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.

Hierarchy

hierarchy this VipsOperation ancestor_0 VipsObject ancestor_0--this ancestor_1 GObject ancestor_1--ancestor_0

Ancestors

Descendants

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

vips_operation_call_valist
No description available.

vips_operation_get_flags

Returns the set of flags for this operation.

vips_operation_invalidate
No description available.

Methods inherited from VipsObject (27)

Please see VipsObject for a full list of methods.

Methods inherited from GObject (43)

Please see GObject for a full list of methods.

Properties

Properties inherited from VipsObject (2)
Vips.Object:description
No description available.

Vips.Object:nickname
No description available.

Signals

Vips.Operation::invalidate
No description available.

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.

Virtual methods

Vips.OperationClass.get_flags

Returns the set of flags for this operation.

Vips.OperationClass.invalidate
No description available.

Class methods

vips_operation_class_print_usage

Print a usage message for the operation to stdout.