argh revert the arg order change

we need to patch bindings instead
This commit is contained in:
John Cupitt 2017-03-13 08:24:06 +00:00
parent d854c18a2f
commit 51f96ce9af
9 changed files with 158 additions and 126 deletions

View File

@ -34,9 +34,6 @@
- vips_region_shrink() knows about alpha, helps dzsave and tiffsave - vips_region_shrink() knows about alpha, helps dzsave and tiffsave
- use expat, not libxml, for XML load ... removes a required dependency, since - use expat, not libxml, for XML load ... removes a required dependency, since
we get expat as part of glib we get expat as part of glib
- the C functions vips_math2_const(), vips_boolean_const() and
vips_relational_const() have changed argument order to match
Python/CLI/C++ ... sorry
- added vips_rot90() etc. convenience functions - added vips_rot90() etc. convenience functions
- fix vips_resize() bug when hscale and vscale were very different - fix vips_resize() bug when hscale and vscale were very different

48
TODO
View File

@ -1,3 +1,50 @@
- oh argh, need to swap _const args back
8.4 had:
$ vips relational_const
relational operations against a constant
usage:
relational_const in out relational c
where:
in - Input image, input VipsImage
out - Output image, output VipsImage
relational - relational to perform, input VipsOperationRelational
default: equal
allowed: equal, noteq, less, lesseq, more, moreeq
c - Array of constants, input VipsArrayDouble
operation flags: sequential-unbuffered
$ vips boolean_const
boolean operations against a constant
usage:
boolean_const in out boolean c
where:
in - Input image, input VipsImage
out - Output image, output VipsImage
boolean - boolean to perform, input VipsOperationBoolean
default: and
allowed: and, or, eor, lshift, rshift
c - Array of constants, input VipsArrayDouble
operation flags: sequential-unbuffered
$ vips math2_const
pow( @in, @c )
usage:
math2_const in out math2 c
where:
in - Input image, input VipsImage
out - Output image, output VipsImage
math2 - math to perform, input VipsOperationMath2
default: pow
allowed: pow, wop
c - Array of constants, input VipsArrayDouble
operation flags: sequential-unbuffered
- not sure about utf8 error messages on win - not sure about utf8 error messages on win
- strange: - strange:
@ -421,4 +468,3 @@ new operations
http://www.nature.com/srep/2015/150730/srep12096/full/srep12096.html http://www.nature.com/srep/2015/150730/srep12096/full/srep12096.html
sounds useful for BM? sounds useful for BM?

View File

