remove the orc stuff from arithmetic
no faster than gcc auto vec
This commit is contained in:
parent
f387d13106
commit
7c43e3d332
1
.gitignore
vendored
1
.gitignore
vendored
@ -12,7 +12,6 @@ Makefile.in
|
|||||||
TAGS
|
TAGS
|
||||||
tags
|
tags
|
||||||
*.o
|
*.o
|
||||||
*.vect
|
|
||||||
Vips-8.0.gir
|
Vips-8.0.gir
|
||||||
Vips-8.0.typelib
|
Vips-8.0.typelib
|
||||||
.*.swp
|
.*.swp
|
||||||
|
9
TODO
9
TODO
@ -1,12 +1,8 @@
|
|||||||
|
|
||||||
- check vectorizer on linear.c
|
- check vectorizer on linear.c
|
||||||
|
|
||||||
do some more packages, we've just done arithmetic so far
|
do some more packages, we've just done arithmetic so far
|
||||||
|
|
||||||
time add with auto vec and with orc, is orc worthwhile?
|
|
||||||
|
|
||||||
make sure __restrict__ turns off if the compiler does not support it, is
|
|
||||||
there a configure thing?
|
|
||||||
|
|
||||||
how much would alignment buy us? is there any way we can do this? probably
|
how much would alignment buy us? is there any way we can do this? probably
|
||||||
not, since we need to be able to generate any sub-area
|
not, since we need to be able to generate any sub-area
|
||||||
|
|
||||||
@ -15,6 +11,9 @@
|
|||||||
not seen more than x2 from auto-vec of abs(), perhaps the bool ops?
|
not seen more than x2 from auto-vec of abs(), perhaps the bool ops?
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
- seen some leaks from
|
- seen some leaks from
|
||||||
|
|
||||||
vips dzsave --layout google wtc.jpg x
|
vips dzsave --layout google wtc.jpg x
|
||||||
|
@ -195,7 +195,7 @@ vips_abs_buffer( VipsArithmetic *arithmetic,
|
|||||||
|
|
||||||
/* Format doesn't change with abs, other than complex -> real.
|
/* Format doesn't change with abs, other than complex -> real.
|
||||||
*/
|
*/
|
||||||
static const VipsBandFormat vips_bandfmt_abs[10] = {
|
static const VipsBandFormat vips_abs_format_table[10] = {
|
||||||
/* UC C US S UI I F X D DX */
|
/* UC C US S UI I F X D DX */
|
||||||
UC, C, US, S, UI, I, F, F, D, D
|
UC, C, US, S, UI, I, F, F, D, D
|
||||||
};
|
};
|
||||||
@ -210,7 +210,7 @@ vips_abs_class_init( VipsAbsClass *class )
|
|||||||
object_class->description = _( "absolute value of an image" );
|
object_class->description = _( "absolute value of an image" );
|
||||||
object_class->build = vips_abs_build;
|
object_class->build = vips_abs_build;
|
||||||
|
|
||||||
vips_arithmetic_set_format_table( aclass, vips_bandfmt_abs );
|
aclass->format_table = vips_abs_format_table;
|
||||||
|
|
||||||
aclass->process_line = vips_abs_buffer;
|
aclass->process_line = vips_abs_buffer;
|
||||||
}
|
}
|
||||||
|
@ -36,6 +36,8 @@
|
|||||||
* - argh vector int/uint was broken
|
* - argh vector int/uint was broken
|
||||||
* 4/4/11
|
* 4/4/11
|
||||||
* - rewrite as a class
|
* - rewrite as a class
|
||||||
|
* 2/12/13
|
||||||
|
* - remove vector code, gcc autovec with -O3 is now as fast
|
||||||
*/
|
*/
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@ -108,20 +110,6 @@ add_buffer( VipsArithmetic *arithmetic, VipsPel *out, VipsPel **in, int width )
|
|||||||
(vips_band_format_iscomplex( vips_image_get_format( im ) ) ?
|
(vips_band_format_iscomplex( vips_image_get_format( im ) ) ?
|
||||||
2 : 1);
|
2 : 1);
|
||||||
|
|
||||||
VipsVector *v;
|
|
||||||
|
|
||||||
if( (v = vips_arithmetic_get_vector( class,
|
|
||||||
vips_image_get_format( im ) )) ) {
|
|
||||||
VipsExecutor ex;
|
|
||||||
|
|
||||||
vips_executor_set_program( &ex, v, sz );
|
|
||||||
vips_executor_set_array( &ex, v->s[0], in[0] );
|
|
||||||
vips_executor_set_array( &ex, v->s[1], in[1] );
|
|
||||||
vips_executor_set_destination( &ex, out );
|
|
||||||
|
|
||||||
vips_executor_run( &ex );
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
int x;
|
int x;
|
||||||
|
|
||||||
/* Add all input types. Keep types here in sync with
|
/* Add all input types. Keep types here in sync with
|
||||||
@ -152,7 +140,6 @@ add_buffer( VipsArithmetic *arithmetic, VipsPel *out, VipsPel **in, int width )
|
|||||||
default:
|
default:
|
||||||
g_assert( 0 );
|
g_assert( 0 );
|
||||||
}
|
}
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Save a bit of typing.
|
/* Save a bit of typing.
|
||||||
@ -171,7 +158,7 @@ add_buffer( VipsArithmetic *arithmetic, VipsPel *out, VipsPel **in, int width )
|
|||||||
/* Type promotion for addition. Sign and value preserving. Make sure these
|
/* Type promotion for addition. Sign and value preserving. Make sure these
|
||||||
* match the case statement in add_buffer() above.
|
* match the case statement in add_buffer() above.
|
||||||
*/
|
*/
|
||||||
static const VipsBandFormat bandfmt_add[10] = {
|
static const VipsBandFormat vips_add_format_table[10] = {
|
||||||
/* UC C US S UI I F X D DX */
|
/* UC C US S UI I F X D DX */
|
||||||
US, S, UI, I, UI, I, F, X, D, DX
|
US, S, UI, I, UI, I, F, X, D, DX
|
||||||
};
|
};
|
||||||
@ -181,48 +168,11 @@ vips_add_class_init( VipsAddClass *class )
|
|||||||
{
|
{
|
||||||
VipsObjectClass *object_class = (VipsObjectClass *) class;
|
VipsObjectClass *object_class = (VipsObjectClass *) class;
|
||||||
VipsArithmeticClass *aclass = VIPS_ARITHMETIC_CLASS( class );
|
VipsArithmeticClass *aclass = VIPS_ARITHMETIC_CLASS( class );
|
||||||
VipsVector *v;
|
|
||||||
|
|
||||||
object_class->nickname = "add";
|
object_class->nickname = "add";
|
||||||
object_class->description = _( "add two images" );
|
object_class->description = _( "add two images" );
|
||||||
|
|
||||||
vips_arithmetic_set_format_table( aclass, bandfmt_add );
|
aclass->format_table = vips_add_format_table;
|
||||||
|
|
||||||
v = vips_arithmetic_get_program( aclass, VIPS_FORMAT_UCHAR );
|
|
||||||
vips_vector_asm2( v, "convubw", "t1", "s1" );
|
|
||||||
vips_vector_asm2( v, "convubw", "t2", "s2" );
|
|
||||||
vips_vector_asm3( v, "addw", "d1", "t1", "t2" );
|
|
||||||
|
|
||||||
v = vips_arithmetic_get_program( aclass, VIPS_FORMAT_CHAR );
|
|
||||||
vips_vector_asm2( v, "convsbw", "t1", "s1" );
|
|
||||||
vips_vector_asm2( v, "convsbw", "t2", "s2" );
|
|
||||||
vips_vector_asm3( v, "addw", "d1", "t1", "t2" );
|
|
||||||
|
|
||||||
v = vips_arithmetic_get_program( aclass, VIPS_FORMAT_USHORT );
|
|
||||||
vips_vector_asm2( v, "convuwl", "t1", "s1" );
|
|
||||||
vips_vector_asm2( v, "convuwl", "t2", "s2" );
|
|
||||||
vips_vector_asm3( v, "addl", "d1", "t1", "t2" );
|
|
||||||
|
|
||||||
v = vips_arithmetic_get_program( aclass, VIPS_FORMAT_SHORT );
|
|
||||||
vips_vector_asm2( v, "convswl", "t1", "s1" );
|
|
||||||
vips_vector_asm2( v, "convswl", "t2", "s2" );
|
|
||||||
vips_vector_asm3( v, "addl", "d1", "t1", "t2" );
|
|
||||||
|
|
||||||
/*
|
|
||||||
|
|
||||||
uint/int are a little slower than C, on a c2d anyway
|
|
||||||
|
|
||||||
float/double/complex are not handled well
|
|
||||||
|
|
||||||
v = vips_arithmetic_get_vector( aclass, VIPS_FORMAT_UINT );
|
|
||||||
vips_vector_asm3( v, "addl", "d1", "s1", "s2" );
|
|
||||||
|
|
||||||
v = vips_arithmetic_get_vector( aclass, VIPS_FORMAT_INT );
|
|
||||||
vips_vector_asm3( v, "addl", "d1", "s1", "s2" );
|
|
||||||
|
|
||||||
*/
|
|
||||||
|
|
||||||
vips_arithmetic_compile( aclass );
|
|
||||||
|
|
||||||
aclass->process_line = add_buffer;
|
aclass->process_line = add_buffer;
|
||||||
}
|
}
|
||||||
|
@ -594,86 +594,6 @@ vips_arithmetic_init( VipsArithmetic *arithmetic )
|
|||||||
arithmetic->base_bands = 1;
|
arithmetic->base_bands = 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
|
||||||
vips_arithmetic_set_format_table( VipsArithmeticClass *class,
|
|
||||||
const VipsBandFormat *format_table )
|
|
||||||
{
|
|
||||||
int i;
|
|
||||||
|
|
||||||
g_assert( !class->format_table );
|
|
||||||
|
|
||||||
class->format_table = format_table;
|
|
||||||
|
|
||||||
for( i = 0; i < VIPS_FORMAT_LAST; i++ ) {
|
|
||||||
int isize = vips_format_sizeof( i );
|
|
||||||
int osize = vips_format_sizeof( (int) format_table[i] );
|
|
||||||
|
|
||||||
VipsVector *v;
|
|
||||||
|
|
||||||
v = vips_vector_new( "arithmetic", osize );
|
|
||||||
|
|
||||||
vips_vector_source_name( v, "s1", isize );
|
|
||||||
vips_vector_source_name( v, "s2", isize );
|
|
||||||
vips_vector_temporary( v, "t1", osize );
|
|
||||||
vips_vector_temporary( v, "t2", osize );
|
|
||||||
|
|
||||||
class->vectors[i] = v;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Get the stub for this program ... use _get_vector() to get the compiled
|
|
||||||
* code.
|
|
||||||
*/
|
|
||||||
VipsVector *
|
|
||||||
vips_arithmetic_get_program( VipsArithmeticClass *class, VipsBandFormat fmt )
|
|
||||||
{
|
|
||||||
g_assert( (int) fmt >= 0 && (int) fmt < VIPS_FORMAT_LAST );
|
|
||||||
g_assert( !class->vector_program[fmt] );
|
|
||||||
|
|
||||||
class->vector_program[fmt] = TRUE;
|
|
||||||
|
|
||||||
return( class->vectors[fmt] );
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Get the compiled code for this type, if available.
|
|
||||||
*/
|
|
||||||
VipsVector *
|
|
||||||
vips_arithmetic_get_vector( VipsArithmeticClass *class, VipsBandFormat fmt )
|
|
||||||
{
|
|
||||||
g_assert( fmt >= 0 && fmt < VIPS_FORMAT_LAST );
|
|
||||||
|
|
||||||
if( !vips_vector_isenabled() ||
|
|
||||||
!class->vector_program[fmt] )
|
|
||||||
return( NULL );
|
|
||||||
|
|
||||||
return( class->vectors[fmt] );
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
|
||||||
vips_arithmetic_compile( VipsArithmeticClass *class )
|
|
||||||
{
|
|
||||||
int i;
|
|
||||||
|
|
||||||
g_assert( class->format_table );
|
|
||||||
|
|
||||||
for( i = 0; i < VIPS_FORMAT_LAST; i++ )
|
|
||||||
if( class->vector_program[i] &&
|
|
||||||
!vips_vector_compile( class->vectors[i] ) )
|
|
||||||
/* If compilation fails, turn off the vector for this
|
|
||||||
* type.
|
|
||||||
*/
|
|
||||||
class->vector_program[i] = FALSE;
|
|
||||||
|
|
||||||
#ifdef DEBUG
|
|
||||||
printf( "vips_arithmetic_compile: " );
|
|
||||||
for( i = 0; i < VIPS_FORMAT_LAST; i++ )
|
|
||||||
if( class->vector_program[i] )
|
|
||||||
printf( "%s ",
|
|
||||||
vips_enum_nick( VIPS_TYPE_BAND_FORMAT, i ) );
|
|
||||||
printf( "\n" );
|
|
||||||
#endif /*DEBUG*/
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Called from iofuncs to init all operations in this dir. Use a plugin system
|
/* Called from iofuncs to init all operations in this dir. Use a plugin system
|
||||||
* instead?
|
* instead?
|
||||||
*/
|
*/
|
||||||
|
@ -191,7 +191,7 @@ vips_boolean_buffer( VipsArithmetic *arithmetic,
|
|||||||
|
|
||||||
/* Type conversions for boolean.
|
/* Type conversions for boolean.
|
||||||
*/
|
*/
|
||||||
static const VipsBandFormat vips_bandfmt_boolean[10] = {
|
static const VipsBandFormat vips_boolean_format_table[10] = {
|
||||||
/* UC C US S UI I F X D DX */
|
/* UC C US S UI I F X D DX */
|
||||||
UC, C, US, S, UI, I, I, I, I, I,
|
UC, C, US, S, UI, I, I, I, I, I,
|
||||||
};
|
};
|
||||||
@ -210,7 +210,7 @@ vips_boolean_class_init( VipsBooleanClass *class )
|
|||||||
object_class->description = _( "boolean operation on two images" );
|
object_class->description = _( "boolean operation on two images" );
|
||||||
object_class->build = vips_boolean_build;
|
object_class->build = vips_boolean_build;
|
||||||
|
|
||||||
vips_arithmetic_set_format_table( aclass, vips_bandfmt_boolean );
|
aclass->format_table = vips_boolean_format_table;
|
||||||
|
|
||||||
aclass->process_line = vips_boolean_buffer;
|
aclass->process_line = vips_boolean_buffer;
|
||||||
|
|
||||||
@ -513,7 +513,7 @@ vips_boolean_const_class_init( VipsBooleanConstClass *class )
|
|||||||
_( "boolean operations against a constant" );
|
_( "boolean operations against a constant" );
|
||||||
object_class->build = vips_boolean_const_build;
|
object_class->build = vips_boolean_const_build;
|
||||||
|
|
||||||
vips_arithmetic_set_format_table( aclass, vips_bandfmt_boolean );
|
aclass->format_table = vips_boolean_format_table;
|
||||||
|
|
||||||
aclass->process_line = vips_boolean_const_buffer;
|
aclass->process_line = vips_boolean_const_buffer;
|
||||||
|
|
||||||
|
@ -196,7 +196,7 @@ vips_complex_buffer( VipsArithmetic *arithmetic,
|
|||||||
#define D VIPS_FORMAT_DOUBLE
|
#define D VIPS_FORMAT_DOUBLE
|
||||||
#define DX VIPS_FORMAT_DPCOMPLEX
|
#define DX VIPS_FORMAT_DPCOMPLEX
|
||||||
|
|
||||||
static const VipsBandFormat vips_bandfmt_complex[10] = {
|
static const VipsBandFormat vips_complex_format_table[10] = {
|
||||||
/* UC C US S UI I F X D DX */
|
/* UC C US S UI I F X D DX */
|
||||||
X, X, X, X, X, X, X, X, DX, DX
|
X, X, X, X, X, X, X, X, DX, DX
|
||||||
};
|
};
|
||||||
@ -215,7 +215,7 @@ vips_complex_class_init( VipsComplexClass *class )
|
|||||||
object_class->description =
|
object_class->description =
|
||||||
_( "perform a complex operation on an image" );
|
_( "perform a complex operation on an image" );
|
||||||
|
|
||||||
vips_arithmetic_set_format_table( aclass, vips_bandfmt_complex );
|
aclass->format_table = vips_complex_format_table;
|
||||||
|
|
||||||
aclass->process_line = vips_complex_buffer;
|
aclass->process_line = vips_complex_buffer;
|
||||||
|
|
||||||
@ -475,7 +475,7 @@ vips_complex2_buffer( VipsArithmetic *arithmetic,
|
|||||||
#define D VIPS_FORMAT_DOUBLE
|
#define D VIPS_FORMAT_DOUBLE
|
||||||
#define DX VIPS_FORMAT_DPCOMPLEX
|
#define DX VIPS_FORMAT_DPCOMPLEX
|
||||||
|
|
||||||
static const VipsBandFormat vips_bandfmt_complex2[10] = {
|
static const VipsBandFormat vips_complex2_format_table[10] = {
|
||||||
/* UC C US S UI I F X D DX */
|
/* UC C US S UI I F X D DX */
|
||||||
X, X, X, X, X, X, X, X, DX, DX
|
X, X, X, X, X, X, X, X, DX, DX
|
||||||
};
|
};
|
||||||
@ -494,7 +494,7 @@ vips_complex2_class_init( VipsComplex2Class *class )
|
|||||||
object_class->description =
|
object_class->description =
|
||||||
_( "perform a binary complex operation on two images" );
|
_( "perform a binary complex operation on two images" );
|
||||||
|
|
||||||
vips_arithmetic_set_format_table( aclass, vips_bandfmt_complex2 );
|
aclass->format_table = vips_complex2_format_table;
|
||||||
|
|
||||||
aclass->process_line = vips_complex2_buffer;
|
aclass->process_line = vips_complex2_buffer;
|
||||||
|
|
||||||
@ -689,7 +689,7 @@ vips_complexget_buffer( VipsArithmetic *arithmetic,
|
|||||||
#define D VIPS_FORMAT_DOUBLE
|
#define D VIPS_FORMAT_DOUBLE
|
||||||
#define DX VIPS_FORMAT_DPCOMPLEX
|
#define DX VIPS_FORMAT_DPCOMPLEX
|
||||||
|
|
||||||
static const VipsBandFormat vips_bandfmt_complexget[10] = {
|
static const VipsBandFormat vips_complexget_format_table[10] = {
|
||||||
/* UC C US S UI I F X D DX */
|
/* UC C US S UI I F X D DX */
|
||||||
UC, C, US, S, UI, I, F, F, D, D
|
UC, C, US, S, UI, I, F, F, D, D
|
||||||
};
|
};
|
||||||
@ -708,7 +708,7 @@ vips_complexget_class_init( VipsComplexgetClass *class )
|
|||||||
object_class->description = _( "get a component from a complex image" );
|
object_class->description = _( "get a component from a complex image" );
|
||||||
object_class->build = vips_complexget_build;
|
object_class->build = vips_complexget_build;
|
||||||
|
|
||||||
vips_arithmetic_set_format_table( aclass, vips_bandfmt_complexget );
|
aclass->format_table = vips_complexget_format_table;
|
||||||
|
|
||||||
aclass->process_line = vips_complexget_buffer;
|
aclass->process_line = vips_complexget_buffer;
|
||||||
|
|
||||||
@ -891,7 +891,7 @@ vips_complexform_buffer( VipsArithmetic *arithmetic,
|
|||||||
/* Type promotion for division. Sign and value preserving. Make sure
|
/* Type promotion for division. Sign and value preserving. Make sure
|
||||||
* these match the case statement in complexform_buffer() above.
|
* these match the case statement in complexform_buffer() above.
|
||||||
*/
|
*/
|
||||||
static int vips_bandfmt_complexform[10] = {
|
static int vips_complexform_format_table[10] = {
|
||||||
/* UC C US S UI I F X D DX */
|
/* UC C US S UI I F X D DX */
|
||||||
X, X, X, X, X, X, X, X, DX,DX
|
X, X, X, X, X, X, X, X, DX,DX
|
||||||
};
|
};
|
||||||
@ -907,7 +907,7 @@ vips_complexform_class_init( VipsComplexformClass *class )
|
|||||||
_( "form a complex image from two real images" );
|
_( "form a complex image from two real images" );
|
||||||
object_class->build = vips_complexform_build;
|
object_class->build = vips_complexform_build;
|
||||||
|
|
||||||
vips_arithmetic_set_format_table( aclass, vips_bandfmt_complexform );
|
aclass->format_table = vips_complexform_format_table;
|
||||||
|
|
||||||
aclass->process_line = vips_complexform_buffer;
|
aclass->process_line = vips_complexform_buffer;
|
||||||
}
|
}
|
||||||
|
@ -211,7 +211,7 @@ vips_divide_buffer( VipsArithmetic *arithmetic,
|
|||||||
/* Type promotion for division. Sign and value preserving. Make sure
|
/* Type promotion for division. Sign and value preserving. Make sure
|
||||||
* these match the case statement in divide_buffer() above.
|
* these match the case statement in divide_buffer() above.
|
||||||
*/
|
*/
|
||||||
static int vips_bandfmt_divide[10] = {
|
static int vips_divide_format_table[10] = {
|
||||||
/* UC C US S UI I F X D DX */
|
/* UC C US S UI I F X D DX */
|
||||||
F, F, F, F, F, F, F, X, D, DX
|
F, F, F, F, F, F, F, X, D, DX
|
||||||
};
|
};
|
||||||
@ -225,7 +225,7 @@ vips_divide_class_init( VipsDivideClass *class )
|
|||||||
object_class->nickname = "divide";
|
object_class->nickname = "divide";
|
||||||
object_class->description = _( "divide two images" );
|
object_class->description = _( "divide two images" );
|
||||||
|
|
||||||
vips_arithmetic_set_format_table( aclass, vips_bandfmt_divide );
|
aclass->format_table = vips_divide_format_table;
|
||||||
|
|
||||||
aclass->process_line = vips_divide_buffer;
|
aclass->process_line = vips_divide_buffer;
|
||||||
}
|
}
|
||||||
|
@ -150,7 +150,7 @@ vips_invert_buffer( VipsArithmetic *arithmetic,
|
|||||||
|
|
||||||
/* Format doesn't change with invert.
|
/* Format doesn't change with invert.
|
||||||
*/
|
*/
|
||||||
static const VipsBandFormat vips_bandfmt_invert[10] = {
|
static const VipsBandFormat vips_invert_format_table[10] = {
|
||||||
/* UC C US S UI I F X D DX */
|
/* UC C US S UI I F X D DX */
|
||||||
UC, C, US, S, UI, I, F, X, D, DX
|
UC, C, US, S, UI, I, F, X, D, DX
|
||||||
};
|
};
|
||||||
@ -164,7 +164,7 @@ vips_invert_class_init( VipsInvertClass *class )
|
|||||||
object_class->nickname = "invert";
|
object_class->nickname = "invert";
|
||||||
object_class->description = _( "invert an image" );
|
object_class->description = _( "invert an image" );
|
||||||
|
|
||||||
vips_arithmetic_set_format_table( aclass, vips_bandfmt_invert );
|
aclass->format_table = vips_invert_format_table;
|
||||||
|
|
||||||
aclass->process_line = vips_invert_buffer;
|
aclass->process_line = vips_invert_buffer;
|
||||||
}
|
}
|
||||||
|
@ -257,7 +257,7 @@ vips_linear_buffer( VipsArithmetic *arithmetic,
|
|||||||
|
|
||||||
/* Format doesn't change with linear.
|
/* Format doesn't change with linear.
|
||||||
*/
|
*/
|
||||||
static const VipsBandFormat vips_bandfmt_linear[10] = {
|
static const VipsBandFormat vips_linear_format_table[10] = {
|
||||||
/* UC C US S UI I F X D DX */
|
/* UC C US S UI I F X D DX */
|
||||||
F, F, F, F, F, F, F, X, D, DX
|
F, F, F, F, F, F, F, X, D, DX
|
||||||
};
|
};
|
||||||
@ -276,8 +276,7 @@ vips_linear_class_init( VipsLinearClass *class )
|
|||||||
object_class->description = _( "calculate (a * in + b)" );
|
object_class->description = _( "calculate (a * in + b)" );
|
||||||
object_class->build = vips_linear_build;
|
object_class->build = vips_linear_build;
|
||||||
|
|
||||||
vips_arithmetic_set_format_table( aclass, vips_bandfmt_linear );
|
aclass->format_table = vips_linear_format_table;
|
||||||
|
|
||||||
aclass->process_line = vips_linear_buffer;
|
aclass->process_line = vips_linear_buffer;
|
||||||
|
|
||||||
VIPS_ARG_BOXED( class, "a", 110,
|
VIPS_ARG_BOXED( class, "a", 110,
|
||||||
|
@ -180,7 +180,7 @@ vips_math_buffer( VipsArithmetic *arithmetic,
|
|||||||
#define D VIPS_FORMAT_DOUBLE
|
#define D VIPS_FORMAT_DOUBLE
|
||||||
#define DX VIPS_FORMAT_DPCOMPLEX
|
#define DX VIPS_FORMAT_DPCOMPLEX
|
||||||
|
|
||||||
static const VipsBandFormat vips_bandfmt_math[10] = {
|
static const VipsBandFormat vips_math_format_table[10] = {
|
||||||
/* UC C US S UI I F X D DX */
|
/* UC C US S UI I F X D DX */
|
||||||
F, F, F, F, F, F, F, X, D, DX
|
F, F, F, F, F, F, F, X, D, DX
|
||||||
};
|
};
|
||||||
@ -199,8 +199,7 @@ vips_math_class_init( VipsMathClass *class )
|
|||||||
object_class->description = _( "perform a math function on an image" );
|
object_class->description = _( "perform a math function on an image" );
|
||||||
object_class->build = vips_math_build;
|
object_class->build = vips_math_build;
|
||||||
|
|
||||||
vips_arithmetic_set_format_table( aclass, vips_bandfmt_math );
|
aclass->format_table = vips_math_format_table;
|
||||||
|
|
||||||
aclass->process_line = vips_math_buffer;
|
aclass->process_line = vips_math_buffer;
|
||||||
|
|
||||||
VIPS_ARG_ENUM( class, "math", 200,
|
VIPS_ARG_ENUM( class, "math", 200,
|
||||||
|
@ -178,7 +178,7 @@ vips_math2_buffer( VipsArithmetic *arithmetic,
|
|||||||
|
|
||||||
/* Type promotion for math2. Keep in sync with math2_buffer() above.
|
/* Type promotion for math2. Keep in sync with math2_buffer() above.
|
||||||
*/
|
*/
|
||||||
static int vips_bandfmt_math2[10] = {
|
static int vips_math2_format_table[10] = {
|
||||||
/* UC C US S UI I F X D DX */
|
/* UC C US S UI I F X D DX */
|
||||||
F, F, F, F, F, F, F, X, D, DX
|
F, F, F, F, F, F, F, X, D, DX
|
||||||
};
|
};
|
||||||
@ -197,8 +197,7 @@ vips_math2_class_init( VipsMath2Class *class )
|
|||||||
object_class->description = _( "binary math operations" );
|
object_class->description = _( "binary math operations" );
|
||||||
object_class->build = vips_math2_build;
|
object_class->build = vips_math2_build;
|
||||||
|
|
||||||
vips_arithmetic_set_format_table( aclass, vips_bandfmt_math2 );
|
aclass->format_table = vips_math2_format_table;
|
||||||
|
|
||||||
aclass->process_line = vips_math2_buffer;
|
aclass->process_line = vips_math2_buffer;
|
||||||
|
|
||||||
VIPS_ARG_ENUM( class, "math2", 200,
|
VIPS_ARG_ENUM( class, "math2", 200,
|
||||||
@ -395,8 +394,7 @@ vips_math2_const_class_init( VipsMath2ConstClass *class )
|
|||||||
object_class->description = _( "pow( @in, @c )" );
|
object_class->description = _( "pow( @in, @c )" );
|
||||||
object_class->build = vips_math2_const_build;
|
object_class->build = vips_math2_const_build;
|
||||||
|
|
||||||
vips_arithmetic_set_format_table( aclass, vips_bandfmt_math2 );
|
aclass->format_table = vips_math2_format_table;
|
||||||
|
|
||||||
aclass->process_line = vips_math2_const_buffer;
|
aclass->process_line = vips_math2_const_buffer;
|
||||||
|
|
||||||
VIPS_ARG_ENUM( class, "math2", 200,
|
VIPS_ARG_ENUM( class, "math2", 200,
|
||||||
|
@ -172,8 +172,7 @@ vips_multiply_class_init( VipsMultiplyClass *class )
|
|||||||
object_class->nickname = "multiply";
|
object_class->nickname = "multiply";
|
||||||
object_class->description = _( "multiply two images" );
|
object_class->description = _( "multiply two images" );
|
||||||
|
|
||||||
vips_arithmetic_set_format_table( aclass, vips_multiply_format_table );
|
aclass->format_table = vips_multiply_format_table;
|
||||||
|
|
||||||
aclass->process_line = vips_multiply_buffer;
|
aclass->process_line = vips_multiply_buffer;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -87,14 +87,6 @@ typedef struct _VipsArithmeticClass {
|
|||||||
*/
|
*/
|
||||||
const VipsBandFormat *format_table;
|
const VipsBandFormat *format_table;
|
||||||
|
|
||||||
/* A vector program for each input type.
|
|
||||||
*/
|
|
||||||
VipsVector *vectors[VIPS_FORMAT_LAST];
|
|
||||||
|
|
||||||
/* ... and if we've set a program for this format.
|
|
||||||
*/
|
|
||||||
gboolean vector_program[VIPS_FORMAT_LAST];
|
|
||||||
|
|
||||||
/* The buffer processor.
|
/* The buffer processor.
|
||||||
*/
|
*/
|
||||||
VipsArithmeticProcessFn process_line;
|
VipsArithmeticProcessFn process_line;
|
||||||
@ -102,14 +94,6 @@ typedef struct _VipsArithmeticClass {
|
|||||||
|
|
||||||
GType vips_arithmetic_get_type( void );
|
GType vips_arithmetic_get_type( void );
|
||||||
|
|
||||||
void vips_arithmetic_set_format_table( VipsArithmeticClass *klass,
|
|
||||||
const VipsBandFormat *format_table );
|
|
||||||
VipsVector *vips_arithmetic_get_vector( VipsArithmeticClass *klass,
|
|
||||||
VipsBandFormat fmt );
|
|
||||||
void vips_arithmetic_compile( VipsArithmeticClass *klass );
|
|
||||||
VipsVector *vips_arithmetic_get_program( VipsArithmeticClass *klass,
|
|
||||||
VipsBandFormat fmt );
|
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
}
|
}
|
||||||
#endif /*__cplusplus*/
|
#endif /*__cplusplus*/
|
||||||
|
@ -200,7 +200,7 @@ vips_relational_buffer( VipsArithmetic *arithmetic,
|
|||||||
#define D VIPS_FORMAT_DOUBLE
|
#define D VIPS_FORMAT_DOUBLE
|
||||||
#define DX VIPS_FORMAT_DPCOMPLEX
|
#define DX VIPS_FORMAT_DPCOMPLEX
|
||||||
|
|
||||||
static const VipsBandFormat vips_bandfmt_relational[10] = {
|
static const VipsBandFormat vips_relational_format_table[10] = {
|
||||||
/* UC C US S UI I F X D DX */
|
/* UC C US S UI I F X D DX */
|
||||||
UC, UC, UC, UC, UC, UC, UC, UC, UC, UC
|
UC, UC, UC, UC, UC, UC, UC, UC, UC, UC
|
||||||
};
|
};
|
||||||
@ -220,8 +220,7 @@ vips_relational_class_init( VipsRelationalClass *class )
|
|||||||
_( "a relational operation on a pair of images" );
|
_( "a relational operation on a pair of images" );
|
||||||
object_class->build = vips_relational_build;
|
object_class->build = vips_relational_build;
|
||||||
|
|
||||||
vips_arithmetic_set_format_table( aclass, vips_bandfmt_relational );
|
aclass->format_table = vips_relational_format_table;
|
||||||
|
|
||||||
aclass->process_line = vips_relational_buffer;
|
aclass->process_line = vips_relational_buffer;
|
||||||
|
|
||||||
VIPS_ARG_ENUM( class, "relational", 200,
|
VIPS_ARG_ENUM( class, "relational", 200,
|
||||||
@ -557,8 +556,7 @@ vips_relational_const_class_init( VipsRelationalConstClass *class )
|
|||||||
_( "relational operations against a constant" );
|
_( "relational operations against a constant" );
|
||||||
object_class->build = vips_relational_const_build;
|
object_class->build = vips_relational_const_build;
|
||||||
|
|
||||||
vips_arithmetic_set_format_table( aclass, vips_bandfmt_relational );
|
aclass->format_table = vips_relational_format_table;
|
||||||
|
|
||||||
aclass->process_line = vips_relational_const_buffer;
|
aclass->process_line = vips_relational_const_buffer;
|
||||||
|
|
||||||
VIPS_ARG_ENUM( class, "relational", 200,
|
VIPS_ARG_ENUM( class, "relational", 200,
|
||||||
|
@ -154,7 +154,7 @@ vips_remainder_buffer( VipsArithmetic *arithmetic,
|
|||||||
|
|
||||||
/* Type promotion for remainder. Keep in sync with remainder_buffer() above.
|
/* Type promotion for remainder. Keep in sync with remainder_buffer() above.
|
||||||
*/
|
*/
|
||||||
static int vips_bandfmt_remainder[10] = {
|
static int vips_remainder_format_table[10] = {
|
||||||
/* UC C US S UI I F X D DX */
|
/* UC C US S UI I F X D DX */
|
||||||
UC, C, US, S, UI, I, F, X, D, DX
|
UC, C, US, S, UI, I, F, X, D, DX
|
||||||
};
|
};
|
||||||
@ -174,8 +174,7 @@ vips_remainder_class_init( VipsRemainderClass *class )
|
|||||||
_( "remainder after integer division of two images" );
|
_( "remainder after integer division of two images" );
|
||||||
object_class->build = vips_remainder_build;
|
object_class->build = vips_remainder_build;
|
||||||
|
|
||||||
vips_arithmetic_set_format_table( aclass, vips_bandfmt_remainder );
|
aclass->format_table = vips_remainder_format_table;
|
||||||
|
|
||||||
aclass->process_line = vips_remainder_buffer;
|
aclass->process_line = vips_remainder_buffer;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -324,8 +323,7 @@ vips_remainder_const_class_init( VipsRemainderConstClass *class )
|
|||||||
"and a constant" );
|
"and a constant" );
|
||||||
object_class->build = vips_remainder_const_build;
|
object_class->build = vips_remainder_const_build;
|
||||||
|
|
||||||
vips_arithmetic_set_format_table( aclass, vips_bandfmt_remainder );
|
aclass->format_table = vips_remainder_format_table;
|
||||||
|
|
||||||
aclass->process_line = vips_remainder_const_buffer;
|
aclass->process_line = vips_remainder_const_buffer;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -142,7 +142,7 @@ vips_round_buffer( VipsArithmetic *arithmetic,
|
|||||||
#define D VIPS_FORMAT_DOUBLE
|
#define D VIPS_FORMAT_DOUBLE
|
||||||
#define DX VIPS_FORMAT_DPCOMPLEX
|
#define DX VIPS_FORMAT_DPCOMPLEX
|
||||||
|
|
||||||
static const VipsBandFormat vips_bandfmt_round[10] = {
|
static const VipsBandFormat vips_round_format_table[10] = {
|
||||||
/* UC C US S UI I F X D DX */
|
/* UC C US S UI I F X D DX */
|
||||||
UC, C, US, S, UI, I, F, X, D, DX
|
UC, C, US, S, UI, I, F, X, D, DX
|
||||||
};
|
};
|
||||||
@ -161,8 +161,7 @@ vips_round_class_init( VipsRoundClass *class )
|
|||||||
object_class->description = _( "perform a round function on an image" );
|
object_class->description = _( "perform a round function on an image" );
|
||||||
object_class->build = vips_round_build;
|
object_class->build = vips_round_build;
|
||||||
|
|
||||||
vips_arithmetic_set_format_table( aclass, vips_bandfmt_round );
|
aclass->format_table = vips_round_format_table;
|
||||||
|
|
||||||
aclass->process_line = vips_round_buffer;
|
aclass->process_line = vips_round_buffer;
|
||||||
|
|
||||||
VIPS_ARG_ENUM( class, "round", 200,
|
VIPS_ARG_ENUM( class, "round", 200,
|
||||||
|
@ -137,7 +137,7 @@ vips_sign_buffer( VipsArithmetic *arithmetic,
|
|||||||
#define D VIPS_FORMAT_DOUBLE
|
#define D VIPS_FORMAT_DOUBLE
|
||||||
#define DX VIPS_FORMAT_DPCOMPLEX
|
#define DX VIPS_FORMAT_DPCOMPLEX
|
||||||
|
|
||||||
static const VipsBandFormat vips_bandfmt_sign[10] = {
|
static const VipsBandFormat vips_sign_format_table[10] = {
|
||||||
/* UC C US S UI I F X D DX */
|
/* UC C US S UI I F X D DX */
|
||||||
C, C, C, C, C, C, C, X, C, DX
|
C, C, C, C, C, C, C, X, C, DX
|
||||||
};
|
};
|
||||||
@ -151,8 +151,7 @@ vips_sign_class_init( VipsSignClass *class )
|
|||||||
object_class->nickname = "sign";
|
object_class->nickname = "sign";
|
||||||
object_class->description = _( "unit vector of pixel" );
|
object_class->description = _( "unit vector of pixel" );
|
||||||
|
|
||||||
vips_arithmetic_set_format_table( aclass, vips_bandfmt_sign );
|
aclass->format_table = vips_sign_format_table;
|
||||||
|
|
||||||
aclass->process_line = vips_sign_buffer;
|
aclass->process_line = vips_sign_buffer;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -147,7 +147,7 @@ vips_subtract_buffer( VipsArithmetic *arithmetic,
|
|||||||
/* Type promotion for subtraction. Sign and value preserving. Make sure these
|
/* Type promotion for subtraction. Sign and value preserving. Make sure these
|
||||||
* match the case statement in vips_subtract_buffer() above.
|
* match the case statement in vips_subtract_buffer() above.
|
||||||
*/
|
*/
|
||||||
static const VipsBandFormat bandfmt_subtract[10] = {
|
static const VipsBandFormat vips_subtract_format_table[10] = {
|
||||||
/* UC C US S UI I F X D DX */
|
/* UC C US S UI I F X D DX */
|
||||||
S, S, I, I, I, I, F, X, D, DX
|
S, S, I, I, I, I, F, X, D, DX
|
||||||
};
|
};
|
||||||
@ -161,8 +161,7 @@ vips_subtract_class_init( VipsSubtractClass *class )
|
|||||||
object_class->nickname = "subtract";
|
object_class->nickname = "subtract";
|
||||||
object_class->description = _( "subtract two images" );
|
object_class->description = _( "subtract two images" );
|
||||||
|
|
||||||
vips_arithmetic_set_format_table( aclass, bandfmt_subtract );
|
aclass->format_table = vips_subtract_format_table;
|
||||||
|
|
||||||
aclass->process_line = vips_subtract_buffer;
|
aclass->process_line = vips_subtract_buffer;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user