in matlab/strred/matlabPyrTools/MEX/convolve.c [199:319]
int internal_expand(image,filt,temp,x_fdim,y_fdim,
x_start,x_step,x_stop,y_start,y_step,y_stop,
result,x_dim,y_dim,edges)
register image_type *result, *temp;
register int x_fdim, x_dim;
register int x_step, y_step;
register image_type *image;
int x_start, y_start;
image_type *filt;
int y_fdim, y_dim;
char *edges;
{
register double val;
register int filt_pos, res_pos, x_filt_stop;
register int x_pos, filt_size = x_fdim*y_fdim;
register int y_pos, im_pos;
register int x_ctr_stop = x_dim - ((x_fdim==1)?0:x_fdim);
int y_ctr_stop = (y_dim - ((y_fdim==1)?0:y_fdim));
int x_ctr_start = ((x_fdim==1)?0:1);
int y_ctr_start = ((y_fdim==1)?0:1);
int x_fmid = x_fdim/2;
int y_fmid = y_fdim/2;
int base_im_pos, x_im_dim = (x_stop-x_start+x_step-1)/x_step;
fptr reflect = edge_function(edges); /* look up edge-handling function */
if (!reflect) return(-1);
/* shift start/stop coords to filter upper left hand corner */
x_start -= x_fmid; y_start -= y_fmid;
x_stop -= x_fmid; y_stop -= y_fmid;
if (x_stop < x_ctr_stop) x_ctr_stop = x_stop;
if (y_stop < y_ctr_stop) y_ctr_stop = y_stop;
for (im_pos=0, y_pos=y_start; /* TOP ROWS */
y_pos<y_ctr_start;
y_pos+=y_step)
{
for (x_pos=x_start; /* TOP-LEFT CORNER */
x_pos<x_ctr_start;
x_pos+=x_step, im_pos++)
{
(*reflect)(filt,x_fdim,y_fdim,x_pos-1,y_pos-1,temp,EXPAND);
INPROD2(0,0)
}
(*reflect)(filt,x_fdim,y_fdim,0,y_pos-1,temp,EXPAND);
for (; /* TOP EDGE */
x_pos<x_ctr_stop;
x_pos+=x_step, im_pos++)
INPROD2(x_pos,0)
for (; /* TOP-RIGHT CORNER */
x_pos<x_stop;
x_pos+=x_step, im_pos++)
{
(*reflect)(filt,x_fdim,y_fdim,x_pos-x_ctr_stop+1,y_pos-1,temp,EXPAND);
INPROD2(x_ctr_stop,0)
}
} /* end TOP ROWS */
y_ctr_start = y_pos; /* hold location of top */
for (base_im_pos=im_pos, x_pos=x_start; /* LEFT EDGE */
x_pos<x_ctr_start;
x_pos+=x_step, base_im_pos++)
{
(*reflect)(filt,x_fdim,y_fdim,x_pos-1,0,temp,EXPAND);
for (y_pos=y_ctr_start, im_pos=base_im_pos;
y_pos<y_ctr_stop;
y_pos+=y_step, im_pos+=x_im_dim)
INPROD2(0,y_pos)
}
(*reflect)(filt,x_fdim,y_fdim,0,0,temp,EXPAND);
for (; /* CENTER */
x_pos<x_ctr_stop;
x_pos+=x_step, base_im_pos++)
for (y_pos=y_ctr_start, im_pos=base_im_pos;
y_pos<y_ctr_stop;
y_pos+=y_step, im_pos+=x_im_dim)
INPROD2(x_pos,y_pos)
for (; /* RIGHT EDGE */
x_pos<x_stop;
x_pos+=x_step, base_im_pos++)
{
(*reflect)(filt,x_fdim,y_fdim,x_pos-x_ctr_stop+1,0,temp,EXPAND);
for (y_pos=y_ctr_start, im_pos=base_im_pos;
y_pos<y_ctr_stop;
y_pos+=y_step, im_pos+=x_im_dim)
INPROD2(x_ctr_stop,y_pos)
}
for (im_pos-=(x_im_dim-1);
y_pos<y_stop; /* BOTTOM ROWS */
y_pos+=y_step)
{
for (x_pos=x_start; /* BOTTOM-LEFT CORNER */
x_pos<x_ctr_start;
x_pos+=x_step, im_pos++)
{
(*reflect)(filt,x_fdim,y_fdim,x_pos-1,y_pos-y_ctr_stop+1,temp,EXPAND);
INPROD2(0,y_ctr_stop)
}
(*reflect)(filt,x_fdim,y_fdim,0,y_pos-y_ctr_stop+1,temp,EXPAND);
for (; /* BOTTOM EDGE */
x_pos<x_ctr_stop;
x_pos+=x_step, im_pos++)
INPROD2(x_pos,y_ctr_stop)
for (; /* BOTTOM-RIGHT CORNER */
x_pos<x_stop;
x_pos+=x_step, im_pos++)
{
(*reflect)(filt,x_fdim,y_fdim,x_pos-x_ctr_stop+1,y_pos-y_ctr_stop+1,temp,EXPAND);
INPROD2(x_ctr_stop,y_ctr_stop)
}
} /* end BOTTOM */
return(0);
} /* end of internal_expand */