From 0fc137cdf2f04d676b196efb6bc0599efd53e84f Mon Sep 17 00:00:00 2001 From: Max Horn Date: Mon, 8 Mar 2010 10:31:09 +0000 Subject: Rename PocketPCPortrait scaler to DownscaleHorizByThreeQuarters, and move it to graphics/scaler. svn-id: r48191 --- graphics/scaler/downscaler.cpp | 41 +++++++++++++++++++++++++++++++++++++++++ graphics/scaler/downscaler.h | 6 ++++++ 2 files changed, 47 insertions(+) (limited to 'graphics/scaler') diff --git a/graphics/scaler/downscaler.cpp b/graphics/scaler/downscaler.cpp index 7b2e7c70c4..53e90bb996 100644 --- a/graphics/scaler/downscaler.cpp +++ b/graphics/scaler/downscaler.cpp @@ -35,6 +35,8 @@ void DownscaleAllByHalf(const uint8 *srcPtr, uint32 srcPitch, uint8 *dstPtr, uin static const int roundingconstants[] = { 0x00200802, 0x00201002 }; static const int redbluegreenMasks[] = { 0x03E07C1F, 0x07E0F81F }; + extern int gBitFormat; + const int maskUsed = (gBitFormat == 565); DownscaleAllByHalfARM(srcPtr, srcPitch, dstPtr, dstPitch, width, height, redbluegreenMasks[maskUsed], roundingconstants[maskUsed]); } @@ -108,3 +110,42 @@ void DownscaleHorizByHalf(const uint8 *srcPtr, uint32 srcPitch, uint8 *dstPtr, u else DownscaleHorizByHalfTemplate >(srcPtr, srcPitch, dstPtr, dstPitch, width, height); } + +/** + * This filter (down)scales the source image horizontally by a factor of 3/4. + * For example, a 320x200 image is scaled to 240x200. + */ +template +void DownscaleHorizByThreeQuartersTemplate(const uint8 *srcPtr, uint32 srcPitch, uint8 *dstPtr, uint32 dstPitch, int width, int height) { + uint16 *work; + + // Various casts below go via (void *) to avoid warning. This is + // safe as these are all even addresses. + while (height--) { + work = (uint16 *)(void *)dstPtr; + + for (int i = 0; i < width; i += 4) { + // Work with 4 pixels + uint16 color1 = *(((const uint16 *)(const void *)srcPtr) + i); + uint16 color2 = *(((const uint16 *)(const void *)srcPtr) + (i + 1)); + uint16 color3 = *(((const uint16 *)(const void *)srcPtr) + (i + 2)); + uint16 color4 = *(((const uint16 *)(const void *)srcPtr) + (i + 3)); + + work[0] = interpolate32_3_1(color1, color2); + work[1] = interpolate32_1_1(color2, color3); + work[2] = interpolate32_3_1(color4, color3); + + work += 3; + } + srcPtr += srcPitch; + dstPtr += dstPitch; + } +} + +void DownscaleHorizByThreeQuarters(const uint8 *srcPtr, uint32 srcPitch, uint8 *dstPtr, uint32 dstPitch, int width, int height) { + extern int gBitFormat; + if (gBitFormat == 565) + DownscaleHorizByThreeQuartersTemplate >(srcPtr, srcPitch, dstPtr, dstPitch, width, height); + else + DownscaleHorizByThreeQuartersTemplate >(srcPtr, srcPitch, dstPtr, dstPitch, width, height); +} diff --git a/graphics/scaler/downscaler.h b/graphics/scaler/downscaler.h index 115ad945e5..158b187940 100644 --- a/graphics/scaler/downscaler.h +++ b/graphics/scaler/downscaler.h @@ -41,4 +41,10 @@ DECLARE_SCALER(DownscaleAllByHalf); */ DECLARE_SCALER(DownscaleHorizByHalf); +/** + * This filter (down)scales the source image horizontally by a factor of 3/4. + * For example, a 320x200 image is scaled to 240x200. + */ +DECLARE_SCALER(DownscaleHorizByThreeQuarters); + #endif -- cgit v1.2.3