add some more C++ docs

This commit is contained in:
John Cupitt 2020-09-07 18:02:50 +01:00
parent b42f72cd56
commit 3fcaf1ea06

View File

@ -49,6 +49,10 @@ VIPS_CPLUSPLUS_API std::vector<double> to_vector( int n, double array[] );
VIPS_CPLUSPLUS_API std::vector<double> negate( std::vector<double> value ); VIPS_CPLUSPLUS_API std::vector<double> negate( std::vector<double> value );
VIPS_CPLUSPLUS_API std::vector<double> invert( std::vector<double> value ); VIPS_CPLUSPLUS_API std::vector<double> invert( std::vector<double> value );
/**
* Whether or not VObject should take over the reference that you pass in. See
* VObject().
*/
enum VSteal { enum VSteal {
NOSTEAL = 0, NOSTEAL = 0,
STEAL = 1 STEAL = 1
@ -57,6 +61,8 @@ enum VSteal {
/** /**
* A smart VipsObject pointer. It calls g_object_ref()/_unref() for you * A smart VipsObject pointer. It calls g_object_ref()/_unref() for you
* automatically. * automatically.
*
* VObjects can be null (have no value set). See is_null().
*/ */
class VObject class VObject
{ {
@ -65,6 +71,12 @@ private:
VipsObject *vobject; VipsObject *vobject;
public: public:
/**
* Wrap a VObject around the underlying VipsObject pointer.
*
* If steal is STEAL, then the new VObject takes over the reference
* that you pass in.
*/
VObject( VipsObject *new_vobject, VSteal steal = STEAL ) : VObject( VipsObject *new_vobject, VSteal steal = STEAL ) :
vobject( new_vobject ) vobject( new_vobject )
{ {
@ -95,7 +107,6 @@ public:
{ {
} }
// copy constructor
VObject( const VObject &a ) : VObject( const VObject &a ) :
vobject( a.vobject ) vobject( a.vobject )
{ {
@ -152,6 +163,11 @@ public:
g_object_unref( vobject ); g_object_unref( vobject );
} }
/**
* Return the underlying VipsObject pointer. This does not make a new
* reference -- you'll need to g_object_ref() the result if you want
* to keep it.
*/
VipsObject *get_object() const VipsObject *get_object() const
{ {
g_assert( !vobject || g_assert( !vobject ||
@ -160,6 +176,9 @@ public:
return( vobject ); return( vobject );
} }
/**
* TRUE if this is a null VObject.
*/
bool is_null() const bool is_null() const
{ {
return vobject == 0; return vobject == 0;
@ -173,8 +192,28 @@ class VIPS_CPLUSPLUS_API VSource;
class VIPS_CPLUSPLUS_API VTarget; class VIPS_CPLUSPLUS_API VTarget;
class VIPS_CPLUSPLUS_API VOption; class VIPS_CPLUSPLUS_API VOption;
class VOption /**
{ * A list of name-value pairs. Pass these to libvips operations to set
* options. For example:
*
* VImage out = in.embed( 10, 10, 1000, 1000, VImage::option()
* ->set( "extend", "background" )
* ->set( "background", 128 ) );
*
* The `set` member functions will take copies (or hold references to)
* compound objects, so you can free them immediately afterwards if necessary.
*
* You can get values back from operations by using the * form of the set
* member functions. For example:
*
* VImage in = VImage::new_from_file( argv[1] );
* int x, y;
* double value = in.max( VImage::option()
* set( "x", &x )
* set( "y", &y ) );
*
*/
class VOption {
private: private:
struct Pair { struct Pair {
const char *name; const char *name;
@ -218,99 +257,243 @@ public:
virtual ~VOption(); virtual ~VOption();
/**
* Set an input boolean option.
*/
VOption *set( const char *name, bool value ); VOption *set( const char *name, bool value );
/**
* Set an input int option. This is used for enums as well, or you can
* use the string version.
*/
VOption *set( const char *name, int value ); VOption *set( const char *name, int value );
/**
* Set an input unsigned 64-bit integer option.
*/
VOption *set( const char *name, guint64 value ); VOption *set( const char *name, guint64 value );
/**
* Set an input double option.
*/
VOption *set( const char *name, double value ); VOption *set( const char *name, double value );
/**
* Set an input string option.
*
* A copy is taken of the object.
*/
VOption *set( const char *name, const char *value ); VOption *set( const char *name, const char *value );
/**
* Set a libvips object as an option. These can be images, sources,
* targets, etc.
*
* A copy is taken of the object.
*/
VOption *set( const char *name, const VObject value ); VOption *set( const char *name, const VObject value );
/**
* Set an array of integers as an input option.
*
* A copy is taken of the object.
*/
VOption *set( const char *name, std::vector<int> value ); VOption *set( const char *name, std::vector<int> value );
/**
* Set an array of doubles as an input option.
*
* A copy is taken of the object.
*/
VOption *set( const char *name, std::vector<double> value ); VOption *set( const char *name, std::vector<double> value );
/**
* Set an array of images as an input option.
*
* A copy is taken of the object.
*/
VOption *set( const char *name, std::vector<VImage> value ); VOption *set( const char *name, std::vector<VImage> value );
/**
* Set a binary object an input option. Use vips_blob_new() to make
* blobs.
*
* A copy is taken of the object.
*/
VOption *set( const char *name, VipsBlob *value ); VOption *set( const char *name, VipsBlob *value );
/**
* Set an option which will return a bool value.
*/
VOption *set( const char *name, bool *value ); VOption *set( const char *name, bool *value );
/**
* Set an option which will return an integer value.
*/
VOption *set( const char *name, int *value ); VOption *set( const char *name, int *value );
/**
* Set an option which will return a double value.
*/
VOption *set( const char *name, double *value ); VOption *set( const char *name, double *value );
/**
* Set an option which will return a reference to an image.
*/
VOption *set( const char *name, VImage *value ); VOption *set( const char *name, VImage *value );
/**
* Set an option which will return an array of doubles.
*/
VOption *set( const char *name, std::vector<double> *value ); VOption *set( const char *name, std::vector<double> *value );
/**
* Set an option which will return a binary object, such as an ICC
* profile.
*/
VOption *set( const char *name, VipsBlob **blob ); VOption *set( const char *name, VipsBlob **blob );
/**
* Walk the set of options, setting options on the operation. This is
* used internally by VImage::call().
*/
void set_operation( VipsOperation *operation ); void set_operation( VipsOperation *operation );
/**
* Walk the set of options, fetching any output values. This is used
* internally by VImage::call().
*/
void get_operation( VipsOperation *operation ); void get_operation( VipsOperation *operation );
}; };
/**
* An image object.
*
* Image processing operations on images are member functions of VImage. For
* example:
*
* VImage in = VImage::new_from_file( argv[1], VImage::option()
* ->set( "access", "sequential" ) );
* VImage out = in.embed( 10, 10, 1000, 1000, VImage::option()
* ->set( "extend", "copy" ) );
* out.write_to_file( argv[2] );
*
* VImage objects are smart pointers over the underlying VipsImage objects.
* They manage the complications of GLib's ref and unref system for you.
*/
class VImage : public VObject class VImage : public VObject
{ {
public: public:
using VObject::is_null; using VObject::is_null;
/**
* Wrap a VImage around an underlying VipsImage object.
*
* If steal is STEAL, then the VImage will take ownership of the
* reference to the VipsImage.
*/
VImage( VipsImage *image, VSteal steal = STEAL ) : VImage( VipsImage *image, VSteal steal = STEAL ) :
VObject( (VipsObject *) image, steal ) VObject( (VipsObject *) image, steal )
{ {
} }
// an empty (NULL) VImage, eg. "VImage a;" /**
* An empty (NULL) VImage, eg. "VImage a;"
*/
VImage() : VImage() :
VObject( 0 ) VObject( 0 )
{ {
} }
/**
* Return the underlying VipsImage reference that this VImage holds.
* This does not make a new reference -- you'll need to g_object_ref()
* the pointer if you need it to last.
*/
VipsImage * VipsImage *
get_image() const get_image() const
{ {
return( (VipsImage *) VObject::get_object() ); return( (VipsImage *) VObject::get_object() );
} }
/**
* Return the width of the image in pixels.
*/
int int
width() const width() const
{ {
return( vips_image_get_width( get_image() ) ); return( vips_image_get_width( get_image() ) );
} }
/**
* Return the height of the image in pixels.
*/
int int
height() const height() const
{ {
return( vips_image_get_height( get_image() ) ); return( vips_image_get_height( get_image() ) );
} }
/**
* Return the number of image bands.
*/
int int
bands() const bands() const
{ {
return( vips_image_get_bands( get_image() ) ); return( vips_image_get_bands( get_image() ) );
} }
/**
* Return the image format, for example VIPS_FORMAT_UCHAR.
*/
VipsBandFormat VipsBandFormat
format() const format() const
{ {
return( vips_image_get_format( get_image() ) ); return( vips_image_get_format( get_image() ) );
} }
/**
* Return the image coding, for example VIPS_CODING_NONE.
*/
VipsCoding VipsCoding
coding() const coding() const
{ {
return( vips_image_get_coding( get_image() ) ); return( vips_image_get_coding( get_image() ) );
} }
/**
* Return the image interpretation, for example
* VIPS_INTERPRETATION_sRGB.
*/
VipsInterpretation VipsInterpretation
interpretation() const interpretation() const
{ {
return( vips_image_get_interpretation( get_image() ) ); return( vips_image_get_interpretation( get_image() ) );
} }
/**
* Try to guess the image interpretation from other fields. This is
* handy if the inperpretaion has not been set correctly.
*/
VipsInterpretation VipsInterpretation
guess_interpretation() const guess_interpretation() const
{ {
return( vips_image_guess_interpretation( get_image() ) ); return( vips_image_guess_interpretation( get_image() ) );
} }
/**
* The horizontal resolution in pixels per millimeter.
*/
double double
xres() const xres() const
{ {
return( vips_image_get_xres( get_image() ) ); return( vips_image_get_xres( get_image() ) );
} }
/**
* The vertical resolution in pixels per millimeter.
*/
double double
yres() const yres() const
{ {