1349 lines
29 KiB
C
1349 lines
29 KiB
C
/* Function dispatch tables for arithmetic.
|
|
*
|
|
* J. Cupitt, 8/4/93.
|
|
*/
|
|
|
|
/*
|
|
|
|
This file is part of VIPS.
|
|
|
|
VIPS is free software; you can redistribute it and/or modify
|
|
it under the terms of the GNU Lesser General Public License as published by
|
|
the Free Software Foundation; either version 2 of the License, or
|
|
(at your option) any later version.
|
|
|
|
This program is distributed in the hope that it will be useful,
|
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
GNU Lesser General Public License for more details.
|
|
|
|
You should have received a copy of the GNU Lesser General Public License
|
|
along with this program; if not, write to the Free Software
|
|
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
|
|
|
*/
|
|
|
|
/*
|
|
|
|
These files are distributed with VIPS - http://www.vips.ecs.soton.ac.uk
|
|
|
|
*/
|
|
|
|
#ifdef HAVE_CONFIG_H
|
|
#include <config.h>
|
|
#endif /*HAVE_CONFIG_H*/
|
|
#include <vips/intl.h>
|
|
|
|
#include <stdio.h>
|
|
|
|
#include <vips/vips.h>
|
|
|
|
#ifdef WITH_DMALLOC
|
|
#include <dmalloc.h>
|
|
#endif /*WITH_DMALLOC*/
|
|
|
|
/* One image in, one out.
|
|
*/
|
|
static im_arg_desc one_in_one_out[] = {
|
|
IM_INPUT_IMAGE( "in" ),
|
|
IM_OUTPUT_IMAGE( "out" )
|
|
};
|
|
|
|
/* Two images in, one out.
|
|
*/
|
|
static im_arg_desc two_in_one_out[] = {
|
|
IM_INPUT_IMAGE( "in1" ),
|
|
IM_INPUT_IMAGE( "in2" ),
|
|
IM_OUTPUT_IMAGE( "out" )
|
|
};
|
|
|
|
/* Image in, number out.
|
|
*/
|
|
static im_arg_desc image_in_num_out[] = {
|
|
IM_INPUT_IMAGE( "in" ),
|
|
IM_OUTPUT_DOUBLE( "value" )
|
|
};
|
|
|
|
/* Call im_abs via arg vector.
|
|
*/
|
|
static int
|
|
abs_vec( im_object *argv )
|
|
{
|
|
return( im_abs( argv[0], argv[1] ) );
|
|
}
|
|
|
|
/* Description of im_abs.
|
|
*/
|
|
static im_function abs_desc = {
|
|
"im_abs", /* Name */
|
|
N_( "absolute value" ), /* Description */
|
|
IM_FN_PIO | IM_FN_PTOP, /* Flags */
|
|
abs_vec, /* Dispatch function */
|
|
IM_NUMBER( one_in_one_out ), /* Size of arg list */
|
|
one_in_one_out /* Arg list */
|
|
};
|
|
|
|
/* Call im_add via arg vector.
|
|
*/
|
|
static int
|
|
add_vec( im_object *argv )
|
|
{
|
|
return( im_add( argv[0], argv[1], argv[2] ) );
|
|
}
|
|
|
|
/* Description of im_add.
|
|
*/
|
|
static im_function add_desc = {
|
|
"im_add", /* Name */
|
|
N_( "add two images" ), /* Description */
|
|
IM_FN_PIO | IM_FN_PTOP, /* Flags */
|
|
add_vec, /* Dispatch function */
|
|
IM_NUMBER( two_in_one_out ), /* Size of arg list */
|
|
two_in_one_out /* Arg list */
|
|
};
|
|
|
|
/* Call im_avg via arg vector.
|
|
*/
|
|
static int
|
|
avg_vec( im_object *argv )
|
|
{
|
|
double f;
|
|
|
|
if( im_avg( argv[0], &f ) )
|
|
return( -1 );
|
|
|
|
*((double *) argv[1]) = f;
|
|
return( 0 );
|
|
}
|
|
|
|
/* Description of im_avg.
|
|
*/
|
|
static im_function avg_desc = {
|
|
"im_avg", /* Name */
|
|
N_( "average value of image" ), /* Description */
|
|
IM_FN_PIO, /* Flags */
|
|
avg_vec, /* Dispatch function */
|
|
IM_NUMBER( image_in_num_out ), /* Size of arg list */
|
|
image_in_num_out /* Arg list */
|
|
};
|
|
|
|
/* Args to im_point_bilinear.
|
|
*/
|
|
static im_arg_desc point_bilinear_args[] = {
|
|
IM_INPUT_IMAGE ("in"),
|
|
IM_INPUT_DOUBLE("x"),
|
|
IM_INPUT_DOUBLE("y"),
|
|
IM_INPUT_INT("band"),
|
|
IM_OUTPUT_DOUBLE("val")
|
|
};
|
|
|
|
/* Call im_point_bilinear via arg vector.
|
|
*/
|
|
static int
|
|
point_bilinear_vec( im_object *argv )
|
|
{
|
|
return im_point_bilinear( argv[0], *(double*)argv[1], *(double*)argv[2], *(int*)argv[3], argv[4] );
|
|
}
|
|
|
|
/* Description of im_point_bilinear.
|
|
*/
|
|
static im_function point_bilinear_desc = {
|
|
"im_point_bilinear",
|
|
"interpolate value at single point, linearly",
|
|
IM_FN_PIO,
|
|
point_bilinear_vec,
|
|
IM_NUMBER( point_bilinear_args ),
|
|
point_bilinear_args
|
|
};
|
|
|
|
/* Call im_cmulnorm via arg vector.
|
|
*/
|
|
static int
|
|
cmulnorm_vec( im_object *argv )
|
|
{
|
|
return( im_cmulnorm( argv[0], argv[1], argv[2] ) );
|
|
}
|
|
|
|
/* Description of im_cmulnorm.
|
|
*/
|
|
static im_function cmulnorm_desc = {
|
|
"im_cmulnorm", /* Name */
|
|
N_( "multiply two complex images, normalising output" ),
|
|
IM_FN_PIO, /* Flags */
|
|
cmulnorm_vec, /* Dispatch function */
|
|
IM_NUMBER( two_in_one_out ), /* Size of arg list */
|
|
two_in_one_out /* Arg list */
|
|
};
|
|
|
|
/* Call im_deviate via arg vector.
|
|
*/
|
|
static int
|
|
deviate_vec( im_object *argv )
|
|
{
|
|
double f;
|
|
|
|
if( im_deviate( argv[0], &f ) )
|
|
return( -1 );
|
|
|
|
*((double *) argv[1]) = f;
|
|
return( 0 );
|
|
}
|
|
|
|
/* Description of im_deviate.
|
|
*/
|
|
static im_function deviate_desc = {
|
|
"im_deviate", /* Name */
|
|
N_( "standard deviation of image" ), /* Description */
|
|
IM_FN_PIO, /* Flags */
|
|
deviate_vec, /* Dispatch function */
|
|
IM_NUMBER( image_in_num_out ), /* Size of arg list */
|
|
image_in_num_out /* Arg list */
|
|
};
|
|
|
|
/* Call im_exp10tra via arg vector.
|
|
*/
|
|
static int
|
|
exp10tra_vec( im_object *argv )
|
|
{
|
|
return( im_exp10tra( argv[0], argv[1] ) );
|
|
}
|
|
|
|
/* Description of im_exp10tra.
|
|
*/
|
|
static im_function exp10tra_desc = {
|
|
"im_exp10tra", /* Name */
|
|
N_( "10^pel of image" ), /* Description */
|
|
IM_FN_PIO | IM_FN_PTOP, /* Flags */
|
|
exp10tra_vec, /* Dispatch function */
|
|
IM_NUMBER( one_in_one_out ), /* Size of arg list */
|
|
one_in_one_out /* Arg list */
|
|
};
|
|
|
|
/* Call im_exptra via arg vector.
|
|
*/
|
|
static int
|
|
exptra_vec( im_object *argv )
|
|
{
|
|
return( im_exptra( argv[0], argv[1] ) );
|
|
}
|
|
|
|
/* Description of im_exptra.
|
|
*/
|
|
static im_function exptra_desc = {
|
|
"im_exptra", /* Name */
|
|
N_( "e^pel of image" ), /* Description */
|
|
IM_FN_PIO | IM_FN_PTOP, /* Flags */
|
|
exptra_vec, /* Dispatch function */
|
|
IM_NUMBER( one_in_one_out ), /* Size of arg list */
|
|
one_in_one_out /* Arg list */
|
|
};
|
|
|
|
/* Args for im_powtra().
|
|
*/
|
|
static im_arg_desc powtra_args[] = {
|
|
IM_INPUT_IMAGE( "in" ),
|
|
IM_OUTPUT_IMAGE( "out" ),
|
|
IM_INPUT_DOUBLE( "x" )
|
|
};
|
|
|
|
/* Call im_expntra via arg vector.
|
|
*/
|
|
static int
|
|
expntra_vec( im_object *argv )
|
|
{
|
|
double a = *((double *) argv[2]);
|
|
|
|
return( im_expntra( argv[0], argv[1], a ) );
|
|
}
|
|
|
|
/* Description of im_expntra.
|
|
*/
|
|
static im_function expntra_desc = {
|
|
"im_expntra", /* Name */
|
|
N_( "x^pel of image" ), /* Description */
|
|
IM_FN_PIO | IM_FN_PTOP, /* Flags */
|
|
expntra_vec, /* Dispatch function */
|
|
IM_NUMBER( powtra_args ), /* Size of arg list */
|
|
powtra_args /* Arg list */
|
|
};
|
|
|
|
/* Args for im_expntra_vec().
|
|
*/
|
|
static im_arg_desc expntra_vec_args[] = {
|
|
IM_INPUT_IMAGE( "in" ),
|
|
IM_OUTPUT_IMAGE( "out" ),
|
|
IM_INPUT_DOUBLEVEC( "v" )
|
|
};
|
|
|
|
/* Call im_expntra_vec() via arg vector.
|
|
*/
|
|
static int
|
|
expntra_vec_vec( im_object *argv )
|
|
{
|
|
im_doublevec_object *rv = (im_doublevec_object *) argv[2];
|
|
|
|
return( im_expntra_vec( argv[0], argv[1], rv->n, rv->vec ) );
|
|
}
|
|
|
|
/* Description of im_expntra_vec.
|
|
*/
|
|
static im_function expntra_vec_desc = {
|
|
"im_expntra_vec", /* Name */
|
|
N_( "[x,y,z]^pel of image" ), /* Description */
|
|
IM_FN_PIO | IM_FN_PTOP, /* Flags */
|
|
expntra_vec_vec, /* Dispatch function */
|
|
IM_NUMBER( expntra_vec_args ), /* Size of arg list */
|
|
expntra_vec_args /* Arg list */
|
|
};
|
|
|
|
/* Four images in, one out.
|
|
*/
|
|
static im_arg_desc fav4_args[] = {
|
|
IM_INPUT_IMAGE( "in1" ),
|
|
IM_INPUT_IMAGE( "in2" ),
|
|
IM_INPUT_IMAGE( "in3" ),
|
|
IM_INPUT_IMAGE( "in4" ),
|
|
IM_OUTPUT_IMAGE( "out" )
|
|
};
|
|
|
|
/* Call im_fav4 via arg vector.
|
|
*/
|
|
static int
|
|
fav4_vec( im_object *argv )
|
|
{
|
|
IMAGE *buf[4];
|
|
|
|
buf[0] = argv[0];
|
|
buf[1] = argv[1];
|
|
buf[2] = argv[2];
|
|
buf[3] = argv[3];
|
|
|
|
return( im_fav4( &buf[0], argv[4] ) );
|
|
}
|
|
|
|
/* Description of im_fav4.
|
|
*/
|
|
static im_function fav4_desc = {
|
|
"im_fav4", /* Name */
|
|
N_( "average of 4 images" ),
|
|
0, /* Flags */
|
|
fav4_vec, /* Dispatch function */
|
|
IM_NUMBER( fav4_args ), /* Size of arg list */
|
|
fav4_args /* Arg list */
|
|
};
|
|
|
|
/* Call im_divide via arg vector.
|
|
*/
|
|
static int
|
|
divide_vec( im_object *argv )
|
|
{
|
|
return( im_divide( argv[0], argv[1], argv[2] ) );
|
|
}
|
|
|
|
/* Description of im_divide.
|
|
*/
|
|
static im_function divide_desc = {
|
|
"im_divide", /* Name */
|
|
N_( "divide two images" ),
|
|
IM_FN_PIO, /* Flags */
|
|
divide_vec, /* Dispatch function */
|
|
IM_NUMBER( two_in_one_out ), /* Size of arg list */
|
|
two_in_one_out /* Arg list */
|
|
};
|
|
|
|
/* Args for im_gadd().
|
|
*/
|
|
static im_arg_desc gadd_args[] = {
|
|
IM_INPUT_DOUBLE( "a" ),
|
|
IM_INPUT_IMAGE( "in1" ),
|
|
IM_INPUT_DOUBLE( "b" ),
|
|
IM_INPUT_IMAGE( "in2" ),
|
|
IM_INPUT_DOUBLE( "c" ),
|
|
IM_OUTPUT_IMAGE( "out" )
|
|
};
|
|
|
|
/* Call im_gadd() via arg vector.
|
|
*/
|
|
static int
|
|
gadd_vec( im_object *argv )
|
|
{
|
|
double a = *((double *) argv[0]);
|
|
double b = *((double *) argv[2]);
|
|
double c = *((double *) argv[4]);
|
|
|
|
return( im_gadd( a, argv[1], b, argv[3], c, argv[5] ) );
|
|
}
|
|
|
|
/* Description of im_gadd().
|
|
*/
|
|
static im_function gadd_desc = {
|
|
"im_gadd", /* Name */
|
|
N_( "calculate a*in1 + b*in2 + c = outfile" ),
|
|
0, /* Flags */
|
|
gadd_vec, /* Dispatch function */
|
|
IM_NUMBER( gadd_args ), /* Size of arg list */
|
|
gadd_args /* Arg list */
|
|
};
|
|
|
|
/* Call im_invert via arg vector.
|
|
*/
|
|
static int
|
|
invert_vec( im_object *argv )
|
|
{
|
|
return( im_invert( argv[0], argv[1] ) );
|
|
}
|
|
|
|
/* Description of im_invert.
|
|
*/
|
|
static im_function invert_desc = {
|
|
"im_invert", /* Name */
|
|
N_( "photographic negative" ), /* Description */
|
|
IM_FN_PIO | IM_FN_PTOP, /* Flags */
|
|
invert_vec, /* Dispatch function */
|
|
IM_NUMBER( one_in_one_out ), /* Size of arg list */
|
|
one_in_one_out /* Arg list */
|
|
};
|
|
|
|
/* Args for im_lintra().
|
|
*/
|
|
static im_arg_desc lintra_args[] = {
|
|
IM_INPUT_DOUBLE( "a" ),
|
|
IM_INPUT_IMAGE( "in" ),
|
|
IM_INPUT_DOUBLE( "b" ),
|
|
IM_OUTPUT_IMAGE( "out" )
|
|
};
|
|
|
|
/* Call im_lintra() via arg vector.
|
|
*/
|
|
static int
|
|
lintra_vec( im_object *argv )
|
|
{
|
|
double a = *((double *) argv[0]);
|
|
double b = *((double *) argv[2]);
|
|
|
|
return( im_lintra( a, argv[1], b, argv[3] ) );
|
|
}
|
|
|
|
/* Description of im_lintra().
|
|
*/
|
|
static im_function lintra_desc = {
|
|
"im_lintra", /* Name */
|
|
N_( "calculate a*in + b = outfile" ),
|
|
IM_FN_PIO | IM_FN_PTOP, /* Flags */
|
|
lintra_vec, /* Dispatch function */
|
|
IM_NUMBER( lintra_args ), /* Size of arg list */
|
|
lintra_args /* Arg list */
|
|
};
|
|
|
|
/* Args for im_lintra_vec().
|
|
*/
|
|
static im_arg_desc lintra_vec_args[] = {
|
|
IM_INPUT_DOUBLEVEC( "a" ),
|
|
IM_INPUT_IMAGE( "in" ),
|
|
IM_INPUT_DOUBLEVEC( "b" ),
|
|
IM_OUTPUT_IMAGE( "out" )
|
|
};
|
|
|
|
/* Call im_lintra_vec() via arg vector.
|
|
*/
|
|
static int
|
|
lintra_vec_vec( im_object *argv )
|
|
{
|
|
im_doublevec_object *dva = (im_doublevec_object *) argv[0];
|
|
im_doublevec_object *dvb = (im_doublevec_object *) argv[2];
|
|
|
|
if( dva->n != dvb->n ) {
|
|
im_error( "im_lintra_vec",
|
|
"%s", _( "vectors not equal length" ) );
|
|
return( -1 );
|
|
}
|
|
|
|
return( im_lintra_vec( dva->n, dva->vec, argv[1], dvb->vec, argv[3] ) );
|
|
}
|
|
|
|
/* Description of im_lintra_vec().
|
|
*/
|
|
static im_function lintra_vec_desc = {
|
|
"im_lintra_vec", /* Name */
|
|
N_( "calculate a*in + b -> out, a and b vectors" ),
|
|
IM_FN_PIO | IM_FN_PTOP, /* Flags */
|
|
lintra_vec_vec, /* Dispatch function */
|
|
IM_NUMBER( lintra_vec_args ), /* Size of arg list */
|
|
lintra_vec_args /* Arg list */
|
|
};
|
|
|
|
/* Args for im_litecor().
|
|
*/
|
|
static im_arg_desc litecor_args[] = {
|
|
IM_INPUT_IMAGE( "in" ),
|
|
IM_INPUT_IMAGE( "white" ),
|
|
IM_OUTPUT_IMAGE( "out" ),
|
|
IM_INPUT_INT( "clip" ),
|
|
IM_INPUT_DOUBLE( "factor" )
|
|
};
|
|
|
|
/* Call im_litecor() via arg vector.
|
|
*/
|
|
static int
|
|
litecor_vec( im_object *argv )
|
|
{
|
|
int clip = *((int *) argv[3]);
|
|
double factor = *((double *) argv[4]);
|
|
|
|
return( im_litecor( argv[0], argv[1], argv[2], clip, factor ) );
|
|
}
|
|
|
|
/* Description of im_litecor().
|
|
*/
|
|
static im_function litecor_desc = {
|
|
"im_litecor", /* Name */
|
|
N_( "calculate max(white)*factor*(in/white), if clip == 1" ),
|
|
0, /* Flags */
|
|
litecor_vec, /* Dispatch function */
|
|
IM_NUMBER( litecor_args ), /* Size of arg list */
|
|
litecor_args /* Arg list */
|
|
};
|
|
|
|
/* Call im_log10tra via arg vector.
|
|
*/
|
|
static int
|
|
log10tra_vec( im_object *argv )
|
|
{
|
|
return( im_log10tra( argv[0], argv[1] ) );
|
|
}
|
|
|
|
/* Description of im_log10tra.
|
|
*/
|
|
static im_function log10tra_desc = {
|
|
"im_log10tra", /* Name */
|
|
N_( "log10 of image" ), /* Description */
|
|
IM_FN_PIO | IM_FN_PTOP, /* Flags */
|
|
log10tra_vec, /* Dispatch function */
|
|
IM_NUMBER( one_in_one_out ), /* Size of arg list */
|
|
one_in_one_out /* Arg list */
|
|
};
|
|
|
|
/* Call im_logtra via arg vector.
|
|
*/
|
|
static int
|
|
logtra_vec( im_object *argv )
|
|
{
|
|
return( im_logtra( argv[0], argv[1] ) );
|
|
}
|
|
|
|
/* Description of im_logtra.
|
|
*/
|
|
static im_function logtra_desc = {
|
|
"im_logtra", /* Name */
|
|
N_( "ln of image" ), /* Description */
|
|
IM_FN_PIO | IM_FN_PTOP, /* Flags */
|
|
logtra_vec, /* Dispatch function */
|
|
IM_NUMBER( one_in_one_out ), /* Size of arg list */
|
|
one_in_one_out /* Arg list */
|
|
};
|
|
|
|
/* Call im_tantra via arg vector.
|
|
*/
|
|
static int
|
|
tantra_vec( im_object *argv )
|
|
{
|
|
return( im_tantra( argv[0], argv[1] ) );
|
|
}
|
|
|
|
/* Description of im_tantra.
|
|
*/
|
|
static im_function tantra_desc = {
|
|
"im_tantra", /* Name */
|
|
N_( "tan of image (angles in degrees)" ),
|
|
IM_FN_PIO | IM_FN_PTOP, /* Flags */
|
|
tantra_vec, /* Dispatch function */
|
|
IM_NUMBER( one_in_one_out ), /* Size of arg list */
|
|
one_in_one_out /* Arg list */
|
|
};
|
|
|
|
/* Call im_atantra via arg vector.
|
|
*/
|
|
static int
|
|
atantra_vec( im_object *argv )
|
|
{
|
|
return( im_atantra( argv[0], argv[1] ) );
|
|
}
|
|
|
|
/* Description of im_atantra.
|
|
*/
|
|
static im_function atantra_desc = {
|
|
"im_atantra", /* Name */
|
|
N_( "atan of image (result in degrees)" ),
|
|
IM_FN_PIO | IM_FN_PTOP, /* Flags */
|
|
atantra_vec, /* Dispatch function */
|
|
IM_NUMBER( one_in_one_out ), /* Size of arg list */
|
|
one_in_one_out /* Arg list */
|
|
};
|
|
|
|
/* Call im_costra via arg vector.
|
|
*/
|
|
static int
|
|
costra_vec( im_object *argv )
|
|
{
|
|
return( im_costra( argv[0], argv[1] ) );
|
|
}
|
|
|
|
/* Description of im_costra.
|
|
*/
|
|
static im_function costra_desc = {
|
|
"im_costra", /* Name */
|
|
N_( "cos of image (angles in degrees)" ),
|
|
IM_FN_PIO | IM_FN_PTOP, /* Flags */
|
|
costra_vec, /* Dispatch function */
|
|
IM_NUMBER( one_in_one_out ), /* Size of arg list */
|
|
one_in_one_out /* Arg list */
|
|
};
|
|
|
|
/* Call im_acostra via arg vector.
|
|
*/
|
|
static int
|
|
acostra_vec( im_object *argv )
|
|
{
|
|
return( im_acostra( argv[0], argv[1] ) );
|
|
}
|
|
|
|
/* Description of im_acostra.
|
|
*/
|
|
static im_function acostra_desc = {
|
|
"im_acostra", /* Name */
|
|
N_( "acos of image (result in degrees)" ),
|
|
IM_FN_PIO | IM_FN_PTOP, /* Flags */
|
|
acostra_vec, /* Dispatch function */
|
|
IM_NUMBER( one_in_one_out ), /* Size of arg list */
|
|
one_in_one_out /* Arg list */
|
|
};
|
|
|
|
/* Call im_ceil via arg vector.
|
|
*/
|
|
static int
|
|
ceil_vec( im_object *argv )
|
|
{
|
|
return( im_ceil( argv[0], argv[1] ) );
|
|
}
|
|
|
|
/* Description of im_ceil.
|
|
*/
|
|
static im_function ceil_desc = {
|
|
"im_ceil", /* Name */
|
|
N_( "round to smallest integal value not less than" ),
|
|
IM_FN_PIO | IM_FN_PTOP, /* Flags */
|
|
ceil_vec, /* Dispatch function */
|
|
IM_NUMBER( one_in_one_out ), /* Size of arg list */
|
|
one_in_one_out /* Arg list */
|
|
};
|
|
|
|
/* Call im_floor via arg vector.
|
|
*/
|
|
static int
|
|
floor_vec( im_object *argv )
|
|
{
|
|
return( im_floor( argv[0], argv[1] ) );
|
|
}
|
|
|
|
/* Description of im_floor.
|
|
*/
|
|
static im_function floor_desc = {
|
|
"im_floor", /* Name */
|
|
N_( "round to largest integal value not greater than" ),
|
|
IM_FN_PIO | IM_FN_PTOP, /* Flags */
|
|
floor_vec, /* Dispatch function */
|
|
IM_NUMBER( one_in_one_out ), /* Size of arg list */
|
|
one_in_one_out /* Arg list */
|
|
};
|
|
|
|
/* Call im_rint via arg vector.
|
|
*/
|
|
static int
|
|
rint_vec( im_object *argv )
|
|
{
|
|
return( im_rint( argv[0], argv[1] ) );
|
|
}
|
|
|
|
/* Description of im_rint.
|
|
*/
|
|
static im_function rint_desc = {
|
|
"im_rint", /* Name */
|
|
N_( "round to nearest integal value" ),
|
|
IM_FN_PIO | IM_FN_PTOP, /* Flags */
|
|
rint_vec, /* Dispatch function */
|
|
IM_NUMBER( one_in_one_out ), /* Size of arg list */
|
|
one_in_one_out /* Arg list */
|
|
};
|
|
|
|
/* Call im_sintra via arg vector.
|
|
*/
|
|
static int
|
|
sintra_vec( im_object *argv )
|
|
{
|
|
return( im_sintra( argv[0], argv[1] ) );
|
|
}
|
|
|
|
/* Description of im_sintra.
|
|
*/
|
|
static im_function sintra_desc = {
|
|
"im_sintra", /* Name */
|
|
N_( "sin of image (angles in degrees)" ),
|
|
IM_FN_PIO | IM_FN_PTOP, /* Flags */
|
|
sintra_vec, /* Dispatch function */
|
|
IM_NUMBER( one_in_one_out ), /* Size of arg list */
|
|
one_in_one_out /* Arg list */
|
|
};
|
|
|
|
/* Call im_bandmean via arg vector.
|
|
*/
|
|
static int
|
|
bandmean_vec( im_object *argv )
|
|
{
|
|
return( im_bandmean( argv[0], argv[1] ) );
|
|
}
|
|
|
|
/* Description of im_bandmean.
|
|
*/
|
|
static im_function bandmean_desc = {
|
|
"im_bandmean", /* Name */
|
|
N_( "average image bands" ),
|
|
IM_FN_PIO, /* Flags */
|
|
bandmean_vec, /* Dispatch function */
|
|
IM_NUMBER( one_in_one_out ), /* Size of arg list */
|
|
one_in_one_out /* Arg list */
|
|
};
|
|
|
|
/* Call im_sign via arg vector.
|
|
*/
|
|
static int
|
|
sign_vec( im_object *argv )
|
|
{
|
|
return( im_sign( argv[0], argv[1] ) );
|
|
}
|
|
|
|
/* Description of im_sign.
|
|
*/
|
|
static im_function sign_desc = {
|
|
"im_sign", /* Name */
|
|
N_( "unit vector in direction of value" ),
|
|
IM_FN_PIO | IM_FN_PTOP, /* Flags */
|
|
sign_vec, /* Dispatch function */
|
|
IM_NUMBER( one_in_one_out ), /* Size of arg list */
|
|
one_in_one_out /* Arg list */
|
|
};
|
|
|
|
/* Call im_asintra via arg vector.
|
|
*/
|
|
static int
|
|
asintra_vec( im_object *argv )
|
|
{
|
|
return( im_asintra( argv[0], argv[1] ) );
|
|
}
|
|
|
|
/* Description of im_asintra.
|
|
*/
|
|
static im_function asintra_desc = {
|
|
"im_asintra", /* Name */
|
|
N_( "asin of image (result in degrees)" ),
|
|
IM_FN_PIO | IM_FN_PTOP, /* Flags */
|
|
asintra_vec, /* Dispatch function */
|
|
IM_NUMBER( one_in_one_out ), /* Size of arg list */
|
|
one_in_one_out /* Arg list */
|
|
};
|
|
|
|
/* Call im_max via arg vector.
|
|
*/
|
|
static int
|
|
max_vec( im_object *argv )
|
|
{
|
|
double f;
|
|
|
|
if( im_max( argv[0], &f ) )
|
|
return( -1 );
|
|
*((double *) argv[1]) = f;
|
|
|
|
return( 0 );
|
|
}
|
|
|
|
/* Description of im_max.
|
|
*/
|
|
static im_function max_desc = {
|
|
"im_max", /* Name */
|
|
N_( "maximum value of image" ), /* Description */
|
|
IM_FN_PIO, /* Flags */
|
|
max_vec, /* Dispatch function */
|
|
IM_NUMBER( image_in_num_out ), /* Size of arg list */
|
|
image_in_num_out /* Arg list */
|
|
};
|
|
|
|
/* Args for maxpos (and minpos).
|
|
*/
|
|
static im_arg_desc maxpos_args[] = {
|
|
IM_INPUT_IMAGE( "in" ),
|
|
IM_OUTPUT_COMPLEX( "position" )
|
|
};
|
|
|
|
/* Call im_maxpos via arg vector.
|
|
*/
|
|
static int
|
|
maxpos_vec( im_object *argv )
|
|
{
|
|
double f;
|
|
int x, y;
|
|
|
|
if( im_maxpos( argv[0], &x, &y, &f ) )
|
|
return( -1 );
|
|
|
|
((double *) argv[1])[0] = x;
|
|
((double *) argv[1])[1] = y;
|
|
|
|
return( 0 );
|
|
}
|
|
|
|
/* Description of im_maxpos.
|
|
*/
|
|
static im_function maxpos_desc = {
|
|
"im_maxpos", /* Name */
|
|
N_( "position of maximum value of image" ),
|
|
0, /* Flags */
|
|
maxpos_vec, /* Dispatch function */
|
|
IM_NUMBER( maxpos_args ), /* Size of arg list */
|
|
maxpos_args /* Arg list */
|
|
};
|
|
|
|
/* Args to im_maxpos_avg.
|
|
*/
|
|
static im_arg_desc maxpos_avg_args[] = {
|
|
IM_INPUT_IMAGE ("in"),
|
|
IM_OUTPUT_DOUBLE("x"),
|
|
IM_OUTPUT_DOUBLE("y"),
|
|
IM_OUTPUT_DOUBLE("out")
|
|
};
|
|
|
|
/* Call im_maxpos_avg via arg vector.
|
|
*/
|
|
static int
|
|
maxpos_avg_vec( im_object *argv )
|
|
{
|
|
return im_maxpos_avg( argv[0], argv[1], argv[2], argv[3] );
|
|
}
|
|
|
|
/* Description of im_maxpos_avg.
|
|
*/
|
|
static im_function maxpos_avg_desc = {
|
|
"im_maxpos_avg",
|
|
"position of maximum value of image, averaging in case of draw",
|
|
IM_FN_PIO,
|
|
maxpos_avg_vec,
|
|
IM_NUMBER( maxpos_avg_args ),
|
|
maxpos_avg_args
|
|
};
|
|
|
|
/* Args to im_min/maxpos_vec.
|
|
*/
|
|
static im_arg_desc maxpos_vec_args[] = {
|
|
IM_INPUT_IMAGE ("in"),
|
|
IM_INPUT_INT ("n"),
|
|
IM_OUTPUT_INTVEC("xes"),
|
|
IM_OUTPUT_INTVEC("yes"),
|
|
IM_OUTPUT_DOUBLEVEC("maxima")
|
|
};
|
|
|
|
/* Call im_maxpos_vec via arg vector.
|
|
*/
|
|
static int
|
|
maxpos_vec_vec( im_object *argv )
|
|
{
|
|
int n = *((int *) argv[1]);
|
|
im_intvec_object *xes = argv[2];
|
|
im_intvec_object *yes = argv[3];
|
|
im_doublevec_object *maxima = argv[4];
|
|
|
|
xes->vec = IM_ARRAY( NULL, n, int );
|
|
xes->n = n;
|
|
yes->vec = IM_ARRAY( NULL, n, int );
|
|
yes->n = n;
|
|
maxima->vec = IM_ARRAY( NULL, n, double );
|
|
maxima->n = n;
|
|
if( !xes->vec || !yes->vec || !maxima->vec ||
|
|
im_maxpos_vec( argv[0], xes->vec, yes->vec, maxima->vec, n ) )
|
|
return -1;
|
|
|
|
return 0;
|
|
}
|
|
|
|
/* Description of im_maxpos_vec.
|
|
*/
|
|
static im_function maxpos_vec_desc = {
|
|
"im_maxpos_vec",
|
|
"position and value of n maxima of image",
|
|
IM_FN_PIO,
|
|
maxpos_vec_vec,
|
|
IM_NUMBER( maxpos_vec_args ),
|
|
maxpos_vec_args
|
|
};
|
|
|
|
/* Call im_minpos_vec via arg vector.
|
|
*/
|
|
static int
|
|
minpos_vec_vec( im_object *argv )
|
|
{
|
|
int n = *((int *) argv[1]);
|
|
im_intvec_object *xes = argv[2];
|
|
im_intvec_object *yes = argv[3];
|
|
im_doublevec_object *minima = argv[4];
|
|
|
|
xes->vec = IM_ARRAY( NULL, n, int );
|
|
xes->n = n;
|
|
yes->vec = IM_ARRAY( NULL, n, int );
|
|
yes->n = n;
|
|
minima->vec = IM_ARRAY( NULL, n, double );
|
|
minima->n = n;
|
|
if( !xes->vec || !yes->vec || !minima->vec ||
|
|
im_minpos_vec( argv[0], xes->vec, yes->vec, minima->vec, n ) )
|
|
return -1;
|
|
|
|
return 0;
|
|
}
|
|
|
|
/* Description of im_minpos_vec.
|
|
*/
|
|
static im_function minpos_vec_desc = {
|
|
"im_minpos_vec",
|
|
"position and value of n minima of image",
|
|
IM_FN_PIO,
|
|
minpos_vec_vec,
|
|
IM_NUMBER( maxpos_vec_args ),
|
|
maxpos_vec_args
|
|
};
|
|
|
|
/* Args for measure.
|
|
*/
|
|
static im_arg_desc measure_args[] = {
|
|
IM_INPUT_IMAGE( "in" ),
|
|
IM_OUTPUT_DMASK( "mask" ),
|
|
IM_INPUT_INT( "x" ),
|
|
IM_INPUT_INT( "y" ),
|
|
IM_INPUT_INT( "w" ),
|
|
IM_INPUT_INT( "h" ),
|
|
IM_INPUT_INT( "h_patches" ),
|
|
IM_INPUT_INT( "v_patches" )
|
|
};
|
|
|
|
/* Call im_measure via arg vector.
|
|
*/
|
|
static int
|
|
measure_vec( im_object *argv )
|
|
{
|
|
IMAGE_BOX box;
|
|
int h, v, i;
|
|
int *sel;
|
|
int nsel;
|
|
im_mask_object *mo = argv[1];
|
|
|
|
box.xstart = *((int *) argv[2]);
|
|
box.ystart = *((int *) argv[3]);
|
|
box.xsize = *((int *) argv[4]);
|
|
box.ysize = *((int *) argv[5]);
|
|
box.chsel = 0;
|
|
|
|
h = *((int *) argv[6]);
|
|
v = *((int *) argv[7]);
|
|
|
|
nsel = h * v;
|
|
if( !(sel = IM_ARRAY( NULL, nsel, int )) )
|
|
return( -1 );
|
|
for( i = 0; i < nsel; i++ )
|
|
sel[i] = i + 1;
|
|
|
|
if( !(mo->mask =
|
|
im_measure( argv[0], &box, h, v, sel, nsel, mo->name )) ) {
|
|
im_free( sel );
|
|
return( -1 );
|
|
}
|
|
im_free( sel );
|
|
|
|
return( 0 );
|
|
}
|
|
|
|
/* Description of im_measure.
|
|
*/
|
|
static im_function measure_desc = {
|
|
"im_measure", /* Name */
|
|
N_( "measure averages of a grid of patches" ),
|
|
IM_FN_PIO, /* Flags */
|
|
measure_vec, /* Dispatch function */
|
|
IM_NUMBER( measure_args ), /* Size of arg list */
|
|
measure_args /* Arg list */
|
|
};
|
|
|
|
/* Call im_min via arg vector.
|
|
*/
|
|
static int
|
|
min_vec( im_object *argv )
|
|
{
|
|
double f;
|
|
|
|
if( im_min( argv[0], &f ) )
|
|
return( -1 );
|
|
*((double *) argv[1]) = f;
|
|
|
|
return( 0 );
|
|
}
|
|
|
|
/* Description of im_min.
|
|
*/
|
|
static im_function min_desc = {
|
|
"im_min", /* Name */
|
|
N_( "minimum value of image" ), /* Description */
|
|
IM_FN_PIO, /* Flags */
|
|
min_vec, /* Dispatch function */
|
|
IM_NUMBER( image_in_num_out ), /* Size of arg list */
|
|
image_in_num_out /* Arg list */
|
|
};
|
|
|
|
/* Call im_minpos via arg vector.
|
|
*/
|
|
static int
|
|
minpos_vec( im_object *argv )
|
|
{
|
|
double f;
|
|
int x, y;
|
|
|
|
if( im_minpos( argv[0], &x, &y, &f ) )
|
|
return( -1 );
|
|
|
|
((double *) argv[1])[0] = x;
|
|
((double *) argv[1])[1] = y;
|
|
|
|
return( 0 );
|
|
}
|
|
|
|
/* Description of im_minpos.
|
|
*/
|
|
static im_function minpos_desc = {
|
|
"im_minpos", /* Name */
|
|
N_( "position of minimum value of image" ),
|
|
0, /* Flags */
|
|
minpos_vec, /* Dispatch function */
|
|
IM_NUMBER( maxpos_args ), /* Size of arg list */
|
|
maxpos_args /* Arg list */
|
|
};
|
|
|
|
/* Call im_remainder via arg vector.
|
|
*/
|
|
static int
|
|
remainder_vec( im_object *argv )
|
|
{
|
|
return( im_remainder( argv[0], argv[1], argv[2] ) );
|
|
}
|
|
|
|
/* Description of im_remainder.
|
|
*/
|
|
static im_function remainder_desc = {
|
|
"im_remainder", /* Name */
|
|
N_( "remainder after integer division" ), /* Description */
|
|
IM_FN_PIO | IM_FN_PTOP, /* Flags */
|
|
remainder_vec, /* Dispatch function */
|
|
IM_NUMBER( two_in_one_out ), /* Size of arg list */
|
|
two_in_one_out /* Arg list */
|
|
};
|
|
|
|
/* Call im_remainderconst via arg vector.
|
|
*/
|
|
static int
|
|
remainderconst_vec( im_object *argv )
|
|
{
|
|
double c = *((double *) argv[2]);
|
|
|
|
return( im_remainderconst( argv[0], argv[1], c ) );
|
|
}
|
|
|
|
/* Args for im_remainderconst().
|
|
*/
|
|
static im_arg_desc remainderconst_args[] = {
|
|
IM_INPUT_IMAGE( "in" ),
|
|
IM_OUTPUT_IMAGE( "out" ),
|
|
IM_INPUT_DOUBLE( "x" )
|
|
};
|
|
|
|
/* Description of im_remainderconst.
|
|
*/
|
|
static im_function remainderconst_desc = {
|
|
"im_remainderconst", /* Name */
|
|
N_( "remainder after integer division by a constant" ),/* Description */
|
|
IM_FN_PIO | IM_FN_PTOP, /* Flags */
|
|
remainderconst_vec, /* Dispatch function */
|
|
IM_NUMBER( remainderconst_args ), /* Size of arg list */
|
|
remainderconst_args /* Arg list */
|
|
};
|
|
|
|
/* Call im_remainderconst_vec via arg vector.
|
|
*/
|
|
static int
|
|
remainderconst_vec_vec( im_object *argv )
|
|
{
|
|
im_doublevec_object *dv = (im_doublevec_object *) argv[2];
|
|
|
|
return( im_remainderconst_vec( argv[0], argv[1], dv->n, dv->vec ) );
|
|
}
|
|
|
|
/* Args for im_remainderconst_vec().
|
|
*/
|
|
static im_arg_desc remainderconst_vec_args[] = {
|
|
IM_INPUT_IMAGE( "in" ),
|
|
IM_OUTPUT_IMAGE( "out" ),
|
|
IM_INPUT_DOUBLEVEC( "x" )
|
|
};
|
|
|
|
/* Description of im_remainderconst_vec.
|
|
*/
|
|
static im_function remainderconst_vec_desc = {
|
|
"im_remainderconst_vec", /* Name */
|
|
N_( "remainder after integer division by a vector of constants" ),
|
|
/* Description */
|
|
IM_FN_PIO | IM_FN_PTOP, /* Flags */
|
|
remainderconst_vec_vec, /* Dispatch function */
|
|
IM_NUMBER( remainderconst_vec_args ), /* Size of arg list */
|
|
remainderconst_vec_args /* Arg list */
|
|
};
|
|
|
|
/* Call im_multiply via arg vector.
|
|
*/
|
|
static int
|
|
multiply_vec( im_object *argv )
|
|
{
|
|
return( im_multiply( argv[0], argv[1], argv[2] ) );
|
|
}
|
|
|
|
/* Description of im_multiply.
|
|
*/
|
|
static im_function multiply_desc = {
|
|
"im_multiply", /* Name */
|
|
N_( "multiply two images" ), /* Description */
|
|
IM_FN_PIO | IM_FN_PTOP, /* Flags */
|
|
multiply_vec, /* Dispatch function */
|
|
IM_NUMBER( two_in_one_out ), /* Size of arg list */
|
|
two_in_one_out /* Arg list */
|
|
};
|
|
|
|
/* Call im_powtra() via arg vector.
|
|
*/
|
|
static int
|
|
powtra_vec( im_object *argv )
|
|
{
|
|
double a = *((double *) argv[2]);
|
|
|
|
return( im_powtra( argv[0], argv[1], a ) );
|
|
}
|
|
|
|
/* Description of im_powtra().
|
|
*/
|
|
static im_function powtra_desc = {
|
|
"im_powtra", /* Name */
|
|
N_( "pel^x ofbuildimage" ),
|
|
IM_FN_PIO | IM_FN_PTOP, /* Flags */
|
|
powtra_vec, /* Dispatch function */
|
|
IM_NUMBER( powtra_args ), /* Size of arg list */
|
|
powtra_args /* Arg list */
|
|
};
|
|
|
|
/* Call im_powtra_vec() via arg vector.
|
|
*/
|
|
static int
|
|
powtra_vec_vec( im_object *argv )
|
|
{
|
|
im_doublevec_object *rv = (im_doublevec_object *) argv[2];
|
|
|
|
return( im_powtra_vec( argv[0], argv[1], rv->n, rv->vec ) );
|
|
}
|
|
|
|
/* Description of im_powtra_vec().
|
|
*/
|
|
static im_function powtra_vec_desc = {
|
|
"im_powtra_vec", /* Name */
|
|
N_( "pel^[x,y,z] of image" ),
|
|
IM_FN_PIO | IM_FN_PTOP, /* Flags */
|
|
powtra_vec_vec, /* Dispatch function */
|
|
IM_NUMBER( expntra_vec_args ), /* Size of arg list */
|
|
expntra_vec_args /* Arg list */
|
|
};
|
|
|
|
/* Args for im_stats.
|
|
*/
|
|
static im_arg_desc stats_args[] = {
|
|
IM_INPUT_IMAGE( "in" ),
|
|
IM_OUTPUT_DMASK_STATS( "statistics" )
|
|
};
|
|
|
|
/* Call im_stats() via arg vector.
|
|
*/
|
|
static int
|
|
stats_vec( im_object *argv )
|
|
{
|
|
im_mask_object *mo = argv[1];
|
|
|
|
if( !(mo->mask = im_stats( argv[0] )) )
|
|
return( -1 );
|
|
|
|
return( 0 );
|
|
}
|
|
|
|
/* Description of im_stats().
|
|
*/
|
|
static im_function stats_desc = {
|
|
"im_stats", /* Name */
|
|
N_( "many image statistics in one pass" ),
|
|
IM_FN_PIO, /* Flags */
|
|
stats_vec, /* Dispatch function */
|
|
IM_NUMBER( stats_args ), /* Size of arg list */
|
|
stats_args /* Arg list */
|
|
};
|
|
|
|
/* Call im_subtract via arg vector.
|
|
*/
|
|
static int
|
|
subtract_vec( im_object *argv )
|
|
{
|
|
return( im_subtract( argv[0], argv[1], argv[2] ) );
|
|
}
|
|
|
|
/* Description of im_subtract.
|
|
*/
|
|
static im_function subtract_desc = {
|
|
"im_subtract", /* Name */
|
|
N_( "subtract two images" ), /* Description */
|
|
IM_FN_PIO, /* Flags */
|
|
subtract_vec, /* Dispatch function */
|
|
IM_NUMBER( two_in_one_out ), /* Size of arg list */
|
|
two_in_one_out /* Arg list */
|
|
};
|
|
|
|
/* Args for im_linreg.
|
|
*/
|
|
static im_arg_desc linreg_args[] = {
|
|
IM_INPUT_IMAGEVEC( "ins" ),
|
|
IM_OUTPUT_IMAGE( "out" ),
|
|
IM_INPUT_DOUBLEVEC( "xs" )
|
|
};
|
|
|
|
/* Call im_linreg() via arg vector.
|
|
*/
|
|
static int
|
|
linreg_vec( im_object *argv )
|
|
{
|
|
#define FUNCTION_NAME "im_linreg_vec"
|
|
im_imagevec_object *ins_vec= (im_imagevec_object*) argv[0];
|
|
im_doublevec_object *xs_vec= (im_doublevec_object*) argv[2];
|
|
IMAGE *out= (IMAGE*) argv[1];
|
|
IMAGE **ins= IM_ARRAY( out, ins_vec-> n + 1, IMAGE* );
|
|
int i;
|
|
|
|
if( ! ins )
|
|
return -1;
|
|
|
|
for( i= 0; i < ins_vec-> n; ++i )
|
|
ins[ i ]= ins_vec-> vec[ i ];
|
|
|
|
ins[ ins_vec-> n ]= NULL;
|
|
|
|
if( xs_vec-> n != ins_vec-> n ){
|
|
im_error( FUNCTION_NAME, "image vector and x vector differ in length" );
|
|
return -1;
|
|
}
|
|
return im_linreg( ins, out, xs_vec-> vec );
|
|
|
|
#undef FUNCTION_NAME
|
|
}
|
|
|
|
/* Description of im_linreg().
|
|
*/
|
|
static im_function linreg_desc = {
|
|
"im_linreg", /* Name */
|
|
N_( "pixelwise linear regression" ),
|
|
IM_FN_PIO | IM_FN_PTOP, /* Flags */
|
|
linreg_vec, /* Dispatch function */
|
|
IM_NUMBER( linreg_args ), /* Size of arg list */
|
|
linreg_args /* Arg list */
|
|
};
|
|
|
|
/* Call im_cross_phase via arg vector.
|
|
*/
|
|
static int
|
|
cross_phase_vec( im_object *argv )
|
|
{
|
|
return( im_cross_phase( argv[0], argv[1], argv[2] ) );
|
|
}
|
|
|
|
/* Description of im_cross_phase.
|
|
*/
|
|
static im_function cross_phase_desc = {
|
|
"im_cross_phase", /* Name */
|
|
N_( "phase of cross power spectrum of two complex images" ), /* Description */
|
|
IM_FN_PIO | IM_FN_PTOP, /* Flags */
|
|
cross_phase_vec, /* Dispatch function */
|
|
IM_NUMBER( two_in_one_out ), /* Size of arg list */
|
|
two_in_one_out /* Arg list */
|
|
};
|
|
|
|
/* Package up all these functions.
|
|
*/
|
|
static im_function *arith_list[] = {
|
|
&abs_desc,
|
|
&acostra_desc,
|
|
&add_desc,
|
|
&asintra_desc,
|
|
&atantra_desc,
|
|
&avg_desc,
|
|
&point_bilinear_desc,
|
|
&bandmean_desc,
|
|
&ceil_desc,
|
|
&cmulnorm_desc,
|
|
&costra_desc,
|
|
&cross_phase_desc,
|
|
&deviate_desc,
|
|
÷_desc,
|
|
&exp10tra_desc,
|
|
&expntra_desc,
|
|
&expntra_vec_desc,
|
|
&exptra_desc,
|
|
&fav4_desc,
|
|
&floor_desc,
|
|
&gadd_desc,
|
|
&invert_desc,
|
|
&lintra_desc,
|
|
&linreg_desc,
|
|
&lintra_vec_desc,
|
|
&litecor_desc,
|
|
&log10tra_desc,
|
|
&logtra_desc,
|
|
&max_desc,
|
|
&maxpos_desc,
|
|
&maxpos_avg_desc,
|
|
&maxpos_vec_desc,
|
|
&measure_desc,
|
|
&min_desc,
|
|
&minpos_desc,
|
|
&minpos_vec_desc,
|
|
&multiply_desc,
|
|
&powtra_desc,
|
|
&powtra_vec_desc,
|
|
&remainder_desc,
|
|
&remainderconst_desc,
|
|
&remainderconst_vec_desc,
|
|
&rint_desc,
|
|
&sign_desc,
|
|
&sintra_desc,
|
|
&stats_desc,
|
|
&subtract_desc,
|
|
&tantra_desc
|
|
};
|
|
|
|
/* Package of functions.
|
|
*/
|
|
im_package im__arithmetic = {
|
|
"arithmetic",
|
|
IM_NUMBER( arith_list ),
|
|
arith_list
|
|
};
|