diff --git a/src/libImaging/Reduce.c b/src/libImaging/Reduce.c index e823beb2f..9c105ac1f 100644 --- a/src/libImaging/Reduce.c +++ b/src/libImaging/Reduce.c @@ -17,8 +17,10 @@ void ImagingReduce2x2(Imaging imOut, Imaging imIn) { ImagingSectionCookie cookie; + int xscale = 2, yscale = 2; int x, y; - int ss0, ss1, ss2, ss3; + UINT32 ss0, ss1, ss2, ss3; + UINT32 amend = yscale * xscale / 2; ImagingSectionEnter(&cookie); if (imIn->image8) { @@ -26,26 +28,444 @@ ImagingReduce2x2(Imaging imOut, Imaging imIn) } else { switch(imIn->type) { case IMAGING_TYPE_UINT8: - for (y = 0; y < imIn->ysize / 2; y++) { - UINT8 *line0 = (UINT8 *)imIn->image[y*2 + 0]; - UINT8 *line1 = (UINT8 *)imIn->image[y*2 + 1]; + 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) { - - } else if (imIn->bands == 3) { - for (x = 0; x < imIn->xsize / 2; x++) { + for (x = 0; x < imIn->xsize / xscale; x++) { UINT32 v; - ss0 = line0[x*2*4 + 0] + line0[x*2*4 + 4] + - line1[x*2*4 + 0] + line1[x*2*4 + 4]; - ss1 = line0[x*2*4 + 1] + line0[x*2*4 + 5] + - line1[x*2*4 + 1] + line1[x*2*4 + 5]; - ss2 = line0[x*2*4 + 2] + line0[x*2*4 + 6] + - line1[x*2*4 + 2] + line1[x*2*4 + 6]; - v = MAKE_UINT32((ss0 + 2) >> 2, (ss1 + 2) >> 2, - (ss2 + 2) >> 2, 0); + 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; + } + } + ImagingSectionLeave(&cookie); +} + +void +ImagingReduce3x3(Imaging imOut, Imaging imIn) +{ + ImagingSectionCookie cookie; + int xscale = 3, yscale = 3; + int x, y; + UINT32 ss0, ss1, ss2, ss3; + UINT32 multiplier = division_UINT32(yscale * xscale, 8); + UINT32 amend = yscale * xscale / 2; + + ImagingSectionEnter(&cookie); + if (imIn->image8) { + + } 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)); + } + } + } + break; + + case IMAGING_TYPE_INT32: + break; + + case IMAGING_TYPE_FLOAT32: + break; + } + } + ImagingSectionLeave(&cookie); +} + +void +ImagingReduce4x4(Imaging imOut, Imaging imIn) +{ + ImagingSectionCookie cookie; + int xscale = 4, yscale = 4; + int x, y; + UINT32 ss0, ss1, ss2, ss3; + UINT32 amend = yscale * xscale / 2; + + ImagingSectionEnter(&cookie); + if (imIn->image8) { + + } 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)); + } + } + } + break; + + case IMAGING_TYPE_INT32: + break; + + case IMAGING_TYPE_FLOAT32: + break; + } + } + ImagingSectionLeave(&cookie); +} + +void +ImagingReduce5x5(Imaging imOut, Imaging imIn) +{ + ImagingSectionCookie cookie; + int xscale = 5, yscale = 5; + int x, y; + UINT32 ss0, ss1, ss2, ss3; + UINT32 multiplier = division_UINT32(yscale * xscale, 8); + UINT32 amend = yscale * xscale / 2; + + ImagingSectionEnter(&cookie); + if (imIn->image8) { + + } 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)); + } + } + } + break; + + case IMAGING_TYPE_INT32: + break; + + case IMAGING_TYPE_FLOAT32: + break; + } + } + ImagingSectionLeave(&cookie); +} + +void +ImagingReduce6x6(Imaging imOut, Imaging imIn) +{ + ImagingSectionCookie cookie; + int xscale = 6, yscale = 6; + int x, y; + UINT32 ss0, ss1, ss2, ss3; + UINT32 multiplier = division_UINT32(yscale * xscale, 8); + UINT32 amend = yscale * xscale / 2; + + ImagingSectionEnter(&cookie); + if (imIn->image8) { + + } 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]; + UINT8 *line5 = (UINT8 *)imIn->image[y*yscale + 5]; + 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] + line0[x*xscale*4 + 20] + + 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] + line1[x*xscale*4 + 20] + + 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] + line2[x*xscale*4 + 20] + + 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] + line3[x*xscale*4 + 20] + + 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] + line4[x*xscale*4 + 20] + + line5[x*xscale*4 + 0] + line5[x*xscale*4 + 4] + line5[x*xscale*4 + 8] + line5[x*xscale*4 + 12] + line5[x*xscale*4 + 16] + line5[x*xscale*4 + 20]; + 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] + line0[x*xscale*4 + 23] + + 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] + line1[x*xscale*4 + 23] + + 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] + line2[x*xscale*4 + 23] + + 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] + line3[x*xscale*4 + 23] + + 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] + line4[x*xscale*4 + 23] + + line5[x*xscale*4 + 3] + line5[x*xscale*4 + 7] + line5[x*xscale*4 + 11] + line5[x*xscale*4 + 15] + line5[x*xscale*4 + 19] + line5[x*xscale*4 + 23]; + 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] + line0[x*xscale*4 + 20] + + 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] + line1[x*xscale*4 + 20] + + 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] + line2[x*xscale*4 + 20] + + 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] + line3[x*xscale*4 + 20] + + 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] + line4[x*xscale*4 + 20] + + line5[x*xscale*4 + 0] + line5[x*xscale*4 + 4] + line5[x*xscale*4 + 8] + line5[x*xscale*4 + 12] + line5[x*xscale*4 + 16] + line5[x*xscale*4 + 20]; + 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] + line0[x*xscale*4 + 21] + + 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] + line1[x*xscale*4 + 21] + + 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] + line2[x*xscale*4 + 21] + + 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] + line3[x*xscale*4 + 21] + + 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] + line4[x*xscale*4 + 21] + + line5[x*xscale*4 + 1] + line5[x*xscale*4 + 5] + line5[x*xscale*4 + 9] + line5[x*xscale*4 + 13] + line5[x*xscale*4 + 17] + line5[x*xscale*4 + 21]; + 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] + line0[x*xscale*4 + 22] + + 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] + line1[x*xscale*4 + 22] + + 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] + line2[x*xscale*4 + 22] + + 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] + line3[x*xscale*4 + 22] + + 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] + line4[x*xscale*4 + 22] + + line5[x*xscale*4 + 2] + line5[x*xscale*4 + 6] + line5[x*xscale*4 + 10] + line5[x*xscale*4 + 14] + line5[x*xscale*4 + 18] + line5[x*xscale*4 + 22]; + 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] + line0[x*xscale*4 + 20] + + 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] + line1[x*xscale*4 + 20] + + 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] + line2[x*xscale*4 + 20] + + 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] + line3[x*xscale*4 + 20] + + 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] + line4[x*xscale*4 + 20] + + line5[x*xscale*4 + 0] + line5[x*xscale*4 + 4] + line5[x*xscale*4 + 8] + line5[x*xscale*4 + 12] + line5[x*xscale*4 + 16] + line5[x*xscale*4 + 20]; + 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] + line0[x*xscale*4 + 21] + + 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] + line1[x*xscale*4 + 21] + + 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] + line2[x*xscale*4 + 21] + + 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] + line3[x*xscale*4 + 21] + + 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] + line4[x*xscale*4 + 21] + + line5[x*xscale*4 + 1] + line5[x*xscale*4 + 5] + line5[x*xscale*4 + 9] + line5[x*xscale*4 + 13] + line5[x*xscale*4 + 17] + line5[x*xscale*4 + 21]; + 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] + line0[x*xscale*4 + 22] + + 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] + line1[x*xscale*4 + 22] + + 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] + line2[x*xscale*4 + 22] + + 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] + line3[x*xscale*4 + 22] + + 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] + line4[x*xscale*4 + 22] + + line5[x*xscale*4 + 2] + line5[x*xscale*4 + 6] + line5[x*xscale*4 + 10] + line5[x*xscale*4 + 14] + line5[x*xscale*4 + 18] + line5[x*xscale*4 + 22]; + 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] + line0[x*xscale*4 + 23] + + 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] + line1[x*xscale*4 + 23] + + 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] + line2[x*xscale*4 + 23] + + 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] + line3[x*xscale*4 + 23] + + 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] + line4[x*xscale*4 + 23] + + line5[x*xscale*4 + 3] + line5[x*xscale*4 + 7] + line5[x*xscale*4 + 11] + line5[x*xscale*4 + 15] + line5[x*xscale*4 + 19] + line5[x*xscale*4 + 23]; + 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; @@ -787,15 +1207,30 @@ ImagingReduce(Imaging imIn, int xscale, int yscale) if (xscale == 1) { ImagingReduce1xN(imOut, imIn, yscale); } else if (xscale == 2) { - ImagingReduce2xN(imOut, imIn, yscale); + if (yscale == 2) + ImagingReduce2x2(imOut, imIn); + else + ImagingReduce2xN(imOut, imIn, yscale); } else if (xscale == 3) { - ImagingReduce3xN(imOut, imIn, yscale); + if (yscale == 3) + ImagingReduce3x3(imOut, imIn); + else + ImagingReduce3xN(imOut, imIn, yscale); } else if (xscale == 4) { - ImagingReduce4xN(imOut, imIn, yscale); + if (yscale == 4) + ImagingReduce4x4(imOut, imIn); + else + ImagingReduce4xN(imOut, imIn, yscale); } else if (xscale == 5) { - ImagingReduce5xN(imOut, imIn, yscale); + if (yscale == 5) + ImagingReduce5x5(imOut, imIn); + else + ImagingReduce5xN(imOut, imIn, yscale); } else if (xscale == 6) { - ImagingReduce6xN(imOut, imIn, yscale); + if (yscale == 6) + ImagingReduce6x6(imOut, imIn); + else + ImagingReduce6xN(imOut, imIn, yscale); } else if (xscale == 7) { ImagingReduce7xN(imOut, imIn, yscale); } else if (xscale == 8) {