// walk the options and fetch any requested outputs void VOption::get_operation( VipsOperation *operation ) { std::list<Pair *>::iterator i; for( i = options.begin(); i != options.end(); ++i ) if( ! (*i)->input ) { const char *name = (*i)->name; g_object_get_property( G_OBJECT( operation ), name, &(*i)->value ); #ifdef VIPS_DEBUG_VERBOSE printf( "get_operation: " ); vips_object_print_name( VIPS_OBJECT( operation ) ); char *str_value = g_strdup_value_contents( &(*i)->value ); printf( ".%s = %s\n", name, str_value ); g_free( str_value ); #endif /*VIPS_DEBUG_VERBOSE*/ GValue *value = &(*i)->value; GType type = G_VALUE_TYPE( value ); if( type == VIPS_TYPE_IMAGE ) { // rebox object VipsImage *image = VIPS_IMAGE( g_value_get_object( value ) ); *((*i)->vimage) = VImage( image ); } else if( type == G_TYPE_INT ) *((*i)->vint) = g_value_get_int( value ); else if( type == G_TYPE_BOOLEAN ) *((*i)->vbool) = g_value_get_boolean( value ); else if( type == G_TYPE_DOUBLE ) *((*i)->vdouble) = g_value_get_double( value ); else if( type == VIPS_TYPE_ARRAY_DOUBLE ) { int length; double *array = vips_value_get_array_double( value, &length ); int j; ((*i)->vvector)->resize( length ); for( j = 0; j < length; j++ ) (*((*i)->vvector))[j] = array[j]; } else if( type == VIPS_TYPE_BLOB ) { // our caller gets a reference *((*i)->vblob) = (VipsBlob *) g_value_dup_boxed( value ); } } }
/** * vips_value_set_array_double: * @value: (out): %GValue to get from * @array: (array length=n): array of doubles * @n: the number of elements * * Set @value to hold a copy of @array. Pass in the array length in @n. * * See also: vips_array_double_get(). * * Returns: 0 on success, -1 otherwise. */ int vips_value_set_array_double( GValue *value, const double *array, int n ) { double *array_copy; g_value_init( value, VIPS_TYPE_ARRAY_DOUBLE ); vips_value_set_array( value, n, G_TYPE_DOUBLE, sizeof( double ) ); array_copy = vips_value_get_array_double( value, NULL ); memcpy( array_copy, array, n * sizeof( double ) ); return( 0 ); }
static void transform_array_double_g_string( const GValue *src_value, GValue *dest_value ) { int n; double *array = vips_value_get_array_double( src_value, &n ); char txt[1024]; VipsBuf buf = VIPS_BUF_STATIC( txt ); int i; for( i = 0; i < n; i++ ) /* Use space as a separator since ',' may be a decimal point * in this locale. */ vips_buf_appendf( &buf, "%g ", array[i] ); g_value_set_string( dest_value, vips_buf_all( &buf ) ); }
// input double array VOption * VOption::set( const char *name, std::vector<double> 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, 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 ); }