diff --git a/TODO b/TODO index e4cd3136..eccd1d2d 100644 --- a/TODO +++ b/TODO @@ -1,52 +1,16 @@ -- embed args are in the wrong order - - $ vips embed - vips_embed_class_init - VipsEmbed (embed), embed an image in a larger image - embed input type x y width height out +- try + + $ vips max + im_max (max), maximum value of image, from package "arithmetic" + max in where: - input :: VipsImage (input) - type :: gint (input) - x :: gint (input) - y :: gint (input) - width :: gint (input) - height :: gint (input) - out :: VipsImage (output) + in :: VipsImage (input) + from package "arithmetic" + flags: (PIO function) (no coordinate transformation) (area + operation) (result can be cached) - how can we fix this? + no output arg? - need to give an extra arg to vips_object_class_install_argument() to - specify 'argument priority' ... show args in priority order - - - -- try some macros for arg specification - - pspec = g_param_spec_int( "y", "Y", - _( "Top edge of input in output" ), - 0, 1000000, 0, - G_PARAM_READWRITE ); - g_object_class_install_property( gobject_class, PROP_Y, pspec ); - vips_object_class_install_argument( vobject_class, pspec, - VIPS_ARGUMENT_REQUIRED_INPUT, - G_STRUCT_OFFSET( VipsEmbed, y ) ); - - could become - - VIPS_ARG_INT( class, "y", "Y", - _( "Top edge of input in output" ), - 0, 1000000, 0, - VIPS_ARGUMENT_REQUIRED_INPUT, - G_STRUCT_OFFSET( VipsEmbed, y ) ); - - could get rid of PROP_ enums as well - - - doing binary.c next - - - -- make 'type' field to embed an enum? @@ -64,9 +28,11 @@ -- do clip/embed etc. in new style, good to get everything that VipsAdd uses in +- do clip etc. in new style, good to get everything that VipsAdd uses in the new stack + embed needs flip* *join extract_area replicate insert + diff --git a/libvips/arithmetic/arithmetic.c b/libvips/arithmetic/arithmetic.c index 2ccb7712..3cd9cb68 100644 --- a/libvips/arithmetic/arithmetic.c +++ b/libvips/arithmetic/arithmetic.c @@ -94,20 +94,20 @@ vips_arithmetic_class_init( VipsArithmeticClass *class ) vobject_class->description = _( "arithmetic operations" ); vobject_class->build = vips_arithmetic_build; - VIPS_ARG_IMAGE( class, "out", 1, + VIPS_ARG_IMAGE( class, "out", 100, _( "Output" ), _( "Output image" ), VIPS_ARGUMENT_REQUIRED_OUTPUT, G_STRUCT_OFFSET( VipsArithmetic, output ) ); - VIPS_ARG_BOOL( class, "booltest", 2, + VIPS_ARG_BOOL( class, "booltest", 1, _( "Bool test" ), _( "Test optional boolean argument" ), VIPS_ARGUMENT_OPTIONAL_INPUT, G_STRUCT_OFFSET( VipsArithmetic, booltest ), FALSE ); - VIPS_ARG_IMAGE( class, "imtest", 3, + VIPS_ARG_IMAGE( class, "imtest", 2, _( "Image test" ), _( "Test optional image argument" ), VIPS_ARGUMENT_OPTIONAL_INPUT, diff --git a/libvips/arithmetic/binary.c b/libvips/arithmetic/binary.c index 5cddaaa8..2a76eeb2 100644 --- a/libvips/arithmetic/binary.c +++ b/libvips/arithmetic/binary.c @@ -349,17 +349,19 @@ vips_binary_class_init( VipsBinaryClass *class ) /* Create properties. */ - VIPS_ARG_IMAGE( class, "right", 1, + + VIPS_ARG_IMAGE( class, "left", 1, + _( "Left" ), + _( "Left-hand image argument" ), + VIPS_ARGUMENT_REQUIRED_INPUT, + G_STRUCT_OFFSET( VipsBinary, left ) ); + + VIPS_ARG_IMAGE( class, "right", 2, _( "Right" ), _( "Right-hand image argument" ), VIPS_ARGUMENT_REQUIRED_INPUT, G_STRUCT_OFFSET( VipsBinary, right ) ); - VIPS_ARG_IMAGE( class, "left", 2, - _( "Left" ), - _( "Left-hand image argument" ), - VIPS_ARGUMENT_REQUIRED_INPUT, - G_STRUCT_OFFSET( VipsBinary, left ) ); } static void diff --git a/libvips/arithmetic/statistic.c b/libvips/arithmetic/statistic.c index d0e77ef4..d9181bd2 100644 --- a/libvips/arithmetic/statistic.c +++ b/libvips/arithmetic/statistic.c @@ -147,7 +147,7 @@ vips_statistic_class_init( VipsStatisticClass *class ) vobject_class->description = _( "VIPS statistic operations" ); vobject_class->build = vips_statistic_build; - VIPS_ARG_IMAGE( class, "in", 1, + VIPS_ARG_IMAGE( class, "in", 0, _( "Input" ), _( "Input image" ), VIPS_ARGUMENT_REQUIRED_INPUT, diff --git a/libvips/conversion/copy.c b/libvips/conversion/copy.c index 5d9a3685..6d914c56 100644 --- a/libvips/conversion/copy.c +++ b/libvips/conversion/copy.c @@ -348,70 +348,70 @@ vips_copy_class_init( VipsCopyClass *class ) G_STRUCT_OFFSET( VipsCopy, swap ), FALSE ); - VIPS_ARG_INT( class, "width", 2, + VIPS_ARG_INT( class, "width", 3, _( "Width" ), _( "Image width in pixels" ), VIPS_ARGUMENT_OPTIONAL_INPUT, G_STRUCT_OFFSET( VipsCopy, width ), 0, 1000000, 0 ); - VIPS_ARG_INT( class, "height", 3, + VIPS_ARG_INT( class, "height", 4, _( "Height" ), _( "Image height in pixels" ), VIPS_ARGUMENT_OPTIONAL_INPUT, G_STRUCT_OFFSET( VipsCopy, height ), 0, 1000000, 0 ); - VIPS_ARG_INT( class, "bands", 4, + VIPS_ARG_INT( class, "bands", 5, _( "Bands" ), _( "Number of bands in image" ), VIPS_ARGUMENT_OPTIONAL_INPUT, G_STRUCT_OFFSET( VipsCopy, bands ), 0, 1000000, 0 ); - VIPS_ARG_ENUM( class, "format", 5, + VIPS_ARG_ENUM( class, "format", 6, _( "Format" ), _( "Pixel format in image" ), VIPS_ARGUMENT_OPTIONAL_INPUT, G_STRUCT_OFFSET( VipsCopy, format ), VIPS_TYPE_BAND_FORMAT, VIPS_FORMAT_UCHAR ); - VIPS_ARG_ENUM( class, "coding", 6, + VIPS_ARG_ENUM( class, "coding", 7, _( "Coding" ), _( "Pixel coding" ), VIPS_ARGUMENT_OPTIONAL_INPUT, G_STRUCT_OFFSET( VipsCopy, coding ), VIPS_TYPE_CODING, VIPS_CODING_NONE ); - VIPS_ARG_ENUM( class, "interpretation", 7, + VIPS_ARG_ENUM( class, "interpretation", 8, _( "Interpretation" ), _( "Pixel interpretation" ), VIPS_ARGUMENT_OPTIONAL_INPUT, G_STRUCT_OFFSET( VipsCopy, interpretation ), VIPS_TYPE_INTERPRETATION, VIPS_INTERPRETATION_MULTIBAND ); - VIPS_ARG_DOUBLE( class, "xres", 8, + VIPS_ARG_DOUBLE( class, "xres", 9, _( "Xres" ), _( "Horizontal resolution in pixels/mm" ), VIPS_ARGUMENT_OPTIONAL_INPUT, G_STRUCT_OFFSET( VipsCopy, xres ), 0, 1000000, 0 ); - VIPS_ARG_DOUBLE( class, "yres", 9, + VIPS_ARG_DOUBLE( class, "yres", 10, _( "Yres" ), _( "Vertical resolution in pixels/mm" ), VIPS_ARGUMENT_OPTIONAL_INPUT, G_STRUCT_OFFSET( VipsCopy, yres ), 0, 1000000, 0 ); - VIPS_ARG_INT( class, "xoffset", 10, + VIPS_ARG_INT( class, "xoffset", 11, _( "Xoffset" ), _( "Horizontal offset of origin" ), VIPS_ARGUMENT_OPTIONAL_INPUT, G_STRUCT_OFFSET( VipsCopy, xoffset ), -1000000, 1000000, 0 ); - VIPS_ARG_INT( class, "yoffset", 11, + VIPS_ARG_INT( class, "yoffset", 12, _( "Yoffset" ), _( "Vertical offset of origin" ), VIPS_ARGUMENT_OPTIONAL_INPUT, diff --git a/libvips/conversion/embed.c b/libvips/conversion/embed.c index 00431db0..47387464 100644 --- a/libvips/conversion/embed.c +++ b/libvips/conversion/embed.c @@ -75,13 +75,14 @@ * VipsEmbed: * @in: input image * @out: output image - * @type: how to generate the edge pixels + * @extend: how to generate the edge pixels * @x: place @in at this x position in @out * @y: place @in at this y position in @out * @width: @out should be this many pixels across * @height: @out should be this many pixels down * - * The opposite of im_extract(): embed an image within a larger image. @type + * The opposite of im_extract(): embed @in within an image of size @width by + * @height at position @x, @y. @extend * controls what appears in the new pels, see #VipsExtend. * * See also: im_extract_area(), im_insert(). @@ -96,7 +97,7 @@ typedef struct _VipsEmbed { */ VipsImage *input; - VipsExtend type; + VipsExtend extend; int x; int y; int width; @@ -104,13 +105,13 @@ typedef struct _VipsEmbed { /* Geometry calculations. */ - Rect rout; /* Whole output area */ - Rect rsub; /* Rect occupied by image */ + VipsRect rout; /* Whole output area */ + VipsRect rsub; /* Rect occupied by image */ /* The 8 border pieces. The 4 borders strictly up/down/left/right of * the main image, and the 4 corner pieces. */ - Rect border[8]; + VipsRect border[8]; } VipsEmbed; typedef VipsConversionClass VipsEmbedClass; @@ -267,17 +268,17 @@ vips_embed_gen( VipsRegion *or, void *seq, void *a, void *b, gboolean *stop ) ovl.top += embed->y; } - switch( embed->type ) { - case 0: - case 4: + switch( embed->extend ) { + case VIPS_EXTEND_BLACK: + case VIPS_EXTEND_WHITE: /* Paint the borders a solid value. */ for( i = 0; i < 8; i++ ) vips_region_paint( or, &embed->border[i], - embed->type == 0 ? 0 : 255 ); + embed->extend == 0 ? 0 : 255 ); break; - case 1: + case VIPS_EXTEND_COPY: /* Extend the borders. */ for( i = 0; i < 8; i++ ) { @@ -338,8 +339,8 @@ vips_embed_build( VipsObject *object ) if( vips_image_pio_input( embed->input ) || vips_image_pio_output( conversion->output ) ) return( -1 ); - if( embed->type < 0 || embed->type > 4 ) { - vips_error( "VipsEmbed", "%s", _( "unknown type" ) ); + if( embed->extend < 0 || embed->extend >= VIPS_EXTEND_LAST ) { + vips_error( "VipsEmbed", "%s", _( "unknown VipsExtend" ) ); return( -1 ); } @@ -351,8 +352,8 @@ vips_embed_build( VipsObject *object ) embed->height == embed->input->Ysize ) return( vips_image_write( embed->input, conversion->output ) ); - switch( embed->type ) { - case 2: + switch( embed->extend ) { + case VIPS_EXTEND_REPEAT: { /* Clock arithmetic: we want negative x/y to wrap around * nicely. @@ -377,7 +378,7 @@ vips_embed_build( VipsObject *object ) } break; - case 3: + case VIPS_EXTEND_MIRROR: { /* As case 2, but the tiles are twice the size because of * mirroring. @@ -586,11 +587,11 @@ vips_embed_class_init( VipsEmbedClass *class ) G_STRUCT_OFFSET( VipsEmbed, y ), -1000000, 1000000, 0 ); - VIPS_ARG_ENUM( class, "type", 6, - _( "type" ), + VIPS_ARG_ENUM( class, "extend", 6, + _( "Extend" ), _( "How to generate the extra pixels" ), VIPS_ARGUMENT_OPTIONAL_INPUT, - G_STRUCT_OFFSET( VipsEmbed, type ), + G_STRUCT_OFFSET( VipsEmbed, extend ), VIPS_TYPE_EXTEND, VIPS_EXTEND_BLACK ); } diff --git a/libvips/include/vips/conversion.h b/libvips/include/vips/conversion.h index 81401dc2..91bf5421 100644 --- a/libvips/include/vips/conversion.h +++ b/libvips/include/vips/conversion.h @@ -72,7 +72,8 @@ typedef enum { VIPS_EXTEND_COPY = 1, VIPS_EXTEND_REPEAT = 2, VIPS_EXTEND_MIRROR = 3, - VIPS_EXTEND_WHITE = 4 + VIPS_EXTEND_WHITE = 4, + VIPS_EXTEND_LAST = 5 } VipsExtend; int vips_copy( VipsImage *in, VipsImage **out, ... ) diff --git a/libvips/iofuncs/enumtypes.c b/libvips/iofuncs/enumtypes.c index 6f158c5b..cfdc48bd 100644 --- a/libvips/iofuncs/enumtypes.c +++ b/libvips/iofuncs/enumtypes.c @@ -17,6 +17,7 @@ vips_extend_get_type( void ) {VIPS_EXTEND_REPEAT, "VIPS_EXTEND_REPEAT", "repeat"}, {VIPS_EXTEND_MIRROR, "VIPS_EXTEND_MIRROR", "mirror"}, {VIPS_EXTEND_WHITE, "VIPS_EXTEND_WHITE", "white"}, + {VIPS_EXTEND_LAST, "VIPS_EXTEND_LAST", "last"}, {0, NULL, NULL} }; diff --git a/libvips/iofuncs/image.c b/libvips/iofuncs/image.c index ceade629..4ba02e3a 100644 --- a/libvips/iofuncs/image.c +++ b/libvips/iofuncs/image.c @@ -952,70 +952,70 @@ vips_image_class_init( VipsImageClass *class ) VIPS_ARG_INT( class, "width", 2, _( "Width" ), _( "Image width in pixels" ), - VIPS_ARGUMENT_OPTIONAL_INPUT, + VIPS_ARGUMENT_SET_ONCE, G_STRUCT_OFFSET( VipsImage, Xsize ), 0, 1000000, 0 ); VIPS_ARG_INT( class, "height", 3, _( "Height" ), _( "Image height in pixels" ), - VIPS_ARGUMENT_OPTIONAL_INPUT, + VIPS_ARGUMENT_SET_ONCE, G_STRUCT_OFFSET( VipsImage, Ysize ), 0, 1000000, 0 ); VIPS_ARG_INT( class, "bands", 4, _( "Bands" ), _( "Number of bands in image" ), - VIPS_ARGUMENT_OPTIONAL_INPUT, + VIPS_ARGUMENT_SET_ONCE, G_STRUCT_OFFSET( VipsImage, Bands ), 0, 1000000, 0 ); VIPS_ARG_ENUM( class, "format", 5, _( "Format" ), _( "Pixel format in image" ), - VIPS_ARGUMENT_OPTIONAL_INPUT, + VIPS_ARGUMENT_SET_ONCE, G_STRUCT_OFFSET( VipsImage, BandFmt ), VIPS_TYPE_BAND_FORMAT, VIPS_FORMAT_UCHAR ); VIPS_ARG_ENUM( class, "coding", 6, _( "Coding" ), _( "Pixel coding" ), - VIPS_ARGUMENT_OPTIONAL_INPUT, + VIPS_ARGUMENT_SET_ONCE, G_STRUCT_OFFSET( VipsImage, Coding ), VIPS_TYPE_CODING, VIPS_CODING_NONE ); VIPS_ARG_ENUM( class, "interpretation", 7, _( "Interpretation" ), _( "Pixel interpretation" ), - VIPS_ARGUMENT_OPTIONAL_INPUT, + VIPS_ARGUMENT_SET_ONCE, 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_OPTIONAL_INPUT, + VIPS_ARGUMENT_SET_ONCE, G_STRUCT_OFFSET( VipsImage, Xres ), 0, 1000000, 0 ); VIPS_ARG_DOUBLE( class, "yres", 9, _( "Yres" ), _( "Vertical resolution in pixels/mm" ), - VIPS_ARGUMENT_OPTIONAL_INPUT, + VIPS_ARGUMENT_SET_ONCE, G_STRUCT_OFFSET( VipsImage, Yres ), 0, 1000000, 0 ); VIPS_ARG_INT( class, "xoffset", 10, _( "Xoffset" ), _( "Horizontal offset of origin" ), - VIPS_ARGUMENT_OPTIONAL_INPUT, + VIPS_ARGUMENT_SET_ONCE, G_STRUCT_OFFSET( VipsImage, Xoffset ), -1000000, 1000000, 0 ); VIPS_ARG_INT( class, "yoffset", 11, _( "Yoffset" ), _( "Vertical offset of origin" ), - VIPS_ARGUMENT_OPTIONAL_INPUT, + VIPS_ARGUMENT_SET_ONCE, G_STRUCT_OFFSET( VipsImage, Yoffset ), -1000000, 1000000, 0 ); @@ -1030,7 +1030,7 @@ vips_image_class_init( VipsImageClass *class ) _( "Mode" ), _( "Open mode" ), VIPS_ARGUMENT_CONSTRUCT, - G_STRUCT_OFFSET( VipsImage, filename ), + G_STRUCT_OFFSET( VipsImage, mode ), "p" ); VIPS_ARG_BOOL( class, "kill", 14, diff --git a/libvips/iofuncs/object.c b/libvips/iofuncs/object.c index 2151cd74..77179e99 100644 --- a/libvips/iofuncs/object.c +++ b/libvips/iofuncs/object.c @@ -64,7 +64,7 @@ static GMutex *vips__object_all_lock = NULL; static guint vips_object_signals[SIG_LAST] = { 0 }; -int _vips__argument_id = 0; +int _vips__argument_id = 1; G_DEFINE_ABSTRACT_TYPE( VipsObject, vips_object, G_TYPE_OBJECT );