diff --git a/TODO b/TODO index c01db248..79076033 100644 --- a/TODO +++ b/TODO @@ -3,7 +3,7 @@ -- add ore sequential mode readers +- add more sequential mode readers $ grep -l write_line *.c csv.c diff --git a/libvips/foreign/foreign.c b/libvips/foreign/foreign.c index a938efb4..2b64d5bb 100644 --- a/libvips/foreign/foreign.c +++ b/libvips/foreign/foreign.c @@ -904,7 +904,7 @@ vips_foreign_load_class_init( VipsForeignLoadClass *class ) VIPS_ARGUMENT_REQUIRED_OUTPUT, G_STRUCT_OFFSET( VipsForeignLoad, out ) ); - VIPS_ARG_ENUM( class, "flags", 6, + VIPS_ARG_FLAGS( class, "flags", 6, _( "Flags" ), _( "Flags for this file" ), VIPS_ARGUMENT_OPTIONAL_OUTPUT, @@ -943,7 +943,8 @@ vips_foreign_tilecache( VipsImage *in, VipsImage **out, int strip_height ) vips_get_tile_size( in, &tile_width, &tile_height, &nlines ); /* We need two buffers, each with enough strips to make a complete - * buffer. And double to be safe. + * buffer. And double to be safe, since input buffers must be larger + * than output, and our buffers may not align exactly. */ nstrips = 2 * (1 + nlines / strip_height); diff --git a/libvips/include/vips/foreign.h b/libvips/include/vips/foreign.h index e1e9c15d..a16010e8 100644 --- a/libvips/include/vips/foreign.h +++ b/libvips/include/vips/foreign.h @@ -86,12 +86,12 @@ void *vips_foreign_map( const char *base, /* Image file load properties. */ -typedef enum { +typedef enum /*< flags >*/ { VIPS_FOREIGN_NONE = 0, /* No flags set */ VIPS_FOREIGN_PARTIAL = 1, /* Lazy read OK (eg. tiled tiff) */ VIPS_FOREIGN_SEQUENTIAL = 2, /* Top-to-bottom lazy read OK */ - VIPS_FOREIGN_BIGENDIAN = 3, /* Most-significant byte first */ - VIPS_FOREIGN_ALL = 4 /* All flags set */ + VIPS_FOREIGN_BIGENDIAN = 4, /* Most-significant byte first */ + VIPS_FOREIGN_ALL = 7 /* All flags set */ } VipsForeignFlags; #define VIPS_TYPE_FOREIGN_LOAD (vips_foreign_load_get_type()) diff --git a/libvips/include/vips/object.h b/libvips/include/vips/object.h index 6c7a899c..51c6f622 100644 --- a/libvips/include/vips/object.h +++ b/libvips/include/vips/object.h @@ -66,7 +66,7 @@ typedef struct _VipsObjectClass VipsObjectClass; * member of struct _VipsImage. We default its 'assigned' to TRUE * since the field is always set directly by C. */ -typedef enum { +typedef enum /*< flags >*/ { VIPS_ARGUMENT_NONE = 0, VIPS_ARGUMENT_REQUIRED = 1, VIPS_ARGUMENT_CONSTRUCT = 2, @@ -201,6 +201,19 @@ extern int _vips__argument_id; pspec, (FLAGS), (PRIORITY), (OFFSET) ); \ } +#define VIPS_ARG_FLAGS( CLASS, NAME, PRIORITY, LONG, DESC, \ + FLAGS, OFFSET, TYPE, VALUE ) { \ + GParamSpec *pspec; \ + \ + pspec = g_param_spec_flags( (NAME), (LONG), (DESC), \ + (TYPE), (VALUE), \ + G_PARAM_READWRITE );\ + g_object_class_install_property( G_OBJECT_CLASS( CLASS ), \ + _vips__argument_id++, pspec ); \ + vips_object_class_install_argument( VIPS_OBJECT_CLASS( CLASS ), \ + pspec, (FLAGS), (PRIORITY), (OFFSET) ); \ +} + #define VIPS_ARG_STRING( CLASS, NAME, PRIORITY, LONG, DESC, FLAGS, OFFSET, \ VALUE ) { \ GParamSpec *pspec; \ diff --git a/libvips/iofuncs/enumtypes.c b/libvips/iofuncs/enumtypes.c index 7bbaf637..c8eb8554 100644 --- a/libvips/iofuncs/enumtypes.c +++ b/libvips/iofuncs/enumtypes.c @@ -11,7 +11,7 @@ vips_foreign_flags_get_type( void ) static GType etype = 0; if( etype == 0 ) { - static const GEnumValue values[] = { + static const GFlagsValue values[] = { {VIPS_FOREIGN_NONE, "VIPS_FOREIGN_NONE", "none"}, {VIPS_FOREIGN_PARTIAL, "VIPS_FOREIGN_PARTIAL", "partial"}, {VIPS_FOREIGN_SEQUENTIAL, "VIPS_FOREIGN_SEQUENTIAL", "sequential"}, @@ -20,7 +20,7 @@ vips_foreign_flags_get_type( void ) {0, NULL, NULL} }; - etype = g_enum_register_static( "VipsForeignFlags", values ); + etype = g_flags_register_static( "VipsForeignFlags", values ); } return( etype ); @@ -499,7 +499,7 @@ vips_argument_flags_get_type( void ) static GType etype = 0; if( etype == 0 ) { - static const GEnumValue values[] = { + static const GFlagsValue values[] = { {VIPS_ARGUMENT_NONE, "VIPS_ARGUMENT_NONE", "none"}, {VIPS_ARGUMENT_REQUIRED, "VIPS_ARGUMENT_REQUIRED", "required"}, {VIPS_ARGUMENT_CONSTRUCT, "VIPS_ARGUMENT_CONSTRUCT", "construct"}, @@ -510,7 +510,7 @@ vips_argument_flags_get_type( void ) {0, NULL, NULL} }; - etype = g_enum_register_static( "VipsArgumentFlags", values ); + etype = g_flags_register_static( "VipsArgumentFlags", values ); } return( etype ); diff --git a/libvips/iofuncs/object.c b/libvips/iofuncs/object.c index 984f49e1..e4faeb48 100644 --- a/libvips/iofuncs/object.c +++ b/libvips/iofuncs/object.c @@ -998,6 +998,12 @@ vips_object_set_property( GObject *gobject, *member = g_value_get_enum( value ); } + else if( G_IS_PARAM_SPEC_FLAGS( pspec ) ) { + int *member = &G_STRUCT_MEMBER( int, object, + argument_class->offset ); + + *member = g_value_get_flags( value ); + } else if( G_IS_PARAM_SPEC_POINTER( pspec ) ) { gpointer *member = &G_STRUCT_MEMBER( gpointer, object, argument_class->offset ); @@ -1104,6 +1110,12 @@ vips_object_get_property( GObject *gobject, g_value_set_enum( value, *member ); } + else if( G_IS_PARAM_SPEC_FLAGS( pspec ) ) { + int *member = &G_STRUCT_MEMBER( int, object, + argument_class->offset ); + + g_value_set_flags( value, *member ); + } else if( G_IS_PARAM_SPEC_POINTER( pspec ) ) { gpointer *member = &G_STRUCT_MEMBER( gpointer, object, argument_class->offset ); @@ -1497,6 +1509,12 @@ vips_object_set_argument_from_string( VipsObject *object, g_value_init( &gvalue, otype ); g_value_set_enum( &gvalue, enum_value->value ); } + else if( G_IS_PARAM_SPEC_FLAGS( pspec ) ) { + /* Hard to set from a symbolic name. Just take an int. + */ + g_value_init( &gvalue, otype ); + g_value_set_flags( &gvalue, atoi( value ) ); + } else { g_value_init( &gvalue, G_TYPE_STRING ); g_value_set_string( &gvalue, value ); diff --git a/tools/vips.c b/tools/vips.c index 366374dd..c0074a1c 100644 --- a/tools/vips.c +++ b/tools/vips.c @@ -68,8 +68,8 @@ /* #define DEBUG - */ #define DEBUG_FATAL + */ /* Need to disable these sometimes. #undef DEBUG_FATAL