@ -533,7 +533,7 @@ vips_boolean_const_init( VipsBooleanConst *boolean_const )
static int static int
vips_boolean_constv( VipsImage *in, VipsImage **out, vips_boolean_constv( VipsImage *in, VipsImage **out,
double *c, int n, VipsOperationBoolean operation, va_list ap ) VipsOperationBoolean operation, double *c, int n, va_list ap )
{ {
VipsArea *area_c; VipsArea *area_c;
double *array; double *array;
@ -546,7 +546,7 @@ vips_boolean_constv( VipsImage *in, VipsImage **out,
array[i] = c[i]; array[i] = c[i];
result = vips_call_split( "boolean_const", ap, result = vips_call_split( "boolean_const", ap,
in, out, area_c, operation ); in, out, operation, area_c );
vips_area_unref( area_c ); vips_area_unref( area_c );
@ -557,9 +557,9 @@ vips_boolean_constv( VipsImage *in, VipsImage **out,
* vips_boolean_const: * vips_boolean_const:
* @in: input image * @in: input image
* @out: output image * @out: output image
* @boolean: boolean operation to perform
* @c: array of constants * @c: array of constants
* @n: number of constants in @c * @n: number of constants in @c
* @boolean: boolean operation to perform
* @...: %NULL-terminated list of optional named arguments * @...: %NULL-terminated list of optional named arguments
* *
* Perform various boolean operations on an image against an array of * Perform various boolean operations on an image against an array of
@ -580,13 +580,13 @@ vips_boolean_constv( VipsImage *in, VipsImage **out,
*/ */
int int
vips_boolean_const( VipsImage *in, VipsImage **out, vips_boolean_const( VipsImage *in, VipsImage **out,
double *c, int n, VipsOperationBoolean boolean, ... ) VipsOperationBoolean boolean, double *c, int n, ... )
{ {
va_list ap; va_list ap;
int result; int result;
va_start( ap, boolean ); va_start( ap, n );
result = vips_boolean_constv( in, out, c, n, boolean, ap ); result = vips_boolean_constv( in, out, boolean, c, n, ap );
va_end( ap ); va_end( ap );
return( result ); return( result );
@ -615,7 +615,7 @@ vips_andimage_const( VipsImage *in, VipsImage **out, double *c, int n, ... )
va_start( ap, n ); va_start( ap, n );
result = vips_boolean_constv( in, out, result = vips_boolean_constv( in, out,
c, n, VIPS_OPERATION_BOOLEAN_AND, ap ); VIPS_OPERATION_BOOLEAN_AND, c, n, ap );
va_end( ap ); va_end( ap );
return( result ); return( result );
@ -644,7 +644,7 @@ vips_orimage_const( VipsImage *in, VipsImage **out, double *c, int n, ... )
va_start( ap, n ); va_start( ap, n );
result = vips_boolean_constv( in, out, result = vips_boolean_constv( in, out,
c, n, VIPS_OPERATION_BOOLEAN_OR, ap ); VIPS_OPERATION_BOOLEAN_OR, c, n, ap );
va_end( ap ); va_end( ap );
return( result ); return( result );
@ -673,7 +673,7 @@ vips_eorimage_const( VipsImage *in, VipsImage **out, double *c, int n, ... )
va_start( ap, n ); va_start( ap, n );
result = vips_boolean_constv( in, out, result = vips_boolean_constv( in, out,
c, n, VIPS_OPERATION_BOOLEAN_EOR, ap ); VIPS_OPERATION_BOOLEAN_EOR, c, n, ap );
va_end( ap ); va_end( ap );
return( result ); return( result );
@ -702,7 +702,7 @@ vips_lshift_const( VipsImage *in, VipsImage **out, double *c, int n, ... )
va_start( ap, n ); va_start( ap, n );
result = vips_boolean_constv( in, out, result = vips_boolean_constv( in, out,
c, n, VIPS_OPERATION_BOOLEAN_LSHIFT, ap ); VIPS_OPERATION_BOOLEAN_LSHIFT, c, n, ap );
va_end( ap ); va_end( ap );
return( result ); return( result );
@ -731,7 +731,7 @@ vips_rshift_const( VipsImage *in, VipsImage **out, double *c, int n, ... )
va_start( ap, n ); va_start( ap, n );
result = vips_boolean_constv( in, out, result = vips_boolean_constv( in, out,
c, n, VIPS_OPERATION_BOOLEAN_RSHIFT, ap ); VIPS_OPERATION_BOOLEAN_RSHIFT, c, n, ap );
va_end( ap ); va_end( ap );
return( result ); return( result );
@ -754,13 +754,13 @@ vips_rshift_const( VipsImage *in, VipsImage **out, double *c, int n, ... )
*/ */
int int
vips_boolean_const1( VipsImage *in, VipsImage **out, vips_boolean_const1( VipsImage *in, VipsImage **out,
double c, VipsOperationBoolean boolean, ... ) VipsOperationBoolean boolean, double c, ... )
{ {
va_list ap; va_list ap;
int result; int result;
va_start( ap, boolean ); va_start( ap, c );
result = vips_boolean_constv( in, out, &c, 1, boolean, ap ); result = vips_boolean_constv( in, out, boolean, &c, 1, ap );
va_end( ap ); va_end( ap );
return( result ); return( result );
@ -788,7 +788,7 @@ vips_andimage_const1( VipsImage *in, VipsImage **out, double c, ... )
va_start( ap, c ); va_start( ap, c );
result = vips_boolean_constv( in, out, result = vips_boolean_constv( in, out,
&c, 1, VIPS_OPERATION_BOOLEAN_AND, ap ); VIPS_OPERATION_BOOLEAN_AND, &c, 1, ap );
va_end( ap ); va_end( ap );
return( result ); return( result );
@ -816,7 +816,7 @@ vips_orimage_const1( VipsImage *in, VipsImage **out, double c, ... )
va_start( ap, c ); va_start( ap, c );
result = vips_boolean_constv( in, out, result = vips_boolean_constv( in, out,
&c, 1, VIPS_OPERATION_BOOLEAN_OR, ap ); VIPS_OPERATION_BOOLEAN_OR, &c, 1, ap );
va_end( ap ); va_end( ap );
return( result ); return( result );
@ -844,7 +844,7 @@ vips_eorimage_const1( VipsImage *in, VipsImage **out, double c, ... )
va_start( ap, c ); va_start( ap, c );
result = vips_boolean_constv( in, out, result = vips_boolean_constv( in, out,
&c, 1, VIPS_OPERATION_BOOLEAN_EOR, ap ); VIPS_OPERATION_BOOLEAN_EOR, &c, 1, ap );
va_end( ap ); va_end( ap );
return( result ); return( result );
@ -872,7 +872,7 @@ vips_lshift_const1( VipsImage *in, VipsImage **out, double c, ... )
va_start( ap, c ); va_start( ap, c );
result = vips_boolean_constv( in, out, result = vips_boolean_constv( in, out,
&c, 1, VIPS_OPERATION_BOOLEAN_LSHIFT, ap ); VIPS_OPERATION_BOOLEAN_LSHIFT, &c, 1, ap );
va_end( ap ); va_end( ap );
return( result ); return( result );
@ -900,7 +900,7 @@ vips_rshift_const1( VipsImage *in, VipsImage **out, double c, ... )
va_start( ap, c ); va_start( ap, c );
result = vips_boolean_constv( in, out, result = vips_boolean_constv( in, out,
&c, 1, VIPS_OPERATION_BOOLEAN_RSHIFT, ap ); VIPS_OPERATION_BOOLEAN_RSHIFT, &c, 1, ap );
va_end( ap ); va_end( ap );
return( result ); return( result );

View File

@ -421,7 +421,7 @@ vips_math2_const_init( VipsMath2Const *math2_const )
static int static int
vips_math2_constv( VipsImage *in, VipsImage **out, vips_math2_constv( VipsImage *in, VipsImage **out,
double *c, int n, VipsOperationMath2 math2, va_list ap ) VipsOperationMath2 math2, double *c, int n, va_list ap )
{ {
VipsArea *area_c; VipsArea *area_c;
double *array; double *array;
@ -433,7 +433,7 @@ vips_math2_constv( VipsImage *in, VipsImage **out,
for( i = 0; i < n; i++ ) for( i = 0; i < n; i++ )
array[i] = c[i]; array[i] = c[i];
result = vips_call_split( "math2_const", ap, in, out, area_c, math2 ); result = vips_call_split( "math2_const", ap, in, out, math2, area_c );
vips_area_unref( area_c ); vips_area_unref( area_c );
@ -444,9 +444,9 @@ vips_math2_constv( VipsImage *in, VipsImage **out,
* vips_math2_const: * vips_math2_const:
* @in: input image * @in: input image
* @out: output image * @out: output image
* @math2: math operation to perform
* @c: array of constants * @c: array of constants
* @n: number of constants in @c * @n: number of constants in @c
* @math2: math operation to perform
* @...: %NULL-terminated list of optional named arguments * @...: %NULL-terminated list of optional named arguments
* *
* This operation calculates various 2-ary maths operations on an image and * This operation calculates various 2-ary maths operations on an image and
@ -471,13 +471,13 @@ vips_math2_constv( VipsImage *in, VipsImage **out,
*/ */
int int
vips_math2_const( VipsImage *in, VipsImage **out, vips_math2_const( VipsImage *in, VipsImage **out,
double *c, int n, VipsOperationMath2 math2, ... ) VipsOperationMath2 math2, double *c, int n, ... )
{ {
va_list ap; va_list ap;
int result; int result;
va_start( ap, math2 ); va_start( ap, n );
result = vips_math2_constv( in, out, c, n, math2, ap ); result = vips_math2_constv( in, out, math2, c, n, ap );
va_end( ap ); va_end( ap );
return( result ); return( result );
@ -504,7 +504,7 @@ vips_pow_const( VipsImage *in, VipsImage **out, double *c, int n, ... )
va_start( ap, n ); va_start( ap, n );
result = vips_math2_constv( in, out, result = vips_math2_constv( in, out,
c, n, VIPS_OPERATION_MATH2_POW, ap ); VIPS_OPERATION_MATH2_POW, c, n, ap );
va_end( ap ); va_end( ap );
return( result ); return( result );
@ -531,7 +531,7 @@ vips_wop_const( VipsImage *in, VipsImage **out, double *c, int n, ... )
va_start( ap, n ); va_start( ap, n );
result = vips_math2_constv( in, out, result = vips_math2_constv( in, out,
c, n, VIPS_OPERATION_MATH2_WOP, ap ); VIPS_OPERATION_MATH2_WOP, c, n, ap );
va_end( ap ); va_end( ap );
return( result ); return( result );
@ -552,13 +552,13 @@ vips_wop_const( VipsImage *in, VipsImage **out, double *c, int n, ... )
*/ */
int int
vips_math2_const1( VipsImage *in, VipsImage **out, vips_math2_const1( VipsImage *in, VipsImage **out,
double c, VipsOperationMath2 math2, ... ) VipsOperationMath2 math2, double c, ... )
{ {
va_list ap; va_list ap;
int result; int result;
va_start( ap, math2 ); va_start( ap, c );
result = vips_math2_constv( in, out, &c, 1, math2, ap ); result = vips_math2_constv( in, out, math2, &c, 1, ap );
va_end( ap ); va_end( ap );
return( result ); return( result );
@ -584,7 +584,7 @@ vips_pow_const1( VipsImage *in, VipsImage **out, double c, ... )
va_start( ap, c ); va_start( ap, c );
result = vips_math2_constv( in, out, result = vips_math2_constv( in, out,
&c, 1, VIPS_OPERATION_MATH2_POW, ap ); VIPS_OPERATION_MATH2_POW, &c, 1, ap );
va_end( ap ); va_end( ap );
return( result ); return( result );
@ -610,7 +610,7 @@ vips_wop_const1( VipsImage *in, VipsImage **out, double c, ... )
va_start( ap, c ); va_start( ap, c );
result = vips_math2_constv( in, out, result = vips_math2_constv( in, out,
&c, 1, VIPS_OPERATION_MATH2_WOP, ap ); VIPS_OPERATION_MATH2_WOP, &c, 1, ap );
va_end( ap ); va_end( ap );
return( result ); return( result );

View File

@ -574,7 +574,7 @@ vips_relational_const_init( VipsRelationalConst *relational_const )
static int static int
vips_relational_constv( VipsImage *in, VipsImage **out, vips_relational_constv( VipsImage *in, VipsImage **out,
double *c, int n, VipsOperationRelational relational, va_list ap ) VipsOperationRelational relational, double *c, int n, va_list ap )
{ {
VipsArea *area_c; VipsArea *area_c;
double *array; double *array;
@ -587,7 +587,7 @@ vips_relational_constv( VipsImage *in, VipsImage **out,
array[i] = c[i]; array[i] = c[i];
result = vips_call_split( "relational_const", ap, result = vips_call_split( "relational_const", ap,
in, out, area_c, relational ); in, out, relational, area_c );
vips_area_unref( area_c ); vips_area_unref( area_c );
@ -598,9 +598,9 @@ vips_relational_constv( VipsImage *in, VipsImage **out,
* vips_relational_const: * vips_relational_const:
* @in: input image * @in: input image
* @out: output image * @out: output image
* @relational: relational operation to perform
* @c: array of constants * @c: array of constants
* @n: number of constants in @c * @n: number of constants in @c
* @relational: relational operation to perform
* @...: %NULL-terminated list of optional named arguments * @...: %NULL-terminated list of optional named arguments
* *
* Perform various relational operations on an image and an array of * Perform various relational operations on an image and an array of
@ -621,13 +621,13 @@ vips_relational_constv( VipsImage *in, VipsImage **out,
*/ */
int int
vips_relational_const( VipsImage *in, VipsImage **out, vips_relational_const( VipsImage *in, VipsImage **out,
double *c, int n, VipsOperationRelational relational, ... ) VipsOperationRelational relational, double *c, int n, ... )
{ {
va_list ap; va_list ap;
int result; int result;
va_start( ap, relational ); va_start( ap, n );
result = vips_relational_constv( in, out, c, n, relational, ap ); result = vips_relational_constv( in, out, relational, c, n, ap );
va_end( ap ); va_end( ap );
return( result ); return( result );
@ -654,7 +654,7 @@ vips_equal_const( VipsImage *in, VipsImage **out, double *c, int n, ... )
va_start( ap, n ); va_start( ap, n );
result = vips_relational_constv( in, out, result = vips_relational_constv( in, out,
c, n, VIPS_OPERATION_RELATIONAL_EQUAL, ap ); VIPS_OPERATION_RELATIONAL_EQUAL, c, n, ap );
va_end( ap ); va_end( ap );
return( result ); return( result );
@ -681,7 +681,7 @@ vips_notequal_const( VipsImage *in, VipsImage **out, double *c, int n, ... )
va_start( ap, n ); va_start( ap, n );
result = vips_relational_constv( in, out, result = vips_relational_constv( in, out,
c, n, VIPS_OPERATION_RELATIONAL_NOTEQ, ap ); VIPS_OPERATION_RELATIONAL_NOTEQ, c, n, ap );
va_end( ap ); va_end( ap );
return( result ); return( result );
@ -708,7 +708,7 @@ vips_less_const( VipsImage *in, VipsImage **out, double *c, int n, ... )
va_start( ap, n ); va_start( ap, n );
result = vips_relational_constv( in, out, result = vips_relational_constv( in, out,
c, n, VIPS_OPERATION_RELATIONAL_LESS, ap ); VIPS_OPERATION_RELATIONAL_LESS, c, n, ap );
va_end( ap ); va_end( ap );
return( result ); return( result );
@ -735,7 +735,7 @@ vips_lesseq_const( VipsImage *in, VipsImage **out, double *c, int n, ... )
va_start( ap, n ); va_start( ap, n );
result = vips_relational_constv( in, out, result = vips_relational_constv( in, out,
c, n, VIPS_OPERATION_RELATIONAL_LESSEQ, ap ); VIPS_OPERATION_RELATIONAL_LESSEQ, c, n, ap );
va_end( ap ); va_end( ap );
return( result ); return( result );
@ -762,7 +762,7 @@ vips_more_const( VipsImage *in, VipsImage **out, double *c, int n, ... )
va_start( ap, n ); va_start( ap, n );
result = vips_relational_constv( in, out, result = vips_relational_constv( in, out,
c, n, VIPS_OPERATION_RELATIONAL_MORE, ap ); VIPS_OPERATION_RELATIONAL_MORE, c, n, ap );
va_end( ap ); va_end( ap );
return( result ); return( result );
@ -789,7 +789,7 @@ vips_moreeq_const( VipsImage *in, VipsImage **out, double *c, int n, ... )
va_start( ap, n ); va_start( ap, n );
result = vips_relational_constv( in, out, result = vips_relational_constv( in, out,
c, n, VIPS_OPERATION_RELATIONAL_MOREEQ, ap ); VIPS_OPERATION_RELATIONAL_MOREEQ, c, n, ap );
va_end( ap ); va_end( ap );
return( result ); return( result );
@ -799,8 +799,8 @@ vips_moreeq_const( VipsImage *in, VipsImage **out, double *c, int n, ... )
* vips_relational_const1: * vips_relational_const1:
* @in: input image * @in: input image
* @out: output image * @out: output image
* @c: constant
* @relational: relational operation to perform * @relational: relational operation to perform
* @c: constant
* @...: %NULL-terminated list of optional named arguments * @...: %NULL-terminated list of optional named arguments
* *
* Perform various relational operations on an image and a constant. See * Perform various relational operations on an image and a constant. See
@ -812,13 +812,13 @@ vips_moreeq_const( VipsImage *in, VipsImage **out, double *c, int n, ... )
*/ */
int int
vips_relational_const1( VipsImage *in, VipsImage **out, vips_relational_const1( VipsImage *in, VipsImage **out,
double c, VipsOperationRelational relational, ... ) VipsOperationRelational relational, double c, ... )
{ {
va_list ap; va_list ap;
int result; int result;
va_start( ap, relational ); va_start( ap, c );
result = vips_relational_constv( in, out, &c, 1, relational, ap ); result = vips_relational_constv( in, out, relational, &c, 1, ap );
va_end( ap ); va_end( ap );
return( result ); return( result );
@ -844,7 +844,7 @@ vips_equal_const1( VipsImage *in, VipsImage **out, double c, ... )
va_start( ap, c ); va_start( ap, c );
result = vips_relational_constv( in, out, result = vips_relational_constv( in, out,
&c, 1, VIPS_OPERATION_RELATIONAL_EQUAL, ap ); VIPS_OPERATION_RELATIONAL_EQUAL, &c, 1, ap );
va_end( ap ); va_end( ap );
return( result ); return( result );
@ -870,7 +870,7 @@ vips_notequal_const1( VipsImage *in, VipsImage **out, double c, ... )
va_start( ap, c ); va_start( ap, c );
result = vips_relational_constv( in, out, result = vips_relational_constv( in, out,
&c, 1, VIPS_OPERATION_RELATIONAL_NOTEQ, ap ); VIPS_OPERATION_RELATIONAL_NOTEQ, &c, 1, ap );
va_end( ap ); va_end( ap );
return( result ); return( result );
@ -896,7 +896,7 @@ vips_less_const1( VipsImage *in, VipsImage **out, double c, ... )
va_start( ap, c ); va_start( ap, c );
result = vips_relational_constv( in, out, result = vips_relational_constv( in, out,
&c, 1, VIPS_OPERATION_RELATIONAL_LESS, ap ); VIPS_OPERATION_RELATIONAL_LESS, &c, 1, ap );
va_end( ap ); va_end( ap );
return( result ); return( result );
@ -922,7 +922,7 @@ vips_lesseq_const1( VipsImage *in, VipsImage **out, double c, ... )
va_start( ap, c ); va_start( ap, c );
result = vips_relational_constv( in, out, result = vips_relational_constv( in, out,
&c, 1, VIPS_OPERATION_RELATIONAL_LESSEQ, ap ); VIPS_OPERATION_RELATIONAL_LESSEQ, &c, 1, ap );
va_end( ap ); va_end( ap );
return( result ); return( result );
@ -948,7 +948,7 @@ vips_more_const1( VipsImage *in, VipsImage **out, double c, ... )
va_start( ap, c ); va_start( ap, c );
result = vips_relational_constv( in, out, result = vips_relational_constv( in, out,
&c, 1, VIPS_OPERATION_RELATIONAL_MORE, ap ); VIPS_OPERATION_RELATIONAL_MORE, &c, 1, ap );
va_end( ap ); va_end( ap );
return( result ); return( result );
@ -974,7 +974,7 @@ vips_moreeq_const1( VipsImage *in, VipsImage **out, double c, ... )
va_start( ap, c ); va_start( ap, c );
result = vips_relational_constv( in, out, result = vips_relational_constv( in, out,
&c, 1, VIPS_OPERATION_RELATIONAL_MOREEQ, ap ); VIPS_OPERATION_RELATIONAL_MOREEQ, &c, 1, ap );
va_end( ap ); va_end( ap );
return( result ); return( result );

View File

@ -203,7 +203,7 @@ vips_unary_const_class_init( VipsUnaryConstClass *class )
object_class->description = _( "unary operations with a constant" ); object_class->description = _( "unary operations with a constant" );
object_class->build = vips_unary_const_build; object_class->build = vips_unary_const_build;
VIPS_ARG_BOXED( class, "c", 199, VIPS_ARG_BOXED( class, "c", 201,
_( "c" ), _( "c" ),
_( "Array of constants" ), _( "Array of constants" ),
VIPS_ARGUMENT_REQUIRED_INPUT, VIPS_ARGUMENT_REQUIRED_INPUT,

View File

@ -2749,7 +2749,7 @@ vips__relational_vec( IMAGE *in, IMAGE *out,
{ {
VipsImage *t; VipsImage *t;
if( vips_relational_const( in, &t, c, n, relational, if( vips_relational_const( in, &t, relational, c, n,
NULL ) ) NULL ) )
return( -1 ); return( -1 );
if( vips_image_write( t, out ) ) { if( vips_image_write( t, out ) ) {
@ -2921,7 +2921,7 @@ vips__boolean_vec( IMAGE *in, IMAGE *out,
{ {
VipsImage *t; VipsImage *t;
if( vips_boolean_const( in, &t, c, n, boolean, if( vips_boolean_const( in, &t, boolean, c, n,
NULL ) ) NULL ) )
return( -1 ); return( -1 );
if( vips_image_write( t, out ) ) { if( vips_image_write( t, out ) ) {
@ -3008,7 +3008,7 @@ vips__math2_vec( IMAGE *in, IMAGE *out,
{ {
VipsImage *t; VipsImage *t;
if( vips_math2_const( in, &t, c, n, math2, if( vips_math2_const( in, &t, math2, c, n,
NULL ) ) NULL ) )
return( -1 ); return( -1 );
if( vips_image_write( t, out ) ) { if( vips_image_write( t, out ) ) {

View File

@ -279,7 +279,7 @@ int vips_more( VipsImage *left, VipsImage *right, VipsImage **out, ... )
int vips_moreeq( VipsImage *left, VipsImage *right, VipsImage **out, ... ) int vips_moreeq( VipsImage *left, VipsImage *right, VipsImage **out, ... )
__attribute__((sentinel)); __attribute__((sentinel));
int vips_relational_const( VipsImage *in, VipsImage **out, int vips_relational_const( VipsImage *in, VipsImage **out,
double *c, int n, VipsOperationRelational relational, ... ) VipsOperationRelational relational, double *c, int n, ... )
__attribute__((sentinel)); __attribute__((sentinel));
int vips_equal_const( VipsImage *in, VipsImage **out, double *c, int n, ... ) int vips_equal_const( VipsImage *in, VipsImage **out, double *c, int n, ... )
__attribute__((sentinel)); __attribute__((sentinel));
@ -294,7 +294,7 @@ int vips_more_const( VipsImage *in, VipsImage **out, double *c, int n, ... )
int vips_moreeq_const( VipsImage *in, VipsImage **out, double *c, int n, ... ) int vips_moreeq_const( VipsImage *in, VipsImage **out, double *c, int n, ... )
__attribute__((sentinel)); __attribute__((sentinel));
int vips_relational_const1( VipsImage *in, VipsImage **out, int vips_relational_const1( VipsImage *in, VipsImage **out,
double c, VipsOperationRelational relational, ... ) VipsOperationRelational relational, double c, ... )
__attribute__((sentinel)); __attribute__((sentinel));
int vips_equal_const1( VipsImage *in, VipsImage **out, double c, ... ) int vips_equal_const1( VipsImage *in, VipsImage **out, double c, ... )
__attribute__((sentinel)); __attribute__((sentinel));
@ -324,7 +324,7 @@ int vips_rshift( VipsImage *left, VipsImage *right, VipsImage **out, ... )
__attribute__((sentinel)); __attribute__((sentinel));
int vips_boolean_const( VipsImage *in, VipsImage **out, int vips_boolean_const( VipsImage *in, VipsImage **out,
double *c, int n, VipsOperationBoolean boolean, ... ) VipsOperationBoolean boolean, double *c, int n, ... )
__attribute__((sentinel)); __attribute__((sentinel));
int vips_andimage_const( VipsImage *in, VipsImage **out, double *c, int n, ... ) int vips_andimage_const( VipsImage *in, VipsImage **out, double *c, int n, ... )
__attribute__((sentinel)); __attribute__((sentinel));
@ -337,7 +337,7 @@ int vips_lshift_const( VipsImage *in, VipsImage **out, double *c, int n, ... )
int vips_rshift_const( VipsImage *in, VipsImage **out, double *c, int n, ... ) int vips_rshift_const( VipsImage *in, VipsImage **out, double *c, int n, ... )
__attribute__((sentinel)); __attribute__((sentinel));
int vips_boolean_const1( VipsImage *in, VipsImage **out, int vips_boolean_const1( VipsImage *in, VipsImage **out,
double c, VipsOperationBoolean boolean, ... ) VipsOperationBoolean boolean, double c, ... )
__attribute__((sentinel)); __attribute__((sentinel));
int vips_andimage_const1( VipsImage *in, VipsImage **out, double c, ... ) int vips_andimage_const1( VipsImage *in, VipsImage **out, double c, ... )
__attribute__((sentinel)); __attribute__((sentinel));
@ -358,14 +358,14 @@ int vips_pow( VipsImage *left, VipsImage *right, VipsImage **out, ... )
int vips_wop( VipsImage *left, VipsImage *right, VipsImage **out, ... ) int vips_wop( VipsImage *left, VipsImage *right, VipsImage **out, ... )
__attribute__((sentinel)); __attribute__((sentinel));
int vips_math2_const( VipsImage *in, VipsImage **out, int vips_math2_const( VipsImage *in, VipsImage **out,
double *c, int n, VipsOperationMath2 math2, ... ) VipsOperationMath2 math2, double *c, int n, ... )
__attribute__((sentinel)); __attribute__((sentinel));
int vips_pow_const( VipsImage *in, VipsImage **out, double *c, int n, ... ) int vips_pow_const( VipsImage *in, VipsImage **out, double *c, int n, ... )
__attribute__((sentinel)); __attribute__((sentinel));
int vips_wop_const( VipsImage *in, VipsImage **out, double *c, int n, ... ) int vips_wop_const( VipsImage *in, VipsImage **out, double *c, int n, ... )
__attribute__((sentinel)); __attribute__((sentinel));
int vips_math2_const1( VipsImage *in, VipsImage **out, int vips_math2_const1( VipsImage *in, VipsImage **out,
double c, VipsOperationMath2 math2, ... ) VipsOperationMath2 math2, double c, ... )
__attribute__((sentinel)); __attribute__((sentinel));
int vips_pow_const1( VipsImage *in, VipsImage **out, double c, ... ) int vips_pow_const1( VipsImage *in, VipsImage **out, double c, ... )
__attribute__((sentinel)); __attribute__((sentinel));

View File

@ -60,6 +60,11 @@ vips_type_image = GObject.GType.from_name("VipsImage")
vips_type_operation = GObject.GType.from_name("VipsOperation") vips_type_operation = GObject.GType.from_name("VipsOperation")
vips_type_ref_string = GObject.GType.from_name("VipsRefString") vips_type_ref_string = GObject.GType.from_name("VipsRefString")
# 8.4 and earlier had a bug which swapped the order of const args to enum
# operations
swap_const_args = Vips.version(0) < 8 or (Vips.version(0) == 8 and
Vips.version(1) <= 4)
def is_2D(value): def is_2D(value):
if not isinstance(value, list): if not isinstance(value, list):
return False return False
@ -415,6 +420,27 @@ def _call_base(name, required, optional, self = None, option_string = None):
return out return out
# handy for expanding enums
def _call_enum(self, name, enum, other):
if isinstance(other, Vips.Image):
return _call_base(name, [other, enum], {}, self)
elif swap_const_args:
return _call_base(name + "_const", [other, enum], {}, self)
else:
return _call_base(name + "_const", [enum, other], {}, self)
# for equality style operations, we need to allow comparison with None
def _call_enum_eq(self, name, enum, other):
if isinstance(other, Vips.Image):
return _call_base(name, [other, enum], {}, self)
elif isinstance(other, list) or isinstance(other, numbers.Number):
if swap_const_args:
return _call_base(name + "_const", [other, enum], {}, self)
else:
return _call_base(name + "_const", [enum, other], {}, self)
else:
return False
# general user entrypoint # general user entrypoint
def call(name, *args, **kwargs): def call(name, *args, **kwargs):
return _call_base(name, args, kwargs) return _call_base(name, args, kwargs)
@ -712,52 +738,34 @@ class Image(Vips.Image):
return self.remainder_const(other) return self.remainder_const(other)
def __pow__(self, other): def __pow__(self, other):
if isinstance(other, Vips.Image): return _call_enum(self, "math2", Vips.OperationMath2.POW, other)
return self.math2(other, Vips.OperationMath2.POW)
else:
return self.math2_const(other, Vips.OperationMath2.POW)
def __rpow__(self, other): def __rpow__(self, other):
return self.math2_const(other, Vips.OperationMath2.WOP) return _call_enum(self, "math2", Vips.OperationMath2.WOP, other)
def __abs__(self): def __abs__(self):
return self.abs() return self.abs()
def __lshift__(self, other): def __lshift__(self, other):
if isinstance(other, Vips.Image): return _call_enum(self, "boolean", Vips.OperationBoolean.LSHIFT, other)
return self.boolean(other, Vips.OperationBoolean.LSHIFT)
else:
return self.boolean_const(other, Vips.OperationBoolean.LSHIFT)
def __rshift__(self, other): def __rshift__(self, other):
if isinstance(other, Vips.Image): return _call_enum(self, "boolean", Vips.OperationBoolean.RSHIFT, other)
return self.boolean(other, Vips.OperationBoolean.RSHIFT)
else:
return self.boolean_const(other, Vips.OperationBoolean.RSHIFT)
def __and__(self, other): def __and__(self, other):
if isinstance(other, Vips.Image): return _call_enum(self, "boolean", Vips.OperationBoolean.AND, other)
return self.boolean(other, Vips.OperationBoolean.AND)
else:
return self.boolean_const(other, Vips.OperationBoolean.AND)
def __rand__(self, other): def __rand__(self, other):
return self.__and__(other) return self.__and__(other)
def __or__(self, other): def __or__(self, other):
if isinstance(other, Vips.Image): return _call_enum(self, "boolean", Vips.OperationBoolean.OR, other)
return self.boolean(other, Vips.OperationBoolean.OR)
else:
return self.boolean_const(other, Vips.OperationBoolean.OR)
def __ror__(self, other): def __ror__(self, other):
return self.__or__(other) return self.__or__(other)
def __xor__(self, other): def __xor__(self, other):
if isinstance(other, Vips.Image): return _call_enum(self, "boolean", Vips.OperationBoolean.EOR, other)
return self.boolean(other, Vips.OperationBoolean.EOR)
else:
return self.boolean_const(other, Vips.OperationBoolean.EOR)
def __rxor__(self, other): def __rxor__(self, other):
return self.__xor__(other) return self.__xor__(other)
@ -772,49 +780,30 @@ class Image(Vips.Image):
return self ^ -1 return self ^ -1
def __gt__(self, other): def __gt__(self, other):
if isinstance(other, Vips.Image): return _call_enum(self,
return self.relational(other, Vips.OperationRelational.MORE) "relational", Vips.OperationRelational.MORE, other)
else:
return self.relational_const(other, Vips.OperationRelational.MORE)
def __ge__(self, other): def __ge__(self, other):
if isinstance(other, Vips.Image): return _call_enum(self,
return self.relational(other, Vips.OperationRelational.MOREEQ) "relational", Vips.OperationRelational.MOREEQ, other)
else:
return self.relational_const(other, Vips.OperationRelational.MOREEQ)
def __lt__(self, other): def __lt__(self, other):
if isinstance(other, Vips.Image): return _call_enum(self,
return self.relational(other, Vips.OperationRelational.LESS) "relational", Vips.OperationRelational.LESS, other)
else:
return self.relational_const(other, Vips.OperationRelational.LESS)
def __le__(self, other): def __le__(self, other):
if isinstance(other, Vips.Image): return _call_enum(self,
return self.relational(other, Vips.OperationRelational.LESSEQ) "relational", Vips.OperationRelational.LESSEQ, other)
else:
return self.relational_const(other, Vips.OperationRelational.LESSEQ)
def __eq__(self, other): def __eq__(self, other):
# for == and != we need to allow comparison to None # _eq version allows comparison to None
if isinstance(other, Vips.Image): return _call_enum_eq(self,
return self.relational(other, Vips.OperationRelational.EQUAL) "relational", Vips.OperationRelational.EQUAL, other)
elif isinstance(other, list):
return self.relational_const(other, Vips.OperationRelational.EQUAL)
elif isinstance(other, numbers.Number):
return self.relational_const(other, Vips.OperationRelational.EQUAL)
else:
return False
def __ne__(self, other): def __ne__(self, other):
if isinstance(other, Vips.Image): # _eq version allows comparison to None
return self.relational(other, Vips.OperationRelational.NOTEQ) return _call_enum_eq(self,
elif isinstance(other, list): "relational", Vips.OperationRelational.NOTEQ, other)
return self.relational_const(other, Vips.OperationRelational.NOTEQ)
elif isinstance(other, numbers.Number):
return self.relational_const(other, Vips.OperationRelational.NOTEQ)
else:
return False
def __getitem__(self, arg): def __getitem__(self, arg):
if isinstance(arg, slice): if isinstance(arg, slice):