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 | |
| 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
| -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 | 
