This commit is contained in:
John Cupitt 2008-01-23 17:16:30 +00:00
parent 9c10ba9ed9
commit 830c303ada
8 changed files with 79 additions and 146 deletions

View File

@ -1,6 +1,7 @@
12/12/07 started 7.13.3
- added "include <cstring>" to VImage.cc to help gcc 4.3
- started moving the python binding to dynamic wrapping
- added im_wrap(), im_wraptwo(), im_phasecor_fft(), im_cross_phase() (Tom)
31/10/07 started 7.13.2
- build cimg on windows fixes

2
TODO
View File

@ -1,3 +1,5 @@
- HAVE_HYPOT could define a hypot() macro?
- write our own python extension to call a vips operation by name
result = vips_call ("name", args)

View File

@ -1260,9 +1260,9 @@ linreg_vec( im_object *argv )
static im_function linreg_desc = {
"im_linreg", /* Name */
N_( "pixelwise linear regression" ),
IM_FN_PIO | IM_FN_PTOP, /* Flags */
IM_FN_PIO | IM_FN_PTOP, /* Flags */
linreg_vec, /* Dispatch function */
IM_NUMBER( linreg_args ), /* Size of arg list */
IM_NUMBER( linreg_args ), /* Size of arg list */
linreg_args /* Arg list */
};
@ -1280,7 +1280,7 @@ 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 */
cross_phase_vec, /* Dispatch function */
IM_NUMBER( two_in_one_out ), /* Size of arg list */
two_in_one_out /* Arg list */
};

View File

