Class
VipsOperation
Description [src]
abstract class Vips.Operation : Vips.Object
{
guint hash,
gboolean found_hash,
int pixels
}
An abstract base class for all operations in libvips.
It builds on VipsObject
to provide the introspection and
command-line interface to libvips.
It also maintains a cache of recent operations. See below.
vips_call()
, vips_call_split()
and vips_call_split_option_string()
are used
by vips to implement the C API. They can execute any VipsOperation
,
passing in a set of required and optional arguments. Normally you would not
use these functions directly: every operation has a tiny wrapper function
which provides type-safety for the required arguments. For example,
vips_embed()
is defined as:
int
vips_embed(VipsImage *in, VipsImage **out,
int x, int y, int width, int height, ...)
{
va_list ap;
int result;
va_start(ap, height);
result = vips_call_split("embed", ap, in, out, x, y, width, height);
va_end(ap);
return result;
}
Use vips_call_argv()
to run any libvips operation from a command-line style
argc/argv array. This is the thing used by the vips
main program to
implement the command-line interface.
VipsOperation
and reference counting
After calling a VipsOperation
you are responsible for unreffing any
output objects. For example, consider:
VipsImage *im = ...;
VipsImage *t1;
if (vips_invert(im, &t1, NULL))
error ..
This will invert im
and return a new VipsImage
, t1
. As the caller
of vips_invert()
, you are responsible for t1
and must unref it
when you no longer need it. If vips_invert()
fails, no t1
is
returned and you don’t need to do anything.
If you don’t need to use im
for another operation, you can unref im
immediately after the call. If im
is needed to calculate t1
,
vips_invert()
will add a ref to im
and automatically drop it when
t1
is unreffed.
Consider running two operations, one after the other. You could write:
VipsImage *im = ...;
VipsImage *t1, *t2;
if (vips_invert(im, &t1, NULL)) {
g_object_unref(im);
return -1;
}
g_object_unref(im);
if (vips_flip(t1, &t2, VIPS_DIRECTION_HORIZONTAL, NULL)) {
g_object_unref(t1);
return -1;
}
g_object_unref(t1);
This is correct, but rather long-winded. libvips provides a handy thing to make a vector of auto-freeing object references. You can write this as:
VipsObject *parent = ...;
VipsImage *im = ...;
VipsImage *t = (VipsImage **) vips_object_local_array(parent, 2);
if (vips_invert(im, &t[0], NULL) ||
vips_flip(t[0], &t[1], VIPS_DIRECTION_HORIZONTAL, NULL))
return -1;
where parent
is some enclosing object which will be unreffed when this
task is complete. vips_object_local_array()
makes an array of
VipsObject
(or VipsImage
, in this case) where when parent
is
freed, all non-NULL
VipsObject
in the array are also unreffed.
The VipsOperation
cache
Because all VipsObject
are immutable, they can be cached. The cache is
very simple to use: instead of calling vips_object_build()
, call
vips_cache_operation_build()
. This function calculates a hash from the
operations’ input arguments and looks it up in table of all recent
operations. If there’s a hit, the new operation is unreffed, the old
operation reffed, and the old operation returned in place of the new one.
The cache size is controlled with vips_cache_set_max()
and friends.
Constructors
vips_operation_new
Return a new VipsOperation
with the specified nickname. Useful for
language bindings.
Functions
vips_operation_block_set
Set the block state on all operations in the libvips class hierarchy at
name
and below.
Instance methods
Methods inherited from VipsObject (27)
Please see VipsObject for a full list of methods.
Properties
Properties inherited from VipsObject (2)
Signals
Signals inherited from VipsObject (4)
VipsObject::close
The ::close signal is emitted once during object close. The object is dying and may not work.
VipsObject::postbuild
The ::postbuild signal is emitted once just after successful object construction. Return non-zero to cause object construction to fail.
VipsObject::postclose
The ::postclose signal is emitted once after object close. The object pointer is still valid, but nothing else.
VipsObject::preclose
The ::preclose signal is emitted once just before object close starts. The object is still alive.
Signals inherited from GObject (1)
GObject::notify
The notify signal is emitted on an object when one of its properties has its value set through g_object_set_property(), g_object_set(), et al.
Class structure
struct VipsOperationClass {
VipsObjectClass parent_class;
void (* usage) (
_VipsOperationClass* cls,
VipsBuf* buf
);
VipsOperationFlags (* get_flags) (
VipsOperation* operation
);
VipsOperationFlags flags;
void (* invalidate) (
VipsOperation* operation
);
}
No description available.
Class members
parent_class: VipsObjectClass
No description available.
usage: void (* usage) ( _VipsOperationClass* cls, VipsBuf* buf )
No description available.
get_flags: VipsOperationFlags (* get_flags) ( VipsOperation* operation )
No description available.
flags: VipsOperationFlags
No description available.
invalidate: void (* invalidate) ( VipsOperation* operation )
No description available.