get goi try.py going

This commit is contained in:
John Cupitt 2012-01-02 11:06:04 +00:00
parent 9fc55c3011
commit 405b89b000
13 changed files with 72 additions and 21 deletions

View File

@ -65,6 +65,7 @@
vips_image_new_from_file() etc.
- VipsFormat is deprecated
- remove outchecks from documented API
- support gobject-introspection
12/10/11 started 7.26.6
- NOCACHE was not being set correctly on OS X causing performance

11
TODO
View File

@ -1,4 +1,10 @@
- revisit gio test prog and try to make a nice binding
- python/try.py
- have a ref leak
- try looping over operator props and looking up class and instance;
need to be able to get INPUT, OUTPUT, ASSIGNED etc
@ -10,7 +16,8 @@
- foreign docs come up as "VipsForeignSave", annoying, why?
- we can no longer have round brackets in filenames, argh
- we can no longer have round brackets in filenames, argh, maybe only allow
[]{} to enclose args
- add something to parse option sets backwards, so only trailing {}()[] are
seen

View File

@ -50,6 +50,7 @@ typedef struct _VipsObjectClass VipsObjectClass;
* @VIPS_ARGUMENT_REQUIRED: must be set in the constructor
* @VIPS_ARGUMENT_CONSTRUCT: can only be set in the constructor
* @VIPS_ARGUMENT_SET_ONCE: can only be set once
* @VIPS_ARGUMENT_SET_ALWAYS: don't do use-before-set checks
* @VIPS_ARGUMENT_INPUT: is an input argument (one we depend on)
* @VIPS_ARGUMENT_OUTPUT: is an output argument (depends on us)
*
@ -59,14 +60,20 @@ typedef struct _VipsObjectClass VipsObjectClass;
*
* Input gobjects are automatically reffed, output gobjects automatically ref
* us. We also automatically watch for "destroy" and unlink.
*
* @VIPS_ARGUMENT_SET_ALWAYS is handy for arguments which are set from C. For
* example, VipsImage::width is a property that gives access to the Xsize
* member of struct _VipsImage. We default its 'assigned' to TRUE
* since the field is always set directly by C.
*/
typedef enum {
VIPS_ARGUMENT_NONE = 0,
VIPS_ARGUMENT_REQUIRED = 1,
VIPS_ARGUMENT_CONSTRUCT = 2,
VIPS_ARGUMENT_SET_ONCE = 4,
VIPS_ARGUMENT_INPUT = 8,
VIPS_ARGUMENT_OUTPUT = 16
VIPS_ARGUMENT_SET_ALWAYS = 8,
VIPS_ARGUMENT_INPUT = 16,
VIPS_ARGUMENT_OUTPUT = 32
} VipsArgumentFlags;
/* Useful flag combinations. User-visible ones are:

View File

@ -480,6 +480,7 @@ vips_argument_flags_get_type( void )
{VIPS_ARGUMENT_REQUIRED, "VIPS_ARGUMENT_REQUIRED", "required"},
{VIPS_ARGUMENT_CONSTRUCT, "VIPS_ARGUMENT_CONSTRUCT", "construct"},
{VIPS_ARGUMENT_SET_ONCE, "VIPS_ARGUMENT_SET_ONCE", "set-once"},
{VIPS_ARGUMENT_SET_ALWAYS, "VIPS_ARGUMENT_SET_ALWAYS", "set-always"},
{VIPS_ARGUMENT_INPUT, "VIPS_ARGUMENT_INPUT", "input"},
{VIPS_ARGUMENT_OUTPUT, "VIPS_ARGUMENT_OUTPUT", "output"},
{0, NULL, NULL}

View File

@ -838,70 +838,70 @@ vips_image_class_init( VipsImageClass *class )
VIPS_ARG_INT( class, "width", 2,
_( "Width" ),
_( "Image width in pixels" ),
VIPS_ARGUMENT_NONE,
VIPS_ARGUMENT_SET_ALWAYS,
G_STRUCT_OFFSET( VipsImage, Xsize ),
0, 1000000, 0 );
VIPS_ARG_INT( class, "height", 3,
_( "Height" ),
_( "Image height in pixels" ),
VIPS_ARGUMENT_NONE,
VIPS_ARGUMENT_SET_ALWAYS,
G_STRUCT_OFFSET( VipsImage, Ysize ),
0, 1000000, 0 );
VIPS_ARG_INT( class, "bands", 4,
_( "Bands" ),
_( "Number of bands in image" ),
VIPS_ARGUMENT_NONE,
VIPS_ARGUMENT_SET_ALWAYS,
G_STRUCT_OFFSET( VipsImage, Bands ),
0, 1000000, 0 );
VIPS_ARG_ENUM( class, "format", 5,
_( "Format" ),
_( "Pixel format in image" ),
VIPS_ARGUMENT_NONE,
VIPS_ARGUMENT_SET_ALWAYS,
G_STRUCT_OFFSET( VipsImage, BandFmt ),
VIPS_TYPE_BAND_FORMAT, VIPS_FORMAT_UCHAR );
VIPS_ARG_ENUM( class, "coding", 6,
_( "Coding" ),
_( "Pixel coding" ),
VIPS_ARGUMENT_NONE,
VIPS_ARGUMENT_SET_ALWAYS,
G_STRUCT_OFFSET( VipsImage, Coding ),
VIPS_TYPE_CODING, VIPS_CODING_NONE );
VIPS_ARG_ENUM( class, "interpretation", 7,
_( "Interpretation" ),
_( "Pixel interpretation" ),
VIPS_ARGUMENT_NONE,
VIPS_ARGUMENT_SET_ALWAYS,
G_STRUCT_OFFSET( VipsImage, Type ),
VIPS_TYPE_INTERPRETATION, VIPS_INTERPRETATION_MULTIBAND );
VIPS_ARG_DOUBLE( class, "xres", 8,
_( "Xres" ),
_( "Horizontal resolution in pixels/mm" ),
VIPS_ARGUMENT_NONE,
VIPS_ARGUMENT_SET_ALWAYS,
G_STRUCT_OFFSET( VipsImage, Xres ),
0, 1000000, 0 );
VIPS_ARG_DOUBLE( class, "yres", 9,
_( "Yres" ),
_( "Vertical resolution in pixels/mm" ),
VIPS_ARGUMENT_NONE,
VIPS_ARGUMENT_SET_ALWAYS,
G_STRUCT_OFFSET( VipsImage, Yres ),
0, 1000000, 0 );
VIPS_ARG_INT( class, "xoffset", 10,
_( "Xoffset" ),
_( "Horizontal offset of origin" ),
VIPS_ARGUMENT_NONE,
VIPS_ARGUMENT_SET_ALWAYS,
G_STRUCT_OFFSET( VipsImage, Xoffset ),
-1000000, 1000000, 0 );
VIPS_ARG_INT( class, "yoffset", 11,
_( "Yoffset" ),
_( "Vertical offset of origin" ),
VIPS_ARGUMENT_NONE,
VIPS_ARGUMENT_SET_ALWAYS,
G_STRUCT_OFFSET( VipsImage, Yoffset ),
-1000000, 1000000, 0 );
@ -922,7 +922,7 @@ vips_image_class_init( VipsImageClass *class )
VIPS_ARG_BOOL( class, "kill", 14,
_( "Kill" ),
_( "Block evaluation on this image" ),
VIPS_ARGUMENT_NONE,
VIPS_ARGUMENT_SET_ALWAYS,
G_STRUCT_OFFSET( VipsImage, kill ),
FALSE );

View File

@ -426,7 +426,11 @@ vips_argument_init( VipsObject *object )
((VipsArgument *) argument_instance)->pspec = pspec;
argument_instance->argument_class = argument_class;
argument_instance->object = object;
argument_instance->assigned = FALSE;
/* SET_ALWAYS args default to assigned.
*/
argument_instance->assigned =
argument_class->flags &
VIPS_ARGUMENT_SET_ALWAYS;
argument_instance->close_id = 0;
vips_argument_table_replace( object->argument_table,
@ -486,8 +490,7 @@ vips_object_get_argument( VipsObject *object, const char *name,
!(*argument_instance = vips__argument_get_instance(
*argument_class, object )) ) {
vips_error( VIPS_OBJECT_CLASS( class )->nickname,
_( "vips argument `%s' has no instance" ),
G_OBJECT_TYPE_NAME( object ), name );
_( "vips argument `%s' has no instance" ), name );
return( -1 );
}
@ -943,9 +946,10 @@ vips_object_set_property( GObject *gobject,
*member = g_value_dup_boxed( value );
}
else {
g_warning( "%s: %s unimplemented property type %s",
g_warning( "%s: %s.%s unimplemented property type %s",
G_STRLOC,
G_OBJECT_TYPE_NAME( gobject ),
g_param_spec_get_name( pspec ),
g_type_name( G_PARAM_SPEC_VALUE_TYPE( pspec ) ) );
}
@ -976,9 +980,10 @@ vips_object_get_property( GObject *gobject,
g_assert( ((VipsArgument *) argument_class)->pspec == pspec );
if( !argument_instance->assigned ) {
g_warning( "%s: %s attempt to read unset property %s",
g_warning( "%s: %s.%s attempt to read unset %s property",
G_STRLOC,
G_OBJECT_TYPE_NAME( gobject ),
g_param_spec_get_name( pspec ),
g_type_name( G_PARAM_SPEC_VALUE_TYPE( pspec ) ) );
return;
}
@ -1041,9 +1046,10 @@ vips_object_get_property( GObject *gobject,
g_value_set_boxed( value, *member );
}
else {
g_warning( "%s: %s unimplemented property type %s",
g_warning( "%s: %s.%s unimplemented property type %s",
G_STRLOC,
G_OBJECT_TYPE_NAME( gobject ),
g_param_spec_get_name( pspec ),
g_type_name( G_PARAM_SPEC_VALUE_TYPE( pspec ) ) );
}
}

View File

@ -7,6 +7,8 @@ import sys
# export GI_TYPELIB_PATH=$VIPSHOME/lib/girepository-1.0
from gi.repository import Vips
print 'long way around:'
a = Vips.Image()
a.props.filename = sys.argv[1]
a.props.mode = 'r'
@ -17,8 +19,35 @@ if a.build() != 0:
print 'a.get_width() =', a.get_width()
print 'a.props.width =', a.props.width
print 'direct call:'
a = Vips.Image.new_from_file(sys.argv[1])
print 'a.get_width() =', a.get_width()
print 'a.props.width =', a.props.width
print 'call operation:'
op = Vips.Operation.new("add")
for prop in op.props:
print 'prop =', prop
op.props.left = a
op.props.right = a
if op.build() != 0:
print Vips.error_buffer()
sys.exit(-1)
out = op.props.out
print 'out.get_format() =', out.get_format()
print 'out.props.format =', out.props.format
out.write_to_file("x.v")
print 'starting shutdown ...'
del a
del op
del out
# sometimes have to do several GCs to get them all, not sure why
for i in range(10):
gc.collect ()