diff options
| author | jacksonmj <mj-pt@jacksonmj.co.uk> | 2011-06-09 14:07:40 (GMT) |
|---|---|---|
| committer | Simon Robertshaw <simon@hardwired.org.uk> | 2011-06-09 15:01:19 (GMT) |
| commit | 7c4135be6b43c48237395c84b605bdbee30be430 (patch) | |
| tree | b4f4fd457791907195d51c600c495182400e1b20 /src | |
| parent | 09a3670d642bbaae008790936f10e0edb704c8f0 (diff) | |
| download | powder-7c4135be6b43c48237395c84b605bdbee30be430.zip powder-7c4135be6b43c48237395c84b605bdbee30be430.tar.gz | |
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
Diffstat (limited to 'src')
| -rw-r--r-- | src/graphics.c | 22 |
1 files changed, 15 insertions, 7 deletions
diff --git a/src/graphics.c b/src/graphics.c index 711edc7..dc344e3 100644 --- a/src/graphics.c +++ b/src/graphics.c @@ -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)), |
