diff --git a/Tests/test_image_reduce.py b/Tests/test_image_reduce.py index 79be88104..96ecc1540 100644 --- a/Tests/test_image_reduce.py +++ b/Tests/test_image_reduce.py @@ -46,16 +46,21 @@ class TestImageReduce(PillowTestCase): im.reduce(3) def get_image(self, mode): - bands = [self.gradients_image] - for _ in ImageMode.getmode(mode).bands[1:]: - # rotate previous image - band = bands[-1].transpose(Image.ROTATE_90) - bands.append(band) - # Correct alpha channel to exclude completely transparent pixels. - # Low alpha values also emphasize error after alpha multiplication. - if mode.endswith('A'): - bands[-1] = bands[-1].point(lambda x: int(85 + x / 1.5)) - return Image.merge(mode, bands) + mode_info = ImageMode.getmode(mode) + if mode_info.basetype == 'L': + bands = [self.gradients_image] + for _ in mode_info.bands[1:]: + # rotate previous image + band = bands[-1].transpose(Image.ROTATE_90) + bands.append(band) + # Correct alpha channel to exclude completely transparent pixels. + # Low alpha values also emphasize error after alpha multiplication. + if mode.endswith('A'): + bands[-1] = bands[-1].point(lambda x: int(85 + x / 1.5)) + return Image.merge(mode, bands) + else: + assert len(mode_info.bands) == 1 + return self.gradients_image.convert(mode) def compare_reduce_with_reference(self, im, factor, average_diff=0.4, max_diff=1): """Image.reduce() should look very similar to Image.resize(BOX). @@ -172,7 +177,7 @@ class TestImageReduce(PillowTestCase): for factor in self.remarkable_factors: self.compare_reduce_with_reference(im, factor) - def test_mode_CMYK(self): - im = self.get_image("CMYK") + def test_mode_F(self): + im = self.get_image("F") for factor in self.remarkable_factors: self.compare_reduce_with_reference(im, factor) diff --git a/src/libImaging/Reduce.c b/src/libImaging/Reduce.c index 9ec102a1c..703c4c758 100644 --- a/src/libImaging/Reduce.c +++ b/src/libImaging/Reduce.c @@ -55,147 +55,137 @@ ImagingReduceNxN(Imaging imOut, Imaging imIn, int xscale, int yscale) } } } else { - switch(imIn->type) { - case IMAGING_TYPE_UINT8: - for (y = 0; y < imIn->ysize / yscale; y++) { - if (imIn->bands == 2) { - for (x = 0; x < imIn->xsize / xscale; x++) { - UINT32 v; - UINT32 ss0 = amend, ss3 = amend; - for (yy = y*yscale; yy < y*yscale + yscale - 1; yy += 2) { - UINT8 *line0 = (UINT8 *)imIn->image[yy]; - UINT8 *line1 = (UINT8 *)imIn->image[yy + 1]; - for (xi = 0; xi < xscale - 1; xi += 2) { - xx = x*xscale + xi; - ss0 += line0[xx*4 + 0] + line0[xx*4 + 4] + - line1[xx*4 + 0] + line1[xx*4 + 4]; - ss3 += line0[xx*4 + 3] + line0[xx*4 + 7] + - line1[xx*4 + 3] + line1[xx*4 + 7]; - } - if (xscale & 0x01) { - xx = x*xscale + xi; - ss0 += line0[xx*4 + 0] + line1[xx*4 + 0]; - ss3 += line0[xx*4 + 3] + line1[xx*4 + 3]; - } + for (y = 0; y < imIn->ysize / yscale; y++) { + if (imIn->bands == 2) { + for (x = 0; x < imIn->xsize / xscale; x++) { + UINT32 v; + UINT32 ss0 = amend, ss3 = amend; + for (yy = y*yscale; yy < y*yscale + yscale - 1; yy += 2) { + UINT8 *line0 = (UINT8 *)imIn->image[yy]; + UINT8 *line1 = (UINT8 *)imIn->image[yy + 1]; + for (xi = 0; xi < xscale - 1; xi += 2) { + xx = x*xscale + xi; + ss0 += line0[xx*4 + 0] + line0[xx*4 + 4] + + line1[xx*4 + 0] + line1[xx*4 + 4]; + ss3 += line0[xx*4 + 3] + line0[xx*4 + 7] + + line1[xx*4 + 3] + line1[xx*4 + 7]; } - if (yscale & 0x01) { - UINT8 *line = (UINT8 *)imIn->image[yy]; - for (xi = 0; xi < xscale - 1; xi += 2) { - xx = x*xscale + xi; - ss0 += line[xx*4 + 0] + line[xx*4 + 4]; - ss3 += line[xx*4 + 3] + line[xx*4 + 7]; - } - if (xscale & 0x01) { - xx = x*xscale + xi; - ss0 += line[xx*4 + 0]; - ss3 += line[xx*4 + 3]; - } + if (xscale & 0x01) { + xx = x*xscale + xi; + ss0 += line0[xx*4 + 0] + line1[xx*4 + 0]; + ss3 += line0[xx*4 + 3] + line1[xx*4 + 3]; } - v = MAKE_UINT32( - (ss0 * multiplier) >> 24, 0, - 0, (ss3 * multiplier) >> 24); - memcpy(imOut->image[y] + x * sizeof(v), &v, sizeof(v)); } - } else if (imIn->bands == 3) { - for (x = 0; x < imIn->xsize / xscale; x++) { - UINT32 v; - UINT32 ss0 = amend, ss1 = amend, ss2 = amend; - for (yy = y*yscale; yy < y*yscale + yscale - 1; yy += 2) { - UINT8 *line0 = (UINT8 *)imIn->image[yy]; - UINT8 *line1 = (UINT8 *)imIn->image[yy + 1]; - for (xi = 0; xi < xscale - 1; xi += 2) { - xx = x*xscale + xi; - ss0 += line0[xx*4 + 0] + line0[xx*4 + 4] + - line1[xx*4 + 0] + line1[xx*4 + 4]; - ss1 += line0[xx*4 + 1] + line0[xx*4 + 5] + - line1[xx*4 + 1] + line1[xx*4 + 5]; - ss2 += line0[xx*4 + 2] + line0[xx*4 + 6] + - line1[xx*4 + 2] + line1[xx*4 + 6]; - } - if (xscale & 0x01) { - xx = x*xscale + xi; - ss0 += line0[xx*4 + 0] + line1[xx*4 + 0]; - ss1 += line0[xx*4 + 1] + line1[xx*4 + 1]; - ss2 += line0[xx*4 + 2] + line1[xx*4 + 2]; - } + if (yscale & 0x01) { + UINT8 *line = (UINT8 *)imIn->image[yy]; + for (xi = 0; xi < xscale - 1; xi += 2) { + xx = x*xscale + xi; + ss0 += line[xx*4 + 0] + line[xx*4 + 4]; + ss3 += line[xx*4 + 3] + line[xx*4 + 7]; } - if (yscale & 0x01) { - UINT8 *line = (UINT8 *)imIn->image[yy]; - for (xi = 0; xi < xscale - 1; xi += 2) { - xx = x*xscale + xi; - ss0 += line[xx*4 + 0] + line[xx*4 + 4]; - ss1 += line[xx*4 + 1] + line[xx*4 + 5]; - ss2 += line[xx*4 + 2] + line[xx*4 + 6]; - } - if (xscale & 0x01) { - xx = x*xscale + xi; - ss0 += line[xx*4 + 0]; - ss1 += line[xx*4 + 1]; - ss2 += line[xx*4 + 2]; - } + if (xscale & 0x01) { + xx = x*xscale + xi; + ss0 += line[xx*4 + 0]; + ss3 += line[xx*4 + 3]; } - v = MAKE_UINT32( - (ss0 * multiplier) >> 24, (ss1 * multiplier) >> 24, - (ss2 * multiplier) >> 24, 0); - memcpy(imOut->image[y] + x * sizeof(v), &v, sizeof(v)); } - } else { // bands == 4 - for (x = 0; x < imIn->xsize / xscale; x++) { - UINT32 v; - UINT32 ss0 = amend, ss1 = amend, ss2 = amend, ss3 = amend; - for (yy = y*yscale; yy < y*yscale + yscale - 1; yy += 2) { - UINT8 *line0 = (UINT8 *)imIn->image[yy]; - UINT8 *line1 = (UINT8 *)imIn->image[yy + 1]; - for (xi = 0; xi < xscale - 1; xi += 2) { - xx = x*xscale + xi; - ss0 += line0[xx*4 + 0] + line0[xx*4 + 4] + - line1[xx*4 + 0] + line1[xx*4 + 4]; - ss1 += line0[xx*4 + 1] + line0[xx*4 + 5] + - line1[xx*4 + 1] + line1[xx*4 + 5]; - ss2 += line0[xx*4 + 2] + line0[xx*4 + 6] + - line1[xx*4 + 2] + line1[xx*4 + 6]; - ss3 += line0[xx*4 + 3] + line0[xx*4 + 7] + - line1[xx*4 + 3] + line1[xx*4 + 7]; - } - if (xscale & 0x01) { - xx = x*xscale + xi; - ss0 += line0[xx*4 + 0] + line1[xx*4 + 0]; - ss1 += line0[xx*4 + 1] + line1[xx*4 + 1]; - ss2 += line0[xx*4 + 2] + line1[xx*4 + 2]; - ss3 += line0[xx*4 + 3] + line1[xx*4 + 3]; - } + v = MAKE_UINT32( + (ss0 * multiplier) >> 24, 0, + 0, (ss3 * multiplier) >> 24); + memcpy(imOut->image[y] + x * sizeof(v), &v, sizeof(v)); + } + } else if (imIn->bands == 3) { + for (x = 0; x < imIn->xsize / xscale; x++) { + UINT32 v; + UINT32 ss0 = amend, ss1 = amend, ss2 = amend; + for (yy = y*yscale; yy < y*yscale + yscale - 1; yy += 2) { + UINT8 *line0 = (UINT8 *)imIn->image[yy]; + UINT8 *line1 = (UINT8 *)imIn->image[yy + 1]; + for (xi = 0; xi < xscale - 1; xi += 2) { + xx = x*xscale + xi; + ss0 += line0[xx*4 + 0] + line0[xx*4 + 4] + + line1[xx*4 + 0] + line1[xx*4 + 4]; + ss1 += line0[xx*4 + 1] + line0[xx*4 + 5] + + line1[xx*4 + 1] + line1[xx*4 + 5]; + ss2 += line0[xx*4 + 2] + line0[xx*4 + 6] + + line1[xx*4 + 2] + line1[xx*4 + 6]; } - if (yscale & 0x01) { - UINT8 *line = (UINT8 *)imIn->image[yy]; - for (xi = 0; xi < xscale - 1; xi += 2) { - xx = x*xscale + xi; - ss0 += line[xx*4 + 0] + line[xx*4 + 4]; - ss1 += line[xx*4 + 1] + line[xx*4 + 5]; - ss2 += line[xx*4 + 2] + line[xx*4 + 6]; - ss3 += line[xx*4 + 3] + line[xx*4 + 7]; - } - if (xscale & 0x01) { - xx = x*xscale + xi; - ss0 += line[xx*4 + 0]; - ss1 += line[xx*4 + 1]; - ss2 += line[xx*4 + 2]; - ss3 += line[xx*4 + 3]; - } + if (xscale & 0x01) { + xx = x*xscale + xi; + ss0 += line0[xx*4 + 0] + line1[xx*4 + 0]; + ss1 += line0[xx*4 + 1] + line1[xx*4 + 1]; + ss2 += line0[xx*4 + 2] + line1[xx*4 + 2]; } - v = MAKE_UINT32( - (ss0 * multiplier) >> 24, (ss1 * multiplier) >> 24, - (ss2 * multiplier) >> 24, (ss3 * multiplier) >> 24); - memcpy(imOut->image[y] + x * sizeof(v), &v, sizeof(v)); } + if (yscale & 0x01) { + UINT8 *line = (UINT8 *)imIn->image[yy]; + for (xi = 0; xi < xscale - 1; xi += 2) { + xx = x*xscale + xi; + ss0 += line[xx*4 + 0] + line[xx*4 + 4]; + ss1 += line[xx*4 + 1] + line[xx*4 + 5]; + ss2 += line[xx*4 + 2] + line[xx*4 + 6]; + } + if (xscale & 0x01) { + xx = x*xscale + xi; + ss0 += line[xx*4 + 0]; + ss1 += line[xx*4 + 1]; + ss2 += line[xx*4 + 2]; + } + } + v = MAKE_UINT32( + (ss0 * multiplier) >> 24, (ss1 * multiplier) >> 24, + (ss2 * multiplier) >> 24, 0); + memcpy(imOut->image[y] + x * sizeof(v), &v, sizeof(v)); + } + } else { // bands == 4 + for (x = 0; x < imIn->xsize / xscale; x++) { + UINT32 v; + UINT32 ss0 = amend, ss1 = amend, ss2 = amend, ss3 = amend; + for (yy = y*yscale; yy < y*yscale + yscale - 1; yy += 2) { + UINT8 *line0 = (UINT8 *)imIn->image[yy]; + UINT8 *line1 = (UINT8 *)imIn->image[yy + 1]; + for (xi = 0; xi < xscale - 1; xi += 2) { + xx = x*xscale + xi; + ss0 += line0[xx*4 + 0] + line0[xx*4 + 4] + + line1[xx*4 + 0] + line1[xx*4 + 4]; + ss1 += line0[xx*4 + 1] + line0[xx*4 + 5] + + line1[xx*4 + 1] + line1[xx*4 + 5]; + ss2 += line0[xx*4 + 2] + line0[xx*4 + 6] + + line1[xx*4 + 2] + line1[xx*4 + 6]; + ss3 += line0[xx*4 + 3] + line0[xx*4 + 7] + + line1[xx*4 + 3] + line1[xx*4 + 7]; + } + if (xscale & 0x01) { + xx = x*xscale + xi; + ss0 += line0[xx*4 + 0] + line1[xx*4 + 0]; + ss1 += line0[xx*4 + 1] + line1[xx*4 + 1]; + ss2 += line0[xx*4 + 2] + line1[xx*4 + 2]; + ss3 += line0[xx*4 + 3] + line1[xx*4 + 3]; + } + } + if (yscale & 0x01) { + UINT8 *line = (UINT8 *)imIn->image[yy]; + for (xi = 0; xi < xscale - 1; xi += 2) { + xx = x*xscale + xi; + ss0 += line[xx*4 + 0] + line[xx*4 + 4]; + ss1 += line[xx*4 + 1] + line[xx*4 + 5]; + ss2 += line[xx*4 + 2] + line[xx*4 + 6]; + ss3 += line[xx*4 + 3] + line[xx*4 + 7]; + } + if (xscale & 0x01) { + xx = x*xscale + xi; + ss0 += line[xx*4 + 0]; + ss1 += line[xx*4 + 1]; + ss2 += line[xx*4 + 2]; + ss3 += line[xx*4 + 3]; + } + } + v = MAKE_UINT32( + (ss0 * multiplier) >> 24, (ss1 * multiplier) >> 24, + (ss2 * multiplier) >> 24, (ss3 * multiplier) >> 24); + memcpy(imOut->image[y] + x * sizeof(v), &v, sizeof(v)); } } - break; - - case IMAGING_TYPE_INT32: - break; - - case IMAGING_TYPE_FLOAT32: - break; } } } @@ -228,84 +218,74 @@ ImagingReduce1xN(Imaging imOut, Imaging imIn, int yscale) } } } else { - switch(imIn->type) { - case IMAGING_TYPE_UINT8: - for (y = 0; y < imIn->ysize / yscale; y++) { - if (imIn->bands == 2) { - for (x = 0; x < imIn->xsize / xscale; x++) { - UINT32 v; - UINT32 ss0 = amend, ss3 = amend; - for (yy = y*yscale; yy < y*yscale + yscale - 1; yy += 2) { - UINT8 *line0 = (UINT8 *)imIn->image[yy]; - UINT8 *line1 = (UINT8 *)imIn->image[yy + 1]; - ss0 += line0[x*4 + 0] + line1[x*4 + 0]; - ss3 += line0[x*4 + 3] + line1[x*4 + 3]; - } - if (yscale & 0x01) { - UINT8 *line = (UINT8 *)imIn->image[yy]; - ss0 += line[x*4 + 0]; - ss3 += line[x*4 + 3]; - } - v = MAKE_UINT32( - (ss0 * multiplier) >> 24, 0, - 0, (ss3 * multiplier) >> 24); - memcpy(imOut->image[y] + x * sizeof(v), &v, sizeof(v)); + for (y = 0; y < imIn->ysize / yscale; y++) { + if (imIn->bands == 2) { + for (x = 0; x < imIn->xsize / xscale; x++) { + UINT32 v; + UINT32 ss0 = amend, ss3 = amend; + for (yy = y*yscale; yy < y*yscale + yscale - 1; yy += 2) { + UINT8 *line0 = (UINT8 *)imIn->image[yy]; + UINT8 *line1 = (UINT8 *)imIn->image[yy + 1]; + ss0 += line0[x*4 + 0] + line1[x*4 + 0]; + ss3 += line0[x*4 + 3] + line1[x*4 + 3]; } - } else if (imIn->bands == 3) { - for (x = 0; x < imIn->xsize / xscale; x++) { - UINT32 v; - UINT32 ss0 = amend, ss1 = amend, ss2 = amend; - for (yy = y*yscale; yy < y*yscale + yscale - 1; yy += 2) { - UINT8 *line0 = (UINT8 *)imIn->image[yy]; - UINT8 *line1 = (UINT8 *)imIn->image[yy + 1]; - ss0 += line0[x*4 + 0] + line1[x*4 + 0]; - ss1 += line0[x*4 + 1] + line1[x*4 + 1]; - ss2 += line0[x*4 + 2] + line1[x*4 + 2]; - } - if (yscale & 0x01) { - UINT8 *line = (UINT8 *)imIn->image[yy]; - ss0 += line[x*4 + 0]; - ss1 += line[x*4 + 1]; - ss2 += line[x*4 + 2]; - } - v = MAKE_UINT32( - (ss0 * multiplier) >> 24, (ss1 * multiplier) >> 24, - (ss2 * multiplier) >> 24, 0); - memcpy(imOut->image[y] + x * sizeof(v), &v, sizeof(v)); + if (yscale & 0x01) { + UINT8 *line = (UINT8 *)imIn->image[yy]; + ss0 += line[x*4 + 0]; + ss3 += line[x*4 + 3]; } - } else { // bands == 4 - for (x = 0; x < imIn->xsize / xscale; x++) { - UINT32 v; - UINT32 ss0 = amend, ss1 = amend, ss2 = amend, ss3 = amend; - for (yy = y*yscale; yy < y*yscale + yscale - 1; yy += 2) { - UINT8 *line0 = (UINT8 *)imIn->image[yy]; - UINT8 *line1 = (UINT8 *)imIn->image[yy + 1]; - ss0 += line0[x*4 + 0] + line1[x*4 + 0]; - ss1 += line0[x*4 + 1] + line1[x*4 + 1]; - ss2 += line0[x*4 + 2] + line1[x*4 + 2]; - ss3 += line0[x*4 + 3] + line1[x*4 + 3]; - } - if (yscale & 0x01) { - UINT8 *line = (UINT8 *)imIn->image[yy]; - ss0 += line[x*4 + 0]; - ss1 += line[x*4 + 1]; - ss2 += line[x*4 + 2]; - ss3 += line[x*4 + 3]; - } - v = MAKE_UINT32( - (ss0 * multiplier) >> 24, (ss1 * multiplier) >> 24, - (ss2 * multiplier) >> 24, (ss3 * multiplier) >> 24); - memcpy(imOut->image[y] + x * sizeof(v), &v, sizeof(v)); + v = MAKE_UINT32( + (ss0 * multiplier) >> 24, 0, + 0, (ss3 * multiplier) >> 24); + memcpy(imOut->image[y] + x * sizeof(v), &v, sizeof(v)); + } + } else if (imIn->bands == 3) { + for (x = 0; x < imIn->xsize / xscale; x++) { + UINT32 v; + UINT32 ss0 = amend, ss1 = amend, ss2 = amend; + for (yy = y*yscale; yy < y*yscale + yscale - 1; yy += 2) { + UINT8 *line0 = (UINT8 *)imIn->image[yy]; + UINT8 *line1 = (UINT8 *)imIn->image[yy + 1]; + ss0 += line0[x*4 + 0] + line1[x*4 + 0]; + ss1 += line0[x*4 + 1] + line1[x*4 + 1]; + ss2 += line0[x*4 + 2] + line1[x*4 + 2]; } + if (yscale & 0x01) { + UINT8 *line = (UINT8 *)imIn->image[yy]; + ss0 += line[x*4 + 0]; + ss1 += line[x*4 + 1]; + ss2 += line[x*4 + 2]; + } + v = MAKE_UINT32( + (ss0 * multiplier) >> 24, (ss1 * multiplier) >> 24, + (ss2 * multiplier) >> 24, 0); + memcpy(imOut->image[y] + x * sizeof(v), &v, sizeof(v)); + } + } else { // bands == 4 + for (x = 0; x < imIn->xsize / xscale; x++) { + UINT32 v; + UINT32 ss0 = amend, ss1 = amend, ss2 = amend, ss3 = amend; + for (yy = y*yscale; yy < y*yscale + yscale - 1; yy += 2) { + UINT8 *line0 = (UINT8 *)imIn->image[yy]; + UINT8 *line1 = (UINT8 *)imIn->image[yy + 1]; + ss0 += line0[x*4 + 0] + line1[x*4 + 0]; + ss1 += line0[x*4 + 1] + line1[x*4 + 1]; + ss2 += line0[x*4 + 2] + line1[x*4 + 2]; + ss3 += line0[x*4 + 3] + line1[x*4 + 3]; + } + if (yscale & 0x01) { + UINT8 *line = (UINT8 *)imIn->image[yy]; + ss0 += line[x*4 + 0]; + ss1 += line[x*4 + 1]; + ss2 += line[x*4 + 2]; + ss3 += line[x*4 + 3]; + } + v = MAKE_UINT32( + (ss0 * multiplier) >> 24, (ss1 * multiplier) >> 24, + (ss2 * multiplier) >> 24, (ss3 * multiplier) >> 24); + memcpy(imOut->image[y] + x * sizeof(v), &v, sizeof(v)); } } - break; - - case IMAGING_TYPE_INT32: - break; - - case IMAGING_TYPE_FLOAT32: - break; } } } @@ -338,82 +318,72 @@ ImagingReduceNx1(Imaging imOut, Imaging imIn, int xscale) } } } else { - switch(imIn->type) { - case IMAGING_TYPE_UINT8: - for (y = 0; y < imIn->ysize / yscale; y++) { - UINT8 *line = (UINT8 *)imIn->image[y]; - if (imIn->bands == 2) { - for (x = 0; x < imIn->xsize / xscale; x++) { - UINT32 v; - UINT32 ss0 = amend, ss3 = amend; - for (xi = 0; xi < xscale - 1; xi += 2) { - xx = x*xscale + xi; - ss0 += line[xx*4 + 0] + line[xx*4 + 4]; - ss3 += line[xx*4 + 3] + line[xx*4 + 7]; - } - if (xscale & 0x01) { - xx = x*xscale + xi; - ss0 += line[xx*4 + 0]; - ss3 += line[xx*4 + 3]; - } - v = MAKE_UINT32( - (ss0 * multiplier) >> 24, 0, - 0, (ss3 * multiplier) >> 24); - memcpy(imOut->image[y] + x * sizeof(v), &v, sizeof(v)); + for (y = 0; y < imIn->ysize / yscale; y++) { + UINT8 *line = (UINT8 *)imIn->image[y]; + if (imIn->bands == 2) { + for (x = 0; x < imIn->xsize / xscale; x++) { + UINT32 v; + UINT32 ss0 = amend, ss3 = amend; + for (xi = 0; xi < xscale - 1; xi += 2) { + xx = x*xscale + xi; + ss0 += line[xx*4 + 0] + line[xx*4 + 4]; + ss3 += line[xx*4 + 3] + line[xx*4 + 7]; } - } else if (imIn->bands == 3) { - for (x = 0; x < imIn->xsize / xscale; x++) { - UINT32 v; - UINT32 ss0 = amend, ss1 = amend, ss2 = amend; - for (xi = 0; xi < xscale - 1; xi += 2) { - xx = x*xscale + xi; - ss0 += line[xx*4 + 0] + line[xx*4 + 4]; - ss1 += line[xx*4 + 1] + line[xx*4 + 5]; - ss2 += line[xx*4 + 2] + line[xx*4 + 6]; - } - if (xscale & 0x01) { - xx = x*xscale + xi; - ss0 += line[xx*4 + 0]; - ss1 += line[xx*4 + 1]; - ss2 += line[xx*4 + 2]; - } - v = MAKE_UINT32( - (ss0 * multiplier) >> 24, (ss1 * multiplier) >> 24, - (ss2 * multiplier) >> 24, 0); - memcpy(imOut->image[y] + x * sizeof(v), &v, sizeof(v)); + if (xscale & 0x01) { + xx = x*xscale + xi; + ss0 += line[xx*4 + 0]; + ss3 += line[xx*4 + 3]; } - } else { // bands == 4 - for (x = 0; x < imIn->xsize / xscale; x++) { - UINT32 v; - UINT32 ss0 = amend, ss1 = amend, ss2 = amend, ss3 = amend; - for (xi = 0; xi < xscale - 1; xi += 2) { - xx = x*xscale + xi; - ss0 += line[xx*4 + 0] + line[xx*4 + 4]; - ss1 += line[xx*4 + 1] + line[xx*4 + 5]; - ss2 += line[xx*4 + 2] + line[xx*4 + 6]; - ss3 += line[xx*4 + 3] + line[xx*4 + 7]; - } - if (xscale & 0x01) { - xx = x*xscale + xi; - ss0 += line[xx*4 + 0]; - ss1 += line[xx*4 + 1]; - ss2 += line[xx*4 + 2]; - ss3 += line[xx*4 + 3]; - } - v = MAKE_UINT32( - (ss0 * multiplier) >> 24, (ss1 * multiplier) >> 24, - (ss2 * multiplier) >> 24, (ss3 * multiplier) >> 24); - memcpy(imOut->image[y] + x * sizeof(v), &v, sizeof(v)); + v = MAKE_UINT32( + (ss0 * multiplier) >> 24, 0, + 0, (ss3 * multiplier) >> 24); + memcpy(imOut->image[y] + x * sizeof(v), &v, sizeof(v)); + } + } else if (imIn->bands == 3) { + for (x = 0; x < imIn->xsize / xscale; x++) { + UINT32 v; + UINT32 ss0 = amend, ss1 = amend, ss2 = amend; + for (xi = 0; xi < xscale - 1; xi += 2) { + xx = x*xscale + xi; + ss0 += line[xx*4 + 0] + line[xx*4 + 4]; + ss1 += line[xx*4 + 1] + line[xx*4 + 5]; + ss2 += line[xx*4 + 2] + line[xx*4 + 6]; } + if (xscale & 0x01) { + xx = x*xscale + xi; + ss0 += line[xx*4 + 0]; + ss1 += line[xx*4 + 1]; + ss2 += line[xx*4 + 2]; + } + v = MAKE_UINT32( + (ss0 * multiplier) >> 24, (ss1 * multiplier) >> 24, + (ss2 * multiplier) >> 24, 0); + memcpy(imOut->image[y] + x * sizeof(v), &v, sizeof(v)); + } + } else { // bands == 4 + for (x = 0; x < imIn->xsize / xscale; x++) { + UINT32 v; + UINT32 ss0 = amend, ss1 = amend, ss2 = amend, ss3 = amend; + for (xi = 0; xi < xscale - 1; xi += 2) { + xx = x*xscale + xi; + ss0 += line[xx*4 + 0] + line[xx*4 + 4]; + ss1 += line[xx*4 + 1] + line[xx*4 + 5]; + ss2 += line[xx*4 + 2] + line[xx*4 + 6]; + ss3 += line[xx*4 + 3] + line[xx*4 + 7]; + } + if (xscale & 0x01) { + xx = x*xscale + xi; + ss0 += line[xx*4 + 0]; + ss1 += line[xx*4 + 1]; + ss2 += line[xx*4 + 2]; + ss3 += line[xx*4 + 3]; + } + v = MAKE_UINT32( + (ss0 * multiplier) >> 24, (ss1 * multiplier) >> 24, + (ss2 * multiplier) >> 24, (ss3 * multiplier) >> 24); + memcpy(imOut->image[y] + x * sizeof(v), &v, sizeof(v)); } } - break; - - case IMAGING_TYPE_INT32: - break; - - case IMAGING_TYPE_FLOAT32: - break; } } } @@ -439,49 +409,39 @@ ImagingReduce2x1(Imaging imOut, Imaging imIn) } } } else { - switch(imIn->type) { - case IMAGING_TYPE_UINT8: - for (y = 0; y < imIn->ysize / yscale; y++) { - UINT8 *line0 = (UINT8 *)imIn->image[y*yscale + 0]; - if (imIn->bands == 2) { - for (x = 0; x < imIn->xsize / xscale; x++) { - UINT32 v; - ss0 = line0[x*xscale*4 + 0] + line0[x*xscale*4 + 4]; - ss3 = line0[x*xscale*4 + 3] + line0[x*xscale*4 + 7]; - v = MAKE_UINT32((ss0 + amend) >> 1, 0, - 0, (ss3 + amend) >> 1); - memcpy(imOut->image[y] + x * sizeof(v), &v, sizeof(v)); - } - } else if (imIn->bands == 3) { - for (x = 0; x < imIn->xsize / xscale; x++) { - UINT32 v; - ss0 = line0[x*xscale*4 + 0] + line0[x*xscale*4 + 4]; - ss1 = line0[x*xscale*4 + 1] + line0[x*xscale*4 + 5]; - ss2 = line0[x*xscale*4 + 2] + line0[x*xscale*4 + 6]; - v = MAKE_UINT32((ss0 + amend) >> 1, (ss1 + amend) >> 1, - (ss2 + amend) >> 1, 0); - memcpy(imOut->image[y] + x * sizeof(v), &v, sizeof(v)); - } - } else { // bands == 4 - for (x = 0; x < imIn->xsize / xscale; x++) { - UINT32 v; - ss0 = line0[x*xscale*4 + 0] + line0[x*xscale*4 + 4]; - ss1 = line0[x*xscale*4 + 1] + line0[x*xscale*4 + 5]; - ss2 = line0[x*xscale*4 + 2] + line0[x*xscale*4 + 6]; - ss3 = line0[x*xscale*4 + 3] + line0[x*xscale*4 + 7]; - v = MAKE_UINT32((ss0 + amend) >> 1, (ss1 + amend) >> 1, - (ss2 + amend) >> 1, (ss3 + amend) >> 1); - memcpy(imOut->image[y] + x * sizeof(v), &v, sizeof(v)); - } + for (y = 0; y < imIn->ysize / yscale; y++) { + UINT8 *line0 = (UINT8 *)imIn->image[y*yscale + 0]; + if (imIn->bands == 2) { + for (x = 0; x < imIn->xsize / xscale; x++) { + UINT32 v; + ss0 = line0[x*xscale*4 + 0] + line0[x*xscale*4 + 4]; + ss3 = line0[x*xscale*4 + 3] + line0[x*xscale*4 + 7]; + v = MAKE_UINT32((ss0 + amend) >> 1, 0, + 0, (ss3 + amend) >> 1); + memcpy(imOut->image[y] + x * sizeof(v), &v, sizeof(v)); + } + } else if (imIn->bands == 3) { + for (x = 0; x < imIn->xsize / xscale; x++) { + UINT32 v; + ss0 = line0[x*xscale*4 + 0] + line0[x*xscale*4 + 4]; + ss1 = line0[x*xscale*4 + 1] + line0[x*xscale*4 + 5]; + ss2 = line0[x*xscale*4 + 2] + line0[x*xscale*4 + 6]; + v = MAKE_UINT32((ss0 + amend) >> 1, (ss1 + amend) >> 1, + (ss2 + amend) >> 1, 0); + memcpy(imOut->image[y] + x * sizeof(v), &v, sizeof(v)); + } + } else { // bands == 4 + for (x = 0; x < imIn->xsize / xscale; x++) { + UINT32 v; + ss0 = line0[x*xscale*4 + 0] + line0[x*xscale*4 + 4]; + ss1 = line0[x*xscale*4 + 1] + line0[x*xscale*4 + 5]; + ss2 = line0[x*xscale*4 + 2] + line0[x*xscale*4 + 6]; + ss3 = line0[x*xscale*4 + 3] + line0[x*xscale*4 + 7]; + v = MAKE_UINT32((ss0 + amend) >> 1, (ss1 + amend) >> 1, + (ss2 + amend) >> 1, (ss3 + amend) >> 1); + memcpy(imOut->image[y] + x * sizeof(v), &v, sizeof(v)); } } - break; - - case IMAGING_TYPE_INT32: - break; - - case IMAGING_TYPE_FLOAT32: - break; } } } @@ -509,59 +469,49 @@ ImagingReduce1x2(Imaging imOut, Imaging imIn) } } } else { - switch(imIn->type) { - case IMAGING_TYPE_UINT8: - for (y = 0; y < imIn->ysize / yscale; y++) { - UINT8 *line0 = (UINT8 *)imIn->image[y*yscale + 0]; - UINT8 *line1 = (UINT8 *)imIn->image[y*yscale + 1]; - if (imIn->bands == 2) { - for (x = 0; x < imIn->xsize / xscale; x++) { - UINT32 v; - ss0 = line0[x*xscale*4 + 0] + - line1[x*xscale*4 + 0]; - ss3 = line0[x*xscale*4 + 3] + - line1[x*xscale*4 + 3]; - v = MAKE_UINT32((ss0 + amend) >> 1, 0, - 0, (ss3 + amend) >> 1); - memcpy(imOut->image[y] + x * sizeof(v), &v, sizeof(v)); - } - } else if (imIn->bands == 3) { - for (x = 0; x < imIn->xsize / xscale; x++) { - UINT32 v; - ss0 = line0[x*xscale*4 + 0] + - line1[x*xscale*4 + 0]; - ss1 = line0[x*xscale*4 + 1] + - line1[x*xscale*4 + 1]; - ss2 = line0[x*xscale*4 + 2] + - line1[x*xscale*4 + 2]; - v = MAKE_UINT32((ss0 + amend) >> 1, (ss1 + amend) >> 1, - (ss2 + amend) >> 1, 0); - memcpy(imOut->image[y] + x * sizeof(v), &v, sizeof(v)); - } - } else { // bands == 4 - for (x = 0; x < imIn->xsize / xscale; x++) { - UINT32 v; - ss0 = line0[x*xscale*4 + 0] + - line1[x*xscale*4 + 0]; - ss1 = line0[x*xscale*4 + 1] + - line1[x*xscale*4 + 1]; - ss2 = line0[x*xscale*4 + 2] + - line1[x*xscale*4 + 2]; - ss3 = line0[x*xscale*4 + 3] + - line1[x*xscale*4 + 3]; - v = MAKE_UINT32((ss0 + amend) >> 1, (ss1 + amend) >> 1, - (ss2 + amend) >> 1, (ss3 + amend) >> 1); - memcpy(imOut->image[y] + x * sizeof(v), &v, sizeof(v)); - } + for (y = 0; y < imIn->ysize / yscale; y++) { + UINT8 *line0 = (UINT8 *)imIn->image[y*yscale + 0]; + UINT8 *line1 = (UINT8 *)imIn->image[y*yscale + 1]; + if (imIn->bands == 2) { + for (x = 0; x < imIn->xsize / xscale; x++) { + UINT32 v; + ss0 = line0[x*xscale*4 + 0] + + line1[x*xscale*4 + 0]; + ss3 = line0[x*xscale*4 + 3] + + line1[x*xscale*4 + 3]; + v = MAKE_UINT32((ss0 + amend) >> 1, 0, + 0, (ss3 + amend) >> 1); + memcpy(imOut->image[y] + x * sizeof(v), &v, sizeof(v)); + } + } else if (imIn->bands == 3) { + for (x = 0; x < imIn->xsize / xscale; x++) { + UINT32 v; + ss0 = line0[x*xscale*4 + 0] + + line1[x*xscale*4 + 0]; + ss1 = line0[x*xscale*4 + 1] + + line1[x*xscale*4 + 1]; + ss2 = line0[x*xscale*4 + 2] + + line1[x*xscale*4 + 2]; + v = MAKE_UINT32((ss0 + amend) >> 1, (ss1 + amend) >> 1, + (ss2 + amend) >> 1, 0); + memcpy(imOut->image[y] + x * sizeof(v), &v, sizeof(v)); + } + } else { // bands == 4 + for (x = 0; x < imIn->xsize / xscale; x++) { + UINT32 v; + ss0 = line0[x*xscale*4 + 0] + + line1[x*xscale*4 + 0]; + ss1 = line0[x*xscale*4 + 1] + + line1[x*xscale*4 + 1]; + ss2 = line0[x*xscale*4 + 2] + + line1[x*xscale*4 + 2]; + ss3 = line0[x*xscale*4 + 3] + + line1[x*xscale*4 + 3]; + v = MAKE_UINT32((ss0 + amend) >> 1, (ss1 + amend) >> 1, + (ss2 + amend) >> 1, (ss3 + amend) >> 1); + memcpy(imOut->image[y] + x * sizeof(v), &v, sizeof(v)); } } - break; - - case IMAGING_TYPE_INT32: - break; - - case IMAGING_TYPE_FLOAT32: - break; } } } @@ -589,59 +539,49 @@ ImagingReduce2x2(Imaging imOut, Imaging imIn) } } } else { - switch(imIn->type) { - case IMAGING_TYPE_UINT8: - for (y = 0; y < imIn->ysize / yscale; y++) { - UINT8 *line0 = (UINT8 *)imIn->image[y*yscale + 0]; - UINT8 *line1 = (UINT8 *)imIn->image[y*yscale + 1]; - if (imIn->bands == 2) { - for (x = 0; x < imIn->xsize / xscale; x++) { - UINT32 v; - ss0 = line0[x*xscale*4 + 0] + line0[x*xscale*4 + 4] + - line1[x*xscale*4 + 0] + line1[x*xscale*4 + 4]; - ss3 = line0[x*xscale*4 + 3] + line0[x*xscale*4 + 7] + - line1[x*xscale*4 + 3] + line1[x*xscale*4 + 7]; - v = MAKE_UINT32((ss0 + amend) >> 2, 0, - 0, (ss3 + amend) >> 2); - memcpy(imOut->image[y] + x * sizeof(v), &v, sizeof(v)); - } - } else if (imIn->bands == 3) { - for (x = 0; x < imIn->xsize / xscale; x++) { - UINT32 v; - ss0 = line0[x*xscale*4 + 0] + line0[x*xscale*4 + 4] + - line1[x*xscale*4 + 0] + line1[x*xscale*4 + 4]; - ss1 = line0[x*xscale*4 + 1] + line0[x*xscale*4 + 5] + - line1[x*xscale*4 + 1] + line1[x*xscale*4 + 5]; - ss2 = line0[x*xscale*4 + 2] + line0[x*xscale*4 + 6] + - line1[x*xscale*4 + 2] + line1[x*xscale*4 + 6]; - v = MAKE_UINT32((ss0 + amend) >> 2, (ss1 + amend) >> 2, - (ss2 + amend) >> 2, 0); - memcpy(imOut->image[y] + x * sizeof(v), &v, sizeof(v)); - } - } else { // bands == 4 - for (x = 0; x < imIn->xsize / xscale; x++) { - UINT32 v; - ss0 = line0[x*xscale*4 + 0] + line0[x*xscale*4 + 4] + - line1[x*xscale*4 + 0] + line1[x*xscale*4 + 4]; - ss1 = line0[x*xscale*4 + 1] + line0[x*xscale*4 + 5] + - line1[x*xscale*4 + 1] + line1[x*xscale*4 + 5]; - ss2 = line0[x*xscale*4 + 2] + line0[x*xscale*4 + 6] + - line1[x*xscale*4 + 2] + line1[x*xscale*4 + 6]; - ss3 = line0[x*xscale*4 + 3] + line0[x*xscale*4 + 7] + - line1[x*xscale*4 + 3] + line1[x*xscale*4 + 7]; - v = MAKE_UINT32((ss0 + amend) >> 2, (ss1 + amend) >> 2, - (ss2 + amend) >> 2, (ss3 + amend) >> 2); - memcpy(imOut->image[y] + x * sizeof(v), &v, sizeof(v)); - } + for (y = 0; y < imIn->ysize / yscale; y++) { + UINT8 *line0 = (UINT8 *)imIn->image[y*yscale + 0]; + UINT8 *line1 = (UINT8 *)imIn->image[y*yscale + 1]; + if (imIn->bands == 2) { + for (x = 0; x < imIn->xsize / xscale; x++) { + UINT32 v; + ss0 = line0[x*xscale*4 + 0] + line0[x*xscale*4 + 4] + + line1[x*xscale*4 + 0] + line1[x*xscale*4 + 4]; + ss3 = line0[x*xscale*4 + 3] + line0[x*xscale*4 + 7] + + line1[x*xscale*4 + 3] + line1[x*xscale*4 + 7]; + v = MAKE_UINT32((ss0 + amend) >> 2, 0, + 0, (ss3 + amend) >> 2); + memcpy(imOut->image[y] + x * sizeof(v), &v, sizeof(v)); + } + } else if (imIn->bands == 3) { + for (x = 0; x < imIn->xsize / xscale; x++) { + UINT32 v; + ss0 = line0[x*xscale*4 + 0] + line0[x*xscale*4 + 4] + + line1[x*xscale*4 + 0] + line1[x*xscale*4 + 4]; + ss1 = line0[x*xscale*4 + 1] + line0[x*xscale*4 + 5] + + line1[x*xscale*4 + 1] + line1[x*xscale*4 + 5]; + ss2 = line0[x*xscale*4 + 2] + line0[x*xscale*4 + 6] + + line1[x*xscale*4 + 2] + line1[x*xscale*4 + 6]; + v = MAKE_UINT32((ss0 + amend) >> 2, (ss1 + amend) >> 2, + (ss2 + amend) >> 2, 0); + memcpy(imOut->image[y] + x * sizeof(v), &v, sizeof(v)); + } + } else { // bands == 4 + for (x = 0; x < imIn->xsize / xscale; x++) { + UINT32 v; + ss0 = line0[x*xscale*4 + 0] + line0[x*xscale*4 + 4] + + line1[x*xscale*4 + 0] + line1[x*xscale*4 + 4]; + ss1 = line0[x*xscale*4 + 1] + line0[x*xscale*4 + 5] + + line1[x*xscale*4 + 1] + line1[x*xscale*4 + 5]; + ss2 = line0[x*xscale*4 + 2] + line0[x*xscale*4 + 6] + + line1[x*xscale*4 + 2] + line1[x*xscale*4 + 6]; + ss3 = line0[x*xscale*4 + 3] + line0[x*xscale*4 + 7] + + line1[x*xscale*4 + 3] + line1[x*xscale*4 + 7]; + v = MAKE_UINT32((ss0 + amend) >> 2, (ss1 + amend) >> 2, + (ss2 + amend) >> 2, (ss3 + amend) >> 2); + memcpy(imOut->image[y] + x * sizeof(v), &v, sizeof(v)); } } - break; - - case IMAGING_TYPE_INT32: - break; - - case IMAGING_TYPE_FLOAT32: - break; } } } @@ -668,52 +608,42 @@ ImagingReduce3x1(Imaging imOut, Imaging imIn) } } } else { - switch(imIn->type) { - case IMAGING_TYPE_UINT8: - for (y = 0; y < imIn->ysize / yscale; y++) { - UINT8 *line0 = (UINT8 *)imIn->image[y*yscale + 0]; - if (imIn->bands == 2) { - for (x = 0; x < imIn->xsize / xscale; x++) { - UINT32 v; - ss0 = line0[x*xscale*4 + 0] + line0[x*xscale*4 + 4] + line0[x*xscale*4 + 8]; - ss3 = line0[x*xscale*4 + 3] + line0[x*xscale*4 + 7] + line0[x*xscale*4 + 11]; - v = MAKE_UINT32( - ((ss0 + amend) * multiplier) >> 24, 0, - 0, ((ss3 + amend) * multiplier) >> 24); - memcpy(imOut->image[y] + x * sizeof(v), &v, sizeof(v)); - } - } else if (imIn->bands == 3) { - for (x = 0; x < imIn->xsize / xscale; x++) { - UINT32 v; - ss0 = line0[x*xscale*4 + 0] + line0[x*xscale*4 + 4] + line0[x*xscale*4 + 8]; - ss1 = line0[x*xscale*4 + 1] + line0[x*xscale*4 + 5] + line0[x*xscale*4 + 9]; - ss2 = line0[x*xscale*4 + 2] + line0[x*xscale*4 + 6] + line0[x*xscale*4 + 10]; - v = MAKE_UINT32( - ((ss0 + amend) * multiplier) >> 24, ((ss1 + amend) * multiplier) >> 24, - ((ss2 + amend) * multiplier) >> 24, 0); - memcpy(imOut->image[y] + x * sizeof(v), &v, sizeof(v)); - } - } else { // bands == 4 - for (x = 0; x < imIn->xsize / xscale; x++) { - UINT32 v; - ss0 = line0[x*xscale*4 + 0] + line0[x*xscale*4 + 4] + line0[x*xscale*4 + 8]; - ss1 = line0[x*xscale*4 + 1] + line0[x*xscale*4 + 5] + line0[x*xscale*4 + 9]; - ss2 = line0[x*xscale*4 + 2] + line0[x*xscale*4 + 6] + line0[x*xscale*4 + 10]; - ss3 = line0[x*xscale*4 + 3] + line0[x*xscale*4 + 7] + line0[x*xscale*4 + 11]; - v = MAKE_UINT32( - ((ss0 + amend) * multiplier) >> 24, ((ss1 + amend) * multiplier) >> 24, - ((ss2 + amend) * multiplier) >> 24, ((ss3 + amend) * multiplier) >> 24); - memcpy(imOut->image[y] + x * sizeof(v), &v, sizeof(v)); - } + for (y = 0; y < imIn->ysize / yscale; y++) { + UINT8 *line0 = (UINT8 *)imIn->image[y*yscale + 0]; + if (imIn->bands == 2) { + for (x = 0; x < imIn->xsize / xscale; x++) { + UINT32 v; + ss0 = line0[x*xscale*4 + 0] + line0[x*xscale*4 + 4] + line0[x*xscale*4 + 8]; + ss3 = line0[x*xscale*4 + 3] + line0[x*xscale*4 + 7] + line0[x*xscale*4 + 11]; + v = MAKE_UINT32( + ((ss0 + amend) * multiplier) >> 24, 0, + 0, ((ss3 + amend) * multiplier) >> 24); + memcpy(imOut->image[y] + x * sizeof(v), &v, sizeof(v)); + } + } else if (imIn->bands == 3) { + for (x = 0; x < imIn->xsize / xscale; x++) { + UINT32 v; + ss0 = line0[x*xscale*4 + 0] + line0[x*xscale*4 + 4] + line0[x*xscale*4 + 8]; + ss1 = line0[x*xscale*4 + 1] + line0[x*xscale*4 + 5] + line0[x*xscale*4 + 9]; + ss2 = line0[x*xscale*4 + 2] + line0[x*xscale*4 + 6] + line0[x*xscale*4 + 10]; + v = MAKE_UINT32( + ((ss0 + amend) * multiplier) >> 24, ((ss1 + amend) * multiplier) >> 24, + ((ss2 + amend) * multiplier) >> 24, 0); + memcpy(imOut->image[y] + x * sizeof(v), &v, sizeof(v)); + } + } else { // bands == 4 + for (x = 0; x < imIn->xsize / xscale; x++) { + UINT32 v; + ss0 = line0[x*xscale*4 + 0] + line0[x*xscale*4 + 4] + line0[x*xscale*4 + 8]; + ss1 = line0[x*xscale*4 + 1] + line0[x*xscale*4 + 5] + line0[x*xscale*4 + 9]; + ss2 = line0[x*xscale*4 + 2] + line0[x*xscale*4 + 6] + line0[x*xscale*4 + 10]; + ss3 = line0[x*xscale*4 + 3] + line0[x*xscale*4 + 7] + line0[x*xscale*4 + 11]; + v = MAKE_UINT32( + ((ss0 + amend) * multiplier) >> 24, ((ss1 + amend) * multiplier) >> 24, + ((ss2 + amend) * multiplier) >> 24, ((ss3 + amend) * multiplier) >> 24); + memcpy(imOut->image[y] + x * sizeof(v), &v, sizeof(v)); } } - break; - - case IMAGING_TYPE_INT32: - break; - - case IMAGING_TYPE_FLOAT32: - break; } } } @@ -744,72 +674,62 @@ ImagingReduce1x3(Imaging imOut, Imaging imIn) } } } else { - switch(imIn->type) { - case IMAGING_TYPE_UINT8: - for (y = 0; y < imIn->ysize / yscale; y++) { - UINT8 *line0 = (UINT8 *)imIn->image[y*yscale + 0]; - UINT8 *line1 = (UINT8 *)imIn->image[y*yscale + 1]; - UINT8 *line2 = (UINT8 *)imIn->image[y*yscale + 2]; - if (imIn->bands == 2) { - for (x = 0; x < imIn->xsize / xscale; x++) { - UINT32 v; - ss0 = line0[x*xscale*4 + 0] + - line1[x*xscale*4 + 0] + - line2[x*xscale*4 + 0]; - ss3 = line0[x*xscale*4 + 3] + - line1[x*xscale*4 + 3] + - line2[x*xscale*4 + 3]; - v = MAKE_UINT32( - ((ss0 + amend) * multiplier) >> 24, 0, - 0, ((ss3 + amend) * multiplier) >> 24); - memcpy(imOut->image[y] + x * sizeof(v), &v, sizeof(v)); - } - } else if (imIn->bands == 3) { - for (x = 0; x < imIn->xsize / xscale; x++) { - UINT32 v; - ss0 = line0[x*xscale*4 + 0] + - line1[x*xscale*4 + 0] + - line2[x*xscale*4 + 0]; - ss1 = line0[x*xscale*4 + 1] + - line1[x*xscale*4 + 1] + - line2[x*xscale*4 + 1]; - ss2 = line0[x*xscale*4 + 2] + - line1[x*xscale*4 + 2] + - line2[x*xscale*4 + 2]; - v = MAKE_UINT32( - ((ss0 + amend) * multiplier) >> 24, ((ss1 + amend) * multiplier) >> 24, - ((ss2 + amend) * multiplier) >> 24, 0); - memcpy(imOut->image[y] + x * sizeof(v), &v, sizeof(v)); - } - } else { // bands == 4 - for (x = 0; x < imIn->xsize / xscale; x++) { - UINT32 v; - ss0 = line0[x*xscale*4 + 0] + - line1[x*xscale*4 + 0] + - line2[x*xscale*4 + 0]; - ss1 = line0[x*xscale*4 + 1] + - line1[x*xscale*4 + 1] + - line2[x*xscale*4 + 1]; - ss2 = line0[x*xscale*4 + 2] + - line1[x*xscale*4 + 2] + - line2[x*xscale*4 + 2]; - ss3 = line0[x*xscale*4 + 3] + - line1[x*xscale*4 + 3] + - line2[x*xscale*4 + 3]; - v = MAKE_UINT32( - ((ss0 + amend) * multiplier) >> 24, ((ss1 + amend) * multiplier) >> 24, - ((ss2 + amend) * multiplier) >> 24, ((ss3 + amend) * multiplier) >> 24); - memcpy(imOut->image[y] + x * sizeof(v), &v, sizeof(v)); - } + for (y = 0; y < imIn->ysize / yscale; y++) { + UINT8 *line0 = (UINT8 *)imIn->image[y*yscale + 0]; + UINT8 *line1 = (UINT8 *)imIn->image[y*yscale + 1]; + UINT8 *line2 = (UINT8 *)imIn->image[y*yscale + 2]; + if (imIn->bands == 2) { + for (x = 0; x < imIn->xsize / xscale; x++) { + UINT32 v; + ss0 = line0[x*xscale*4 + 0] + + line1[x*xscale*4 + 0] + + line2[x*xscale*4 + 0]; + ss3 = line0[x*xscale*4 + 3] + + line1[x*xscale*4 + 3] + + line2[x*xscale*4 + 3]; + v = MAKE_UINT32( + ((ss0 + amend) * multiplier) >> 24, 0, + 0, ((ss3 + amend) * multiplier) >> 24); + memcpy(imOut->image[y] + x * sizeof(v), &v, sizeof(v)); + } + } else if (imIn->bands == 3) { + for (x = 0; x < imIn->xsize / xscale; x++) { + UINT32 v; + ss0 = line0[x*xscale*4 + 0] + + line1[x*xscale*4 + 0] + + line2[x*xscale*4 + 0]; + ss1 = line0[x*xscale*4 + 1] + + line1[x*xscale*4 + 1] + + line2[x*xscale*4 + 1]; + ss2 = line0[x*xscale*4 + 2] + + line1[x*xscale*4 + 2] + + line2[x*xscale*4 + 2]; + v = MAKE_UINT32( + ((ss0 + amend) * multiplier) >> 24, ((ss1 + amend) * multiplier) >> 24, + ((ss2 + amend) * multiplier) >> 24, 0); + memcpy(imOut->image[y] + x * sizeof(v), &v, sizeof(v)); + } + } else { // bands == 4 + for (x = 0; x < imIn->xsize / xscale; x++) { + UINT32 v; + ss0 = line0[x*xscale*4 + 0] + + line1[x*xscale*4 + 0] + + line2[x*xscale*4 + 0]; + ss1 = line0[x*xscale*4 + 1] + + line1[x*xscale*4 + 1] + + line2[x*xscale*4 + 1]; + ss2 = line0[x*xscale*4 + 2] + + line1[x*xscale*4 + 2] + + line2[x*xscale*4 + 2]; + ss3 = line0[x*xscale*4 + 3] + + line1[x*xscale*4 + 3] + + line2[x*xscale*4 + 3]; + v = MAKE_UINT32( + ((ss0 + amend) * multiplier) >> 24, ((ss1 + amend) * multiplier) >> 24, + ((ss2 + amend) * multiplier) >> 24, ((ss3 + amend) * multiplier) >> 24); + memcpy(imOut->image[y] + x * sizeof(v), &v, sizeof(v)); } } - break; - - case IMAGING_TYPE_INT32: - break; - - case IMAGING_TYPE_FLOAT32: - break; } } } @@ -840,72 +760,62 @@ ImagingReduce3x3(Imaging imOut, Imaging imIn) } } } else { - switch(imIn->type) { - case IMAGING_TYPE_UINT8: - for (y = 0; y < imIn->ysize / yscale; y++) { - UINT8 *line0 = (UINT8 *)imIn->image[y*yscale + 0]; - UINT8 *line1 = (UINT8 *)imIn->image[y*yscale + 1]; - UINT8 *line2 = (UINT8 *)imIn->image[y*yscale + 2]; - if (imIn->bands == 2) { - for (x = 0; x < imIn->xsize / xscale; x++) { - UINT32 v; - ss0 = line0[x*xscale*4 + 0] + line0[x*xscale*4 + 4] + line0[x*xscale*4 + 8] + - line1[x*xscale*4 + 0] + line1[x*xscale*4 + 4] + line1[x*xscale*4 + 8] + - line2[x*xscale*4 + 0] + line2[x*xscale*4 + 4] + line2[x*xscale*4 + 8]; - ss3 = line0[x*xscale*4 + 3] + line0[x*xscale*4 + 7] + line0[x*xscale*4 + 11] + - line1[x*xscale*4 + 3] + line1[x*xscale*4 + 7] + line1[x*xscale*4 + 11] + - line2[x*xscale*4 + 3] + line2[x*xscale*4 + 7] + line2[x*xscale*4 + 11]; - v = MAKE_UINT32( - ((ss0 + amend) * multiplier) >> 24, 0, - 0, ((ss3 + amend) * multiplier) >> 24); - memcpy(imOut->image[y] + x * sizeof(v), &v, sizeof(v)); - } - } else if (imIn->bands == 3) { - for (x = 0; x < imIn->xsize / xscale; x++) { - UINT32 v; - ss0 = line0[x*xscale*4 + 0] + line0[x*xscale*4 + 4] + line0[x*xscale*4 + 8] + - line1[x*xscale*4 + 0] + line1[x*xscale*4 + 4] + line1[x*xscale*4 + 8] + - line2[x*xscale*4 + 0] + line2[x*xscale*4 + 4] + line2[x*xscale*4 + 8]; - ss1 = line0[x*xscale*4 + 1] + line0[x*xscale*4 + 5] + line0[x*xscale*4 + 9] + - line1[x*xscale*4 + 1] + line1[x*xscale*4 + 5] + line1[x*xscale*4 + 9] + - line2[x*xscale*4 + 1] + line2[x*xscale*4 + 5] + line2[x*xscale*4 + 9]; - ss2 = line0[x*xscale*4 + 2] + line0[x*xscale*4 + 6] + line0[x*xscale*4 + 10] + - line1[x*xscale*4 + 2] + line1[x*xscale*4 + 6] + line1[x*xscale*4 + 10] + - line2[x*xscale*4 + 2] + line2[x*xscale*4 + 6] + line2[x*xscale*4 + 10]; - v = MAKE_UINT32( - ((ss0 + amend) * multiplier) >> 24, ((ss1 + amend) * multiplier) >> 24, - ((ss2 + amend) * multiplier) >> 24, 0); - memcpy(imOut->image[y] + x * sizeof(v), &v, sizeof(v)); - } - } else { // bands == 4 - for (x = 0; x < imIn->xsize / xscale; x++) { - UINT32 v; - ss0 = line0[x*xscale*4 + 0] + line0[x*xscale*4 + 4] + line0[x*xscale*4 + 8] + - line1[x*xscale*4 + 0] + line1[x*xscale*4 + 4] + line1[x*xscale*4 + 8] + - line2[x*xscale*4 + 0] + line2[x*xscale*4 + 4] + line2[x*xscale*4 + 8]; - ss1 = line0[x*xscale*4 + 1] + line0[x*xscale*4 + 5] + line0[x*xscale*4 + 9] + - line1[x*xscale*4 + 1] + line1[x*xscale*4 + 5] + line1[x*xscale*4 + 9] + - line2[x*xscale*4 + 1] + line2[x*xscale*4 + 5] + line2[x*xscale*4 + 9]; - ss2 = line0[x*xscale*4 + 2] + line0[x*xscale*4 + 6] + line0[x*xscale*4 + 10] + - line1[x*xscale*4 + 2] + line1[x*xscale*4 + 6] + line1[x*xscale*4 + 10] + - line2[x*xscale*4 + 2] + line2[x*xscale*4 + 6] + line2[x*xscale*4 + 10]; - ss3 = line0[x*xscale*4 + 3] + line0[x*xscale*4 + 7] + line0[x*xscale*4 + 11] + - line1[x*xscale*4 + 3] + line1[x*xscale*4 + 7] + line1[x*xscale*4 + 11] + - line2[x*xscale*4 + 3] + line2[x*xscale*4 + 7] + line2[x*xscale*4 + 11]; - v = MAKE_UINT32( - ((ss0 + amend) * multiplier) >> 24, ((ss1 + amend) * multiplier) >> 24, - ((ss2 + amend) * multiplier) >> 24, ((ss3 + amend) * multiplier) >> 24); - memcpy(imOut->image[y] + x * sizeof(v), &v, sizeof(v)); - } + for (y = 0; y < imIn->ysize / yscale; y++) { + UINT8 *line0 = (UINT8 *)imIn->image[y*yscale + 0]; + UINT8 *line1 = (UINT8 *)imIn->image[y*yscale + 1]; + UINT8 *line2 = (UINT8 *)imIn->image[y*yscale + 2]; + if (imIn->bands == 2) { + for (x = 0; x < imIn->xsize / xscale; x++) { + UINT32 v; + ss0 = line0[x*xscale*4 + 0] + line0[x*xscale*4 + 4] + line0[x*xscale*4 + 8] + + line1[x*xscale*4 + 0] + line1[x*xscale*4 + 4] + line1[x*xscale*4 + 8] + + line2[x*xscale*4 + 0] + line2[x*xscale*4 + 4] + line2[x*xscale*4 + 8]; + ss3 = line0[x*xscale*4 + 3] + line0[x*xscale*4 + 7] + line0[x*xscale*4 + 11] + + line1[x*xscale*4 + 3] + line1[x*xscale*4 + 7] + line1[x*xscale*4 + 11] + + line2[x*xscale*4 + 3] + line2[x*xscale*4 + 7] + line2[x*xscale*4 + 11]; + v = MAKE_UINT32( + ((ss0 + amend) * multiplier) >> 24, 0, + 0, ((ss3 + amend) * multiplier) >> 24); + memcpy(imOut->image[y] + x * sizeof(v), &v, sizeof(v)); + } + } else if (imIn->bands == 3) { + for (x = 0; x < imIn->xsize / xscale; x++) { + UINT32 v; + ss0 = line0[x*xscale*4 + 0] + line0[x*xscale*4 + 4] + line0[x*xscale*4 + 8] + + line1[x*xscale*4 + 0] + line1[x*xscale*4 + 4] + line1[x*xscale*4 + 8] + + line2[x*xscale*4 + 0] + line2[x*xscale*4 + 4] + line2[x*xscale*4 + 8]; + ss1 = line0[x*xscale*4 + 1] + line0[x*xscale*4 + 5] + line0[x*xscale*4 + 9] + + line1[x*xscale*4 + 1] + line1[x*xscale*4 + 5] + line1[x*xscale*4 + 9] + + line2[x*xscale*4 + 1] + line2[x*xscale*4 + 5] + line2[x*xscale*4 + 9]; + ss2 = line0[x*xscale*4 + 2] + line0[x*xscale*4 + 6] + line0[x*xscale*4 + 10] + + line1[x*xscale*4 + 2] + line1[x*xscale*4 + 6] + line1[x*xscale*4 + 10] + + line2[x*xscale*4 + 2] + line2[x*xscale*4 + 6] + line2[x*xscale*4 + 10]; + v = MAKE_UINT32( + ((ss0 + amend) * multiplier) >> 24, ((ss1 + amend) * multiplier) >> 24, + ((ss2 + amend) * multiplier) >> 24, 0); + memcpy(imOut->image[y] + x * sizeof(v), &v, sizeof(v)); + } + } else { // bands == 4 + for (x = 0; x < imIn->xsize / xscale; x++) { + UINT32 v; + ss0 = line0[x*xscale*4 + 0] + line0[x*xscale*4 + 4] + line0[x*xscale*4 + 8] + + line1[x*xscale*4 + 0] + line1[x*xscale*4 + 4] + line1[x*xscale*4 + 8] + + line2[x*xscale*4 + 0] + line2[x*xscale*4 + 4] + line2[x*xscale*4 + 8]; + ss1 = line0[x*xscale*4 + 1] + line0[x*xscale*4 + 5] + line0[x*xscale*4 + 9] + + line1[x*xscale*4 + 1] + line1[x*xscale*4 + 5] + line1[x*xscale*4 + 9] + + line2[x*xscale*4 + 1] + line2[x*xscale*4 + 5] + line2[x*xscale*4 + 9]; + ss2 = line0[x*xscale*4 + 2] + line0[x*xscale*4 + 6] + line0[x*xscale*4 + 10] + + line1[x*xscale*4 + 2] + line1[x*xscale*4 + 6] + line1[x*xscale*4 + 10] + + line2[x*xscale*4 + 2] + line2[x*xscale*4 + 6] + line2[x*xscale*4 + 10]; + ss3 = line0[x*xscale*4 + 3] + line0[x*xscale*4 + 7] + line0[x*xscale*4 + 11] + + line1[x*xscale*4 + 3] + line1[x*xscale*4 + 7] + line1[x*xscale*4 + 11] + + line2[x*xscale*4 + 3] + line2[x*xscale*4 + 7] + line2[x*xscale*4 + 11]; + v = MAKE_UINT32( + ((ss0 + amend) * multiplier) >> 24, ((ss1 + amend) * multiplier) >> 24, + ((ss2 + amend) * multiplier) >> 24, ((ss3 + amend) * multiplier) >> 24); + memcpy(imOut->image[y] + x * sizeof(v), &v, sizeof(v)); } } - break; - - case IMAGING_TYPE_INT32: - break; - - case IMAGING_TYPE_FLOAT32: - break; } } } @@ -936,79 +846,69 @@ ImagingReduce4x4(Imaging imOut, Imaging imIn) } } } else { - switch(imIn->type) { - case IMAGING_TYPE_UINT8: - for (y = 0; y < imIn->ysize / yscale; y++) { - UINT8 *line0 = (UINT8 *)imIn->image[y*yscale + 0]; - UINT8 *line1 = (UINT8 *)imIn->image[y*yscale + 1]; - UINT8 *line2 = (UINT8 *)imIn->image[y*yscale + 2]; - UINT8 *line3 = (UINT8 *)imIn->image[y*yscale + 3]; - if (imIn->bands == 2) { - for (x = 0; x < imIn->xsize / xscale; x++) { - UINT32 v; - ss0 = line0[x*xscale*4 + 0] + line0[x*xscale*4 + 4] + line0[x*xscale*4 + 8] + line0[x*xscale*4 + 12] + - line1[x*xscale*4 + 0] + line1[x*xscale*4 + 4] + line1[x*xscale*4 + 8] + line1[x*xscale*4 + 12] + - line2[x*xscale*4 + 0] + line2[x*xscale*4 + 4] + line2[x*xscale*4 + 8] + line2[x*xscale*4 + 12] + - line3[x*xscale*4 + 0] + line3[x*xscale*4 + 4] + line3[x*xscale*4 + 8] + line3[x*xscale*4 + 12]; - ss3 = line0[x*xscale*4 + 3] + line0[x*xscale*4 + 7] + line0[x*xscale*4 + 11] + line0[x*xscale*4 + 15] + - line1[x*xscale*4 + 3] + line1[x*xscale*4 + 7] + line1[x*xscale*4 + 11] + line1[x*xscale*4 + 15] + - line2[x*xscale*4 + 3] + line2[x*xscale*4 + 7] + line2[x*xscale*4 + 11] + line2[x*xscale*4 + 15] + - line3[x*xscale*4 + 3] + line3[x*xscale*4 + 7] + line3[x*xscale*4 + 11] + line3[x*xscale*4 + 15]; - v = MAKE_UINT32((ss0 + amend) >> 4, 0, - 0, (ss3 + amend) >> 4); - memcpy(imOut->image[y] + x * sizeof(v), &v, sizeof(v)); - } - } else if (imIn->bands == 3) { - for (x = 0; x < imIn->xsize / xscale; x++) { - UINT32 v; - ss0 = line0[x*xscale*4 + 0] + line0[x*xscale*4 + 4] + line0[x*xscale*4 + 8] + line0[x*xscale*4 + 12] + - line1[x*xscale*4 + 0] + line1[x*xscale*4 + 4] + line1[x*xscale*4 + 8] + line1[x*xscale*4 + 12] + - line2[x*xscale*4 + 0] + line2[x*xscale*4 + 4] + line2[x*xscale*4 + 8] + line2[x*xscale*4 + 12] + - line3[x*xscale*4 + 0] + line3[x*xscale*4 + 4] + line3[x*xscale*4 + 8] + line3[x*xscale*4 + 12]; - ss1 = line0[x*xscale*4 + 1] + line0[x*xscale*4 + 5] + line0[x*xscale*4 + 9] + line0[x*xscale*4 + 13] + - line1[x*xscale*4 + 1] + line1[x*xscale*4 + 5] + line1[x*xscale*4 + 9] + line1[x*xscale*4 + 13] + - line2[x*xscale*4 + 1] + line2[x*xscale*4 + 5] + line2[x*xscale*4 + 9] + line2[x*xscale*4 + 13] + - line3[x*xscale*4 + 1] + line3[x*xscale*4 + 5] + line3[x*xscale*4 + 9] + line3[x*xscale*4 + 13]; - ss2 = line0[x*xscale*4 + 2] + line0[x*xscale*4 + 6] + line0[x*xscale*4 + 10] + line0[x*xscale*4 + 14] + - line1[x*xscale*4 + 2] + line1[x*xscale*4 + 6] + line1[x*xscale*4 + 10] + line1[x*xscale*4 + 14] + - line2[x*xscale*4 + 2] + line2[x*xscale*4 + 6] + line2[x*xscale*4 + 10] + line2[x*xscale*4 + 14] + - line3[x*xscale*4 + 2] + line3[x*xscale*4 + 6] + line3[x*xscale*4 + 10] + line3[x*xscale*4 + 14]; - v = MAKE_UINT32((ss0 + amend) >> 4, (ss1 + amend) >> 4, - (ss2 + amend) >> 4, 0); - memcpy(imOut->image[y] + x * sizeof(v), &v, sizeof(v)); - } - } else { // bands == 4 - for (x = 0; x < imIn->xsize / xscale; x++) { - UINT32 v; - ss0 = line0[x*xscale*4 + 0] + line0[x*xscale*4 + 4] + line0[x*xscale*4 + 8] + line0[x*xscale*4 + 12] + - line1[x*xscale*4 + 0] + line1[x*xscale*4 + 4] + line1[x*xscale*4 + 8] + line1[x*xscale*4 + 12] + - line2[x*xscale*4 + 0] + line2[x*xscale*4 + 4] + line2[x*xscale*4 + 8] + line2[x*xscale*4 + 12] + - line3[x*xscale*4 + 0] + line3[x*xscale*4 + 4] + line3[x*xscale*4 + 8] + line3[x*xscale*4 + 12]; - ss1 = line0[x*xscale*4 + 1] + line0[x*xscale*4 + 5] + line0[x*xscale*4 + 9] + line0[x*xscale*4 + 13] + - line1[x*xscale*4 + 1] + line1[x*xscale*4 + 5] + line1[x*xscale*4 + 9] + line1[x*xscale*4 + 13] + - line2[x*xscale*4 + 1] + line2[x*xscale*4 + 5] + line2[x*xscale*4 + 9] + line2[x*xscale*4 + 13] + - line3[x*xscale*4 + 1] + line3[x*xscale*4 + 5] + line3[x*xscale*4 + 9] + line3[x*xscale*4 + 13]; - ss2 = line0[x*xscale*4 + 2] + line0[x*xscale*4 + 6] + line0[x*xscale*4 + 10] + line0[x*xscale*4 + 14] + - line1[x*xscale*4 + 2] + line1[x*xscale*4 + 6] + line1[x*xscale*4 + 10] + line1[x*xscale*4 + 14] + - line2[x*xscale*4 + 2] + line2[x*xscale*4 + 6] + line2[x*xscale*4 + 10] + line2[x*xscale*4 + 14] + - line3[x*xscale*4 + 2] + line3[x*xscale*4 + 6] + line3[x*xscale*4 + 10] + line3[x*xscale*4 + 14]; - ss3 = line0[x*xscale*4 + 3] + line0[x*xscale*4 + 7] + line0[x*xscale*4 + 11] + line0[x*xscale*4 + 15] + - line1[x*xscale*4 + 3] + line1[x*xscale*4 + 7] + line1[x*xscale*4 + 11] + line1[x*xscale*4 + 15] + - line2[x*xscale*4 + 3] + line2[x*xscale*4 + 7] + line2[x*xscale*4 + 11] + line2[x*xscale*4 + 15] + - line3[x*xscale*4 + 3] + line3[x*xscale*4 + 7] + line3[x*xscale*4 + 11] + line3[x*xscale*4 + 15]; - v = MAKE_UINT32((ss0 + amend) >> 4, (ss1 + amend) >> 4, - (ss2 + amend) >> 4, (ss3 + amend) >> 4); - memcpy(imOut->image[y] + x * sizeof(v), &v, sizeof(v)); - } + for (y = 0; y < imIn->ysize / yscale; y++) { + UINT8 *line0 = (UINT8 *)imIn->image[y*yscale + 0]; + UINT8 *line1 = (UINT8 *)imIn->image[y*yscale + 1]; + UINT8 *line2 = (UINT8 *)imIn->image[y*yscale + 2]; + UINT8 *line3 = (UINT8 *)imIn->image[y*yscale + 3]; + if (imIn->bands == 2) { + for (x = 0; x < imIn->xsize / xscale; x++) { + UINT32 v; + ss0 = line0[x*xscale*4 + 0] + line0[x*xscale*4 + 4] + line0[x*xscale*4 + 8] + line0[x*xscale*4 + 12] + + line1[x*xscale*4 + 0] + line1[x*xscale*4 + 4] + line1[x*xscale*4 + 8] + line1[x*xscale*4 + 12] + + line2[x*xscale*4 + 0] + line2[x*xscale*4 + 4] + line2[x*xscale*4 + 8] + line2[x*xscale*4 + 12] + + line3[x*xscale*4 + 0] + line3[x*xscale*4 + 4] + line3[x*xscale*4 + 8] + line3[x*xscale*4 + 12]; + ss3 = line0[x*xscale*4 + 3] + line0[x*xscale*4 + 7] + line0[x*xscale*4 + 11] + line0[x*xscale*4 + 15] + + line1[x*xscale*4 + 3] + line1[x*xscale*4 + 7] + line1[x*xscale*4 + 11] + line1[x*xscale*4 + 15] + + line2[x*xscale*4 + 3] + line2[x*xscale*4 + 7] + line2[x*xscale*4 + 11] + line2[x*xscale*4 + 15] + + line3[x*xscale*4 + 3] + line3[x*xscale*4 + 7] + line3[x*xscale*4 + 11] + line3[x*xscale*4 + 15]; + v = MAKE_UINT32((ss0 + amend) >> 4, 0, + 0, (ss3 + amend) >> 4); + memcpy(imOut->image[y] + x * sizeof(v), &v, sizeof(v)); + } + } else if (imIn->bands == 3) { + for (x = 0; x < imIn->xsize / xscale; x++) { + UINT32 v; + ss0 = line0[x*xscale*4 + 0] + line0[x*xscale*4 + 4] + line0[x*xscale*4 + 8] + line0[x*xscale*4 + 12] + + line1[x*xscale*4 + 0] + line1[x*xscale*4 + 4] + line1[x*xscale*4 + 8] + line1[x*xscale*4 + 12] + + line2[x*xscale*4 + 0] + line2[x*xscale*4 + 4] + line2[x*xscale*4 + 8] + line2[x*xscale*4 + 12] + + line3[x*xscale*4 + 0] + line3[x*xscale*4 + 4] + line3[x*xscale*4 + 8] + line3[x*xscale*4 + 12]; + ss1 = line0[x*xscale*4 + 1] + line0[x*xscale*4 + 5] + line0[x*xscale*4 + 9] + line0[x*xscale*4 + 13] + + line1[x*xscale*4 + 1] + line1[x*xscale*4 + 5] + line1[x*xscale*4 + 9] + line1[x*xscale*4 + 13] + + line2[x*xscale*4 + 1] + line2[x*xscale*4 + 5] + line2[x*xscale*4 + 9] + line2[x*xscale*4 + 13] + + line3[x*xscale*4 + 1] + line3[x*xscale*4 + 5] + line3[x*xscale*4 + 9] + line3[x*xscale*4 + 13]; + ss2 = line0[x*xscale*4 + 2] + line0[x*xscale*4 + 6] + line0[x*xscale*4 + 10] + line0[x*xscale*4 + 14] + + line1[x*xscale*4 + 2] + line1[x*xscale*4 + 6] + line1[x*xscale*4 + 10] + line1[x*xscale*4 + 14] + + line2[x*xscale*4 + 2] + line2[x*xscale*4 + 6] + line2[x*xscale*4 + 10] + line2[x*xscale*4 + 14] + + line3[x*xscale*4 + 2] + line3[x*xscale*4 + 6] + line3[x*xscale*4 + 10] + line3[x*xscale*4 + 14]; + v = MAKE_UINT32((ss0 + amend) >> 4, (ss1 + amend) >> 4, + (ss2 + amend) >> 4, 0); + memcpy(imOut->image[y] + x * sizeof(v), &v, sizeof(v)); + } + } else { // bands == 4 + for (x = 0; x < imIn->xsize / xscale; x++) { + UINT32 v; + ss0 = line0[x*xscale*4 + 0] + line0[x*xscale*4 + 4] + line0[x*xscale*4 + 8] + line0[x*xscale*4 + 12] + + line1[x*xscale*4 + 0] + line1[x*xscale*4 + 4] + line1[x*xscale*4 + 8] + line1[x*xscale*4 + 12] + + line2[x*xscale*4 + 0] + line2[x*xscale*4 + 4] + line2[x*xscale*4 + 8] + line2[x*xscale*4 + 12] + + line3[x*xscale*4 + 0] + line3[x*xscale*4 + 4] + line3[x*xscale*4 + 8] + line3[x*xscale*4 + 12]; + ss1 = line0[x*xscale*4 + 1] + line0[x*xscale*4 + 5] + line0[x*xscale*4 + 9] + line0[x*xscale*4 + 13] + + line1[x*xscale*4 + 1] + line1[x*xscale*4 + 5] + line1[x*xscale*4 + 9] + line1[x*xscale*4 + 13] + + line2[x*xscale*4 + 1] + line2[x*xscale*4 + 5] + line2[x*xscale*4 + 9] + line2[x*xscale*4 + 13] + + line3[x*xscale*4 + 1] + line3[x*xscale*4 + 5] + line3[x*xscale*4 + 9] + line3[x*xscale*4 + 13]; + ss2 = line0[x*xscale*4 + 2] + line0[x*xscale*4 + 6] + line0[x*xscale*4 + 10] + line0[x*xscale*4 + 14] + + line1[x*xscale*4 + 2] + line1[x*xscale*4 + 6] + line1[x*xscale*4 + 10] + line1[x*xscale*4 + 14] + + line2[x*xscale*4 + 2] + line2[x*xscale*4 + 6] + line2[x*xscale*4 + 10] + line2[x*xscale*4 + 14] + + line3[x*xscale*4 + 2] + line3[x*xscale*4 + 6] + line3[x*xscale*4 + 10] + line3[x*xscale*4 + 14]; + ss3 = line0[x*xscale*4 + 3] + line0[x*xscale*4 + 7] + line0[x*xscale*4 + 11] + line0[x*xscale*4 + 15] + + line1[x*xscale*4 + 3] + line1[x*xscale*4 + 7] + line1[x*xscale*4 + 11] + line1[x*xscale*4 + 15] + + line2[x*xscale*4 + 3] + line2[x*xscale*4 + 7] + line2[x*xscale*4 + 11] + line2[x*xscale*4 + 15] + + line3[x*xscale*4 + 3] + line3[x*xscale*4 + 7] + line3[x*xscale*4 + 11] + line3[x*xscale*4 + 15]; + v = MAKE_UINT32((ss0 + amend) >> 4, (ss1 + amend) >> 4, + (ss2 + amend) >> 4, (ss3 + amend) >> 4); + memcpy(imOut->image[y] + x * sizeof(v), &v, sizeof(v)); } } - break; - - case IMAGING_TYPE_INT32: - break; - - case IMAGING_TYPE_FLOAT32: - break; } } } @@ -1043,92 +943,82 @@ ImagingReduce5x5(Imaging imOut, Imaging imIn) } } } else { - switch(imIn->type) { - case IMAGING_TYPE_UINT8: - for (y = 0; y < imIn->ysize / yscale; y++) { - UINT8 *line0 = (UINT8 *)imIn->image[y*yscale + 0]; - UINT8 *line1 = (UINT8 *)imIn->image[y*yscale + 1]; - UINT8 *line2 = (UINT8 *)imIn->image[y*yscale + 2]; - UINT8 *line3 = (UINT8 *)imIn->image[y*yscale + 3]; - UINT8 *line4 = (UINT8 *)imIn->image[y*yscale + 4]; - if (imIn->bands == 2) { - for (x = 0; x < imIn->xsize / xscale; x++) { - UINT32 v; - ss0 = line0[x*xscale*4 + 0] + line0[x*xscale*4 + 4] + line0[x*xscale*4 + 8] + line0[x*xscale*4 + 12] + line0[x*xscale*4 + 16] + - line1[x*xscale*4 + 0] + line1[x*xscale*4 + 4] + line1[x*xscale*4 + 8] + line1[x*xscale*4 + 12] + line1[x*xscale*4 + 16] + - line2[x*xscale*4 + 0] + line2[x*xscale*4 + 4] + line2[x*xscale*4 + 8] + line2[x*xscale*4 + 12] + line2[x*xscale*4 + 16] + - line3[x*xscale*4 + 0] + line3[x*xscale*4 + 4] + line3[x*xscale*4 + 8] + line3[x*xscale*4 + 12] + line3[x*xscale*4 + 16] + - line4[x*xscale*4 + 0] + line4[x*xscale*4 + 4] + line4[x*xscale*4 + 8] + line4[x*xscale*4 + 12] + line4[x*xscale*4 + 16]; - ss3 = line0[x*xscale*4 + 3] + line0[x*xscale*4 + 7] + line0[x*xscale*4 + 11] + line0[x*xscale*4 + 15] + line0[x*xscale*4 + 19] + - line1[x*xscale*4 + 3] + line1[x*xscale*4 + 7] + line1[x*xscale*4 + 11] + line1[x*xscale*4 + 15] + line1[x*xscale*4 + 19] + - line2[x*xscale*4 + 3] + line2[x*xscale*4 + 7] + line2[x*xscale*4 + 11] + line2[x*xscale*4 + 15] + line2[x*xscale*4 + 19] + - line3[x*xscale*4 + 3] + line3[x*xscale*4 + 7] + line3[x*xscale*4 + 11] + line3[x*xscale*4 + 15] + line3[x*xscale*4 + 19] + - line4[x*xscale*4 + 3] + line4[x*xscale*4 + 7] + line4[x*xscale*4 + 11] + line4[x*xscale*4 + 15] + line4[x*xscale*4 + 19]; - v = MAKE_UINT32( - ((ss0 + amend) * multiplier) >> 24, 0, - 0, ((ss3 + amend) * multiplier) >> 24); - memcpy(imOut->image[y] + x * sizeof(v), &v, sizeof(v)); - } - } else if (imIn->bands == 3) { - for (x = 0; x < imIn->xsize / xscale; x++) { - UINT32 v; - ss0 = line0[x*xscale*4 + 0] + line0[x*xscale*4 + 4] + line0[x*xscale*4 + 8] + line0[x*xscale*4 + 12] + line0[x*xscale*4 + 16] + - line1[x*xscale*4 + 0] + line1[x*xscale*4 + 4] + line1[x*xscale*4 + 8] + line1[x*xscale*4 + 12] + line1[x*xscale*4 + 16] + - line2[x*xscale*4 + 0] + line2[x*xscale*4 + 4] + line2[x*xscale*4 + 8] + line2[x*xscale*4 + 12] + line2[x*xscale*4 + 16] + - line3[x*xscale*4 + 0] + line3[x*xscale*4 + 4] + line3[x*xscale*4 + 8] + line3[x*xscale*4 + 12] + line3[x*xscale*4 + 16] + - line4[x*xscale*4 + 0] + line4[x*xscale*4 + 4] + line4[x*xscale*4 + 8] + line4[x*xscale*4 + 12] + line4[x*xscale*4 + 16]; - ss1 = line0[x*xscale*4 + 1] + line0[x*xscale*4 + 5] + line0[x*xscale*4 + 9] + line0[x*xscale*4 + 13] + line0[x*xscale*4 + 17] + - line1[x*xscale*4 + 1] + line1[x*xscale*4 + 5] + line1[x*xscale*4 + 9] + line1[x*xscale*4 + 13] + line1[x*xscale*4 + 17] + - line2[x*xscale*4 + 1] + line2[x*xscale*4 + 5] + line2[x*xscale*4 + 9] + line2[x*xscale*4 + 13] + line2[x*xscale*4 + 17] + - line3[x*xscale*4 + 1] + line3[x*xscale*4 + 5] + line3[x*xscale*4 + 9] + line3[x*xscale*4 + 13] + line3[x*xscale*4 + 17] + - line4[x*xscale*4 + 1] + line4[x*xscale*4 + 5] + line4[x*xscale*4 + 9] + line4[x*xscale*4 + 13] + line4[x*xscale*4 + 17]; - ss2 = line0[x*xscale*4 + 2] + line0[x*xscale*4 + 6] + line0[x*xscale*4 + 10] + line0[x*xscale*4 + 14] + line0[x*xscale*4 + 18] + - line1[x*xscale*4 + 2] + line1[x*xscale*4 + 6] + line1[x*xscale*4 + 10] + line1[x*xscale*4 + 14] + line1[x*xscale*4 + 18] + - line2[x*xscale*4 + 2] + line2[x*xscale*4 + 6] + line2[x*xscale*4 + 10] + line2[x*xscale*4 + 14] + line2[x*xscale*4 + 18] + - line3[x*xscale*4 + 2] + line3[x*xscale*4 + 6] + line3[x*xscale*4 + 10] + line3[x*xscale*4 + 14] + line3[x*xscale*4 + 18] + - line4[x*xscale*4 + 2] + line4[x*xscale*4 + 6] + line4[x*xscale*4 + 10] + line4[x*xscale*4 + 14] + line4[x*xscale*4 + 18]; - v = MAKE_UINT32( - ((ss0 + amend) * multiplier) >> 24, ((ss1 + amend) * multiplier) >> 24, - ((ss2 + amend) * multiplier) >> 24, 0); - memcpy(imOut->image[y] + x * sizeof(v), &v, sizeof(v)); - } - } else { // bands == 4 - for (x = 0; x < imIn->xsize / xscale; x++) { - UINT32 v; - ss0 = line0[x*xscale*4 + 0] + line0[x*xscale*4 + 4] + line0[x*xscale*4 + 8] + line0[x*xscale*4 + 12] + line0[x*xscale*4 + 16] + - line1[x*xscale*4 + 0] + line1[x*xscale*4 + 4] + line1[x*xscale*4 + 8] + line1[x*xscale*4 + 12] + line1[x*xscale*4 + 16] + - line2[x*xscale*4 + 0] + line2[x*xscale*4 + 4] + line2[x*xscale*4 + 8] + line2[x*xscale*4 + 12] + line2[x*xscale*4 + 16] + - line3[x*xscale*4 + 0] + line3[x*xscale*4 + 4] + line3[x*xscale*4 + 8] + line3[x*xscale*4 + 12] + line3[x*xscale*4 + 16] + - line4[x*xscale*4 + 0] + line4[x*xscale*4 + 4] + line4[x*xscale*4 + 8] + line4[x*xscale*4 + 12] + line4[x*xscale*4 + 16]; - ss1 = line0[x*xscale*4 + 1] + line0[x*xscale*4 + 5] + line0[x*xscale*4 + 9] + line0[x*xscale*4 + 13] + line0[x*xscale*4 + 17] + - line1[x*xscale*4 + 1] + line1[x*xscale*4 + 5] + line1[x*xscale*4 + 9] + line1[x*xscale*4 + 13] + line1[x*xscale*4 + 17] + - line2[x*xscale*4 + 1] + line2[x*xscale*4 + 5] + line2[x*xscale*4 + 9] + line2[x*xscale*4 + 13] + line2[x*xscale*4 + 17] + - line3[x*xscale*4 + 1] + line3[x*xscale*4 + 5] + line3[x*xscale*4 + 9] + line3[x*xscale*4 + 13] + line3[x*xscale*4 + 17] + - line4[x*xscale*4 + 1] + line4[x*xscale*4 + 5] + line4[x*xscale*4 + 9] + line4[x*xscale*4 + 13] + line4[x*xscale*4 + 17]; - ss2 = line0[x*xscale*4 + 2] + line0[x*xscale*4 + 6] + line0[x*xscale*4 + 10] + line0[x*xscale*4 + 14] + line0[x*xscale*4 + 18] + - line1[x*xscale*4 + 2] + line1[x*xscale*4 + 6] + line1[x*xscale*4 + 10] + line1[x*xscale*4 + 14] + line1[x*xscale*4 + 18] + - line2[x*xscale*4 + 2] + line2[x*xscale*4 + 6] + line2[x*xscale*4 + 10] + line2[x*xscale*4 + 14] + line2[x*xscale*4 + 18] + - line3[x*xscale*4 + 2] + line3[x*xscale*4 + 6] + line3[x*xscale*4 + 10] + line3[x*xscale*4 + 14] + line3[x*xscale*4 + 18] + - line4[x*xscale*4 + 2] + line4[x*xscale*4 + 6] + line4[x*xscale*4 + 10] + line4[x*xscale*4 + 14] + line4[x*xscale*4 + 18]; - ss3 = line0[x*xscale*4 + 3] + line0[x*xscale*4 + 7] + line0[x*xscale*4 + 11] + line0[x*xscale*4 + 15] + line0[x*xscale*4 + 19] + - line1[x*xscale*4 + 3] + line1[x*xscale*4 + 7] + line1[x*xscale*4 + 11] + line1[x*xscale*4 + 15] + line1[x*xscale*4 + 19] + - line2[x*xscale*4 + 3] + line2[x*xscale*4 + 7] + line2[x*xscale*4 + 11] + line2[x*xscale*4 + 15] + line2[x*xscale*4 + 19] + - line3[x*xscale*4 + 3] + line3[x*xscale*4 + 7] + line3[x*xscale*4 + 11] + line3[x*xscale*4 + 15] + line3[x*xscale*4 + 19] + - line4[x*xscale*4 + 3] + line4[x*xscale*4 + 7] + line4[x*xscale*4 + 11] + line4[x*xscale*4 + 15] + line4[x*xscale*4 + 19]; - v = MAKE_UINT32( - ((ss0 + amend) * multiplier) >> 24, ((ss1 + amend) * multiplier) >> 24, - ((ss2 + amend) * multiplier) >> 24, ((ss3 + amend) * multiplier) >> 24); - memcpy(imOut->image[y] + x * sizeof(v), &v, sizeof(v)); - } + for (y = 0; y < imIn->ysize / yscale; y++) { + UINT8 *line0 = (UINT8 *)imIn->image[y*yscale + 0]; + UINT8 *line1 = (UINT8 *)imIn->image[y*yscale + 1]; + UINT8 *line2 = (UINT8 *)imIn->image[y*yscale + 2]; + UINT8 *line3 = (UINT8 *)imIn->image[y*yscale + 3]; + UINT8 *line4 = (UINT8 *)imIn->image[y*yscale + 4]; + if (imIn->bands == 2) { + for (x = 0; x < imIn->xsize / xscale; x++) { + UINT32 v; + ss0 = line0[x*xscale*4 + 0] + line0[x*xscale*4 + 4] + line0[x*xscale*4 + 8] + line0[x*xscale*4 + 12] + line0[x*xscale*4 + 16] + + line1[x*xscale*4 + 0] + line1[x*xscale*4 + 4] + line1[x*xscale*4 + 8] + line1[x*xscale*4 + 12] + line1[x*xscale*4 + 16] + + line2[x*xscale*4 + 0] + line2[x*xscale*4 + 4] + line2[x*xscale*4 + 8] + line2[x*xscale*4 + 12] + line2[x*xscale*4 + 16] + + line3[x*xscale*4 + 0] + line3[x*xscale*4 + 4] + line3[x*xscale*4 + 8] + line3[x*xscale*4 + 12] + line3[x*xscale*4 + 16] + + line4[x*xscale*4 + 0] + line4[x*xscale*4 + 4] + line4[x*xscale*4 + 8] + line4[x*xscale*4 + 12] + line4[x*xscale*4 + 16]; + ss3 = line0[x*xscale*4 + 3] + line0[x*xscale*4 + 7] + line0[x*xscale*4 + 11] + line0[x*xscale*4 + 15] + line0[x*xscale*4 + 19] + + line1[x*xscale*4 + 3] + line1[x*xscale*4 + 7] + line1[x*xscale*4 + 11] + line1[x*xscale*4 + 15] + line1[x*xscale*4 + 19] + + line2[x*xscale*4 + 3] + line2[x*xscale*4 + 7] + line2[x*xscale*4 + 11] + line2[x*xscale*4 + 15] + line2[x*xscale*4 + 19] + + line3[x*xscale*4 + 3] + line3[x*xscale*4 + 7] + line3[x*xscale*4 + 11] + line3[x*xscale*4 + 15] + line3[x*xscale*4 + 19] + + line4[x*xscale*4 + 3] + line4[x*xscale*4 + 7] + line4[x*xscale*4 + 11] + line4[x*xscale*4 + 15] + line4[x*xscale*4 + 19]; + v = MAKE_UINT32( + ((ss0 + amend) * multiplier) >> 24, 0, + 0, ((ss3 + amend) * multiplier) >> 24); + memcpy(imOut->image[y] + x * sizeof(v), &v, sizeof(v)); + } + } else if (imIn->bands == 3) { + for (x = 0; x < imIn->xsize / xscale; x++) { + UINT32 v; + ss0 = line0[x*xscale*4 + 0] + line0[x*xscale*4 + 4] + line0[x*xscale*4 + 8] + line0[x*xscale*4 + 12] + line0[x*xscale*4 + 16] + + line1[x*xscale*4 + 0] + line1[x*xscale*4 + 4] + line1[x*xscale*4 + 8] + line1[x*xscale*4 + 12] + line1[x*xscale*4 + 16] + + line2[x*xscale*4 + 0] + line2[x*xscale*4 + 4] + line2[x*xscale*4 + 8] + line2[x*xscale*4 + 12] + line2[x*xscale*4 + 16] + + line3[x*xscale*4 + 0] + line3[x*xscale*4 + 4] + line3[x*xscale*4 + 8] + line3[x*xscale*4 + 12] + line3[x*xscale*4 + 16] + + line4[x*xscale*4 + 0] + line4[x*xscale*4 + 4] + line4[x*xscale*4 + 8] + line4[x*xscale*4 + 12] + line4[x*xscale*4 + 16]; + ss1 = line0[x*xscale*4 + 1] + line0[x*xscale*4 + 5] + line0[x*xscale*4 + 9] + line0[x*xscale*4 + 13] + line0[x*xscale*4 + 17] + + line1[x*xscale*4 + 1] + line1[x*xscale*4 + 5] + line1[x*xscale*4 + 9] + line1[x*xscale*4 + 13] + line1[x*xscale*4 + 17] + + line2[x*xscale*4 + 1] + line2[x*xscale*4 + 5] + line2[x*xscale*4 + 9] + line2[x*xscale*4 + 13] + line2[x*xscale*4 + 17] + + line3[x*xscale*4 + 1] + line3[x*xscale*4 + 5] + line3[x*xscale*4 + 9] + line3[x*xscale*4 + 13] + line3[x*xscale*4 + 17] + + line4[x*xscale*4 + 1] + line4[x*xscale*4 + 5] + line4[x*xscale*4 + 9] + line4[x*xscale*4 + 13] + line4[x*xscale*4 + 17]; + ss2 = line0[x*xscale*4 + 2] + line0[x*xscale*4 + 6] + line0[x*xscale*4 + 10] + line0[x*xscale*4 + 14] + line0[x*xscale*4 + 18] + + line1[x*xscale*4 + 2] + line1[x*xscale*4 + 6] + line1[x*xscale*4 + 10] + line1[x*xscale*4 + 14] + line1[x*xscale*4 + 18] + + line2[x*xscale*4 + 2] + line2[x*xscale*4 + 6] + line2[x*xscale*4 + 10] + line2[x*xscale*4 + 14] + line2[x*xscale*4 + 18] + + line3[x*xscale*4 + 2] + line3[x*xscale*4 + 6] + line3[x*xscale*4 + 10] + line3[x*xscale*4 + 14] + line3[x*xscale*4 + 18] + + line4[x*xscale*4 + 2] + line4[x*xscale*4 + 6] + line4[x*xscale*4 + 10] + line4[x*xscale*4 + 14] + line4[x*xscale*4 + 18]; + v = MAKE_UINT32( + ((ss0 + amend) * multiplier) >> 24, ((ss1 + amend) * multiplier) >> 24, + ((ss2 + amend) * multiplier) >> 24, 0); + memcpy(imOut->image[y] + x * sizeof(v), &v, sizeof(v)); + } + } else { // bands == 4 + for (x = 0; x < imIn->xsize / xscale; x++) { + UINT32 v; + ss0 = line0[x*xscale*4 + 0] + line0[x*xscale*4 + 4] + line0[x*xscale*4 + 8] + line0[x*xscale*4 + 12] + line0[x*xscale*4 + 16] + + line1[x*xscale*4 + 0] + line1[x*xscale*4 + 4] + line1[x*xscale*4 + 8] + line1[x*xscale*4 + 12] + line1[x*xscale*4 + 16] + + line2[x*xscale*4 + 0] + line2[x*xscale*4 + 4] + line2[x*xscale*4 + 8] + line2[x*xscale*4 + 12] + line2[x*xscale*4 + 16] + + line3[x*xscale*4 + 0] + line3[x*xscale*4 + 4] + line3[x*xscale*4 + 8] + line3[x*xscale*4 + 12] + line3[x*xscale*4 + 16] + + line4[x*xscale*4 + 0] + line4[x*xscale*4 + 4] + line4[x*xscale*4 + 8] + line4[x*xscale*4 + 12] + line4[x*xscale*4 + 16]; + ss1 = line0[x*xscale*4 + 1] + line0[x*xscale*4 + 5] + line0[x*xscale*4 + 9] + line0[x*xscale*4 + 13] + line0[x*xscale*4 + 17] + + line1[x*xscale*4 + 1] + line1[x*xscale*4 + 5] + line1[x*xscale*4 + 9] + line1[x*xscale*4 + 13] + line1[x*xscale*4 + 17] + + line2[x*xscale*4 + 1] + line2[x*xscale*4 + 5] + line2[x*xscale*4 + 9] + line2[x*xscale*4 + 13] + line2[x*xscale*4 + 17] + + line3[x*xscale*4 + 1] + line3[x*xscale*4 + 5] + line3[x*xscale*4 + 9] + line3[x*xscale*4 + 13] + line3[x*xscale*4 + 17] + + line4[x*xscale*4 + 1] + line4[x*xscale*4 + 5] + line4[x*xscale*4 + 9] + line4[x*xscale*4 + 13] + line4[x*xscale*4 + 17]; + ss2 = line0[x*xscale*4 + 2] + line0[x*xscale*4 + 6] + line0[x*xscale*4 + 10] + line0[x*xscale*4 + 14] + line0[x*xscale*4 + 18] + + line1[x*xscale*4 + 2] + line1[x*xscale*4 + 6] + line1[x*xscale*4 + 10] + line1[x*xscale*4 + 14] + line1[x*xscale*4 + 18] + + line2[x*xscale*4 + 2] + line2[x*xscale*4 + 6] + line2[x*xscale*4 + 10] + line2[x*xscale*4 + 14] + line2[x*xscale*4 + 18] + + line3[x*xscale*4 + 2] + line3[x*xscale*4 + 6] + line3[x*xscale*4 + 10] + line3[x*xscale*4 + 14] + line3[x*xscale*4 + 18] + + line4[x*xscale*4 + 2] + line4[x*xscale*4 + 6] + line4[x*xscale*4 + 10] + line4[x*xscale*4 + 14] + line4[x*xscale*4 + 18]; + ss3 = line0[x*xscale*4 + 3] + line0[x*xscale*4 + 7] + line0[x*xscale*4 + 11] + line0[x*xscale*4 + 15] + line0[x*xscale*4 + 19] + + line1[x*xscale*4 + 3] + line1[x*xscale*4 + 7] + line1[x*xscale*4 + 11] + line1[x*xscale*4 + 15] + line1[x*xscale*4 + 19] + + line2[x*xscale*4 + 3] + line2[x*xscale*4 + 7] + line2[x*xscale*4 + 11] + line2[x*xscale*4 + 15] + line2[x*xscale*4 + 19] + + line3[x*xscale*4 + 3] + line3[x*xscale*4 + 7] + line3[x*xscale*4 + 11] + line3[x*xscale*4 + 15] + line3[x*xscale*4 + 19] + + line4[x*xscale*4 + 3] + line4[x*xscale*4 + 7] + line4[x*xscale*4 + 11] + line4[x*xscale*4 + 15] + line4[x*xscale*4 + 19]; + v = MAKE_UINT32( + ((ss0 + amend) * multiplier) >> 24, ((ss1 + amend) * multiplier) >> 24, + ((ss2 + amend) * multiplier) >> 24, ((ss3 + amend) * multiplier) >> 24); + memcpy(imOut->image[y] + x * sizeof(v), &v, sizeof(v)); } } - break; - - case IMAGING_TYPE_INT32: - break; - - case IMAGING_TYPE_FLOAT32: - break; } } } @@ -1191,64 +1081,16 @@ ImagingReduceCorners(Imaging imOut, Imaging imIn, int xscale, int yscale) imOut->image8[y][x] = (ss * multiplier) >> 24; } } else { - switch(imIn->type) { - case IMAGING_TYPE_UINT8: - if (imIn->xsize % xscale) { - int scale = (imIn->xsize % xscale) * yscale; - UINT32 multiplier = division_UINT32(scale, 8); - UINT32 amend = scale / 2; - for (y = 0; y < imIn->ysize / yscale; y++) { - UINT32 v; - UINT32 ss0 = amend, ss1 = amend, ss2 = amend, ss3 = amend; - x = imIn->xsize / xscale; - - for (yy = y*yscale; yy < y*yscale + yscale; yy++) { - UINT8 *line = (UINT8 *)imIn->image[yy]; - for (xx = x*xscale; xx < imIn->xsize; xx++) { - ss0 += line[xx*4 + 0]; - ss1 += line[xx*4 + 1]; - ss2 += line[xx*4 + 2]; - ss3 += line[xx*4 + 3]; - } - } - v = MAKE_UINT32( - (ss0 * multiplier) >> 24, (ss1 * multiplier) >> 24, - (ss2 * multiplier) >> 24, (ss3 * multiplier) >> 24); - memcpy(imOut->image[y] + x * sizeof(v), &v, sizeof(v)); - } - } - if (imIn->ysize % yscale) { - int scale = xscale * (imIn->ysize % yscale); - UINT32 multiplier = division_UINT32(scale, 8); - UINT32 amend = scale / 2; - y = imIn->ysize / yscale; - for (x = 0; x < imIn->xsize / xscale; x++) { - UINT32 v; - UINT32 ss0 = amend, ss1 = amend, ss2 = amend, ss3 = amend; - for (yy = y*yscale; yy < imIn->ysize; yy++) { - UINT8 *line = (UINT8 *)imIn->image[yy]; - for (xx = x*xscale; xx < x*xscale + xscale; xx++) { - ss0 += line[xx*4 + 0]; - ss1 += line[xx*4 + 1]; - ss2 += line[xx*4 + 2]; - ss3 += line[xx*4 + 3]; - } - } - v = MAKE_UINT32( - (ss0 * multiplier) >> 24, (ss1 * multiplier) >> 24, - (ss2 * multiplier) >> 24, (ss3 * multiplier) >> 24); - memcpy(imOut->image[y] + x * sizeof(v), &v, sizeof(v)); - } - } - if (imIn->xsize % xscale && imIn->ysize % yscale) { - int scale = (imIn->xsize % xscale) * (imIn->ysize % yscale); - UINT32 multiplier = division_UINT32(scale, 8); - UINT32 amend = scale / 2; + if (imIn->xsize % xscale) { + int scale = (imIn->xsize % xscale) * yscale; + UINT32 multiplier = division_UINT32(scale, 8); + UINT32 amend = scale / 2; + for (y = 0; y < imIn->ysize / yscale; y++) { UINT32 v; UINT32 ss0 = amend, ss1 = amend, ss2 = amend, ss3 = amend; x = imIn->xsize / xscale; - y = imIn->ysize / yscale; - for (yy = y*yscale; yy < imIn->ysize; yy++) { + + for (yy = y*yscale; yy < y*yscale + yscale; yy++) { UINT8 *line = (UINT8 *)imIn->image[yy]; for (xx = x*xscale; xx < imIn->xsize; xx++) { ss0 += line[xx*4 + 0]; @@ -1262,14 +1104,158 @@ ImagingReduceCorners(Imaging imOut, Imaging imIn, int xscale, int yscale) (ss2 * multiplier) >> 24, (ss3 * multiplier) >> 24); memcpy(imOut->image[y] + x * sizeof(v), &v, sizeof(v)); } - break; - - case IMAGING_TYPE_INT32: - break; - - case IMAGING_TYPE_FLOAT32: - break; } + if (imIn->ysize % yscale) { + int scale = xscale * (imIn->ysize % yscale); + UINT32 multiplier = division_UINT32(scale, 8); + UINT32 amend = scale / 2; + y = imIn->ysize / yscale; + for (x = 0; x < imIn->xsize / xscale; x++) { + UINT32 v; + UINT32 ss0 = amend, ss1 = amend, ss2 = amend, ss3 = amend; + for (yy = y*yscale; yy < imIn->ysize; yy++) { + UINT8 *line = (UINT8 *)imIn->image[yy]; + for (xx = x*xscale; xx < x*xscale + xscale; xx++) { + ss0 += line[xx*4 + 0]; + ss1 += line[xx*4 + 1]; + ss2 += line[xx*4 + 2]; + ss3 += line[xx*4 + 3]; + } + } + v = MAKE_UINT32( + (ss0 * multiplier) >> 24, (ss1 * multiplier) >> 24, + (ss2 * multiplier) >> 24, (ss3 * multiplier) >> 24); + memcpy(imOut->image[y] + x * sizeof(v), &v, sizeof(v)); + } + } + if (imIn->xsize % xscale && imIn->ysize % yscale) { + int scale = (imIn->xsize % xscale) * (imIn->ysize % yscale); + UINT32 multiplier = division_UINT32(scale, 8); + UINT32 amend = scale / 2; + UINT32 v; + UINT32 ss0 = amend, ss1 = amend, ss2 = amend, ss3 = amend; + x = imIn->xsize / xscale; + y = imIn->ysize / yscale; + for (yy = y*yscale; yy < imIn->ysize; yy++) { + UINT8 *line = (UINT8 *)imIn->image[yy]; + for (xx = x*xscale; xx < imIn->xsize; xx++) { + ss0 += line[xx*4 + 0]; + ss1 += line[xx*4 + 1]; + ss2 += line[xx*4 + 2]; + ss3 += line[xx*4 + 3]; + } + } + v = MAKE_UINT32( + (ss0 * multiplier) >> 24, (ss1 * multiplier) >> 24, + (ss2 * multiplier) >> 24, (ss3 * multiplier) >> 24); + memcpy(imOut->image[y] + x * sizeof(v), &v, sizeof(v)); + } + } +} + + +void +ImagingReduceNxN_32bpc(Imaging imOut, Imaging imIn, int xscale, int yscale) +{ + /* The most general implementation for any xscale and yscale + */ + int x, y, xx, yy, xi; + double multiplier = 1.0 / (yscale * xscale); + + switch(imIn->type) { + case IMAGING_TYPE_INT32: + break; + + case IMAGING_TYPE_FLOAT32: + for (y = 0; y < imIn->ysize / yscale; y++) { + for (x = 0; x < imIn->xsize / xscale; x++) { + double ss = 0; + for (yy = y*yscale; yy < y*yscale + yscale - 1; yy += 2) { + float *line0 = (float *)imIn->image[yy]; + float *line1 = (float *)imIn->image[yy + 1]; + for (xi = 0; xi < xscale - 1; xi += 2) { + xx = x*xscale + xi; + ss += line0[xx + 0] + line0[xx + 1] + + line1[xx + 0] + line1[xx + 1]; + } + if (xscale & 0x01) { + xx = x*xscale + xi; + ss += line0[xx + 0] + line1[xx + 0]; + } + } + if (yscale & 0x01) { + float *line = (float *)imIn->image[yy]; + for (xi = 0; xi < xscale - 1; xi += 2) { + xx = x*xscale + xi; + ss += line[xx + 0] + line[xx + 1]; + } + if (xscale & 0x01) { + xx = x*xscale + xi; + ss += line[xx + 0]; + } + } + IMAGING_PIXEL_F(imOut, x, y) = ss * multiplier; + } + } + break; + } +} + + +void +ImagingReduceCorners_32bpc(Imaging imOut, Imaging imIn, int xscale, int yscale) +{ + /* Fill the last row and the last column for any xscale and yscale. + */ + int x, y, xx, yy; + + switch(imIn->type) { + case IMAGING_TYPE_INT32: + break; + + case IMAGING_TYPE_FLOAT32: + if (imIn->xsize % xscale) { + double multiplier = 1.0 / ((imIn->xsize % xscale) * yscale); + for (y = 0; y < imIn->ysize / yscale; y++) { + double ss = 0; + x = imIn->xsize / xscale; + for (yy = y*yscale; yy < y*yscale + yscale; yy++) { + float *line = (float *)imIn->image[yy]; + for (xx = x*xscale; xx < imIn->xsize; xx++) { + ss += line[xx + 0]; + } + } + IMAGING_PIXEL_F(imOut, x, y) = ss * multiplier; + } + } + if (imIn->ysize % yscale) { + double multiplier = 1.0 / (xscale * (imIn->ysize % yscale)); + y = imIn->ysize / yscale; + for (x = 0; x < imIn->xsize / xscale; x++) { + double ss = 0; + for (yy = y*yscale; yy < imIn->ysize; yy++) { + float *line = (float *)imIn->image[yy]; + for (xx = x*xscale; xx < x*xscale + xscale; xx++) { + ss += line[xx + 0]; + } + } + IMAGING_PIXEL_F(imOut, x, y) = ss * multiplier; + } + } + if (imIn->xsize % xscale && imIn->ysize % yscale) { + double multiplier = 1.0 / ((imIn->xsize % xscale) * (imIn->ysize % yscale)); + double ss = 0; + x = imIn->xsize / xscale; + y = imIn->ysize / yscale; + for (yy = y*yscale; yy < imIn->ysize; yy++) { + float *line = (float *)imIn->image[yy]; + for (xx = x*xscale; xx < imIn->xsize; xx++) { + ss += line[xx + 0]; + } + } + IMAGING_PIXEL_F(imOut, x, y) = ss * multiplier; + } + break; } } @@ -1295,37 +1281,48 @@ ImagingReduce(Imaging imIn, int xscale, int yscale) ImagingSectionEnter(&cookie); - if (xscale == 1) { - if (yscale == 2) { - ImagingReduce1x2(imOut, imIn); - } else if (yscale == 3) { - ImagingReduce1x3(imOut, imIn); + switch(imIn->type) { + case IMAGING_TYPE_UINT8: + if (xscale == 1) { + if (yscale == 2) { + ImagingReduce1x2(imOut, imIn); + } else if (yscale == 3) { + ImagingReduce1x3(imOut, imIn); + } else { + ImagingReduce1xN(imOut, imIn, yscale); + } + } else if (yscale == 1) { + if (xscale == 2) { + ImagingReduce2x1(imOut, imIn); + } else if (xscale == 3) { + ImagingReduce3x1(imOut, imIn); + } else { + ImagingReduceNx1(imOut, imIn, xscale); + } + } else if (xscale == yscale && xscale <= 5) { + if (xscale == 2) { + ImagingReduce2x2(imOut, imIn); + } else if (xscale == 3) { + ImagingReduce3x3(imOut, imIn); + } else if (xscale == 4) { + ImagingReduce4x4(imOut, imIn); + } else { + ImagingReduce5x5(imOut, imIn); + } } else { - ImagingReduce1xN(imOut, imIn, yscale); + ImagingReduceNxN(imOut, imIn, xscale, yscale); } - } else if (yscale == 1) { - if (xscale == 2) { - ImagingReduce2x1(imOut, imIn); - } else if (xscale == 3) { - ImagingReduce3x1(imOut, imIn); - } else { - ImagingReduceNx1(imOut, imIn, xscale); - } - } else if (xscale == yscale && xscale <= 5) { - if (xscale == 2) { - ImagingReduce2x2(imOut, imIn); - } else if (xscale == 3) { - ImagingReduce3x3(imOut, imIn); - } else if (xscale == 4) { - ImagingReduce4x4(imOut, imIn); - } else { - ImagingReduce5x5(imOut, imIn); - } - } else { - ImagingReduceNxN(imOut, imIn, xscale, yscale); - } - ImagingReduceCorners(imOut, imIn, xscale, yscale); + ImagingReduceCorners(imOut, imIn, xscale, yscale); + break; + + case IMAGING_TYPE_INT32: + case IMAGING_TYPE_FLOAT32: + ImagingReduceNxN_32bpc(imOut, imIn, xscale, yscale); + + ImagingReduceCorners_32bpc(imOut, imIn, xscale, yscale); + break; + } ImagingSectionLeave(&cookie);