Top |
enum | VipsArgumentFlags |
#define | VIPS_ARGUMENT_REQUIRED_INPUT |
#define | VIPS_ARGUMENT_OPTIONAL_INPUT |
#define | VIPS_ARGUMENT_REQUIRED_OUTPUT |
#define | VIPS_ARGUMENT_OPTIONAL_OUTPUT |
VipsArgument | |
VipsArgumentClass | |
VipsArgumentInstance | |
typedef | VipsArgumentTable |
#define | VIPS_ARGUMENT_COLLECT_END |
GObject ╰── VipsObject ├── VipsOperation ├── VipsImage ├── VipsInterpolate ├── VipsRegion ╰── VipsThreadState
The VipsObject class and associated types and macros.
VipsObject is the base class for all objects in libvips. It has the following major features:
Functional class creation Vips objects have a very regular lifecycle: initialise, build, use, destroy. They behave rather like function calls and are free of side-effects.
Run-time introspection Vips objects can be fully introspected at run-time. There is not need for separate source-code analysis.
Command-line interface Any vips object can be run from
the command-line with the vips
driver program.
VipsObject s have a strictly defined lifecycle, split broadly as construct and then use. In detail, the stages are:
g_object_new(). The VipsObject is created with g_object_new()
. Objects
in this state are blank slates and need to have their various parameters
set.
g_object_set(). You loop over the VipsArgument that the object has
defined with vips_argument_map()
. Arguments have a set of flags attached to
them for required, optional, input, output, type, and so on. You must set
all required arguments.
vips_object_build(). Call this to construct the object and get it ready for use. Building an object happens in four stages, see below.
g_object_get(). The object has now been built. You can read out any computed values.
g_object_unref(). When you are done with an object, you can unref it. See the section on reference counting for an explanation of the convention that VipsObject uses. When the last ref to an object is released, the object is closed. Objects close in three stages, see below.
The stages inside vips_object_build()
are:
Chain up through the object's build
class methods. At each stage,
each class does any initial setup and checking, then chains up to its
superclass.
The innermost build
method inside VipsObject itself checks that all
input arguments have been set and then returns.
All object build
methods now finish executing, from innermost to
outermost. They know all input arguments have been checked and supplied, so
now they set all output arguments.
vips_object_build() finishes the process by checking that all output objects have been set, and then triggering the “postbuild” signal. “postbuild” only runs if the object has constructed successfuly.
VipsOperation has a cache of recent operation objects, see that class for
an explanation of vips_cache_operation_build()
.
Finally the stages inside close are:
“preclose”. This is emitted at the start of the VipsObject dispose. The object is still functioning.
“close”. This runs just after all VipsArgument held by the object have been released.
“postclose”. This runs right at the end. The object pointer is still valid, but nothing else is.
libvips has a simple mechanism for automating at least some aspects of
GObject
properties. You add a set of macros to your _class_init()
which
describe the arguments, and set the get and set functions to the vips ones.
See extending for a complete example.
VipsObject has a set of conventions to simplify reference counting.
All input GObject
have a ref added to them, owned by the object. When a
VipsObject is unreffed, all of these refs to input objects are
automatically dropped.
All output GObject
hold a ref to the object. When a GObject
which is an
output of a VipsObject is disposed, it must drop this reference.
VipsObject which are outputs of other VipsObject will do this
automatically.
See VipsOperation for an example of VipsObject reference counting.
#define VIPS_ARG_INTERPOLATE( CLASS, NAME, PRIORITY, LONG, DESC, FLAGS, OFFSET )
#define VIPS_ARG_DOUBLE( CLASS, NAME, PRIORITY, LONG, DESC, \ FLAGS, OFFSET, MIN, MAX, VALUE )
#define VIPS_ARG_INT( CLASS, NAME, PRIORITY, LONG, DESC, \ FLAGS, OFFSET, MIN, MAX, VALUE )
#define VIPS_ARG_UINT64( CLASS, NAME, PRIORITY, LONG, DESC, \ FLAGS, OFFSET, MIN, MAX, VALUE )
#define VIPS_ARG_ENUM( CLASS, NAME, PRIORITY, LONG, DESC, \ FLAGS, OFFSET, TYPE, VALUE )
#define VIPS_ARG_FLAGS( CLASS, NAME, PRIORITY, LONG, DESC, \ FLAGS, OFFSET, TYPE, VALUE )
#define VIPS_ARG_STRING( CLASS, NAME, PRIORITY, LONG, DESC, FLAGS, OFFSET, \ VALUE )
VipsArgumentInstance * vips__argument_get_instance (VipsArgumentClass *argument_class
,VipsObject *object
);
Convenience ... given the VipsArgumentClass, get the VipsArgumentInstance.
VipsArgument * vips__argument_table_lookup (VipsArgumentTable *argument_class
,GParamSpec *pspec
);
void vips__object_set_member (VipsObject *object
,GParamSpec *pspec
,GObject **member
,GObject *argument
);
void * (*VipsArgumentMapFn) (VipsObject *object
,GParamSpec *pspec
,VipsArgumentClass *argument_class
,VipsArgumentInstance *argument_instance
,void *a
,void *b
);
void * vips_argument_map (VipsObject *object
,VipsArgumentMapFn fn
,void *a
,void *b
);
Loop over the vips_arguments to an object. Stop when fn
returns non-NULL
and return that value.
void * (*VipsArgumentClassMapFn) (VipsObjectClass *object_class
,GParamSpec *pspec
,VipsArgumentClass *argument_class
,void *a
,void *b
);
void * vips_argument_class_map (VipsObjectClass *object_class
,VipsArgumentClassMapFn fn
,void *a
,void *b
);
And loop over a class. Same as ^^, but with no VipsArgumentInstance.
gboolean
vips_argument_class_needsstring (VipsArgumentClass *argument_class
);
int vips_object_get_argument (VipsObject *object
,const char *name
,GParamSpec **pspec
,VipsArgumentClass **argument_class
,VipsArgumentInstance **argument_instance
);
Look up the three things you need to work with a vips argument.
gboolean vips_object_argument_isset (VipsObject *object
,const char *name
);
Convenience: has an argument been assigned. Useful for bindings.
VipsArgumentFlags vips_object_get_argument_flags (VipsObject *object
,const char *name
);
Convenience: get the flags for an argument. Useful for bindings.
int vips_object_get_argument_priority (VipsObject *object
,const char *name
);
Convenience: get the priority for an argument. Useful for bindings.
void vips_object_set_property (GObject *gobject
,guint property_id
,const GValue *value
,GParamSpec *pspec
);
void vips_object_get_property (GObject *gobject
,guint property_id
,GValue *value
,GParamSpec *pspec
);
void vips_object_summary_class (VipsObjectClass *klass
,VipsBuf *buf
);
Generate a human-readable summary for a class.
void vips_object_summary (VipsObject *object
,VipsBuf *buf
);
Generate a human-readable summary for an object.
void vips_object_dump (VipsObject *object
,VipsBuf *buf
);
Dump everything that vips knows about an object to a string.
void vips_object_class_install_argument (VipsObjectClass *cls
,GParamSpec *pspec
,VipsArgumentFlags flags
,int priority
,guint offset
);
int vips_object_set_argument_from_string (VipsObject *object
,const char *name
,const char *value
);
gboolean vips_object_argument_needsstring (VipsObject *object
,const char *name
);
int vips_object_get_argument_to_string (VipsObject *object
,const char *name
,const char *arg
);
VipsObject * vips_object_new (GType type
,VipsObjectSetArguments set
,void *a
,void *b
);
g_object_new() the object, set any arguments with set
, call
vips_object_build()
and return the complete object.
int vips_object_set_valist (VipsObject *object
,va_list ap
);
See vips_object_set()
.
int vips_object_set (VipsObject *object
,...
);
Set a list of vips object arguments. For example:
vips_object_set (operation, "input", in, "output", &out, NULL);
Input arguments are given in-line, output arguments are given as pointers to where the output value should be written.
See also: vips_object_set_valist()
, vips_object_set_from_string()
.
int vips_object_set_from_string (VipsObject *object
,const char *string
);
Set object arguments from a string. The string can be something like "a=12", or "a = 12, b = 13", or "fred". The string can optionally be enclosed in brackets.
You'd typically use this between creating the object and building it.
See also: vips_object_set()
, vips_object_build()
,
vips_cache_operation_buildp()
.
VipsObject * vips_object_new_from_string (VipsObjectClass *object_class
,const char *p
);
void vips_object_to_string (VipsObject *object
,VipsBuf *buf
);
The inverse of vips_object_new_from_string()
: turn object
into eg.
"VipsInterpolateSnohalo1(blur=.333333)".
void * vips_object_map (VipsSListMap2Fn fn
,void *a
,void *b
);
Call a function for all alive objects.
Stop when fn
returns non-NULL
and return that value.
void * vips_type_map (GType base
,VipsTypeMap2Fn fn
,void *a
,void *b
);
Map over a type's children. Stop when fn
returns non-NULL
and return that value.
void * vips_type_map_all (GType base
,VipsTypeMapFn fn
,void *a
);
Map over a type's children, direct and indirect. Stop when fn
returns
non-NULL
and return that value.
const char *
vips_nickname_find (GType type
);
Return the VIPS nickanme for a GType
. Handy for language bindings.
void * vips_class_map_all (GType type
,VipsClassMapFn fn
,void *a
);
Loop over all the subclasses of type
. Non-abstract classes only.
Stop when fn
returns
non-NULL
and return that value.
VipsObjectClass * vips_class_find (const char *basename
,const char *nickname
);
Search below basename, return the first class whose name or nickname matches.
VipsObject ** vips_object_local_array (VipsObject *parent
,int n
);
Make an array of NULL VipsObject pointers. When parent
closes, every
non-NULL pointer in the array will be unreffed and the array will be
freed. Handy for creating a set of temporary images for a function.
The array is NULL-terminated, ie. contains an extra NULL element at the end.
Example:
VipsObject **t; t = vips_object_local_array( a, 5 ); if( vips_add( a, b, &t[0], NULL ) || vips_invert( t[0], &t[1], NULL ) || vips_add( t[1], t[0], &t[2], NULL ) || vips_costra( t[2], out, NULL ) ) return( -1 );
See also: vips_object_local()
.
void
vips_object_unref_outputs (VipsObject *object
);
Unref all assigned output objects. Useful for language bindings.
After an object is built, all output args are owned by the caller. If something goes wrong before then, we have to unref the outputs that have been made so far. This function can also be useful for callers when they've finished processing outputs themselves.
See also: vips_cache_operation_build()
.
const char *
vips_object_get_description (VipsObject *object
);
Fetch the object description. Useful for language bindings.
object.description
is only avaliable after _build()
, which can be too
late. This function fetches from the instance, if possible, but falls back
to the class description if we are too early.
VipsArgumentFlags
is deprecated and should not be used in newly-written code.
Flags we associate with each object argument.
Have separate input & output flags. Both set is an error; neither set is OK.
Input gobjects are automatically reffed, output gobjects automatically ref us. We also automatically watch for "destroy" and unlink.
VIPS_ARGUMENT_SET_ALWAYS
is handy for arguments which are set from C. For
example, VipsImage::width is a property that gives access to the Xsize
member of struct _VipsImage. We default its 'assigned' to TRUE
since the field is always set directly by C.
VIPS_ARGUMENT_DEPRECATED
arguments are not shown in help text, are not
looked for if required, are not checked for "have-been-set". You can
deprecate a required argument, but you must obviously add a new required
argument if you do.
Input args with VIPS_ARGUMENT_MODIFY
will be modified by the operation.
This is used for things like the in-place drawing operations.
typedef struct { GParamSpec *pspec; /* pspec for this argument */ /* More stuff, see below */ } VipsArgument;
typedef struct { VipsArgument parent; /* The class of the object we are an arg for. */ VipsObjectClass *object_class; VipsArgumentFlags flags; int priority; /* Order args by this */ guint offset; /* G_STRUCT_OFFSET of member in object */ } VipsArgumentClass;
typedef struct { VipsArgument parent; /* The class we are part of. */ VipsArgumentClass *argument_class; /* The object we are attached to. */ VipsObject *object; /* Has been set. */ gboolean assigned; /* If this is an output argument, keep the id of our "close" handler * here. */ gulong close_id; /* We need to listen for "invalidate" on input images and send our own * "invalidate" out. If we go, we need to disconnect. */ gulong invalidate_id; } VipsArgumentInstance;
“description”
property “description” gchar *
Class description.
Flags: Read / Write
Default value: ""
“close”
signalvoid user_function (VipsObject *object, gpointer user_data)
The ::close signal is emitted once during object close. The object is dying and may not work.
object |
the object that is closing |
|
user_data |
user data set when the signal handler was connected. |
Flags: Run Last
“postbuild”
signalgint user_function (VipsObject *object, gpointer user_data)
The ::postbuild signal is emitted once just after successful object construction. Return non-zero to cause object construction to fail.
object |
the object that has been built |
|
user_data |
user data set when the signal handler was connected. |
Flags: Run Last
“postclose”
signalvoid user_function (VipsObject *object, gpointer user_data)
The ::postclose signal is emitted once after object close. The object pointer is still valid, but nothing else.
object |
the object that has closed |
|
user_data |
user data set when the signal handler was connected. |
Flags: Run Last
“preclose”
signalvoid user_function (VipsObject *object, gpointer user_data)
The ::preclose signal is emitted once just before object close starts. The oject is still alive.
object |
the object that is to close |
|
user_data |
user data set when the signal handler was connected. |
Flags: Run Last