From 20d83b9af261ee281303aa4f506029ed8ec0ce97 Mon Sep 17 00:00:00 2001 From: John Cupitt Date: Sat, 20 Oct 2007 21:12:50 +0000 Subject: [PATCH] more gen/it hacks --- TODO | 4 ++++ libsrc/convolution/im_spcor.c | 27 ++++++++++++++++----------- libsrc/convolution/im_stretch3.c | 30 +++++++++++++++++------------- libsrc/convolution/im_zerox.c | 11 +++++++---- 4 files changed, 44 insertions(+), 28 deletions(-) diff --git a/TODO b/TODO index e5b6b57d..a402cda8 100644 --- a/TODO +++ b/TODO @@ -4,6 +4,10 @@ also, same problem as maxpos_avg re. uninit data? +- im_spcor2() has a potential leak in the start function + +- zerox_gen() passes an int as a void*, hmm + Python binding ============== diff --git a/libsrc/convolution/im_spcor.c b/libsrc/convolution/im_spcor.c index f54e415d..89c6c9e9 100644 --- a/libsrc/convolution/im_spcor.c +++ b/libsrc/convolution/im_spcor.c @@ -109,9 +109,9 @@ typedef struct { } spcor2_w_inf; -static spcor2_seq *spcor2_start( IMAGE *r, IMAGE *f ); -static int spcor2_gen( REGION *r, spcor2_seq *seq, void *unrequired, spcor2_w_inf *w_inf ); -static int spcor2_stop( spcor2_seq *seq ); +static void *spcor2_start( IMAGE *r, void *a, void *b ); +static int spcor2_gen( REGION *r, void *seq, void *a, void *b ); +static int spcor2_stop( void *seq, void *a, void *b ); #define LOOP(IN) \ { \ @@ -156,8 +156,10 @@ static int spcor2_stop( spcor2_seq *seq ); /* spcor generate function. */ static int -spcor_gen( REGION *or, REGION *ir, IMAGE *in, SpcorInfo *inf ) +spcor_gen( REGION *or, void *seq, void *a, void *b ) { + REGION *ir = (REGION *) seq; + SpcorInfo *inf = (SpcorInfo *) b; IMAGE *ref = inf->ref; Rect irect; Rect *r = &or->valid; @@ -399,14 +401,15 @@ im_spcor2_raw( im_free_dmask( w_stats ); - return im_generate( r, (void*)spcor2_start, spcor2_gen, spcor2_stop, f, w_inf ); + return im_generate( r, spcor2_start, spcor2_gen, spcor2_stop, f, w_inf ); #undef FUNCTION_NAME } -static spcor2_seq * -spcor2_start( IMAGE *r, IMAGE *f ){ +static void * +spcor2_start( IMAGE *r, void *a, void *b ){ + IMAGE *f= (IMAGE *) a; REGION *reg= im_region_create( f ); spcor2_seq *seq; @@ -427,11 +430,11 @@ spcor2_start( IMAGE *r, IMAGE *f ){ static int spcor2_gen( REGION *r, - spcor2_seq *seq, - void *unrequired, - spcor2_w_inf *w_inf + void *vseq, void *a, void *b ){ + spcor2_seq *seq= (spcor2_seq *) vseq; + spcor2_w_inf *w_inf= (spcor2_w_inf *) b; Rect need= { r-> valid. left, r-> valid. top, @@ -521,7 +524,9 @@ spcor2_gen( } static int -spcor2_stop( spcor2_seq *seq ){ +spcor2_stop( void *vseq, void *a, void *b ){ + + spcor2_seq *seq= (spcor2_seq *) vseq; im_region_free( seq-> f ); im_free( seq-> f_cols ); diff --git a/libsrc/convolution/im_stretch3.c b/libsrc/convolution/im_stretch3.c index 3eec8f93..bbd85561 100644 --- a/libsrc/convolution/im_stretch3.c +++ b/libsrc/convolution/im_stretch3.c @@ -86,22 +86,23 @@ typedef struct seq_info { } SeqInfo; static int -stop_stretch( SeqInfo *seq ) +stretch_stop( void *vseq, void *a, void *b ) { - if( seq->ir ) { - im_region_free( seq->ir ); - seq->ir = NULL; - } + SeqInfo *seq = (SeqInfo *) vseq; + + IM_FREEF( im_region_free, seq->ir ); return( 0 ); } static void * -start_stretch( IMAGE *out, IMAGE *in, StretchInfo *sin ) +stretch_start( IMAGE *out, void *a, void *b ) { - SeqInfo *seq = IM_NEW( out, SeqInfo ); + IMAGE *in = (IMAGE *) a; + StretchInfo *sin = (StretchInfo *) b; + SeqInfo *seq; - if( !seq ) + if( !(seq = IM_NEW( out, SeqInfo )) ) return( NULL ); seq->sin = sin; @@ -110,7 +111,7 @@ start_stretch( IMAGE *out, IMAGE *in, StretchInfo *sin ) seq->buf = IM_ARRAY( out, 4*seq->lsk, unsigned short ); if( !seq->buf || !seq->ir ) { - stop_stretch( seq ); + stretch_stop( seq, NULL, NULL ); return( NULL ); } @@ -191,8 +192,10 @@ make_yline( StretchInfo *sin, int lsk, int boff, } static int -stretch_gen( REGION *or, SeqInfo *seq, IMAGE *in, StretchInfo *sin ) +stretch_gen( REGION *or, void *vseq, void *a, void *b ) { + SeqInfo *seq = (SeqInfo *) vseq; + StretchInfo *sin = (StretchInfo *) b; REGION *ir = seq->ir; Rect *r = &or->valid; Rect r1; @@ -265,11 +268,12 @@ im_stretch3( IMAGE *in, IMAGE *out, double dx, double dy ) /* Check our args. */ if( in->Coding != IM_CODING_NONE || in->BandFmt != IM_BANDFMT_USHORT ) { - im_errormsg( "im_stretch3: not uncoded unsigned short" ); + im_error( "im_stretch3", _( "not uncoded unsigned short" ) ); return( -1 ); } if( dx < 0 || dx >= 1.0 || dy < 0 || dy >= 1.0 ) { - im_errormsg( "im_stretch3: displacements out of range [0,1)" ); + im_error( "im_stretch3", + _( "displacements out of range [0,1)" ) ); return( -1 ); } if( im_piocheck( in, out ) ) @@ -316,7 +320,7 @@ im_stretch3( IMAGE *in, IMAGE *out, double dx, double dy ) sin->yoff = (dy * 33.0) + 0.5; if( im_generate( out, - start_stretch, stretch_gen, stop_stretch, in, sin ) ) + stretch_start, stretch_gen, stretch_stop, in, sin ) ) return( -1 ); return( 0 ); diff --git a/libsrc/convolution/im_zerox.c b/libsrc/convolution/im_zerox.c index a76adbcb..b67b774e 100644 --- a/libsrc/convolution/im_zerox.c +++ b/libsrc/convolution/im_zerox.c @@ -67,7 +67,7 @@ #define loop( TYPE ) \ for( i = 0; i < ne; i++ ) { \ TYPE p1 = ((TYPE *)p)[i]; \ - TYPE p2 = ((TYPE *)p)[i + b]; \ + TYPE p2 = ((TYPE *)p)[i + ba]; \ \ if( flag == 1 && p1 > 0 && p2 <= 0 ) \ q[i] = 255; \ @@ -80,8 +80,11 @@ /* Zerox generate function. */ static int -zerox_gen( REGION *or, REGION *ir, IMAGE *in, int flag ) +zerox_gen( REGION *or, void *seq, void *a, void *b ) { + REGION *ir = (REGION *) seq; + IMAGE *in = (IMAGE *) a; + int flag = (int) b; Rect irect; Rect *r = &or->valid; @@ -90,8 +93,8 @@ zerox_gen( REGION *or, REGION *ir, IMAGE *in, int flag ) int le = r->left; int to = r->top; int bo = IM_RECT_BOTTOM( r ); - int b = in->Bands; - int ne = b * r->width; + int ba = in->Bands; + int ne = ba * r->width; int i, y;