new C++ interface works!
phew
This commit is contained in:
parent
620bff2d78
commit
266e120676
20
TODO
20
TODO
@ -1,23 +1,5 @@
|
|||||||
- see
|
- remove VipsCollect
|
||||||
|
|
||||||
http://www.parashift.com/c++-faq/named-parameter-idiom.html
|
|
||||||
|
|
||||||
good idea? seems clumsy
|
|
||||||
|
|
||||||
could do it something like:
|
|
||||||
|
|
||||||
VImage sum = image.add(image2).set("max", 12).build();
|
|
||||||
|
|
||||||
or maybe:
|
|
||||||
|
|
||||||
VImage result = image.sin().build().cos().build();
|
|
||||||
|
|
||||||
could the options go into an optional param?
|
|
||||||
|
|
||||||
VImage result = image.sin().cos();
|
|
||||||
|
|
||||||
VImage sum = image.add(image2,
|
|
||||||
VOption().set("max", 12).set("title", "poop"));
|
|
||||||
|
|
||||||
|
|
||||||
- use vips_autorot() in jpegload and vipsthumbnail
|
- use vips_autorot() in jpegload and vipsthumbnail
|
||||||
|
@ -374,6 +374,10 @@ void VImage::call_option_string( const char *operation_name,
|
|||||||
if( options )
|
if( options )
|
||||||
options->get_operation( operation );
|
options->get_operation( operation );
|
||||||
|
|
||||||
|
/* We're done with options!
|
||||||
|
*/
|
||||||
|
delete options;
|
||||||
|
|
||||||
/* The operation we have built should now have been reffed by
|
/* The operation we have built should now have been reffed by
|
||||||
* one of its arguments or have finished its work. Either
|
* one of its arguments or have finished its work. Either
|
||||||
* way, we can unref.
|
* way, we can unref.
|
||||||
@ -467,25 +471,9 @@ main( int argc, char **argv )
|
|||||||
vips_error_exit( NULL );
|
vips_error_exit( NULL );
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
|
||||||
|
|
||||||
VipsImage *in;
|
|
||||||
VipsImage *out;
|
|
||||||
|
|
||||||
if( !(in = vips_image_new_from_file( argv[1], NULL )) )
|
|
||||||
vips_error_exit( NULL );
|
|
||||||
|
|
||||||
if( vips_invert( in, &out, NULL ) )
|
|
||||||
vips_error_exit( NULL );
|
|
||||||
|
|
||||||
if( vips_image_write_to_file( out, argv[2], NULL ) )
|
|
||||||
vips_error_exit( NULL );
|
|
||||||
|
|
||||||
g_object_unref( in );
|
|
||||||
g_object_unref( out );
|
|
||||||
|
|
||||||
*/
|
|
||||||
|
|
||||||
|
printf( "these should match, if the class is compile-time-only,\n" );
|
||||||
|
printf( "as it should be\n" );
|
||||||
printf( "sizeof( VipsImage *) = %zd\n", sizeof( VipsImage *) );
|
printf( "sizeof( VipsImage *) = %zd\n", sizeof( VipsImage *) );
|
||||||
printf( "sizeof( VImage ) = %zd\n", sizeof( VImage ) );
|
printf( "sizeof( VImage ) = %zd\n", sizeof( VImage ) );
|
||||||
|
|
||||||
@ -493,9 +481,9 @@ main( int argc, char **argv )
|
|||||||
VImage in = VImage::new_from_file( argv[1] );
|
VImage in = VImage::new_from_file( argv[1] );
|
||||||
VImage out;
|
VImage out;
|
||||||
|
|
||||||
//out = in.invert();
|
out = in.invert();
|
||||||
|
|
||||||
//out.write_to_file( argv[2] );
|
out.write_to_file( argv[2] );
|
||||||
}
|
}
|
||||||
|
|
||||||
vips_shutdown();
|
vips_shutdown();
|
||||||
|
@ -59,25 +59,6 @@ typedef void *(*VipsSListMap4Fn)( void *item,
|
|||||||
typedef void *(*VipsSListFold2Fn)( void *item,
|
typedef void *(*VipsSListFold2Fn)( void *item,
|
||||||
void *a, void *b, void *c );
|
void *a, void *b, void *c );
|
||||||
|
|
||||||
/* The value has been read from the VipsOperation and written to the
|
|
||||||
* arg pointer. @arg is eg. gboolean* for a bool value.
|
|
||||||
*/
|
|
||||||
typedef void (*VipsCollectGet)( GParamSpec *pspec, void *arg );
|
|
||||||
|
|
||||||
/* The value has been read from argv into a GValue. Do any
|
|
||||||
* boxing/unboxing before the GValue is used to set the property.
|
|
||||||
*/
|
|
||||||
typedef void (*VipsCollectSet)( GParamSpec *pspec, GValue *value );
|
|
||||||
|
|
||||||
/* We need to be able to use different things to collect values for the C++
|
|
||||||
* API: we have to box and unbox VipsImage. Set/get need to be parameters.
|
|
||||||
*/
|
|
||||||
typedef struct _VipsCollect {
|
|
||||||
VipsCollectGet get;
|
|
||||||
VipsCollectSet set;
|
|
||||||
|
|
||||||
} VipsCollect;
|
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
}
|
}
|
||||||
#endif /*__cplusplus*/
|
#endif /*__cplusplus*/
|
||||||
|
@ -601,8 +601,7 @@ typedef void *(*VipsObjectSetArguments)( VipsObject *object, void *a, void *b );
|
|||||||
VipsObject *vips_object_new( GType type,
|
VipsObject *vips_object_new( GType type,
|
||||||
VipsObjectSetArguments set, void *a, void *b );
|
VipsObjectSetArguments set, void *a, void *b );
|
||||||
|
|
||||||
int vips_object_set_valist( VipsObject *object,
|
int vips_object_set_valist( VipsObject *object, va_list ap );
|
||||||
VipsCollect *collect, va_list ap );
|
|
||||||
int vips_object_set( VipsObject *object, ... )
|
int vips_object_set( VipsObject *object, ... )
|
||||||
__attribute__((sentinel));
|
__attribute__((sentinel));
|
||||||
int vips_object_set_from_string( VipsObject *object, const char *string );
|
int vips_object_set_from_string( VipsObject *object, const char *string );
|
||||||
|
@ -101,7 +101,7 @@ void vips_operation_invalidate( VipsOperation *operation );
|
|||||||
int vips_operation_call_valist( VipsOperation *operation, va_list ap );
|
int vips_operation_call_valist( VipsOperation *operation, va_list ap );
|
||||||
VipsOperation *vips_operation_new( const char *name );
|
VipsOperation *vips_operation_new( const char *name );
|
||||||
int vips_call_required_optional( VipsOperation **operation,
|
int vips_call_required_optional( VipsOperation **operation,
|
||||||
VipsCollect *collect, va_list required, va_list optional );
|
va_list required, va_list optional );
|
||||||
int vips_call( const char *operation_name, ... )
|
int vips_call( const char *operation_name, ... )
|
||||||
__attribute__((sentinel));
|
__attribute__((sentinel));
|
||||||
int vips_call_split( const char *operation_name, va_list optional, ... );
|
int vips_call_split( const char *operation_name, va_list optional, ... );
|
||||||
|
@ -2157,7 +2157,6 @@ vips_object_new( GType type, VipsObjectSetArguments set, void *a, void *b )
|
|||||||
/**
|
/**
|
||||||
* vips_object_set_valist:
|
* vips_object_set_valist:
|
||||||
* @object: object to set arguments on
|
* @object: object to set arguments on
|
||||||
* @collect: how to box or unbox values
|
|
||||||
* @ap: %NULL-terminated list of argument/value pairs
|
* @ap: %NULL-terminated list of argument/value pairs
|
||||||
*
|
*
|
||||||
* See vips_object_set().
|
* See vips_object_set().
|
||||||
@ -2165,7 +2164,7 @@ vips_object_new( GType type, VipsObjectSetArguments set, void *a, void *b )
|
|||||||
* Returns: 0 on success, -1 on error
|
* Returns: 0 on success, -1 on error
|
||||||
*/
|
*/
|
||||||
int
|
int
|
||||||
vips_object_set_valist( VipsObject *object, VipsCollect *collect, va_list ap )
|
vips_object_set_valist( VipsObject *object, va_list ap )
|
||||||
{
|
{
|
||||||
char *name;
|
char *name;
|
||||||
|
|
||||||
@ -2184,9 +2183,6 @@ vips_object_set_valist( VipsObject *object, VipsCollect *collect, va_list ap )
|
|||||||
|
|
||||||
VIPS_ARGUMENT_COLLECT_SET( pspec, argument_class, ap );
|
VIPS_ARGUMENT_COLLECT_SET( pspec, argument_class, ap );
|
||||||
|
|
||||||
if( collect )
|
|
||||||
collect->set( pspec, &value );
|
|
||||||
|
|
||||||
g_object_set_property( G_OBJECT( object ), name, &value );
|
g_object_set_property( G_OBJECT( object ), name, &value );
|
||||||
|
|
||||||
VIPS_ARGUMENT_COLLECT_GET( pspec, argument_class, ap );
|
VIPS_ARGUMENT_COLLECT_GET( pspec, argument_class, ap );
|
||||||
@ -2225,7 +2221,7 @@ vips_object_set( VipsObject *object, ... )
|
|||||||
int result;
|
int result;
|
||||||
|
|
||||||
va_start( ap, object );
|
va_start( ap, object );
|
||||||
result = vips_object_set_valist( object, NULL, ap );
|
result = vips_object_set_valist( object, ap );
|
||||||
va_end( ap );
|
va_end( ap );
|
||||||
|
|
||||||
return( result );
|
return( result );
|
||||||
|
@ -181,13 +181,6 @@
|
|||||||
* compatibility only and should be hidden from users.
|
* compatibility only and should be hidden from users.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
/**
|
|
||||||
* VipsCollect:
|
|
||||||
*
|
|
||||||
* We need to be able to use different things to collect values for the C++
|
|
||||||
* API: we have to box and unbox VipsImage. Set/get need to be parameters.
|
|
||||||
*/
|
|
||||||
|
|
||||||
/* Abstract base class for operations.
|
/* Abstract base class for operations.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
@ -584,8 +577,7 @@ vips_operation_new( const char *name )
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
static int
|
static int
|
||||||
vips_operation_set_valist_required( VipsOperation *operation,
|
vips_operation_set_valist_required( VipsOperation *operation, va_list ap )
|
||||||
VipsCollect *collect, va_list ap )
|
|
||||||
{
|
{
|
||||||
VIPS_DEBUG_MSG( "vips_operation_set_valist_required:\n" );
|
VIPS_DEBUG_MSG( "vips_operation_set_valist_required:\n" );
|
||||||
|
|
||||||
@ -611,9 +603,6 @@ vips_operation_set_valist_required( VipsOperation *operation,
|
|||||||
}
|
}
|
||||||
#endif /*VIPS_DEBUG */
|
#endif /*VIPS_DEBUG */
|
||||||
|
|
||||||
if( collect )
|
|
||||||
collect->set( pspec, &value );
|
|
||||||
|
|
||||||
g_object_set_property( G_OBJECT( operation ),
|
g_object_set_property( G_OBJECT( operation ),
|
||||||
g_param_spec_get_name( pspec ), &value );
|
g_param_spec_get_name( pspec ), &value );
|
||||||
|
|
||||||
@ -632,8 +621,7 @@ vips_operation_set_valist_required( VipsOperation *operation,
|
|||||||
}
|
}
|
||||||
|
|
||||||
static int
|
static int
|
||||||
vips_operation_get_valist_required( VipsOperation *operation,
|
vips_operation_get_valist_required( VipsOperation *operation, va_list ap )
|
||||||
VipsCollect *collect, va_list ap )
|
|
||||||
{
|
{
|
||||||
VIPS_DEBUG_MSG( "vips_operation_get_valist_required:\n" );
|
VIPS_DEBUG_MSG( "vips_operation_get_valist_required:\n" );
|
||||||
|
|
||||||
@ -679,11 +667,6 @@ vips_operation_get_valist_required( VipsOperation *operation,
|
|||||||
g_object_unref( object );
|
g_object_unref( object );
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Do any boxing/unboxing.
|
|
||||||
*/
|
|
||||||
if( collect )
|
|
||||||
collect->get( pspec, arg );
|
|
||||||
|
|
||||||
VIPS_ARGUMENT_COLLECT_END
|
VIPS_ARGUMENT_COLLECT_END
|
||||||
}
|
}
|
||||||
} VIPS_ARGUMENT_FOR_ALL_END
|
} VIPS_ARGUMENT_FOR_ALL_END
|
||||||
@ -692,8 +675,7 @@ vips_operation_get_valist_required( VipsOperation *operation,
|
|||||||
}
|
}
|
||||||
|
|
||||||
static int
|
static int
|
||||||
vips_operation_get_valist_optional( VipsOperation *operation,
|
vips_operation_get_valist_optional( VipsOperation *operation, va_list ap )
|
||||||
VipsCollect *collect, va_list ap )
|
|
||||||
{
|
{
|
||||||
char *name;
|
char *name;
|
||||||
|
|
||||||
@ -743,11 +725,6 @@ vips_operation_get_valist_optional( VipsOperation *operation,
|
|||||||
object = *((GObject **) arg);
|
object = *((GObject **) arg);
|
||||||
g_object_unref( object );
|
g_object_unref( object );
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Do any boxing/unboxing.
|
|
||||||
*/
|
|
||||||
if( collect )
|
|
||||||
collect->get( pspec, arg );
|
|
||||||
}
|
}
|
||||||
|
|
||||||
VIPS_ARGUMENT_COLLECT_END
|
VIPS_ARGUMENT_COLLECT_END
|
||||||
@ -759,14 +736,11 @@ vips_operation_get_valist_optional( VipsOperation *operation,
|
|||||||
/**
|
/**
|
||||||
* vips_call_required_optional:
|
* vips_call_required_optional:
|
||||||
* @operation: the operation to execute
|
* @operation: the operation to execute
|
||||||
* @collect: how to box and unbox arguments
|
|
||||||
* @required: %va_list of required arguments
|
* @required: %va_list of required arguments
|
||||||
* @optional: NULL-terminated %va_list of name / value pairs
|
* @optional: NULL-terminated %va_list of name / value pairs
|
||||||
*
|
*
|
||||||
* This is the main entry point for the C and C++ varargs APIs. @operation
|
* This is the main entry point for the C and C++ varargs APIs. @operation
|
||||||
* is executed, supplying @required and @optional arguments. @collect is used
|
* is executed, supplying @required and @optional arguments.
|
||||||
* to do any boxing or unboxing. It can be %NULL for no boxing on unboxing
|
|
||||||
* required (the C case).
|
|
||||||
*
|
*
|
||||||
* Beware, this can change @operation to point at an old, cached one.
|
* Beware, this can change @operation to point at an old, cached one.
|
||||||
*
|
*
|
||||||
@ -774,7 +748,7 @@ vips_operation_get_valist_optional( VipsOperation *operation,
|
|||||||
*/
|
*/
|
||||||
int
|
int
|
||||||
vips_call_required_optional( VipsOperation **operation,
|
vips_call_required_optional( VipsOperation **operation,
|
||||||
VipsCollect *collect, va_list required, va_list optional )
|
va_list required, va_list optional )
|
||||||
{
|
{
|
||||||
int result;
|
int result;
|
||||||
va_list a;
|
va_list a;
|
||||||
@ -786,8 +760,8 @@ vips_call_required_optional( VipsOperation **operation,
|
|||||||
*/
|
*/
|
||||||
va_copy( a, required );
|
va_copy( a, required );
|
||||||
va_copy( b, optional );
|
va_copy( b, optional );
|
||||||
result = vips_operation_set_valist_required( *operation, collect, a ) ||
|
result = vips_operation_set_valist_required( *operation, a ) ||
|
||||||
vips_object_set_valist( VIPS_OBJECT( *operation ), collect, b );
|
vips_object_set_valist( VIPS_OBJECT( *operation ), b );
|
||||||
va_end( a );
|
va_end( a );
|
||||||
va_end( b );
|
va_end( b );
|
||||||
|
|
||||||
@ -803,10 +777,8 @@ vips_call_required_optional( VipsOperation **operation,
|
|||||||
*/
|
*/
|
||||||
va_copy( a, required );
|
va_copy( a, required );
|
||||||
va_copy( b, optional );
|
va_copy( b, optional );
|
||||||
result = vips_operation_get_valist_required( *operation,
|
result = vips_operation_get_valist_required( *operation, required ) ||
|
||||||
collect, required ) ||
|
vips_operation_get_valist_optional( *operation, optional );
|
||||||
vips_operation_get_valist_optional( *operation,
|
|
||||||
collect, optional );
|
|
||||||
va_end( a );
|
va_end( a );
|
||||||
va_end( b );
|
va_end( b );
|
||||||
|
|
||||||
@ -838,8 +810,7 @@ vips_call_by_name( const char *operation_name,
|
|||||||
return( -1 );
|
return( -1 );
|
||||||
}
|
}
|
||||||
|
|
||||||
result = vips_call_required_optional( &operation,
|
result = vips_call_required_optional( &operation, required, optional );
|
||||||
NULL, required, optional );
|
|
||||||
|
|
||||||
/* Build failed: junk args and back out.
|
/* Build failed: junk args and back out.
|
||||||
*/
|
*/
|
||||||
|
Loading…
Reference in New Issue
Block a user