Top | Description | Object Hierarchy | Properties | Signals | ![]() | ![]() | ![]() | ![]() |
GFlags╰── VipsArgumentFlags GObject╰── VipsObject├──VipsConnection├──VipsOperation├──VipsImage├──VipsInterpolate├──VipsRegion├──VipsSbuf╰──VipsThreadState
TheVipsObject class and associated types and macros.
VipsObject is the base class for all objects in libvips. It has thefollowing major features:
Functional class creation Vips objects have a veryregular lifecycle: initialise, build, use, destroy. They behave rather likefunction calls and are free of side-effects.
Run-time introspection Vips objects can be fullyintrospected at run-time. There is no need for separate source-codeanalysis.
Command-line interface Any vips object can be run fromthe command-line with thevips
driver program.
VipsObject s have a strictly defined lifecycle, split broadly as constructand then use. In detail, the stages are:
g_object_new(). TheVipsObject is created withg_object_new()
. Objectsin this state are blank slates and need to have their various parametersset.
g_object_set(). You loop over theVipsArgument that the object hasdefined withvips_argument_map()
. Arguments have a set of flags attached tothem for required, optional, input, output, type, and so on. You must setall required arguments.
vips_object_build(). Call this to construct the object and get it readyfor use. Building an object happens in four stages, see below.
g_object_get(). The object has now been built. You can read out anycomputed 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 conventionthatVipsObject uses. When the last ref to an object is released, theobject is closed. Objects close in three stages, see below.
The stages insidevips_object_build()
are:
Chain up through the object'sbuild
class methods. At each stage,each class does any initial setup and checking, then chains up to itssuperclass.
The innermostbuild
method insideVipsObject itself checks that allinput arguments have been set and then returns.
All objectbuild
methods now finish executing, from innermost tooutermost. They know all input arguments have been checked and supplied, sonow they set all output arguments.
vips_object_build() finishes the process by checking that all outputobjects have been set, and then triggering the“postbuild”signal.“postbuild” only runs if the object has constructedsuccessfully.
VipsOperation has a cache of recent operation objects, see that class foran explanation ofvips_cache_operation_build()
.
Finally the stages inside close are:
“preclose”. This is emitted at the start oftheVipsObject dispose. The object is still functioning.
“close”. This runs just after allVipsArgument held bythe object have been released.
“postclose”. This runs right at the end. The objectpointer is still valid, but nothing else is.
libvips has a simple mechanism for automating at least some aspects ofGObject
properties. You add a set of macros to your_class_init()
whichdescribe the arguments, and set the get and set functions to the vips ones.
Seeextending for a complete example.
VipsObject has a set of conventions to simplify reference counting.
All inputGObject
have a ref added to them, owned by the object. When aVipsObject is unreffed, all of these refs to input objects areautomatically dropped.
All outputGObject
hold a ref to the object. When aGObject
which is anoutput of aVipsObject is disposed, it must drop this reference.VipsObject which are outputs of otherVipsObject will do thisautomatically.
SeeVipsOperation for an example ofVipsObject 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)
intvips_argument_get_id (void
);
Allocate a new property id. Seeg_object_class_install_property()
.
voidvips__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 whenfn
returns non-NULL
and return that value.
intvips_object_get_args (VipsObject *object
,constchar ***names
,int **flags
,int *n_args
);
Get allGParamSpec
names andVipsArgumentFlags for an object.
This is handy for language bindings. From C, it's usually more convenient tousevips_argument_map()
.
object | object whose args should be retrieved | |
names | output array of | [transfer none][array length=n_args][allow-none] |
flags | output array ofVipsArgumentFlags. | [transfer none][array length=n_args][allow-none] |
n_args | length of output arrays. | [allow-none] |
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.
gbooleanvips_argument_class_needsstring (VipsArgumentClass *argument_class
);
intvips_object_get_argument (VipsObject *object
,constchar *name
,GParamSpec **pspec
,VipsArgumentClass **argument_class
,VipsArgumentInstance **argument_instance
);
Look up the three things you need to work with a vips argument.
object | the object to fetch the args from | |
name | arg to fetch | |
pspec | the pspec for this arg. | [transfer none] |
argument_class | the argument_class for this arg. | [transfer none] |
argument_instance | the argument_instance for this arg. | [transfer none] |
gbooleanvips_object_argument_isset (VipsObject *object
,constchar *name
);
Convenience: has an argument been assigned. Useful for bindings.
VipsArgumentFlagsvips_object_get_argument_flags (VipsObject *object
,constchar *name
);
Convenience: get the flags for an argument. Useful for bindings.
intvips_object_get_argument_priority (VipsObject *object
,constchar *name
);
Convenience: get the priority for an argument. Useful for bindings.
voidvips_object_set_property (GObject *gobject
,guint property_id
,constGValue *value
,GParamSpec *pspec
);
voidvips_object_get_property (GObject *gobject
,guint property_id
,GValue *value
,GParamSpec *pspec
);
voidvips_object_summary_class (VipsObjectClass *klass
,VipsBuf *buf
);
Generate a human-readable summary for a class.
voidvips_object_summary (VipsObject *object
,VipsBuf *buf
);
Generate a human-readable summary for an object.
voidvips_object_dump (VipsObject *object
,VipsBuf *buf
);
Dump everything that vips knows about an object to a string.
voidvips_object_class_install_argument (VipsObjectClass *cls
,GParamSpec *pspec
,VipsArgumentFlags flags
,int priority
,guint offset
);
intvips_object_set_argument_from_string (VipsObject *object
,constchar *name
,constchar *value
);
gbooleanvips_object_argument_needsstring (VipsObject *object
,constchar *name
);
intvips_object_get_argument_to_string (VipsObject *object
,constchar *name
,constchar *arg
);
VipsObject *vips_object_new (GType type
,VipsObjectSetArguments set
,void *a
,void *b
);
g_object_new() the object, set any arguments withset
, callvips_object_build()
and return the complete object.
intvips_object_set (VipsObject *object
,...
);
Set a list of vips object arguments. For example:
1234 | vips_object_set(operation,"input",in,"output",&out,NULL); |
Input arguments are given in-line, output arguments are given as pointersto where the output value should be written.
See also:vips_object_set_valist()
,vips_object_set_from_string()
.
intvips_object_set_from_string (VipsObject *object
,constchar *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 beenclosed 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
,constchar *p
);
voidvips_object_to_string (VipsObject *object
,VipsBuf *buf
);
The inverse ofvips_object_new_from_string()
: turnobject
into eg."VipsInterpolateSnohalo1(blur=.333333)".
void *vips_object_map (VipsSListMap2Fn fn
,void *a
,void *b
);
Call a function for all alive objects.Stop whenfn
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 whenfn
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 whenfn
returnsnon-NULL
and return that value.
GTypevips_type_find (constchar *basename
,constchar *nickname
);
Search belowbasename
, return theGType
of the class whose name ornickname
matches, or 0 for not found.Ifbasename
is NULL, the whole ofVipsObject is searched.
This function uses a cache, so it should be quick.
See also:vips_class_find()
constchar *vips_nickname_find (GType type
);
Return the VIPS nickname for aGType
. Handy for language bindings.
void *vips_class_map_all (GType type
,VipsClassMapFn fn
,void *a
);
Loop over all the subclasses oftype
. Non-abstract classes only.Stop whenfn
returnsnon-NULL
and return that value.
constVipsObjectClass *vips_class_find (constchar *basename
,constchar *nickname
);
Search belowbasename
, return the first class whose name ornickname
matches.
See also:vips_type_find()
VipsObject **vips_object_local_array (VipsObject *parent
,int n
);
Make an array of NULL VipsObject pointers. Whenparent
closes, everynon-NULL pointer in the array will be unreffed and the array will befreed. Handy for creating a set of temporary images for a function.
The array is NULL-terminated, ie. contains an extra NULL element at theend.
Example:
12345678 | VipsObject**t;t=vips_object_local_array(parent,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()
.
voidvips_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. Ifsomething goes wrong before then, we have to unref the outputs that havebeen made so far. This function can also be useful for callers whenthey've finished processing outputs themselves.
See also:vips_cache_operation_build()
.
constchar *vips_object_get_description (VipsObject *object
);
Fetch the object description. Useful for language bindings.
object.description
is only available after_build()
, which can be toolate. This function fetches from the instance, if possible, but falls backto the class description if we are too early.
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 refus. We also automatically watch for "destroy" and unlink.
VIPS_ARGUMENT_SET_ALWAYS
is handy for arguments which are set from C. Forexample, VipsImage::width is a property that gives access to the Xsizemember of struct _VipsImage. We default its 'assigned' to TRUEsince the field is always set directly by C.
VIPS_ARGUMENT_DEPRECATED
arguments are not shown in help text, are notlooked for if required, are not checked for "have-been-set". You candeprecate a required argument, but you must obviously add a new requiredargument if you do.
Input args withVIPS_ARGUMENT_MODIFY
will be modified by the operation.This is used for things like the in-place drawing operations.
VIPS_ARGUMENT_NON_HASHABLE
stops the argument being used in hash andequality tests. It's useful for arguments likerevalidate
whichcontrol the behaviour of the operator cache.
no flags | ||
must be set in the constructor | ||
can only be set in the constructor | ||
can only be set once | ||
don't do use-before-set checks | ||
is an input argument (one we depend on) | ||
is an output argument (depends on us) | ||
just there for back-compat, hide | ||
the input argument will be modified | ||
the argument is non-hashable |
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”char *
Class description.
Owner: VipsObject
Flags: Read / Write
Default value: ""
“close”
signalvoiduser_function (VipsObject *object,gpointer user_data)
The ::close signal is emitted once during object close. The objectis 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”
signalintuser_function (VipsObject *object,gpointer user_data)
The ::postbuild signal is emitted once just after successful objectconstruction. 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”
signalvoiduser_function (VipsObject *object,gpointer user_data)
The ::postclose signal is emitted once after object close. Theobject 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”
signalvoiduser_function (VipsObject *object,gpointer user_data)
The ::preclose signal is emitted once just before object closestarts. The object is still alive.
object | the object that is to close | |
user_data | user data set when the signal handler was connected. |
Flags: Run Last