@ -108,13 +108,15 @@
#ifdef HAVE_HYPOT
#define complexabs(TYPE) { \
TYPE *p = (TYPE *) in; \
TYPE *q = (TYPE *) out; \
TYPE *q_stop = q + sz; \
\
while( q < q_stop ) \
*q++= hypot( *p++, *p++ ); \
#define complexabs(TYPE) { \
TYPE *p = (TYPE *) in; \
TYPE *q = (TYPE *) out; \
int i; \
\
for( i = 0; i < sz; i++ ) { \
q[i] = hypot( p[0], p[1] ); \
p += 2; \
} \
}
#else /*HAVE_HYPOT*/
@ -147,8 +149,7 @@
*/
static void
abs_gen( PEL *in, PEL *out, int width, IMAGE *im )
{
int x;
{
int sz = width * im->Bands;
/* Abs all input types.

View File

@ -44,7 +44,6 @@ libiofuncs_la_SOURCES = \
im_guess_prefix.c \
im_wbuffer.c \
im_wrapmany.c \
im_wrapone.c \
im_wraptwo.c \
im_writeline.c \
memory.c \

View File

@ -22,6 +22,8 @@
* array
* 28/7/97 JC
* - amazing error ... only worked if ir and or had same valid
* 23/1/08
* - do im_wrapone() in terms of this
*/
/*
@ -67,7 +69,7 @@
typedef struct {
im_wrapmany_fn fn; /* Function we call */
void *a, *b; /* User values for function */
} UserBundle;
} Bundle;
/* Maximum number of input images -- why not?
*/
@ -79,7 +81,7 @@ static int
process_region( REGION *or, void *seq, void *a, void *b )
{
REGION **ir = (REGION **) seq;
UserBundle *bun = (UserBundle *) b;
Bundle *bun = (Bundle *) b;
PEL *p[IM_MAX_INPUT_IMAGES], *q;
int i, y;
@ -153,7 +155,7 @@ dupims( IMAGE *out, IMAGE **in )
int
im_wrapmany( IMAGE **in, IMAGE *out, im_wrapmany_fn fn, void *a, void *b )
{
UserBundle *bun = IM_NEW( out, UserBundle );
Bundle *bun = IM_NEW( out, Bundle );
int i, n;
/* Count input images.
@ -203,3 +205,55 @@ im_wrapmany( IMAGE **in, IMAGE *out, im_wrapmany_fn fn, void *a, void *b )
return( 0 );
}
static void
wrapone_gen( void **ins, void *out, int width, Bundle *bun, void *dummy )
{
((im_wrapone_fn) (bun->fn)) (ins[0], out, width, bun->a, bun->b );
}
int
im_wrapone( IMAGE *in, IMAGE *out, im_wrapone_fn fn, void *a, void *b )
{
Bundle *bun = IM_NEW( out, Bundle );
IMAGE *invec[2];
/* Heh, yuk. We cast back above.
*/
bun->fn = (im_wrapmany_fn) fn;
bun->a = a;
bun->b = b;
invec[0] = in; invec[1] = NULL;
return( im_wrapmany( invec, out,
(im_wrapmany_fn) wrapone_gen, bun, NULL ) );
}
/*
commented out for now ... replace im_wraptwo with this?
static void
wraptwo_gen( void **ins, void *out, int width, Bundle *bun, void *dummy )
{
((im_wraptwo_fn) (bun->fn)) (ins[0], ins[1], or,
width, bun->a, bun->b );
}
int
im_wraptwo( IMAGE *in1, IMAGE *in2, IMAGE *out,
im_wraptwo_fn fn, void *a, void *b )
{
Bundle *bun = IM_NEW( out, Bundle );
IMAGE *invec[3];
bun->fn = (im_wrapmany_fn) fn;
bun->a = a;
bun->b = b;
invec[0] = in1; invec[1] = in2; invec[2] = NULL;
return( im_wrapmany( invec, out,
(im_wrapmany_fn) wraptwo_gen, bun, NULL ) );
}
*/

View File

@ -1,124 +0,0 @@
/* As im_wrapmany, but just allow one input and one output.
*
* The types become:
*
* int im_wrapone( IMAGE *in, IMAGE *out,
* im_wrapone_fn fn, void *a, void *b )
*
* where im_wrapone_fn has type:
*
* process_buffer( void *in, void *out, int n,
* void *a, void *b )
* 28/7/97 JC
* - amazing error ... failed if or and ir were different sizes
*/
/*
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 <stdlib.h>
#include <vips/vips.h>
#ifdef WITH_DMALLOC
#include <dmalloc.h>
#endif /*WITH_DMALLOC*/
typedef struct {
im_wrapone_fn fn; /* Function we call */
void *a, *b; /* User values for function */
} UserBundle;
/* Build or->valid a line at a time from ir.
*/
static int
process_region( REGION *or, void *seq, void *a, void *b )
{
REGION *ir = (REGION *) seq;
UserBundle *bun = (UserBundle *) b;
PEL *p, *q;
int y;
/* Prepare input region and make buffer pointers.
*/
if( im_prepare( ir, &or->valid ) )
return( -1 );
p = (PEL *) IM_REGION_ADDR( ir, or->valid.left, or->valid.top );
q = (PEL *) IM_REGION_ADDR( or, or->valid.left, or->valid.top );
/* Convert linewise.
*/
for( y = 0; y < or->valid.height; y++ ) {
bun->fn( p, q, or->valid.width, bun->a, bun->b );
p += IM_REGION_LSKIP( ir );
q += IM_REGION_LSKIP( or );
}
return( 0 );
}
/* Wrap up as a partial.
*/
int
im_wrapone( IMAGE *in, IMAGE *out, im_wrapone_fn fn, void *a, void *b )
{
UserBundle *bun = IM_NEW( out, UserBundle );
/* Save args.
*/
if( !bun )
return( -1 );
bun->fn = fn;
bun->a = a;
bun->b = b;
/* Check descriptors.
*/
if( im_piocheck( in, out ) )
return( -1 );
/* Hint demand style. Being a buffer processor, we are happiest with
* thin strips.
*/
if( im_demand_hint( out, IM_THINSTRIP, in, NULL ) )
return( -1 );
/* Generate!
*/
if( im_generate( out,
im_start_one, process_region, im_stop_one,
in, bun ) )
return( -1 );
return( 0 );
}

View File

@ -68,8 +68,8 @@ class VImage (VImage_core):
print "VImage getattr: ", name
if (is_a_valid_method (name)):
return VImage_method (name)
else
raise AttributeError
else:
raise AttributeError ("unknown method %s" % name)
%}
/* Helper code for vips_init().
@ -104,7 +104,7 @@ args_print (Args *args)
printf ("args_print: argc = %d\n", args->argc);
// +1 so we print the trailing NULL too
for (i = 0; i < args->argc + 1; i++)
printf( "\t%2d)\t%s\n", i, args->argv[i]);
printf ("\t%2d)\t%s\n", i, args->argv[i]);
}
#endif /*DEBUG*/
@ -170,7 +170,7 @@ vips_fatal (const char *msg)
char buf[256];
im_snprintf (buf, 256, "%s\n%s", msg, im_error_buffer());
im_error_clear();
im_error_clear ();
Py_FatalError (buf);
}
@ -205,9 +205,9 @@ vips_fatal (const char *msg)
&args->argc, &args->argv, &error)) {
g_option_context_free (context);
args_free (args);
im_error( "vipsmodule", "%s", error->message);
im_error ("vipsmodule", "%s", error->message);
g_error_free (error);
vips_fatal ("can't initialise module vips_core");
vips_fatal ("can't initialise module vips");
}
g_option_context_free (context);