diff options
-rw-r--r-- | backends/platform/wince/CEScaler.cpp | 61 | ||||
-rw-r--r-- | backends/platform/wince/CEScaler.h | 10 | ||||
-rw-r--r-- | backends/platform/wince/wince-sdl.cpp | 2 | ||||
-rw-r--r-- | graphics/scaler.cpp | 40 | ||||
-rw-r--r-- | graphics/scaler.h | 20 | ||||
-rw-r--r-- | graphics/scaler/aspect.cpp | 106 | ||||
-rw-r--r-- | graphics/scaler/aspect.h | 17 |
7 files changed, 137 insertions, 119 deletions
diff --git a/backends/platform/wince/CEScaler.cpp b/backends/platform/wince/CEScaler.cpp index 8334ba7a04..cb97907497 100644 --- a/backends/platform/wince/CEScaler.cpp +++ b/backends/platform/wince/CEScaler.cpp @@ -25,67 +25,6 @@ #include "graphics/scaler/intern.h" #include "CEScaler.h" -void PocketPCLandscapeAspect(const uint8 *srcPtr, uint32 srcPitch, uint8 *dstPtr, uint32 dstPitch, int width, int height) { - - const int redblueMasks[] = { 0x7C1F, 0xF81F }; - const int greenMasks[] = { 0x03E0, 0x07E0 }; - const int RBM = redblueMasks[gBitFormat == 565]; - const int GM = greenMasks[gBitFormat == 565]; - - int i,j; - unsigned int p1, p2; - const uint8 *inbuf, *instart; - uint8 *outbuf, *outstart; - -#define RB(x) ((x & RBM)<<8) -#define G(x) ((x & GM)<<3) - -#define P20(x) (((x)>>2)-((x)>>4)) -#define P40(x) (((x)>>1)-((x)>>3)) -#define P60(x) (((x)>>1)+((x)>>3)) -#define P80(x) (((x)>>1)+((x)>>2)+((x)>>4)) - -#define MAKEPIXEL(rb,g) ((((rb)>>8) & RBM | ((g)>>3) & GM)) - - inbuf = (const uint8 *)srcPtr; - outbuf = (uint8 *)dstPtr; - height /= 5; - - // Various casts below go via (void *) to avoid warning. This is - // safe as these are all even addresses. - for (i = 0; i < height; i++) { - instart = inbuf; - outstart = outbuf; - for (j=0; j < width; j++) { - - p1 = *(const uint16*)(const void *)inbuf; inbuf += srcPitch; - *(uint16*)(void *)outbuf = p1; outbuf += dstPitch; - - p2 = *(const uint16*)(const void *)inbuf; inbuf += srcPitch; - *(uint16*)(void *)outbuf = MAKEPIXEL(P20(RB(p1))+P80(RB(p2)),P20(G(p1))+P80(G(p2))); outbuf += dstPitch; - - p1 = p2; - p2 = *(const uint16*)(const void *)inbuf; inbuf += srcPitch; - *(uint16*)(void *)outbuf = MAKEPIXEL(P40(RB(p1))+P60(RB(p2)),P40(G(p1))+P60(G(p2))); outbuf += dstPitch; - - p1 = p2; - p2 = *(const uint16*)(const void *)inbuf; inbuf += srcPitch; - *(uint16*)(void *)outbuf = MAKEPIXEL(P60(RB(p1))+P40(RB(p2)),P60(G(p1))+P40(G(p2))); outbuf += dstPitch; - - p1 = p2; - p2 = *(const uint16*)(const void *)inbuf; - *(uint16*)(void *)outbuf = MAKEPIXEL(P80(RB(p1))+P20(RB(p2)),P80(G(p1))+P20(G(p2))); outbuf += dstPitch; - - *(uint16*)(void *)outbuf = p2; - - inbuf = inbuf - srcPitch*4 + sizeof(uint16); - outbuf = outbuf - dstPitch*5 + sizeof(uint16); - } - inbuf = instart + srcPitch*5; - outbuf = outstart + dstPitch*6; - } -} - #ifdef ARM extern "C" { void SmartphoneLandscapeARM(const uint8 *srcPtr, uint32 srcPitch, uint8 *dstPtr, uint32 dstPitch, int width, int height, int mask); diff --git a/backends/platform/wince/CEScaler.h b/backends/platform/wince/CEScaler.h index b806630d31..a51cd5528c 100644 --- a/backends/platform/wince/CEScaler.h +++ b/backends/platform/wince/CEScaler.h @@ -32,16 +32,6 @@ #include "graphics/scaler/intern.h" /** - * This filter (up)scales the source image vertically by a factor of 6/5. - * For example, a 320x200 image is scaled to 320x240. - * - * The main difference to the code in graphics/scaler/aspect.cpp is the - * out-of-place operation, omitting a straight blit step the sdl backend - * does. Also, tests show unaligned access errors with the stock aspect scaler. - */ -DECLARE_SCALER(PocketPCLandscapeAspect); - -/** * This filter (down)scales the source image horizontally by a factor of 2/3 * and vertically by 7/8. For example, a 320x200 image is scaled to 213x175. * diff --git a/backends/platform/wince/wince-sdl.cpp b/backends/platform/wince/wince-sdl.cpp index 02538f879f..1b332d1942 100644 --- a/backends/platform/wince/wince-sdl.cpp +++ b/backends/platform/wince/wince-sdl.cpp @@ -1166,7 +1166,7 @@ bool OSystem_WINCE3::update_scalers() { _scaleFactorXd = 1; _scaleFactorYm = 6; _scaleFactorYd = 5; - _scalerProc = PocketPCLandscapeAspect; + _scalerProc = Normal1xAspect; _modeFlags = 0; _videoMode.aspectRatioCorrection = true; } else { diff --git a/graphics/scaler.cpp b/graphics/scaler.cpp index 65e32cd2c2..a1439d3165 100644 --- a/graphics/scaler.cpp +++ b/graphics/scaler.cpp @@ -178,45 +178,9 @@ void Normal1x(const uint8 *srcPtr, uint32 srcPitch, uint8 *dstPtr, uint32 dstPit } #ifndef DISABLE_SCALERS -#ifdef USE_ARM_SCALER_ASM -extern "C" void Normal2xAspectMask(const uint8 *srcPtr, - uint32 srcPitch, - uint8 *dstPtr, - uint32 dstPitch, - int width, - int height, - uint32 mask); -/** - * A 2x scaler which also does aspect ratio correction. - * This is Normal2x combined with vertical stretching, - * so it will scale a 320x200 surface to a 640x480 surface. - */ -void Normal2xAspect(const uint8 *srcPtr, - uint32 srcPitch, - uint8 *dstPtr, - uint32 dstPitch, - int width, - int height) { - if (gBitFormat == 565) { - Normal2xAspectMask(srcPtr, - srcPitch, - dstPtr, - dstPitch, - width, - height, - 0x07e0F81F); - } else { - Normal2xAspectMask(srcPtr, - srcPitch, - dstPtr, - dstPitch, - width, - height, - 0x03e07C1F); - } -} +#ifdef USE_ARM_SCALER_ASM extern "C" void Normal2xARM(const uint8 *srcPtr, uint32 srcPitch, uint8 *dstPtr, @@ -422,4 +386,4 @@ void DotMatrix(const uint8 *srcPtr, uint32 srcPitch, uint8 *dstPtr, uint32 dstPi } } -#endif +#endif // #ifndef DISABLE_SCALERS diff --git a/graphics/scaler.h b/graphics/scaler.h index 9d2e578bde..f00226cab9 100644 --- a/graphics/scaler.h +++ b/graphics/scaler.h @@ -38,18 +38,22 @@ typedef void ScalerProc(const uint8 *srcPtr, uint32 srcPitch, extern void x(const uint8 *srcPtr, uint32 srcPitch, uint8 *dstPtr, \ uint32 dstPitch, int width, int height) + +DECLARE_SCALER(Normal1x); + +#ifndef DISABLE_SCALERS + +DECLARE_SCALER(Normal2x); +DECLARE_SCALER(Normal3x); +DECLARE_SCALER(Normal1o5x); + DECLARE_SCALER(_2xSaI); DECLARE_SCALER(Super2xSaI); DECLARE_SCALER(SuperEagle); + DECLARE_SCALER(AdvMame2x); DECLARE_SCALER(AdvMame3x); -DECLARE_SCALER(Normal1x); -DECLARE_SCALER(Normal2x); -#ifdef USE_ARM_SCALER_ASM -DECLARE_SCALER(Normal2xAspect); -#endif -DECLARE_SCALER(Normal3x); -DECLARE_SCALER(Normal1o5x); + DECLARE_SCALER(TV2x); DECLARE_SCALER(DotMatrix); @@ -58,6 +62,8 @@ DECLARE_SCALER(HQ2x); DECLARE_SCALER(HQ3x); #endif +#endif // #ifndef DISABLE_SCALERS + // creates a 160x100 thumbnail for 320x200 games // and 160x120 thumbnail for 320x240 and 640x480 games // only 565 mode diff --git a/graphics/scaler/aspect.cpp b/graphics/scaler/aspect.cpp index 58974c30fa..c34cab9a8d 100644 --- a/graphics/scaler/aspect.cpp +++ b/graphics/scaler/aspect.cpp @@ -183,3 +183,109 @@ int stretch200To240(uint8 *buf, uint32 pitch, int width, int height, int srcX, i return stretch200To240<Graphics::ColorMasks<555> >(buf, pitch, width, height, srcX, srcY, origSrcY); } + +void Normal1xAspect(const uint8 *srcPtr, uint32 srcPitch, uint8 *dstPtr, uint32 dstPitch, int width, int height) { + + extern int gBitFormat; + + const int redblueMasks[] = { 0x7C1F, 0xF81F }; + const int greenMasks[] = { 0x03E0, 0x07E0 }; + const int RBM = redblueMasks[gBitFormat == 565]; + const int GM = greenMasks[gBitFormat == 565]; + + int i,j; + unsigned int p1, p2; + const uint8 *inbuf, *instart; + uint8 *outbuf, *outstart; + +#define RB(x) ((x & RBM)<<8) +#define G(x) ((x & GM)<<3) + +#define P20(x) (((x)>>2)-((x)>>4)) +#define P40(x) (((x)>>1)-((x)>>3)) +#define P60(x) (((x)>>1)+((x)>>3)) +#define P80(x) (((x)>>1)+((x)>>2)+((x)>>4)) + +#define MAKEPIXEL(rb,g) ((((rb)>>8) & RBM | ((g)>>3) & GM)) + + inbuf = (const uint8 *)srcPtr; + outbuf = (uint8 *)dstPtr; + height /= 5; + + // Various casts below go via (void *) to avoid warning. This is + // safe as these are all even addresses. + for (i = 0; i < height; i++) { + instart = inbuf; + outstart = outbuf; + for (j=0; j < width; j++) { + + p1 = *(const uint16*)(const void *)inbuf; inbuf += srcPitch; + *(uint16*)(void *)outbuf = p1; outbuf += dstPitch; + + p2 = *(const uint16*)(const void *)inbuf; inbuf += srcPitch; + *(uint16*)(void *)outbuf = MAKEPIXEL(P20(RB(p1))+P80(RB(p2)),P20(G(p1))+P80(G(p2))); outbuf += dstPitch; + + p1 = p2; + p2 = *(const uint16*)(const void *)inbuf; inbuf += srcPitch; + *(uint16*)(void *)outbuf = MAKEPIXEL(P40(RB(p1))+P60(RB(p2)),P40(G(p1))+P60(G(p2))); outbuf += dstPitch; + + p1 = p2; + p2 = *(const uint16*)(const void *)inbuf; inbuf += srcPitch; + *(uint16*)(void *)outbuf = MAKEPIXEL(P60(RB(p1))+P40(RB(p2)),P60(G(p1))+P40(G(p2))); outbuf += dstPitch; + + p1 = p2; + p2 = *(const uint16*)(const void *)inbuf; + *(uint16*)(void *)outbuf = MAKEPIXEL(P80(RB(p1))+P20(RB(p2)),P80(G(p1))+P20(G(p2))); outbuf += dstPitch; + + *(uint16*)(void *)outbuf = p2; + + inbuf = inbuf - srcPitch*4 + sizeof(uint16); + outbuf = outbuf - dstPitch*5 + sizeof(uint16); + } + inbuf = instart + srcPitch*5; + outbuf = outstart + dstPitch*6; + } +} + + +#ifdef USE_ARM_SCALER_ASM +extern "C" void Normal2xAspectMask(const uint8 *srcPtr, + uint32 srcPitch, + uint8 *dstPtr, + uint32 dstPitch, + int width, + int height, + uint32 mask); + +/** + * A 2x scaler which also does aspect ratio correction. + * This is Normal2x combined with vertical stretching, + * so it will scale a 320x200 surface to a 640x480 surface. + */ +void Normal2xAspect(const uint8 *srcPtr, + uint32 srcPitch, + uint8 *dstPtr, + uint32 dstPitch, + int width, + int height) { + if (gBitFormat == 565) { + Normal2xAspectMask(srcPtr, + srcPitch, + dstPtr, + dstPitch, + width, + height, + 0x07e0F81F); + } else { + Normal2xAspectMask(srcPtr, + srcPitch, + dstPtr, + dstPitch, + width, + height, + 0x03e07C1F); + } +} + +#endif // USE_ARM_SCALER_ASM + diff --git a/graphics/scaler/aspect.h b/graphics/scaler/aspect.h index ebe922ef00..850b8f0b85 100644 --- a/graphics/scaler/aspect.h +++ b/graphics/scaler/aspect.h @@ -26,6 +26,7 @@ #define GRAPHICS_SCALER_ASPECT_H #include "common/scummsys.h" +#include "graphics/scaler.h" /** * TODO: explain @@ -57,7 +58,19 @@ int stretch200To240(uint8 *buf, int srcY, int origSrcY); -// TODO: Move Normal2xAspect & PocketPCLandscapeAspect here; -// also rename the latter to Normal1xAspect + +/** + * This filter (up)scales the source image vertically by a factor of 6/5. + * For example, a 320x200 image is scaled to 320x240. + * + * The main difference to the code in graphics/scaler/aspect.cpp is the + * out-of-place operation, omitting a straight blit step the sdl backend + * does. Also, tests show unaligned access errors with the stock aspect scaler. + */ +DECLARE_SCALER(Normal1xAspect); + +#ifdef USE_ARM_SCALER_ASM +DECLARE_SCALER(Normal2xAspect); +#endif #endif |