Mosaicing fixes and improvements (#2705)

* Fix segv in `vips_mosaic1`

* Fix ref handling in `rotjoin_search`

* Pass `oarea` to `vips_affine` as `VipsArrayInt` instead

* Flip X/Y positions in `vips__coeff`

* Fix `-Wunused-but-set-variable` warning

* Deprecate unused mosaicing arguments

* Remove a couple of stray header decls
This commit is contained in:
Kleis Auke Wolthuizen 2022-03-03 21:10:20 +01:00 committed by GitHub
parent a0f9cd95e0
commit 330ebf3cd7
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
11 changed files with 42 additions and 54 deletions

View File

@ -4363,7 +4363,6 @@ VImage mosaic( VImage sec, VipsDirection direction, int xref, int yref, int xsec
* - **search** -- Search to improve tie-points, bool. * - **search** -- Search to improve tie-points, bool.
* - **interpolate** -- Interpolate pixels with this, VInterpolate. * - **interpolate** -- Interpolate pixels with this, VInterpolate.
* - **mblend** -- Maximum blend size, int. * - **mblend** -- Maximum blend size, int.
* - **bandno** -- Band to search for features on, int.
* *
* @param sec Secondary image. * @param sec Secondary image.
* @param direction Horizontal or vertical mosaic. * @param direction Horizontal or vertical mosaic.

View File

@ -83,7 +83,7 @@ static im_arg_desc mosaic_args[] = {
IM_INPUT_INT( "ys" ), IM_INPUT_INT( "ys" ),
IM_INPUT_INT( "halfcorrelation" ), IM_INPUT_INT( "halfcorrelation" ),
IM_INPUT_INT( "halfarea" ), IM_INPUT_INT( "halfarea" ),
IM_INPUT_INT( "balancetype" ), IM_INPUT_INT( "balancetype" ), // Deprecated
IM_INPUT_INT( "mwidth" ) IM_INPUT_INT( "mwidth" )
}; };
@ -93,7 +93,7 @@ static im_arg_desc mosaic1_args[] = {
IM_INPUT_IMAGE( "ref" ), IM_INPUT_IMAGE( "ref" ),
IM_INPUT_IMAGE( "sec" ), IM_INPUT_IMAGE( "sec" ),
IM_OUTPUT_IMAGE( "out" ), IM_OUTPUT_IMAGE( "out" ),
IM_INPUT_INT( "bandno" ), IM_INPUT_INT( "bandno" ), // Deprecated
IM_INPUT_INT( "xr1" ), IM_INPUT_INT( "xr1" ),
IM_INPUT_INT( "yr1" ), IM_INPUT_INT( "yr1" ),
IM_INPUT_INT( "xs1" ), IM_INPUT_INT( "xs1" ),
@ -104,7 +104,7 @@ static im_arg_desc mosaic1_args[] = {
IM_INPUT_INT( "ys2" ), IM_INPUT_INT( "ys2" ),
IM_INPUT_INT( "halfcorrelation" ), IM_INPUT_INT( "halfcorrelation" ),
IM_INPUT_INT( "halfarea" ), IM_INPUT_INT( "halfarea" ),
IM_INPUT_INT( "balancetype" ), IM_INPUT_INT( "balancetype" ), // Deprecated
IM_INPUT_INT( "mwidth" ) IM_INPUT_INT( "mwidth" )
}; };
@ -120,14 +120,13 @@ lrmosaic_vec( im_object *argv )
int ys = *((int *) argv[7]); int ys = *((int *) argv[7]);
int halfcorrelation = *((int *) argv[8]); int halfcorrelation = *((int *) argv[8]);
int halfarea = *((int *) argv[9]); int halfarea = *((int *) argv[9]);
int balancetype = *((int *) argv[10]);
int mwidth = *((int *) argv[11]); int mwidth = *((int *) argv[11]);
return( vips__lrmosaic( argv[0], argv[1], argv[2], return( vips__lrmosaic( argv[0], argv[1], argv[2],
bandno, bandno,
xr, yr, xs, ys, xr, yr, xs, ys,
halfcorrelation, halfarea, halfcorrelation, halfarea,
balancetype, mwidth ) ); mwidth ) );
} }
/* Call im_lrmosaic1 via arg vector. /* Call im_lrmosaic1 via arg vector.
@ -135,7 +134,6 @@ lrmosaic_vec( im_object *argv )
static int static int
lrmosaic1_vec( im_object *argv ) lrmosaic1_vec( im_object *argv )
{ {
int bandno = *((int *) argv[3]);
int xr1 = *((int *) argv[4]); int xr1 = *((int *) argv[4]);
int yr1 = *((int *) argv[5]); int yr1 = *((int *) argv[5]);
int xs1 = *((int *) argv[6]); int xs1 = *((int *) argv[6]);
@ -146,15 +144,14 @@ lrmosaic1_vec( im_object *argv )
int ys2 = *((int *) argv[11]); int ys2 = *((int *) argv[11]);
int halfcorrelation = *((int *) argv[12]); int halfcorrelation = *((int *) argv[12]);
int halfarea = *((int *) argv[13]); int halfarea = *((int *) argv[13]);
int balancetype = *((int *) argv[14]);
int mwidth = *((int *) argv[15]); int mwidth = *((int *) argv[15]);
return( im_lrmosaic1( argv[0], argv[1], argv[2], return( im_lrmosaic1( argv[0], argv[1], argv[2],
bandno, 0,
xr1, yr1, xs1, ys1, xr1, yr1, xs1, ys1,
xr2, yr2, xs2, ys2, xr2, yr2, xs2, ys2,
halfcorrelation, halfarea, halfcorrelation, halfarea,
balancetype, mwidth ) ); 0, mwidth ) );
} }
/* Description of im_lrmosaic. /* Description of im_lrmosaic.
@ -254,14 +251,13 @@ tbmosaic_vec( im_object *argv )
int y2 = *((int *) argv[7]); int y2 = *((int *) argv[7]);
int halfcorrelation = *((int *) argv[8]); int halfcorrelation = *((int *) argv[8]);
int halfarea = *((int *) argv[9]); int halfarea = *((int *) argv[9]);
int balancetype = *((int *) argv[10]);
int mwidth = *((int *) argv[11]); int mwidth = *((int *) argv[11]);
return( vips__tbmosaic( argv[0], argv[1], argv[2], return( vips__tbmosaic( argv[0], argv[1], argv[2],
bandno, bandno,
x1, y1, x2, y2, x1, y1, x2, y2,
halfcorrelation, halfarea, halfcorrelation, halfarea,
balancetype, mwidth ) ); mwidth ) );
} }
/* Call im_tbmosaic1 via arg vector. /* Call im_tbmosaic1 via arg vector.
@ -269,7 +265,6 @@ tbmosaic_vec( im_object *argv )
static int static int
tbmosaic1_vec( im_object *argv ) tbmosaic1_vec( im_object *argv )
{ {
int bandno = *((int *) argv[3]);
int xr1 = *((int *) argv[4]); int xr1 = *((int *) argv[4]);
int yr1 = *((int *) argv[5]); int yr1 = *((int *) argv[5]);
int xs1 = *((int *) argv[6]); int xs1 = *((int *) argv[6]);
@ -280,15 +275,14 @@ tbmosaic1_vec( im_object *argv )
int ys2 = *((int *) argv[11]); int ys2 = *((int *) argv[11]);
int halfcorrelation = *((int *) argv[12]); int halfcorrelation = *((int *) argv[12]);
int halfarea = *((int *) argv[13]); int halfarea = *((int *) argv[13]);
int balancetype = *((int *) argv[14]);
int mwidth = *((int *) argv[15]); int mwidth = *((int *) argv[15]);
return( im_tbmosaic1( argv[0], argv[1], argv[2], return( im_tbmosaic1( argv[0], argv[1], argv[2],
bandno, 0,
xr1, yr1, xs1, ys1, xr1, yr1, xs1, ys1,
xr2, yr2, xs2, ys2, xr2, yr2, xs2, ys2,
halfcorrelation, halfarea, halfcorrelation, halfarea,
balancetype, mwidth ) ); 0, mwidth ) );
} }
/* Call im__find_tboverlap via arg vector. /* Call im__find_tboverlap via arg vector.

View File

@ -5349,7 +5349,6 @@ im_lrmosaic1( IMAGE *ref, IMAGE *sec, IMAGE *out,
if( vips_mosaic1( ref, sec, &x, VIPS_DIRECTION_HORIZONTAL, if( vips_mosaic1( ref, sec, &x, VIPS_DIRECTION_HORIZONTAL,
xr1, yr1, xs1, ys1, xr2, yr2, xs2, ys2, xr1, yr1, xs1, ys1, xr2, yr2, xs2, ys2,
"search", TRUE, "search", TRUE,
"bandno", bandno,
"hwindow", hwindowsize, "hwindow", hwindowsize,
"harea", hsearchsize, "harea", hsearchsize,
"mblend", mwidth, "mblend", mwidth,
@ -5404,7 +5403,6 @@ im_tbmosaic1( IMAGE *ref, IMAGE *sec, IMAGE *out,
if( vips_mosaic1( ref, sec, &x, VIPS_DIRECTION_VERTICAL, if( vips_mosaic1( ref, sec, &x, VIPS_DIRECTION_VERTICAL,
xr1, yr1, xs1, ys1, xr2, yr2, xs2, ys2, xr1, yr1, xs1, ys1, xr2, yr2, xs2, ys2,
"search", TRUE, "search", TRUE,
"bandno", bandno,
"hwindow", hwindowsize, "hwindow", hwindowsize,
"harea", hsearchsize, "harea", hsearchsize,
"mblend", mwidth, "mblend", mwidth,

View File

@ -306,14 +306,12 @@ int vips__lrmosaic( VipsImage *ref, VipsImage *sec, VipsImage *out,
int bandno, int bandno,
int xref, int yref, int xsec, int ysec, int xref, int yref, int xsec, int ysec,
int hwindowsize, int hsearchsize, int hwindowsize, int hsearchsize,
int balancetype,
int mwidth ); int mwidth );
int vips__tbmosaic( VipsImage *ref, VipsImage *sec, VipsImage *out, int vips__tbmosaic( VipsImage *ref, VipsImage *sec, VipsImage *out,
int bandno, int bandno,
int xref, int yref, int xsec, int ysec, int xref, int yref, int xsec, int ysec,
int hwindowsize, int hsearchsize, int hwindowsize, int hsearchsize,
int balancetype,
int mwidth ); int mwidth );
int vips__correl( VipsImage *ref, VipsImage *sec, int vips__correl( VipsImage *ref, VipsImage *sec,

View File

@ -1165,12 +1165,6 @@ int vips__find_tboverlap( VipsImage *ref_in, VipsImage *sec_in, VipsImage *out,
int halfcorrelation, int halfarea, int halfcorrelation, int halfarea,
int *dx0, int *dy0, int *dx0, int *dy0,
double *scale1, double *angle1, double *dx1, double *dy1 ); double *scale1, double *angle1, double *dx1, double *dy1 );
int im__find_best_contrast( VipsImage *image,
int xpos, int ypos, int xsize, int ysize,
int xarray[], int yarray[], int cont[],
int nbest, int hcorsize );
int im__balance( VipsImage *ref, VipsImage *sec, VipsImage *out,
VipsImage **ref_out, VipsImage **sec_out, int dx, int dy, int balancetype );
void imb_LCh2Lab( float *, float *, int ); void imb_LCh2Lab( float *, float *, int );

View File

@ -1633,12 +1633,12 @@ vips__affinei( VipsImage *in, VipsImage *out, VipsTransformation *trn )
{ {
VipsImage **t = (VipsImage **) VipsImage **t = (VipsImage **)
vips_object_local_array( VIPS_OBJECT( out ), 2 ); vips_object_local_array( VIPS_OBJECT( out ), 2 );
VipsArea *oarea; VipsArrayInt *oarea;
gboolean repack; gboolean repack;
oarea = VIPS_AREA( vips_array_int_newv( 4, oarea = vips_array_int_newv( 4,
trn->oarea.left, trn->oarea.top, trn->oarea.left, trn->oarea.top,
trn->oarea.width, trn->oarea.height ) ); trn->oarea.width, trn->oarea.height );
/* vips7 affine would repack labq and im_benchmark() depends upon /* vips7 affine would repack labq and im_benchmark() depends upon
* this. * this.
@ -1651,10 +1651,10 @@ vips__affinei( VipsImage *in, VipsImage *out, VipsTransformation *trn )
"odx", trn->odx, "odx", trn->odx,
"ody", trn->ody, "ody", trn->ody,
NULL ) ) { NULL ) ) {
vips_area_unref( oarea ); vips_area_unref( VIPS_AREA( oarea ) );
return( -1 ); return( -1 );
} }
vips_area_unref( oarea ); vips_area_unref( VIPS_AREA( oarea ) );
in = t[0]; in = t[0];
if( repack ) { if( repack ) {

View File

@ -69,7 +69,7 @@ vips__clinear( TiePoints *points )
VipsImage *mat, *matinv; VipsImage *mat, *matinv;
double *g; double *g;
double value; double value;
double sx1 = 0.0, sx1x1 = 0.0, sy1 = 0.0, sy1y1 = 0.0, sx1y1 = 0.0; double sx1 = 0.0, sx1x1 = 0.0, sy1 = 0.0, sy1y1 = 0.0;
double sx2x1 = 0.0, sx2y1 = 0.0, sx2 = 0.0, sy2 = 0.0, sy2y1 = 0.0, sy2x1 = 0.0; double sx2x1 = 0.0, sx2y1 = 0.0, sx2 = 0.0, sy2 = 0.0, sy2y1 = 0.0, sy2x1 = 0.0;
int i, j; int i, j;
@ -99,7 +99,6 @@ vips__clinear( TiePoints *points )
sx1x1 += xref[i] * xref[i]; sx1x1 += xref[i] * xref[i];
sy1 += yref[i]; sy1 += yref[i];
sy1y1 += yref[i] * yref[i]; sy1y1 += yref[i] * yref[i];
sx1y1 += xref[i] * yref[i];
sx2x1 += xsec[i] * xref[i]; sx2x1 += xsec[i] * xref[i];
sx2y1 += xsec[i] * yref[i]; sx2y1 += xsec[i] * yref[i];
sy2y1 += ysec[i] * yref[i]; sy2y1 += ysec[i] * yref[i];

View File

@ -246,7 +246,6 @@ vips__lrmosaic( VipsImage *ref, VipsImage *sec, VipsImage *out,
int bandno, int bandno,
int xref, int yref, int xsec, int ysec, int xref, int yref, int xsec, int ysec,
int hwindowsize, int hsearchsize, int hwindowsize, int hsearchsize,
int balancetype,
int mwidth ) int mwidth )
{ {
int dx0, dy0; int dx0, dy0;

View File

@ -66,14 +66,14 @@ vips__coeff( int xr1, int yr1, int xs1, int ys1,
return( -1 ); return( -1 );
} }
*a = *VIPS_MATRIX( t[1], 0, 0 ) * xr1 + *VIPS_MATRIX( t[1], 0, 1 ) * yr1 + *a = *VIPS_MATRIX( t[1], 0, 0 ) * xr1 + *VIPS_MATRIX( t[1], 1, 0 ) * yr1 +
*VIPS_MATRIX( t[1], 0, 2 ) * xr2 + *VIPS_MATRIX( t[1], 0, 3 ) * yr2; *VIPS_MATRIX( t[1], 2, 0 ) * xr2 + *VIPS_MATRIX( t[1], 3, 0 ) * yr2;
*b = *VIPS_MATRIX( t[1], 1, 0 ) * xr1 + *VIPS_MATRIX( t[1], 1, 1 ) * yr1 + *b = *VIPS_MATRIX( t[1], 0, 1 ) * xr1 + *VIPS_MATRIX( t[1], 1, 1 ) * yr1 +
*VIPS_MATRIX( t[1], 1, 2 ) * xr2 + *VIPS_MATRIX( t[1], 1, 3 ) * yr2; *VIPS_MATRIX( t[1], 2, 1 ) * xr2 + *VIPS_MATRIX( t[1], 3, 1 ) * yr2;
*dx= *VIPS_MATRIX( t[1], 2, 0 ) * xr1 + *VIPS_MATRIX( t[1], 2, 1 ) * yr1 + *dx = *VIPS_MATRIX( t[1], 0, 2 ) * xr1 + *VIPS_MATRIX( t[1], 1, 2 ) * yr1 +
*VIPS_MATRIX( t[1], 2, 2 ) * xr2 + *VIPS_MATRIX( t[1], 2, 3 ) * yr2; *VIPS_MATRIX( t[1], 2, 2 ) * xr2 + *VIPS_MATRIX( t[1], 3, 2 ) * yr2;
*dy= *VIPS_MATRIX( t[1], 3, 0 ) * xr1 + *VIPS_MATRIX( t[1], 3, 1 ) * yr1 + *dy = *VIPS_MATRIX( t[1], 0, 3 ) * xr1 + *VIPS_MATRIX( t[1], 1, 3 ) * yr1 +
*VIPS_MATRIX( t[1], 3, 2 ) * xr2 + *VIPS_MATRIX( t[1], 3, 3 ) * yr2; *VIPS_MATRIX( t[1], 2, 3 ) * xr2 + *VIPS_MATRIX( t[1], 3, 3 ) * yr2;
g_object_unref( t[0] ); g_object_unref( t[0] );
g_object_unref( t[1] ); g_object_unref( t[1] );

View File

@ -114,6 +114,8 @@ vips__lrmerge1( VipsImage *ref, VipsImage *sec, VipsImage *out,
VipsBuf buf; VipsBuf buf;
char text[1024]; char text[1024];
t[0] = vips_image_new();
/* Scale, rotate and displace sec. /* Scale, rotate and displace sec.
*/ */
if( apply_similarity( &trn, sec, t[0], a, b, dx, dy ) ) if( apply_similarity( &trn, sec, t[0], a, b, dx, dy ) )
@ -160,6 +162,8 @@ vips__tbmerge1( VipsImage *ref, VipsImage *sec, VipsImage *out,
VipsBuf buf; VipsBuf buf;
char text[1024]; char text[1024];
t[0] = vips_image_new();
/* Scale, rotate and displace sec. /* Scale, rotate and displace sec.
*/ */
if( apply_similarity( &trn, sec, t[0], a, b, dx, dy ) ) if( apply_similarity( &trn, sec, t[0], a, b, dx, dy ) )
@ -222,11 +226,9 @@ rotjoin( VipsImage *ref, VipsImage *sec, VipsImage *out, joinfn jfn,
*/ */
static int static int
rotjoin_search( VipsImage *ref, VipsImage *sec, VipsImage *out, joinfn jfn, rotjoin_search( VipsImage *ref, VipsImage *sec, VipsImage *out, joinfn jfn,
int bandno,
int xr1, int yr1, int xs1, int ys1, int xr1, int yr1, int xs1, int ys1,
int xr2, int yr2, int xs2, int ys2, int xr2, int yr2, int xs2, int ys2,
int halfcorrelation, int halfarea, int halfcorrelation, int halfarea,
int balancetype,
int mwidth ) int mwidth )
{ {
VipsTransformation trn; VipsTransformation trn;
@ -250,14 +252,20 @@ rotjoin_search( VipsImage *ref, VipsImage *sec, VipsImage *out, joinfn jfn,
if( vips_LabQ2LabS( ref, &t[0], NULL ) ) if( vips_LabQ2LabS( ref, &t[0], NULL ) )
return( -1 ); return( -1 );
} }
else else {
t[0] = ref; t[0] = ref;
g_object_ref( t[0] );
}
if( sec->Coding == VIPS_CODING_LABQ ) { if( sec->Coding == VIPS_CODING_LABQ ) {
if( vips_LabQ2LabS( sec, &t[1], NULL ) ) if( vips_LabQ2LabS( sec, &t[1], NULL ) )
return( -1 ); return( -1 );
} }
else else {
t[1] = sec; t[1] = sec;
g_object_ref( t[1] );
}
t[2] = vips_image_new();
/* Solve to get scale + rot + disp. /* Solve to get scale + rot + disp.
*/ */
@ -329,7 +337,6 @@ old_lrmosaic1( VipsImage *ref, VipsImage *sec, VipsImage *out,
int xr1, int yr1, int xs1, int ys1, int xr1, int yr1, int xs1, int ys1,
int xr2, int yr2, int xs2, int ys2, int xr2, int yr2, int xs2, int ys2,
int halfcorrelation, int halfarea, int halfcorrelation, int halfarea,
int balancetype,
int mwidth ) int mwidth )
{ {
VipsTransformation trn1, trn2; VipsTransformation trn1, trn2;
@ -346,6 +353,8 @@ old_lrmosaic1( VipsImage *ref, VipsImage *sec, VipsImage *out,
vips_object_local_array( VIPS_OBJECT( out ), 2 ); vips_object_local_array( VIPS_OBJECT( out ), 2 );
VipsImage *dummy; VipsImage *dummy;
t[0] = vips_image_new();
/* Solve to get scale + rot + disp. /* Solve to get scale + rot + disp.
*/ */
if( vips__coeff( xr1, yr1, xs1, ys1, xr2, yr2, xs2, ys2, if( vips__coeff( xr1, yr1, xs1, ys1, xr2, yr2, xs2, ys2,
@ -382,6 +391,8 @@ old_lrmosaic1( VipsImage *ref, VipsImage *sec, VipsImage *out,
printf( "final: a = %g, b = %g, dx = %g, dy = %g\n", printf( "final: a = %g, b = %g, dx = %g, dy = %g\n",
af, bf, dxf, dyf ); af, bf, dxf, dyf );
t[1] = vips_image_new();
/* Scale and rotate final. /* Scale and rotate final.
*/ */
if( apply_similarity( &trn2, sec, t[1], af, bf, dxf, dyf ) ) if( apply_similarity( &trn2, sec, t[1], af, bf, dxf, dyf ) )
@ -394,7 +405,7 @@ old_lrmosaic1( VipsImage *ref, VipsImage *sec, VipsImage *out,
/* And join to ref. /* And join to ref.
*/ */
if( vips_merge( ref, t[1], out, VIPS_DIRECtION_HORIZONTAL, if( vips_merge( ref, t[1], out, VIPS_DIRECTION_HORIZONTAL,
-trn2.area.left, -trn2.area.top, mwidth ) ) -trn2.area.left, -trn2.area.top, mwidth ) )
return( -1 ); return( -1 );
@ -451,11 +462,9 @@ vips_mosaic1_build( VipsObject *object )
if( mosaic1->search ) { if( mosaic1->search ) {
if( rotjoin_search( mosaic1->ref, mosaic1->sec, mosaic1->out, if( rotjoin_search( mosaic1->ref, mosaic1->sec, mosaic1->out,
jfn, jfn,
mosaic1->bandno,
mosaic1->xr1, mosaic1->yr1, mosaic1->xs1, mosaic1->ys1, mosaic1->xr1, mosaic1->yr1, mosaic1->xs1, mosaic1->ys1,
mosaic1->xr2, mosaic1->yr2, mosaic1->xs2, mosaic1->ys2, mosaic1->xr2, mosaic1->yr2, mosaic1->xs2, mosaic1->ys2,
mosaic1->hwindow, mosaic1->harea, mosaic1->hwindow, mosaic1->harea,
0,
mosaic1->mblend ) ) mosaic1->mblend ) )
return( -1 ); return( -1 );
} }
@ -602,7 +611,7 @@ vips_mosaic1_class_init( VipsMosaic1Class *class )
VIPS_ARG_INT( class, "bandno", 18, VIPS_ARG_INT( class, "bandno", 18,
_( "Search band" ), _( "Search band" ),
_( "Band to search for features on" ), _( "Band to search for features on" ),
VIPS_ARGUMENT_OPTIONAL_INPUT, VIPS_ARGUMENT_OPTIONAL_INPUT | VIPS_ARGUMENT_DEPRECATED,
G_STRUCT_OFFSET( VipsMosaic1, bandno ), G_STRUCT_OFFSET( VipsMosaic1, bandno ),
0, 10000, 0 ); 0, 10000, 0 );
@ -639,7 +648,6 @@ vips_mosaic1_init( VipsMosaic1 *mosaic1 )
* * @harea: half search size * * @harea: half search size
* * @interpolate: interpolate pixels with this * * @interpolate: interpolate pixels with this
* * @mblend: maximum blend size * * @mblend: maximum blend size
* * @bandno: band to search for features
* *
* This operation joins two images top-bottom (with @sec on the right) * This operation joins two images top-bottom (with @sec on the right)
* or left-right (with @sec at the bottom) * or left-right (with @sec at the bottom)

View File

@ -217,7 +217,6 @@ vips__tbmosaic( VipsImage *ref, VipsImage *sec, VipsImage *out,
int bandno, int bandno,
int xref, int yref, int xsec, int ysec, int xref, int yref, int xsec, int ysec,
int hwindowsize, int hsearchsize, int hwindowsize, int hsearchsize,
int balancetype,
int mwidth ) int mwidth )
{ {
int dx0, dy0; int dx0, dy0;