From 8aa4083bc9b41b49c582b1d342392c7e5d92dca8 Mon Sep 17 00:00:00 2001 From: Max Horn Date: Wed, 18 Nov 2009 15:22:15 +0000 Subject: Modify WinCE, LinuxMoto and GP2xWiz backends to use graphics/scaler/downscaler* code (untested as of now) svn-id: r45975 --- backends/platform/wince/ARMscaler.s | 184 ---------------------------------- backends/platform/wince/CEScaler.cpp | 103 ++----------------- backends/platform/wince/CEScaler.h | 25 ++++- backends/platform/wince/Makefile | 8 +- backends/platform/wince/module.mk | 1 - backends/platform/wince/wince-sdl.cpp | 20 ++-- backends/platform/wince/wince-sdl.h | 9 +- 7 files changed, 44 insertions(+), 306 deletions(-) delete mode 100644 backends/platform/wince/ARMscaler.s (limited to 'backends/platform/wince') diff --git a/backends/platform/wince/ARMscaler.s b/backends/platform/wince/ARMscaler.s deleted file mode 100644 index bcd3917665..0000000000 --- a/backends/platform/wince/ARMscaler.s +++ /dev/null @@ -1,184 +0,0 @@ -@ ScummVM Scumm Interpreter -@ Copyright (C) 2007 The ScummVM project -@ -@ This program is free software; you can redistribute it and/or -@ modify it under the terms of the GNU General Public License -@ as published by the Free Software Foundation; either version 2 -@ of the License, or (at your option) any later version. -@ -@ This program is distributed in the hope that it will be useful, -@ but WITHOUT ANY WARRANTY; without even the implied warranty of -@ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -@ GNU General Public License for more details. -@ -@ You should have received a copy of the GNU General Public License -@ along with this program; if not, write to the Free Software -@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. -@ -@ $URL$ -@ $Id$ -@ -@ @author Robin Watts (robin@wss.co.uk) - - .text - - .global PocketPCHalfARM - - @ ARM implementation of PocketPCHalf scaler. - @ Scales a width x height block of 16bpp pixels from srcPtr to - @ dstPtr. srcPitch and dstPitch identify how to reach subsequent - @ lines. redblueMask and round allow for one routine to do both - @ 565 and 555 formats. -PocketPCHalfARM: - @ r0 = srcPtr - @ r1 = srcPitch - @ r2 = dstPtr - @ r3 = dstPitch - MOV r12,r13 - STMFD r13!,{r4-r11,r14} - LDMIA r12,{r4-r7} - @ r4 = width - @ r5 = height - @ r6 = redblueMask - @ r7 = round - - SUB r3,r3,r4 @ dstPitch -= width - SUBS r5,r5,#2 @ while ((height-=2) >= 0) - BLT end -height_loop: - - SUBS r11, r4, #8 @ r11= width_minus_8 - BLT thin - -width_loop: - @ unroll loop 4 times here - LDRH r8,[r0],r1 @ r8 = A = srcPtr[0] - LDRH r9,[r0],#2 @ r9 = C = srcPtr[dstPitch] - LDRH r12,[r0],-r1 @ r12= D = srcPtr[dstPitch+2] - LDRH r14,[r0],#2 @ r14= B = srcPtr[2] - - ORR r8, r8, r8, LSL #16 @ r8 = b | g | r | b | g | r - ORR r9, r9, r9, LSL #16 @ r9 = b | g | r | b | g | r - ORR r12,r12,r12,LSL #16 @ r12= b | g | r | b | g | r - ORR r14,r14,r14,LSL #16 @ r14= b | g | r | b | g | r - AND r8, r8, r6 @ r8 = 0 | g | 0 | b | 0 | r - AND r9, r9, r6 @ r9 = 0 | g | 0 | b | 0 | r - AND r12,r12,r6 @ r12= 0 | g | 0 | b | 0 | r - AND r14,r14,r6 @ r14= 0 | g | 0 | b | 0 | r - ADD r8, r8, r9 - ADD r8, r8, r12 - ADD r8, r8, r14 - ADD r8, r8, r7 @ r8 = summed pixels + rounding - AND r8, r6, r8, LSR #2 @ r8 = 0 | g | 0 | b | 0 | r - ORR r10,r8, r8, LSR #16 @ r10= 0 | g | 0 | b | g | r - - LDRH r8,[r0],r1 @ r8 = A = srcPtr[0] - LDRH r9,[r0],#2 @ r9 = C = srcPtr[dstPitch] - LDRH r12,[r0],-r1 @ r12= D = srcPtr[dstPitch+2] - LDRH r14,[r0],#2 @ r14= B = srcPtr[2] - - STRH r10,[r2],#2 @ *dstPtr++ - - ORR r8, r8, r8, LSL #16 @ r8 = b | g | r | b | g | r - ORR r9, r9, r9, LSL #16 @ r9 = b | g | r | b | g | r - ORR r12,r12,r12,LSL #16 @ r12= b | g | r | b | g | r - ORR r14,r14,r14,LSL #16 @ r14= b | g | r | b | g | r - AND r8, r8, r6 @ r8 = 0 | g | 0 | b | 0 | r - AND r9, r9, r6 @ r9 = 0 | g | 0 | b | 0 | r - AND r12,r12,r6 @ r12= 0 | g | 0 | b | 0 | r - AND r14,r14,r6 @ r14= 0 | g | 0 | b | 0 | r - ADD r8, r8, r9 - ADD r8, r8, r12 - ADD r8, r8, r14 - ADD r8, r8, r7 @ r8 = summed pixels + rounding - AND r8, r6, r8, LSR #2 @ r8 = 0 | g | 0 | b | 0 | r - ORR r10,r8, r8, LSR #16 @ r10= 0 | g | 0 | b | g | r - - LDRH r8,[r0],r1 @ r8 = A = srcPtr[0] - LDRH r9,[r0],#2 @ r9 = C = srcPtr[dstPitch] - LDRH r12,[r0],-r1 @ r12= D = srcPtr[dstPitch+2] - LDRH r14,[r0],#2 @ r14= B = srcPtr[2] - - STRH r10,[r2],#2 @ *dstPtr++ - - ORR r8, r8, r8, LSL #16 @ r8 = b | g | r | b | g | r - ORR r9, r9, r9, LSL #16 @ r9 = b | g | r | b | g | r - ORR r12,r12,r12,LSL #16 @ r12= b | g | r | b | g | r - ORR r14,r14,r14,LSL #16 @ r14= b | g | r | b | g | r - AND r8, r8, r6 @ r8 = 0 | g | 0 | b | 0 | r - AND r9, r9, r6 @ r9 = 0 | g | 0 | b | 0 | r - AND r12,r12,r6 @ r12= 0 | g | 0 | b | 0 | r - AND r14,r14,r6 @ r14= 0 | g | 0 | b | 0 | r - ADD r8, r8, r9 - ADD r8, r8, r12 - ADD r8, r8, r14 - ADD r8, r8, r7 @ r8 = summed pixels + rounding - AND r8, r6, r8, LSR #2 @ r8 = 0 | g | 0 | b | 0 | r - ORR r10,r8, r8, LSR #16 @ r10= 0 | g | 0 | b | g | r - - LDRH r8,[r0],r1 @ r8 = A = srcPtr[0] - LDRH r9,[r0],#2 @ r9 = C = srcPtr[dstPitch] - LDRH r12,[r0],-r1 @ r12= D = srcPtr[dstPitch+2] - LDRH r14,[r0],#2 @ r14= B = srcPtr[2] - - STRH r10,[r2],#2 @ *dstPtr++ - - ORR r8, r8, r8, LSL #16 @ r8 = b | g | r | b | g | r - ORR r9, r9, r9, LSL #16 @ r9 = b | g | r | b | g | r - ORR r12,r12,r12,LSL #16 @ r12= b | g | r | b | g | r - ORR r14,r14,r14,LSL #16 @ r14= b | g | r | b | g | r - AND r8, r8, r6 @ r8 = 0 | g | 0 | b | 0 | r - AND r9, r9, r6 @ r9 = 0 | g | 0 | b | 0 | r - AND r12,r12,r6 @ r12= 0 | g | 0 | b | 0 | r - AND r14,r14,r6 @ r14= 0 | g | 0 | b | 0 | r - ADD r8, r8, r9 - ADD r8, r8, r12 - ADD r8, r8, r14 - ADD r8, r8, r7 @ r8 = summed pixels + rounding - AND r8, r6, r8, LSR #2 @ r8 = 0 | g | 0 | b | 0 | r - ORR r10, r8, r8, LSR #16 @ r8 = 0 | g | 0 | b | g | r - - STRH r10,[r2],#2 @ *dstPtr++ - - SUBS r11,r11,#8 @ width_minus_8 -= 8 - BGE width_loop @ (width_minus_8 >= 0) => do 8+ more - -thin: - ADDS r11,r11,#8 @ r11= width - BEQ width_end @ if no more left to do, then bail -thin_lp: - @ single output pixels done in this bit - LDRH r8,[r0],r1 @ r8 = A = srcPtr[0] - LDRH r9,[r0],#2 @ r9 = C = srcPtr[dstPitch] - LDRH r12,[r0],-r1 @ r12= D = srcPtr[dstPitch+2] - LDRH r14,[r0],#2 @ r14= B = srcPtr[2] - - ORR r8, r8, r8, LSL #16 @ r8 = b | g | r | b | g | r - ORR r9, r9, r9, LSL #16 @ r9 = b | g | r | b | g | r - ORR r12,r12,r12,LSL #16 @ r12= b | g | r | b | g | r - ORR r14,r14,r14,LSL #16 @ r14= b | g | r | b | g | r - AND r8, r8, r6 @ r8 = 0 | g | 0 | b | 0 | r - AND r9, r9, r6 @ r9 = 0 | g | 0 | b | 0 | r - AND r12,r12,r6 @ r12= 0 | g | 0 | b | 0 | r - AND r14,r14,r6 @ r14= 0 | g | 0 | b | 0 | r - ADD r8, r8, r9 - ADD r8, r8, r12 - ADD r8, r8, r14 - ADD r8, r8, r7 @ r8 = summed pixels + rounding - AND r8, r6, r8, LSR #2 @ r8 = 0 | g | 0 | b | 0 | r - ORR r8, r8, r8, LSR #16 @ r8 = 0 | g | 0 | b | g | r - - STRH r8,[r2],#2 @ *dstPtr++ - - SUBS r11,r11,#2 - BGT thin_lp -width_end: - ADD r2,r2,r3 @ dstPtr += dstPitch - ADD r0,r0,r1,LSL #1 @ srcPtr += 2*srcPitch - SUB r0,r0,r4,LSL #1 @ srcPtr -= 2*width - - SUBS r5,r5,#2 - BGE height_loop - -end: - LDMFD r13!,{r4-r11,PC} diff --git a/backends/platform/wince/CEScaler.cpp b/backends/platform/wince/CEScaler.cpp index 7239d18753..adf6d1c5eb 100644 --- a/backends/platform/wince/CEScaler.cpp +++ b/backends/platform/wince/CEScaler.cpp @@ -25,10 +25,6 @@ #include "graphics/scaler/intern.h" #include "CEScaler.h" -/** - * 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 PocketPCPortraitTemplate(const uint8 *srcPtr, uint32 srcPitch, uint8 *dstPtr, uint32 dstPitch, int width, int height) { uint16 *work; @@ -57,14 +53,6 @@ void PocketPCPortraitTemplate(const uint8 *srcPtr, uint32 srcPitch, uint8 *dstPt } MAKE_WRAPPER(PocketPCPortrait) -/** - * 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. - */ void PocketPCLandscapeAspect(const uint8 *srcPtr, uint32 srcPitch, uint8 *dstPtr, uint32 dstPitch, int width, int height) { const int redblueMasks[] = { 0x7C1F, 0xF81F }; @@ -128,79 +116,17 @@ void PocketPCLandscapeAspect(const uint8 *srcPtr, uint32 srcPitch, uint8 *dstPtr #ifdef ARM extern "C" { - void PocketPCHalfARM(const uint8 *srcPtr, uint32 srcPitch, uint8 *dstPtr, uint32 dstPitch, int width, int height, int mask, int round); void SmartphoneLandscapeARM(const uint8 *srcPtr, uint32 srcPitch, uint8 *dstPtr, uint32 dstPitch, int width, int height, int mask); - // Rounding constants and masks used for different pixel formats - int roundingconstants[] = { 0x00200802, 0x00201002 }; - int redbluegreenMasks[] = { 0x03E07C1F, 0x07E0F81F }; } -#endif - -template -void PocketPCHalfTemplate(const uint8 *srcPtr, uint32 srcPitch, uint8 *dstPtr, uint32 dstPitch, int width, int height) { - uint8 *work; - uint16 srcPitch16 = (uint16)(srcPitch / sizeof(uint16)); - - while ((height -= 2) >= 0) { - work = dstPtr; - - for (int i=0; i(color1, color2, color3, color4); - work += sizeof(uint16); - } - srcPtr += 2 * srcPitch; - dstPtr += dstPitch; - } +void SmartphoneLandscape(const uint8 *srcPtr, uint32 srcPitch, uint8 *dstPtr, uint32 dstPitch, int width, int height) { + // Rounding constants and masks used for different pixel formats + static const int redbluegreenMasks[] = { 0x03E07C1F, 0x07E0F81F }; + const int maskUsed = (gBitFormat == 565); + SmartphoneLandscapeARM(srcPtr, srcPitch, dstPtr, dstPitch, width, height, redbluegreenMasks[maskUsed]); } -/** - * This filter (down)scales the source image by a factor of 1/2. - * For example, a 320x200 image is scaled to 160x100. - */ -void PocketPCHalf(const uint8 *srcPtr, uint32 srcPitch, uint8 *dstPtr, uint32 dstPitch, int width, int height) { -#ifdef ARM - int maskUsed = (gBitFormat == 565); - PocketPCHalfARM(srcPtr, srcPitch, dstPtr, dstPitch, width, height, redbluegreenMasks[maskUsed], roundingconstants[maskUsed]); #else - if (gBitFormat == 565) - PocketPCHalfTemplate<565>(srcPtr, srcPitch, dstPtr, dstPitch, width, height); - else - PocketPCHalfTemplate<555>(srcPtr, srcPitch, dstPtr, dstPitch, width, height); -#endif -} - -/** - * This filter (down)scales the source image horizontally by a factor of 1/2. - * For example, a 320x200 image is scaled to 160x200. - */ -template -void PocketPCHalfZoomTemplate(const uint8 *srcPtr, uint32 srcPitch, uint8 *dstPtr, uint32 dstPitch, int width, int height) { - uint16 *work; - - if (!height) - return; - - // 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 += 2) { - uint16 color1 = *(((const uint16 *)(const void *)srcPtr) + i); - uint16 color2 = *(((const uint16 *)(const void *)srcPtr) + (i + 1)); - *work++ = interpolate32_1_1(color1, color2); - } - srcPtr += srcPitch; - dstPtr += dstPitch; - } -} -MAKE_WRAPPER(PocketPCHalfZoom) template void SmartphoneLandscapeTemplate(const uint8 *srcPtr, uint32 srcPitch, uint8 *dstPtr, uint32 dstPitch, int width, int height) { @@ -231,22 +157,7 @@ void SmartphoneLandscapeTemplate(const uint8 *srcPtr, uint32 srcPitch, uint8 *ds } } } +MAKE_WRAPPER(SmartphoneLandscape) -/** - * 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. - * - * @note The ARM asm version seems to work differently ?!? It apparently scales - * horizontally by 11/16. Thus a 320x200 image is scaled to 220x175. - */ -void SmartphoneLandscape(const uint8 *srcPtr, uint32 srcPitch, uint8 *dstPtr, uint32 dstPitch, int width, int height) { -#ifdef ARM - int maskUsed = (gBitFormat == 565); - SmartphoneLandscapeARM(srcPtr, srcPitch, dstPtr, dstPitch, width, height, redbluegreenMasks[maskUsed]); -#else - if (gBitFormat == 565) - SmartphoneLandscapeTemplate<565>(srcPtr, srcPitch, dstPtr, dstPitch, width, height); - else - SmartphoneLandscapeTemplate<555>(srcPtr, srcPitch, dstPtr, dstPitch, width, height); #endif -} + diff --git a/backends/platform/wince/CEScaler.h b/backends/platform/wince/CEScaler.h index 157ec98c63..548c0c99c1 100644 --- a/backends/platform/wince/CEScaler.h +++ b/backends/platform/wince/CEScaler.h @@ -31,12 +31,29 @@ #include "graphics/scaler.h" #include "graphics/scaler/intern.h" +/** + * 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(PocketPCPortrait); + +/** + * 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); -DECLARE_SCALER(PocketPCHalf); -DECLARE_SCALER(PocketPCHalfZoom); -//#ifdef WIN32_PLATFORM_WFSP + +/** + * 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. + * + * @note The ARM asm version seems to work differently ?!? It apparently scales + * horizontally by 11/16. Thus a 320x200 image is scaled to 220x175. + */ DECLARE_SCALER(SmartphoneLandscape); -//#endif #endif diff --git a/backends/platform/wince/Makefile b/backends/platform/wince/Makefile index 8c70879482..f81d97f075 100644 --- a/backends/platform/wince/Makefile +++ b/backends/platform/wince/Makefile @@ -189,7 +189,6 @@ OBJS += CEkeys/EventsBuffer.o OBJS += $(srcdir)/gui/Actions.o $(srcdir)/gui/Key.o $(srcdir)/gui/KeysDialog.o OBJS += ../sdl/sdl.o ../sdl/graphics.o ../sdl/events.o ../sdl/hardwarekeys.o OBJS += missing/missing.o -OBJS += ARMscaler.o OBJS += smartLandScale.o ifndef DYNAMIC_MODULES OBJS += PocketSCUMM.o @@ -225,7 +224,7 @@ deploy: deploy-exe endif -dist: ARMscaler.o PocketSCUMM.o $(EXECUTABLE) +dist: PocketSCUMM.o $(EXECUTABLE) dist-plugins: $(EXECUTABLE) plugins PocketSCUMM.o plugins-stub @@ -235,11 +234,8 @@ plugins-stub: stub.o PocketSCUMM.o: PocketSCUMM.rc $(WINDRES) $*.rc $@ -ARMscaler.o: ARMscaler.s - $(AS) $*.s -o $@ - all-clean: clean - $(RM) ARMscaler.o PocketSCUMM.o stub.o + $(RM) PocketSCUMM.o stub.o deploy-plugins: dist-plugins @echo Deploying DLLs diff --git a/backends/platform/wince/module.mk b/backends/platform/wince/module.mk index fd0c20bcb4..6e328b0af4 100644 --- a/backends/platform/wince/module.mk +++ b/backends/platform/wince/module.mk @@ -26,7 +26,6 @@ MODULE_OBJS := \ ../sdl/hardwarekeys.o \ missing/missing.o \ PocketSCUMM.o \ - ARMscaler.o \ smartLandScale.o MODULE_DIRS += \ diff --git a/backends/platform/wince/wince-sdl.cpp b/backends/platform/wince/wince-sdl.cpp index 42d0fadf6f..75e882f43e 100644 --- a/backends/platform/wince/wince-sdl.cpp +++ b/backends/platform/wince/wince-sdl.cpp @@ -50,8 +50,10 @@ #include "backends/platform/wince/CEActionsSmartphone.h" #include "backends/platform/wince/CEgui/ItemAction.h" +#include "graphics/scaler/downscaler.h" #include "backends/platform/wince/CEException.h" +#include "backends/platform/wince/CEScaler.h" #ifdef USE_VORBIS #ifndef USE_TREMOR @@ -590,19 +592,19 @@ void OSystem_WINCE3::swap_zoom_up() { _toolbarHandler.setVisible(_saveToolbarZoom); // restore scaler _scaleFactorYd = 2; - _scalerProc = PocketPCHalf; + _scalerProc = DownscaleAllByHalf; _zoomUp = false; _zoomDown = false; } else { // only active if running on a PocketPC - if (_scalerProc != PocketPCHalf && _scalerProc != PocketPCHalfZoom) + if (_scalerProc != DownscaleAllByHalf && _scalerProc != DownscaleHorizByHalf) return; - if (_scalerProc == PocketPCHalf) { + if (_scalerProc == DownscaleAllByHalf) { _saveToolbarZoom = _toolbarHandler.visible(); _toolbarHandler.setVisible(false); // set zoom scaler _scaleFactorYd = 1; - _scalerProc = PocketPCHalfZoom; + _scalerProc = DownscaleHorizByHalf; } _zoomDown = false; @@ -619,19 +621,19 @@ void OSystem_WINCE3::swap_zoom_down() { _toolbarHandler.setVisible(_saveToolbarZoom); // restore scaler _scaleFactorYd = 2; - _scalerProc = PocketPCHalf; + _scalerProc = DownscaleAllByHalf; _zoomDown = false; _zoomUp = false; } else { // only active if running on a PocketPC - if (_scalerProc != PocketPCHalf && _scalerProc != PocketPCHalfZoom) + if (_scalerProc != DownscaleAllByHalf && _scalerProc != DownscaleHorizByHalf) return; - if (_scalerProc == PocketPCHalf) { + if (_scalerProc == DownscaleAllByHalf) { _saveToolbarZoom = _toolbarHandler.visible(); _toolbarHandler.setVisible(false); // set zoom scaler _scaleFactorYd = 1; - _scalerProc = PocketPCHalfZoom; + _scalerProc = DownscaleHorizByHalf; } _zoomUp = false; @@ -1180,7 +1182,7 @@ bool OSystem_WINCE3::update_scalers() { _scaleFactorXd = 2; _scaleFactorYm = 1; _scaleFactorYd = 2; - _scalerProc = PocketPCHalf; + _scalerProc = DownscaleAllByHalf; _modeFlags = 0; } else if (_videoMode.screenWidth == 640 && (isOzone() && (getScreenWidth() >= 640 || getScreenHeight() >= 640))) { _scaleFactorXm = 1; diff --git a/backends/platform/wince/wince-sdl.h b/backends/platform/wince/wince-sdl.h index a47df42476..bbcfcc2f72 100644 --- a/backends/platform/wince/wince-sdl.h +++ b/backends/platform/wince/wince-sdl.h @@ -31,12 +31,9 @@ #include "graphics/scaler.h" #include "backends/platform/sdl/sdl.h" -#include "CEGUI.h" -#include "CEKeys.h" -#include "CEDevice.h" -#include "CEScaler.h" - -#include +#include "backends/platform/wince/CEGUI.h" +#include "backends/platform/wince/CEKeys.h" +#include "backends/platform/wince/CEDevice.h" #define TOTAL_ZONES 3 -- cgit v1.2.3