From 409301a2004429c46894f3586fec56ccc49ffaaf Mon Sep 17 00:00:00 2001 From: John Cupitt Date: Wed, 19 Aug 2020 15:08:28 +0100 Subject: [PATCH] improve C++ API Make VObject inheritance public, so we can have a single set() for all VObject-derived types. --- ChangeLog | 3 + cplusplus/VConnection.cpp | 26 -------- cplusplus/VImage.cpp | 86 +++++++++++++------------- cplusplus/VInterpolate.cpp | 13 ---- cplusplus/include/vips/VConnection8.h | 4 +- cplusplus/include/vips/VImage8.h | 11 ++-- cplusplus/include/vips/VInterpolate8.h | 2 +- 7 files changed, 54 insertions(+), 91 deletions(-) diff --git a/ChangeLog b/ChangeLog index 6535460f..90287cdf 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,5 +1,8 @@ 14/8/20 started 8.11 - add vips_jpegload_source() and vips_svgload_source() to public C API +- integrate doxygen in build system to generate C++ API docs +- improve C++ API doc comments +- add VipsInterpolate and guint64 support to C++ API 9/8/20 started 8.10.1 - fix markdown -> xml conversion in doc generation diff --git a/cplusplus/VConnection.cpp b/cplusplus/VConnection.cpp index be7afc5a..adea2e17 100644 --- a/cplusplus/VConnection.cpp +++ b/cplusplus/VConnection.cpp @@ -110,19 +110,6 @@ VSource::new_from_options( const char *options ) return( out ); } -VOption * -VOption::set( const char *name, const VSource value ) -{ - Pair *pair = new Pair( name ); - - pair->input = true; - g_value_init( &pair->value, VIPS_TYPE_SOURCE ); - g_value_set_object( &pair->value, value.get_source() ); - options.push_back( pair ); - - return( this ); -} - VTarget VTarget::new_to_descriptor( int descriptor ) { @@ -162,17 +149,4 @@ VTarget::new_to_memory() return( out ); } -VOption * -VOption::set( const char *name, const VTarget value ) -{ - Pair *pair = new Pair( name ); - - pair->input = true; - g_value_init( &pair->value, VIPS_TYPE_TARGET ); - g_value_set_object( &pair->value, value.get_target() ); - options.push_back( pair ); - - return( this ); -} - VIPS_NAMESPACE_END diff --git a/cplusplus/VImage.cpp b/cplusplus/VImage.cpp index 5c9f12a0..196b8c72 100644 --- a/cplusplus/VImage.cpp +++ b/cplusplus/VImage.cpp @@ -140,20 +140,6 @@ VOption::set( const char *name, int value ) return( this ); } -// input double -VOption * -VOption::set( const char *name, double value ) -{ - Pair *pair = new Pair( name ); - - pair->input = true; - g_value_init( &pair->value, G_TYPE_DOUBLE ); - g_value_set_double( &pair->value, value ); - options.push_back( pair ); - - return( this ); -} - // input guint64 VOption * VOption::set( const char *name, guint64 value ) @@ -168,6 +154,20 @@ VOption::set( const char *name, guint64 value ) return( this ); } +// input double +VOption * +VOption::set( const char *name, double value ) +{ + Pair *pair = new Pair( name ); + + pair->input = true; + g_value_init( &pair->value, G_TYPE_DOUBLE ); + g_value_set_double( &pair->value, value ); + options.push_back( pair ); + + return( this ); +} + VOption * VOption::set( const char *name, const char *value ) { @@ -181,39 +181,17 @@ VOption::set( const char *name, const char *value ) return( this ); } -// input image +// input vips object (image, source, target, etc. etc.) VOption * -VOption::set( const char *name, const VImage value ) +VOption::set( const char *name, const VObject value ) { Pair *pair = new Pair( name ); + VipsObject *object = value.get_object(); + GType type = G_VALUE_TYPE( object ); pair->input = true; - g_value_init( &pair->value, VIPS_TYPE_IMAGE ); - g_value_set_object( &pair->value, value.get_image() ); - options.push_back( pair ); - - return( this ); -} - -// input double array -VOption * -VOption::set( const char *name, std::vector value ) -{ - Pair *pair = new Pair( name ); - - double *array; - unsigned int i; - - pair->input = true; - - g_value_init( &pair->value, VIPS_TYPE_ARRAY_DOUBLE ); - vips_value_set_array_double( &pair->value, NULL, - static_cast< int >( value.size() ) ); - array = vips_value_get_array_double( &pair->value, NULL ); - - for( i = 0; i < value.size(); i++ ) - array[i] = value[i]; - + g_value_init( &pair->value, type ); + g_value_set_object( &pair->value, object ); options.push_back( pair ); return( this ); @@ -243,6 +221,30 @@ VOption::set( const char *name, std::vector value ) return( this ); } +// input double array +VOption * +VOption::set( const char *name, std::vector value ) +{ + Pair *pair = new Pair( name ); + + double *array; + unsigned int i; + + pair->input = true; + + g_value_init( &pair->value, VIPS_TYPE_ARRAY_DOUBLE ); + vips_value_set_array_double( &pair->value, NULL, + static_cast< int >( value.size() ) ); + array = vips_value_get_array_double( &pair->value, NULL ); + + for( i = 0; i < value.size(); i++ ) + array[i] = value[i]; + + options.push_back( pair ); + + return( this ); +} + // input image array VOption * VOption::set( const char *name, std::vector value ) diff --git a/cplusplus/VInterpolate.cpp b/cplusplus/VInterpolate.cpp index cb59715c..303a9b8b 100644 --- a/cplusplus/VInterpolate.cpp +++ b/cplusplus/VInterpolate.cpp @@ -60,17 +60,4 @@ VInterpolate::new_from_name( const char *name, VOption *options ) return( out ); } -VOption * -VOption::set( const char *name, const VInterpolate value ) -{ - Pair *pair = new Pair( name ); - - pair->input = true; - g_value_init( &pair->value, VIPS_TYPE_INTERPOLATE ); - g_value_set_object( &pair->value, value.get_interpolate() ); - options.push_back( pair ); - - return( this ); -} - VIPS_NAMESPACE_END diff --git a/cplusplus/include/vips/VConnection8.h b/cplusplus/include/vips/VConnection8.h index 15d4c902..43085c79 100644 --- a/cplusplus/include/vips/VConnection8.h +++ b/cplusplus/include/vips/VConnection8.h @@ -34,7 +34,7 @@ VIPS_NAMESPACE_START -class VSource : VObject +class VSource : public VObject { public: VSource( VipsSource *input, VSteal steal = STEAL ) : @@ -66,7 +66,7 @@ public: }; -class VTarget : VObject +class VTarget : public VObject { public: VTarget( VipsTarget *output, VSteal steal = STEAL ) : diff --git a/cplusplus/include/vips/VImage8.h b/cplusplus/include/vips/VImage8.h index 5522b62e..c0f902f0 100644 --- a/cplusplus/include/vips/VImage8.h +++ b/cplusplus/include/vips/VImage8.h @@ -223,13 +223,10 @@ public: VOption *set( const char *name, guint64 value ); VOption *set( const char *name, double value ); VOption *set( const char *name, const char *value ); - VOption *set( const char *name, const VImage value ); - VOption *set( const char *name, const VInterpolate value ); - VOption *set( const char *name, const VSource value ); - VOption *set( const char *name, const VTarget value ); - VOption *set( const char *name, std::vector value ); - VOption *set( const char *name, std::vector value ); + VOption *set( const char *name, const VObject value ); VOption *set( const char *name, std::vector value ); + VOption *set( const char *name, std::vector value ); + VOption *set( const char *name, std::vector value ); VOption *set( const char *name, VipsBlob *value ); VOption *set( const char *name, bool *value ); @@ -244,7 +241,7 @@ public: }; -class VImage : VObject +class VImage : public VObject { public: using VObject::is_null; diff --git a/cplusplus/include/vips/VInterpolate8.h b/cplusplus/include/vips/VInterpolate8.h index 89e6b77b..0d9c1ed0 100644 --- a/cplusplus/include/vips/VInterpolate8.h +++ b/cplusplus/include/vips/VInterpolate8.h @@ -41,7 +41,7 @@ VIPS_NAMESPACE_START * The available interpolators vary a bit with your libvips version and how it * was built, but will include `nearest`, `bilinear` and `bicubic`. */ -class VInterpolate : VObject +class VInterpolate : public VObject { public: /**