Fix resample_img using array indices larger than src image size

E.g. resampling to 204x128 from 153x96
Src is 14688 pixels, calculation for pixel location 203,127 accesses
array indices 14688, 14687, 14841, 14840
This commit is contained in:
jacksonmj 2011-06-09 22:07:40 +08:00 committed by Simon Robertshaw
parent 09a3670d64
commit 7c4135be6b

View File

@ -154,7 +154,7 @@ pixel *resample_img_nn(pixel * src, int sw, int sh, int rw, int rh)
pixel *resample_img(pixel *src, int sw, int sh, int rw, int rh)
{
int y, x;
int y, x, fxceil, fyceil;
//int i,j,x,y,w,h,r,g,b,c;
pixel *q = NULL;
//TODO: Actual resampling, this is just cheap nearest pixel crap
@ -174,10 +174,14 @@ pixel *resample_img(pixel *src, int sw, int sh, int rw, int rh)
fy = ((float)y)*((float)sh)/((float)rh);
fxc = modf(fx, &intp);
fyc = modf(fy, &intp);
tr = src[sw*(int)floor(fy)+(int)ceil(fx)];
fxceil = (int)ceil(fx);
fyceil = (int)ceil(fy);
if (fxceil>=sw) fxceil = sw-1;
if (fyceil>=sh) fxceil = sh-1;
tr = src[sw*(int)floor(fy)+fxceil];
tl = src[sw*(int)floor(fy)+(int)floor(fx)];
br = src[sw*(int)ceil(fy)+(int)ceil(fx)];
bl = src[sw*(int)ceil(fy)+(int)floor(fx)];
br = src[sw*fyceil+fxceil];
bl = src[sw*fyceil+(int)floor(fx)];
q[rw*y+x] = PIXRGB(
(int)(((((float)PIXR(tl))*(1.0f-fxc))+(((float)PIXR(tr))*(fxc)))*(1.0f-fyc) + ((((float)PIXR(bl))*(1.0f-fxc))+(((float)PIXR(br))*(fxc)))*(fyc)),
(int)(((((float)PIXG(tl))*(1.0f-fxc))+(((float)PIXG(tr))*(fxc)))*(1.0f-fyc) + ((((float)PIXG(bl))*(1.0f-fxc))+(((float)PIXG(br))*(fxc)))*(fyc)),
@ -210,10 +214,14 @@ pixel *resample_img(pixel *src, int sw, int sh, int rw, int rh)
fy = ((float)y)*((float)sh)/((float)rh);
fxc = modf(fx, &intp);
fyc = modf(fy, &intp);
tr = oq[sw*(int)floor(fy)+(int)ceil(fx)];
fxceil = (int)ceil(fx);
fyceil = (int)ceil(fy);
if (fxceil>=sw) fxceil = sw-1;
if (fyceil>=sh) fxceil = sh-1;
tr = oq[sw*(int)floor(fy)+fxceil];
tl = oq[sw*(int)floor(fy)+(int)floor(fx)];
br = oq[sw*(int)ceil(fy)+(int)ceil(fx)];
bl = oq[sw*(int)ceil(fy)+(int)floor(fx)];
br = oq[sw*fyceil+fxceil];
bl = oq[sw*fyceil+(int)floor(fx)];
q[rw*y+x] = PIXRGB(
(int)(((((float)PIXR(tl))*(1.0f-fxc))+(((float)PIXR(tr))*(fxc)))*(1.0f-fyc) + ((((float)PIXR(bl))*(1.0f-fxc))+(((float)PIXR(br))*(fxc)))*(fyc)),
(int)(((((float)PIXG(tl))*(1.0f-fxc))+(((float)PIXG(tr))*(fxc)))*(1.0f-fyc) + ((((float)PIXG(bl))*(1.0f-fxc))+(((float)PIXG(br))*(fxc)))*(fyc)),