diff --git a/backends/platform/wince/CEScaler.cpp b/backends/platform/wince/CEScaler.cpp index 546f8546c96..4e321e527e5 100644 --- a/backends/platform/wince/CEScaler.cpp +++ b/backends/platform/wince/CEScaler.cpp @@ -51,7 +51,14 @@ void PocketPCPortraitTemplate(const uint8 *srcPtr, uint32 srcPitch, uint8 *dstPt dstPtr += dstPitch; } } -MAKE_WRAPPER(PocketPCPortrait) + +void PocketPCPortrait(const uint8 *srcPtr, uint32 srcPitch, uint8 *dstPtr, uint32 dstPitch, int width, int height) { + extern int gBitFormat; + if (gBitFormat == 565) + PocketPCPortraitTemplate >(srcPtr, srcPitch, dstPtr, dstPitch, width, height); + else + PocketPCPortraitTemplate >(srcPtr, srcPitch, dstPtr, dstPitch, width, height); +} void PocketPCLandscapeAspect(const uint8 *srcPtr, uint32 srcPitch, uint8 *dstPtr, uint32 dstPitch, int width, int height) { @@ -157,7 +164,14 @@ void SmartphoneLandscapeTemplate(const uint8 *srcPtr, uint32 srcPitch, uint8 *ds } } } -MAKE_WRAPPER(SmartphoneLandscape) + +void SmartphoneLandscape(const uint8 *srcPtr, uint32 srcPitch, uint8 *dstPtr, uint32 dstPitch, int width, int height) { + extern int gBitFormat; + if (gBitFormat == 565) + SmartphoneLandscapeTemplate >(srcPtr, srcPitch, dstPtr, dstPitch, width, height); + else + SmartphoneLandscapeTemplate >(srcPtr, srcPitch, dstPtr, dstPitch, width, height); +} #endif diff --git a/graphics/scaler.cpp b/graphics/scaler.cpp index 95606043b7d..e9eeb71fe3d 100644 --- a/graphics/scaler.cpp +++ b/graphics/scaler.cpp @@ -59,22 +59,27 @@ uint32 hqx_greenMask = 0; uint32 hqx_redBlueMask = 0; uint32 hqx_green_redBlue_Mask = 0; -// FIXME/TODO: The RGBtoYUV table sucks up 256 KB. This is bad. -// In addition we never free it... -// -// Note: a memory lookup table is *not* necessarily faster than computing -// these things on the fly, because of its size. The table together with -// the code, plus the input/output GFX data, may not fit in the cache on some -// systems, so main memory has to be accessed, which is about the worst thing -// that can happen to code which tries to be fast... -// -// So we should think about ways to get this smaller / removed. Maybe we can -// use the same technique employed by our MPEG code to reduce the size of the -// lookup table at the cost of some additional computations? -// -// Of course, the above is largely a conjecture, and the actual speed -// differences are likely to vary a lot between different architectures and -// CPUs. +/** + * 16bit RGB to YUV conversion table. This table is setup by InitLUT(). + * Used by the hq scaler family. + * + * FIXME/TODO: The RGBtoYUV table sucks up 256 KB. This is bad. + * In addition we never free it... + * + * Note: a memory lookup table is *not* necessarily faster than computing + * these things on the fly, because of its size. The table together with + * the code, plus the input/output GFX data, may not fit in the cache on some + * systems, so main memory has to be accessed, which is about the worst thing + * that can happen to code which tries to be fast... + * + * So we should think about ways to get this smaller / removed. Maybe we can + * use the same technique employed by our MPEG code to reduce the size of the + * lookup table at the cost of some additional computations? + * + * Of course, the above is largely a conjecture, and the actual speed + * differences are likely to vary a lot between different architectures and + * CPUs. + */ uint32 *RGBtoYUV = 0; } @@ -322,7 +327,13 @@ void Normal1o5xTemplate(const uint8 *srcPtr, uint32 srcPitch, uint8 *dstPtr, uin height -= 2; } } -MAKE_WRAPPER(Normal1o5x) + +void Normal1o5x(const uint8 *srcPtr, uint32 srcPitch, uint8 *dstPtr, uint32 dstPitch, int width, int height) { + if (gBitFormat == 565) + Normal1o5xTemplate >(srcPtr, srcPitch, dstPtr, dstPitch, width, height); + else + Normal1o5xTemplate >(srcPtr, srcPitch, dstPtr, dstPitch, width, height); +} /** * The Scale2x filter, also known as AdvMame2x. @@ -368,7 +379,13 @@ void TV2xTemplate(const uint8 *srcPtr, uint32 srcPitch, uint8 *dstPtr, uint32 ds q += nextlineDst << 1; } } -MAKE_WRAPPER(TV2x) + +void TV2x(const uint8 *srcPtr, uint32 srcPitch, uint8 *dstPtr, uint32 dstPitch, int width, int height) { + if (gBitFormat == 565) + TV2xTemplate >(srcPtr, srcPitch, dstPtr, dstPitch, width, height); + else + TV2xTemplate >(srcPtr, srcPitch, dstPtr, dstPitch, width, height); +} static inline uint16 DOT_16(const uint16 *dotmatrix, uint16 c, int j, int i) { return c - ((c >> 2) & dotmatrix[((j & 3) << 2) + (i & 3)]); diff --git a/graphics/scaler/2xsai.cpp b/graphics/scaler/2xsai.cpp index 165734ba10e..936ed191247 100644 --- a/graphics/scaler/2xsai.cpp +++ b/graphics/scaler/2xsai.cpp @@ -153,7 +153,13 @@ void Super2xSaITemplate(const uint8 *srcPtr, uint32 srcPitch, uint8 *dstPtr, uin } } -MAKE_WRAPPER(Super2xSaI) +void Super2xSaI(const uint8 *srcPtr, uint32 srcPitch, uint8 *dstPtr, uint32 dstPitch, int width, int height) { + extern int gBitFormat; + if (gBitFormat == 565) + Super2xSaITemplate >(srcPtr, srcPitch, dstPtr, dstPitch, width, height); + else + Super2xSaITemplate >(srcPtr, srcPitch, dstPtr, dstPitch, width, height); +} template void SuperEagleTemplate(const uint8 *srcPtr, uint32 srcPitch, uint8 *dstPtr, uint32 dstPitch, int width, int height) { @@ -258,7 +264,14 @@ void SuperEagleTemplate(const uint8 *srcPtr, uint32 srcPitch, uint8 *dstPtr, uin } } -MAKE_WRAPPER(SuperEagle) + +void SuperEagle(const uint8 *srcPtr, uint32 srcPitch, uint8 *dstPtr, uint32 dstPitch, int width, int height) { + extern int gBitFormat; + if (gBitFormat == 565) + SuperEagleTemplate >(srcPtr, srcPitch, dstPtr, dstPitch, width, height); + else + SuperEagleTemplate >(srcPtr, srcPitch, dstPtr, dstPitch, width, height); +} template void _2xSaITemplate(const uint8 *srcPtr, uint32 srcPitch, uint8 *dstPtr, uint32 dstPitch, int width, int height) { @@ -394,4 +407,11 @@ void _2xSaITemplate(const uint8 *srcPtr, uint32 srcPitch, uint8 *dstPtr, uint32 } } -MAKE_WRAPPER(_2xSaI) + +void _2xSaI(const uint8 *srcPtr, uint32 srcPitch, uint8 *dstPtr, uint32 dstPitch, int width, int height) { + extern int gBitFormat; + if (gBitFormat == 565) + _2xSaITemplate >(srcPtr, srcPitch, dstPtr, dstPitch, width, height); + else + _2xSaITemplate >(srcPtr, srcPitch, dstPtr, dstPitch, width, height); +} diff --git a/graphics/scaler/aspect.cpp b/graphics/scaler/aspect.cpp index 3707f39b60e..58974c30fa5 100644 --- a/graphics/scaler/aspect.cpp +++ b/graphics/scaler/aspect.cpp @@ -176,6 +176,7 @@ int stretch200To240(uint8 *buf, uint32 pitch, int width, int height, int srcX, i } int stretch200To240(uint8 *buf, uint32 pitch, int width, int height, int srcX, int srcY, int origSrcY) { + extern int gBitFormat; if (gBitFormat == 565) return stretch200To240 >(buf, pitch, width, height, srcX, srcY, origSrcY); else // gBitFormat == 555 diff --git a/graphics/scaler/downscaler.cpp b/graphics/scaler/downscaler.cpp index 6f94f1f34b5..7b2e7c70c47 100644 --- a/graphics/scaler/downscaler.cpp +++ b/graphics/scaler/downscaler.cpp @@ -63,7 +63,14 @@ void DownscaleAllByHalfTemplate(const uint8 *srcPtr, uint32 srcPitch, uint8 *dst dstPtr += dstPitch; } } -MAKE_WRAPPER(DownscaleAllByHalf) + +void DownscaleAllByHalf(const uint8 *srcPtr, uint32 srcPitch, uint8 *dstPtr, uint32 dstPitch, int width, int height) { + extern int gBitFormat; + if (gBitFormat == 565) + DownscaleAllByHalfTemplate >(srcPtr, srcPitch, dstPtr, dstPitch, width, height); + else + DownscaleAllByHalfTemplate >(srcPtr, srcPitch, dstPtr, dstPitch, width, height); +} #endif @@ -93,4 +100,11 @@ void DownscaleHorizByHalfTemplate(const uint8 *srcPtr, uint32 srcPitch, uint8 *d dstPtr += dstPitch; } } -MAKE_WRAPPER(DownscaleHorizByHalf) + +void DownscaleHorizByHalf(const uint8 *srcPtr, uint32 srcPitch, uint8 *dstPtr, uint32 dstPitch, int width, int height) { + extern int gBitFormat; + if (gBitFormat == 565) + DownscaleHorizByHalfTemplate >(srcPtr, srcPitch, dstPtr, dstPitch, width, height); + else + DownscaleHorizByHalfTemplate >(srcPtr, srcPitch, dstPtr, dstPitch, width, height); +} diff --git a/graphics/scaler/hq2x.cpp b/graphics/scaler/hq2x.cpp index 3d9112e5c62..c302ebe8e46 100644 --- a/graphics/scaler/hq2x.cpp +++ b/graphics/scaler/hq2x.cpp @@ -96,6 +96,7 @@ void HQ2x(const uint8 *srcPtr, uint32 srcPitch, uint8 *dstPtr, uint32 dstPitch, #define PIXEL11_90 *(q+1+nextlineDst) = interpolate16_2_3_3(w5, w6, w8); #define PIXEL11_100 *(q+1+nextlineDst) = interpolate16_14_1_1(w5, w6, w8); +extern "C" uint32 *RGBtoYUV; #define YUV(x) RGBtoYUV[w ## x] diff --git a/graphics/scaler/hq3x.cpp b/graphics/scaler/hq3x.cpp index 727f06ff0bb..83b00ee4b31 100644 --- a/graphics/scaler/hq3x.cpp +++ b/graphics/scaler/hq3x.cpp @@ -99,6 +99,7 @@ void HQ3x(const uint8 *srcPtr, uint32 srcPitch, uint8 *dstPtr, uint32 dstPitch, #define PIXEL22_5 *(q+2+nextlineDst2) = interpolate16_1_1(w6, w8); #define PIXEL22_C *(q+2+nextlineDst2) = w5; +extern "C" uint32 *RGBtoYUV; #define YUV(x) RGBtoYUV[w ## x] diff --git a/graphics/scaler/intern.h b/graphics/scaler/intern.h index 706f0a11d02..4addd6d3bd3 100644 --- a/graphics/scaler/intern.h +++ b/graphics/scaler/intern.h @@ -211,22 +211,4 @@ static inline bool diffYUV(int yuv1, int yuv2) { */ } -/** - * 16bit RGB to YUV conversion table. This table is setup by InitLUT(). - * Used by the hq scaler family. - */ -extern "C" uint32 *RGBtoYUV; - -/** Auxiliary macro to simplify creating those template function wrappers. */ -#define MAKE_WRAPPER(FUNC) \ - void FUNC(const uint8 *srcPtr, uint32 srcPitch, uint8 *dstPtr, uint32 dstPitch, int width, int height) { \ - if (gBitFormat == 565) \ - FUNC ## Template >(srcPtr, srcPitch, dstPtr, dstPitch, width, height); \ - else \ - FUNC ## Template >(srcPtr, srcPitch, dstPtr, dstPitch, width, height); \ - } - -/** Specifies the currently active 16bit pixel format, 555 or 565. */ -extern int gBitFormat; - #endif