From 5b94bf1ce863fa7d319e2fe6c8f7505f6bb5ab45 Mon Sep 17 00:00:00 2001 From: Yay295 Date: Tue, 23 Aug 2022 14:44:25 -0500 Subject: [PATCH] account for pixel size in ImagingScaleAffine() --- src/libImaging/Geometry.c | 44 +++++++++++++++++---------------------- 1 file changed, 19 insertions(+), 25 deletions(-) diff --git a/src/libImaging/Geometry.c b/src/libImaging/Geometry.c index ad36d9600..f4418bf50 100644 --- a/src/libImaging/Geometry.c +++ b/src/libImaging/Geometry.c @@ -731,11 +731,12 @@ ImagingScaleAffine( /* scale, nearest neighbour resampling */ ImagingSectionCookie cookie; - int x, y; + int x, y, b; int xin; double xo, yo; int xmin, xmax; int *xintab; + int pixelsize; if (!imOut || !imIn || strcmp(imIn->mode, imOut->mode) != 0) { return (Imaging)ImagingError_ModeError(); @@ -782,35 +783,28 @@ ImagingScaleAffine( xo += a[0]; } -#define AFFINE_SCALE(pixel, image) \ - for (y = y0; y < y1; y++) { \ - int yi = COORD(yo); \ - pixel *in, *out; \ - out = imOut->image[y]; \ - if (fill && x1 > x0) { \ - memset(out + x0, 0, (x1 - x0) * sizeof(pixel)); \ - } \ - if (yi >= 0 && yi < imIn->ysize) { \ - in = imIn->image[yi]; \ - for (x = xmin; x < xmax; x++) { \ - out[x] = in[xintab[x]]; \ - } \ - } \ - yo += a[4]; \ - } + pixelsize = imOut->pixelsize; ImagingSectionEnter(&cookie); - - if (imIn->image8) { - AFFINE_SCALE(UINT8, image8); - } else { - AFFINE_SCALE(INT32, image32); + for (y = y0; y < y1; y++) { + int yi = COORD(yo); + UINT8 *in, *out; + out = (UINT8 *)imOut->image[y]; + if (fill && x1 > x0) { + memset(out + x0 * pixelsize, 0, (x1 - x0) * pixelsize); + } + if (yi >= 0 && yi < imIn->ysize) { + in = (UINT8 *)imIn->image[yi]; + for (x = xmin; x < xmax; x++) { + for (b = 0; b < pixelsize; b++) { + out[x * pixelsize + b] = in[xintab[x] * pixelsize + b]; + } + } + } + yo += a[4]; } - ImagingSectionLeave(&cookie); -#undef AFFINE_SCALE - free(xintab); return imOut;