From 7c4135be6b43c48237395c84b605bdbee30be430 Mon Sep 17 00:00:00 2001 From: jacksonmj Date: Thu, 9 Jun 2011 22:07:40 +0800 Subject: [PATCH] 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 --- src/graphics.c | 22 +++++++++++++++------- 1 file changed, 15 insertions(+), 7 deletions(-) diff --git a/src/graphics.c b/src/graphics.c index 711edc754..dc344e381 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)),