diff options
author | Max Horn | 2010-03-08 10:31:42 +0000 |
---|---|---|
committer | Max Horn | 2010-03-08 10:31:42 +0000 |
commit | 2cdf8996f3394e3bde74eba404bdde121b41abe7 (patch) | |
tree | 57f380925b547ee4590a45bb051cee1d014a5dff /graphics | |
parent | 0fc137cdf2f04d676b196efb6bc0599efd53e84f (diff) | |
download | scummvm-rg350-2cdf8996f3394e3bde74eba404bdde121b41abe7.tar.gz scummvm-rg350-2cdf8996f3394e3bde74eba404bdde121b41abe7.tar.bz2 scummvm-rg350-2cdf8996f3394e3bde74eba404bdde121b41abe7.zip |
Rename PocketPCLandscapeAspect to Normal1xAspect and move it to
graphics/scaler/aspect.cpp
svn-id: r48192
Diffstat (limited to 'graphics')
-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 |
4 files changed, 136 insertions, 47 deletions
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 |