allow optional output args
optional output args in C API startup ... need to fix up C API shutdown, plus CLI, see TODO notes
This commit is contained in:
parent
5b7de5e594
commit
07eb155462
@ -1,8 +1,9 @@
|
|||||||
20/8/11 started 7.27.0
|
20/8/11 started 7.27.0
|
||||||
- version bump for new dev cycle
|
- version bump for new dev cycle
|
||||||
- im_subtract(), im_avg() redone as classes
|
- im_subtract(), im_avg(), im_min(), im_minpos() redone as classes
|
||||||
- added VIPS_ARGUMENT_APPEND to help control arg ordering
|
- added VIPS_ARGUMENT_APPEND to help control arg ordering
|
||||||
- generate has a 'stop' param to signal successful early termination
|
- generate has a 'stop' param to signal successful early termination
|
||||||
|
- added optional output args, eg. x/y for min
|
||||||
|
|
||||||
10/8/11 started 7.26.3
|
10/8/11 started 7.26.3
|
||||||
- don't use G_VALUE_COLLECT_INIT(), many platforms do not have a glib this
|
- don't use G_VALUE_COLLECT_INIT(), many platforms do not have a glib this
|
||||||
|
28
TODO
28
TODO
@ -1,16 +1,30 @@
|
|||||||
- optional output args are broken
|
- cmd line interface needs to print optional output args, if requested
|
||||||
|
|
||||||
|
eg.
|
||||||
|
|
||||||
|
$ vips min fred.v
|
||||||
|
12
|
||||||
|
$ vips min -x fred.v
|
||||||
|
12
|
||||||
|
300
|
||||||
|
|
||||||
|
the switch is there, but breaks an assert:
|
||||||
|
|
||||||
|
$ vips min -x babe.jpg
|
||||||
|
VIPS:ERROR:object.c:1178:vips_object_set_argument_from_string: assertion
|
||||||
|
failed: (argument_class->flags & VIPS_ARGUMENT_INPUT)
|
||||||
|
Aborted
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
- C interface needs to look for optional output args in final psss, eg.
|
||||||
|
|
||||||
vips_min( im, &min,
|
vips_min( im, &min,
|
||||||
"x", &xpos,
|
"x", &xpos,
|
||||||
"y", &ypos,
|
"y", &ypos,
|
||||||
NULL );
|
NULL );
|
||||||
|
|
||||||
tries to set "x" and "y" during vips_operation_set_valist_optional(),
|
|
||||||
instead it should read them during output arg readout phase
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
@ -702,7 +702,6 @@ vips_object_set_property( GObject *gobject,
|
|||||||
}
|
}
|
||||||
|
|
||||||
#ifdef DEBUG
|
#ifdef DEBUG
|
||||||
#endif /*DEBUG*/
|
|
||||||
{
|
{
|
||||||
char *str_value;
|
char *str_value;
|
||||||
|
|
||||||
@ -712,6 +711,7 @@ vips_object_set_property( GObject *gobject,
|
|||||||
printf( ".%s = %s\n", g_param_spec_get_name( pspec ), str_value );
|
printf( ".%s = %s\n", g_param_spec_get_name( pspec ), str_value );
|
||||||
g_free( str_value );
|
g_free( str_value );
|
||||||
}
|
}
|
||||||
|
#endif /*DEBUG*/
|
||||||
|
|
||||||
g_assert( ((VipsArgument *) argument_class)->pspec == pspec );
|
g_assert( ((VipsArgument *) argument_class)->pspec == pspec );
|
||||||
g_assert( ((VipsArgument *) argument_instance)->pspec == pspec );
|
g_assert( ((VipsArgument *) argument_instance)->pspec == pspec );
|
||||||
|
@ -302,10 +302,54 @@ vips_operation_set_valist_required( VipsOperation *operation, va_list ap )
|
|||||||
static int
|
static int
|
||||||
vips_operation_set_valist_optional( VipsOperation *operation, va_list ap )
|
vips_operation_set_valist_optional( VipsOperation *operation, va_list ap )
|
||||||
{
|
{
|
||||||
char *first_property_name;
|
VipsOperationClass *class =
|
||||||
|
VIPS_OPERATION_GET_CLASS( operation );
|
||||||
|
VipsArgumentTable *argument_table =
|
||||||
|
VIPS_OBJECT_CLASS( class )->argument_table;
|
||||||
|
|
||||||
first_property_name = va_arg( ap, char * );
|
char *name;
|
||||||
g_object_set_valist( G_OBJECT (operation), first_property_name, ap );
|
|
||||||
|
name = va_arg( ap, char * );
|
||||||
|
|
||||||
|
while( name ) {
|
||||||
|
GValue value = { 0, };
|
||||||
|
GParamSpec *pspec;
|
||||||
|
gchar *error = NULL;
|
||||||
|
VipsArgumentClass *argument_class;
|
||||||
|
|
||||||
|
if( !(pspec = g_object_class_find_property(
|
||||||
|
G_OBJECT_CLASS( class ), name )) ) {
|
||||||
|
vips_error( VIPS_OBJECT_CLASS( class )->description,
|
||||||
|
_( "class `%s' has no property named `%s'\n" ),
|
||||||
|
G_OBJECT_TYPE_NAME( operation ), name );
|
||||||
|
return( -1 );
|
||||||
|
}
|
||||||
|
|
||||||
|
g_value_init( &value, G_PARAM_SPEC_VALUE_TYPE( pspec ) );
|
||||||
|
G_VALUE_COLLECT( &value, ap, 0, &error );
|
||||||
|
if( error ) {
|
||||||
|
vips_error( VIPS_OBJECT_CLASS( class )->description,
|
||||||
|
"%s", _( error ) );
|
||||||
|
g_value_unset( &value );
|
||||||
|
g_free( error );
|
||||||
|
|
||||||
|
return( -1 );
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Only set input args, Output args are read from the
|
||||||
|
* finished object after build.
|
||||||
|
*/
|
||||||
|
argument_class = (VipsArgumentClass *)
|
||||||
|
vips__argument_table_lookup( argument_table, pspec );
|
||||||
|
if( argument_class &&
|
||||||
|
(argument_class->flags & VIPS_ARGUMENT_INPUT) )
|
||||||
|
g_object_set_property( G_OBJECT( operation ),
|
||||||
|
name, &value );
|
||||||
|
|
||||||
|
g_value_unset( &value );
|
||||||
|
|
||||||
|
name = va_arg( ap, char * );
|
||||||
|
}
|
||||||
|
|
||||||
return( 0 );
|
return( 0 );
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user