[Scummvm-cvs-logs] SF.net SVN: scummvm: [25131] scummvm/trunk/backends/platform/PalmOS/Src

chrilith at users.sourceforge.net chrilith at users.sourceforge.net
Sat Jan 20 19:20:37 CET 2007


Revision: 25131
          http://scummvm.svn.sourceforge.net/scummvm/?rev=25131&view=rev
Author:   chrilith
Date:     2007-01-20 10:20:36 -0800 (Sat, 20 Jan 2007)

Log Message:
-----------
Added support fir hi-res games to standard PalmOS 5 devices (BS, TOuche, ...)
Added aspect ratio selection too

Modified Paths:
--------------
    scummvm/trunk/backends/platform/PalmOS/Src/be_os5.cpp
    scummvm/trunk/backends/platform/PalmOS/Src/be_os5.h
    scummvm/trunk/backends/platform/PalmOS/Src/be_zodiac.h
    scummvm/trunk/backends/platform/PalmOS/Src/os5_event.cpp
    scummvm/trunk/backends/platform/PalmOS/Src/os5_gfx.cpp
    scummvm/trunk/backends/platform/PalmOS/Src/os5_renderer.cpp

Modified: scummvm/trunk/backends/platform/PalmOS/Src/be_os5.cpp
===================================================================
--- scummvm/trunk/backends/platform/PalmOS/Src/be_os5.cpp	2007-01-20 18:11:27 UTC (rev 25130)
+++ scummvm/trunk/backends/platform/PalmOS/Src/be_os5.cpp	2007-01-20 18:20:36 UTC (rev 25131)
@@ -43,6 +43,40 @@
 	_soundEx.sound = &_sound;
 }
 
+void OSystem_PalmOS5::calc_scale() {
+	for (int y = 0; y < _screenDest.h; y++) {
+		int ys = y * _screenHeight / _screenDest.h;
+		_scaleTableY[y] = ys * _screenWidth;
+	}
+
+	for (int x = 0; x < _screenDest.w; x++) {
+		int xs = x * _screenWidth / _screenDest.w;
+		_scaleTableX[x] = xs;
+	}
+}
+
+void OSystem_PalmOS5::calc_rect(Boolean fullscreen) {
+	Int32 w, h;
+
+	if (fullscreen) {
+		w = (_ratio.adjustAspect == kRatioWidth) ? _ratio.width : gVars->screenFullWidth;
+		h = (_ratio.adjustAspect == kRatioHeight) ? _ratio.height : gVars->screenFullHeight;
+
+		_screenOffset.x = (_ratio.adjustAspect == kRatioWidth) ? (gVars->screenFullWidth - _ratio.width) / 2 : 0;
+		_screenOffset.y = (_ratio.adjustAspect == kRatioHeight) ? (gVars->screenFullHeight - _ratio.height) / 2 : 0;
+
+	} else {
+		w = gVars->screenWidth;
+		h = gVars->screenHeight - MIN_OFFSET * 2;
+
+		_screenOffset.x = 0;
+		_screenOffset.y = MIN_OFFSET;		
+	}
+	
+	_screenDest.w = w;
+	_screenDest.h = h;
+}
+
 void OSystem_PalmOS5::int_initBackend() {
 	if (OPTIONS_TST(kOpt5WayNavigatorV1)) {
 		_keyMouse.bitUp		= keyBitPageUp;
@@ -71,6 +105,28 @@
 	return false;
 }
 
+void OSystem_PalmOS5::setFeatureState(Feature f, bool enable) {
+	switch (f) {
+/*		case kFeatureFullscreenMode:
+			if (_gfxLoaded)
+				if (OPTIONS_TST(kOptModeWide) && _initMode != GFX_WIDE) {
+					_fullscreen = enable;
+					hotswap_gfx_mode(_mode);
+				}
+			break;
+*/
+		case kFeatureAspectRatioCorrection:
+			if (_mode == GFX_WIDE) {
+				_ratio.adjustAspect = (_ratio.adjustAspect + 1) % 3;
+				//calc_rect(true);
+				hotswap_gfx_mode(_mode);
+//				TwGfxSetClip(_palmScreenP, &_dstRect);
+				clearScreen();
+			}
+			break;
+	}
+}
+
 void OSystem_PalmOS5::setWindowCaption(const char *caption) {
 	Err e;
 	Char buf[64];

Modified: scummvm/trunk/backends/platform/PalmOS/Src/be_os5.h
===================================================================
--- scummvm/trunk/backends/platform/PalmOS/Src/be_os5.h	2007-01-20 18:11:27 UTC (rev 25130)
+++ scummvm/trunk/backends/platform/PalmOS/Src/be_os5.h	2007-01-20 18:20:36 UTC (rev 25131)
@@ -27,6 +27,8 @@
 
 #include "be_base.h"
 
+#define MIN_OFFSET	20
+
 #if !defined(SYSTEM_CALLBACK) || defined(PALMOS_68K)
 #	define SYSTEM_CALLBACK
 #	ifdef PALMOS_ARM
@@ -100,6 +102,9 @@
 
 class OSystem_PalmOS5 : public OSystem_PalmBase {
 private:
+	uint16 _scaleTableX[512];
+	uint32 _scaleTableY[512];
+
 	typedef void (OSystem_PalmOS5::*RendererProc)(RectangleType &r, PointType &p);
 	RendererProc _render;
 
@@ -123,7 +128,10 @@
 	virtual void get_coordinates(EventPtr ev, Coord &x, Coord &y);
 	virtual bool check_event(Event &event, EventPtr ev);
 	virtual void extras_palette(uint8 index, uint8 r, uint8 g, uint8 b);
+	void calc_rect(Boolean fullscreen);
+	void calc_scale();
 
+	void render_landscapeAny(RectangleType &r, PointType &p);
 	void render_landscape(RectangleType &r, PointType &p);
 	void render_portrait(RectangleType &r, PointType &p);
 	void render_1x(RectangleType &r, PointType &p);
@@ -139,11 +147,23 @@
 	UInt16 _sysOldCoord, _sysOldOrientation;
 	Boolean _stretched, _cursorPaletteDisabled;
 
+	enum {
+		kRatioNone = 0,
+		kRatioHeight,
+		kRatioWidth
+	};
+	struct {
+		UInt8 adjustAspect;
+		Coord width;	// (width x 320)
+		Coord height;	// (480 x height)
+	} _ratio;
+
 public:
 	OSystem_PalmOS5();
 	static OSystem *create();
 
 	bool hasFeature(Feature f);
+	void setFeatureState(Feature f, bool enable);
 
 	void copyRectToScreen(const byte *buf, int pitch, int x, int y, int w, int h);
 	void clearScreen();

Modified: scummvm/trunk/backends/platform/PalmOS/Src/be_zodiac.h
===================================================================
--- scummvm/trunk/backends/platform/PalmOS/Src/be_zodiac.h	2007-01-20 18:11:27 UTC (rev 25130)
+++ scummvm/trunk/backends/platform/PalmOS/Src/be_zodiac.h	2007-01-20 18:20:36 UTC (rev 25131)
@@ -32,16 +32,6 @@
 
 class OSystem_PalmZodiac : public OSystem_PalmOS5Ex {
 private:
-	enum {
-		kRatioNone = 0,
-		kRatioHeight,
-		kRatioWidth
-	};
-	struct {
-		UInt8 adjustAspect;
-		Coord width;	// (width x 320)
-		Coord height;	// (480 x height)
-	} _ratio;
 
 	TwGfxType *_gfxH;
 	TwGfxSurfaceType *_palmScreenP, *_tmpScreenP;

Modified: scummvm/trunk/backends/platform/PalmOS/Src/os5_event.cpp
===================================================================
--- scummvm/trunk/backends/platform/PalmOS/Src/os5_event.cpp	2007-01-20 18:11:27 UTC (rev 25130)
+++ scummvm/trunk/backends/platform/PalmOS/Src/os5_event.cpp	2007-01-20 18:20:36 UTC (rev 25131)
@@ -30,14 +30,23 @@
 	
 	x = (ev->screenX - _screenOffset.x);
 	y = (ev->screenY - _screenOffset.y);
-	
+
 	if (_stretched) {
-		if (OPTIONS_TST(kOptModeLandscape)) {
-			x = (x * 2 / 3);
-			y = (y * 2 / 3);
+		Int32 w, h;
+
+		if (_mode == GFX_NORMAL) {
+
+			h = gVars->screenHeight - MIN_OFFSET * 2;
+			w = gVars->screenWidth;
+			x = (_screenWidth * x) / w;
+			y = (_screenHeight * y) / h;
+
 		} else {
-			y =       ((ev->screenX - _screenOffset.y) * 2) / 3;
-			x = 320 - ((ev->screenY - _screenOffset.x) * 2) / 3 - 1;	
+
+			h = (_ratio.adjustAspect == kRatioHeight ? _ratio.height : gVars->screenFullHeight);
+			w = (_ratio.adjustAspect == kRatioWidth ? _ratio.width : gVars->screenFullWidth);
+			x = (_screenWidth * x) / w;
+			y = (_screenHeight * y) / h;
 		}
 	}
 }
@@ -56,21 +65,17 @@
 		if (_keyMouse.hasMore) {
 			switch (ev->data.keyDown.chr) {
 			// hot swap gfx
-			case 0x1B04:
+//			case 0x1B04:
 			case vchrHard1:
 				printf("swap\n");
 				if (OPTIONS_TST(kOptCollapsible))
 					hotswap_gfx_mode(_mode == GFX_WIDE ? GFX_NORMAL: GFX_WIDE);
 				return false; // not a key
 
-			// ESC key
+//			case 0x1B05:
 			case vchrHard2:
-				_lastKey = kKeyNone;
-				event.type = EVENT_KEYDOWN;
-				event.kbd.keycode = 27;
-				event.kbd.ascii = 27;
-				event.kbd.flags = 0;
-				return true;
+			setFeatureState(kFeatureAspectRatioCorrection, 0);
+			return false; // not a key
 			
 			// F5 = menu
 			case vchrHard3:

Modified: scummvm/trunk/backends/platform/PalmOS/Src/os5_gfx.cpp
===================================================================
--- scummvm/trunk/backends/platform/PalmOS/Src/os5_gfx.cpp	2007-01-20 18:11:27 UTC (rev 25130)
+++ scummvm/trunk/backends/platform/PalmOS/Src/os5_gfx.cpp	2007-01-20 18:20:36 UTC (rev 25131)
@@ -24,6 +24,7 @@
 
 #include "be_os5.h"
 #include "graphics/surface.h"
+#include "common/config-manager.h"
 #include <PenInputMgr.h>
 #include <palmOneResources.h>
 
@@ -54,11 +55,22 @@
 		return;
 	_gfxLoaded = true;
 
+	// get command line config
+//	_fullscreen = ConfMan.getBool("fullscreen");	// TODO : (NORMAL mode)
+	_ratio.adjustAspect = ConfMan.getBool("aspect_ratio") ? kRatioHeight : kRatioNone;
 
+	// precalc ratio (WIDE mode)
+	_ratio.width = (gVars->screenFullHeight * _screenWidth / _screenHeight);
+	_ratio.height = (gVars->screenFullWidth * _screenHeight / _screenWidth);
+
 	_mouseBackupP = (byte *)MemPtrNew(MAX_MOUSE_W * MAX_MOUSE_H * 2); // *2 if 16bit
 	_mouseDataP = (byte *)MemPtrNew(MAX_MOUSE_W * MAX_MOUSE_H);
 	_offScreenP	= (byte *)malloc(_screenWidth * _screenHeight);
 
+	MemSet(_offScreenP, _screenWidth * _screenHeight, 0);
+	MemSet(_nativePal, sizeof(_nativePal), 0);
+	MemSet(_currentPalette, sizeof(_currentPalette), 0);
+
 	UInt32 depth = 16;
 	WinScreenMode(winScreenModeSet, NULL, NULL, &depth, NULL);
 	clearScreen();
@@ -67,17 +79,13 @@
 	gVars->indicator.off = RGBToColor(0,0,0);
 
 	_overlayH =  alloc_screen(_screenWidth, _screenHeight);
-	_screenH = WinGetDisplayWindow();
-
 	_overlayP = (OverlayColor *)(BmpGetBits(WinGetBitmap(_overlayH)));
+
+	_screenH = WinGetDisplayWindow();
 	_screenP = (byte *)(BmpGetBits(WinGetBitmap(_screenH)));
 
-	MemSet(_offScreenP, _screenWidth * _screenHeight, 0);
-	MemSet(_nativePal, sizeof(_nativePal), 0);
-	MemSet(_currentPalette, sizeof(_currentPalette), 0);
-
-	_isSwitchable = (_screenWidth == 320 && _screenHeight == 200 && OPTIONS_TST(kOptCollapsible));
-	if (_screenWidth > 320 || _screenHeight > 200 || !_isSwitchable)
+	_isSwitchable = OPTIONS_TST(kOptModeLandscape) && OPTIONS_TST(kOptCollapsible);
+	if (!_isSwitchable)
 		_mode = GFX_NORMAL;
 
 	hotswap_gfx_mode(_mode);
@@ -85,62 +93,53 @@
 
 void OSystem_PalmOS5::hotswap_gfx_mode(int mode) {
 	Err e;
-	UInt32 device;
 
 	if (_mode != GFX_NORMAL && !_isSwitchable)
 		return;
 
-	if (_workScreenH)
-		WinDeleteWindow(_workScreenH, false);
-	_workScreenH = NULL;
-
 #ifdef PALMOS_ARM
+	UInt32 device;
 	Boolean isT3 = false;
 	if (!FtrGet(sysFileCSystem, sysFtrNumOEMDeviceID, &device))
 		isT3 = (device == kPalmOneDeviceIDTungstenT3);
 #endif
 
+	if (_workScreenH)
+		WinDeleteWindow(_workScreenH, false);
+	_workScreenH = NULL;
+
+	_screenDest.w = _screenWidth;
+	_screenDest.h = _screenHeight;
+
 	// prevent bad DIA redraw (Stat part)
-	if (mode  == GFX_NORMAL) {		
-		// only if this API is available
-		if (_stretched && OPTIONS_TST(kOptCollapsible)) {
+	if (mode == GFX_NORMAL) {
+		_redawOSD = true;
+		_stretched = (_screenWidth > gVars->screenWidth);
+
 #ifdef PALMOS_ARM
-			if (isT3) {
-				//AiaSetInputAreaState(aiaInputAreaShow);
-				StatShow_68k();
-				PINSetInputAreaState_68k(pinInputAreaOpen);
-			} else
+		if (isT3) {
+			//AiaSetInputAreaState(aiaInputAreaShow);
+			StatShow_68k();
+			PINSetInputAreaState_68k(pinInputAreaOpen);
+		} else
 #endif
-			{
-				StatShow();
-				PINSetInputAreaState(pinInputAreaOpen);
-			}
+		{
+			StatShow();
+			PINSetInputAreaState(pinInputAreaOpen);
 		}
 
-		_redawOSD = true;
-		_stretched = false;
-		OPTIONS_RST(kOptDisableOnScrDisp);
-		_screenDest.w = _screenWidth;
-		_screenDest.h = _screenHeight;
-
-		if (_wasRotated) {
-			// restore controls rotation
-			SWAP(_keyMouse.bitLeft, _keyMouse.bitRight);
-			SWAP(_keyMouse.bitRight, _keyMouse.bitDown);
-			SWAP(_keyMouse.bitLeft, _keyMouse.bitUp);
-			_wasRotated = false;
+		if (_stretched) {
+			calc_rect(false);
+		} else {
+			// offsets
+			_screenOffset.x = (gVars->screenWidth - _screenWidth) / 2;
+			_screenOffset.y = (gVars->screenHeight - _screenHeight) / 2;
 		}
 
-		_workScreenH = alloc_screen(_screenWidth, _screenHeight);
-		_workScreenP = (int16 *)(BmpGetBits(WinGetBitmap(_workScreenH)));
-		MemSet(_workScreenP, _screenWidth * _screenHeight * 2, 0);
-
-		_screenOffset.x = (gVars->screenWidth - _screenWidth) / 2;
-		_screenOffset.y = (gVars->screenHeight - _screenHeight)  / 2;
-		
-		_render = &OSystem_PalmOS5::render_1x;
-
 	} else {
+		_redawOSD = false;
+		_stretched = true;
+
 #ifdef PALMOS_ARM
 		// T3 DIA library is 68k base, there is no possible native call
 		if (isT3) {
@@ -154,35 +153,22 @@
 			StatHide();
 		}
 
-		_redawOSD = false;
-		_stretched = true;
-		OPTIONS_SET(kOptDisableOnScrDisp);
+		calc_rect(true);
+	}
 
-		if (OPTIONS_TST(kOptModeLandscape)) {
-			_screenDest.w = 480;
-			_screenDest.h = 300;
-			_workScreenH = alloc_screen(480, 300);
-			_render = &OSystem_PalmOS5::render_landscape;
-
-		} else {
-			_screenDest.w = 300;
-			_screenDest.h = 480;
-			_workScreenH = alloc_screen(300, 480);
-			_render = &OSystem_PalmOS5::render_portrait;
-			// This mode need a controls rotation
-			SWAP(_keyMouse.bitLeft, _keyMouse.bitUp);
-			SWAP(_keyMouse.bitRight, _keyMouse.bitDown);
-			SWAP(_keyMouse.bitLeft, _keyMouse.bitRight);
-			_wasRotated = true;
-		}
-
-		_workScreenP = (int16 *)(BmpGetBits(WinGetBitmap(_workScreenH)));
-		MemSet(_workScreenP, 480 * 300 * 2, 0);
-
-		_screenOffset.x = 0;
-		_screenOffset.y = 10;
+	if (_stretched) {
+		calc_scale();
+		OPTIONS_SET(kOptDisableOnScrDisp);
+		_render = &OSystem_PalmOS5::render_landscapeAny;
+	} else {
+		OPTIONS_RST(kOptDisableOnScrDisp);
+		_render = &OSystem_PalmOS5::render_1x;
 	}
 
+	_workScreenH = alloc_screen(_screenDest.w, _screenDest.h);
+	_workScreenP = (int16 *)(BmpGetBits(WinGetBitmap(_workScreenH)));
+	MemSet(_workScreenP, _screenDest.w * _screenDest.h * 2, 0);
+
 	_mode = mode;
 	clearScreen();
 }

Modified: scummvm/trunk/backends/platform/PalmOS/Src/os5_renderer.cpp
===================================================================
--- scummvm/trunk/backends/platform/PalmOS/Src/os5_renderer.cpp	2007-01-20 18:11:27 UTC (rev 25130)
+++ scummvm/trunk/backends/platform/PalmOS/Src/os5_renderer.cpp	2007-01-20 18:20:36 UTC (rev 25131)
@@ -48,109 +48,30 @@
 	RctSetRectangle(&r, 0, 0, _screenWidth, _screenHeight - o);
 }
 
-void OSystem_PalmOS5::render_landscape(RectangleType &r, PointType &p) {
+void OSystem_PalmOS5::render_landscapeAny(RectangleType &r, PointType &p) {
 	Coord x, y, o = 0;
 	int16 *dst =  _workScreenP;
 
 	if (_overlayVisible) {
-		int16 *src = _overlayP;
-
-		for (y = 0; y < 100; y++) {
-			// draw 2 lines
-			for (x = 0; x < 320; x++) {
-				*dst++ = *src++;
-				*dst++ = *src;
-				*dst++ = *src++;
+		for (y = 0; y < _screenDest.h; y++) {
+			int16 *src = _overlayP + *(_scaleTableY + y);
+			for (x = 0; x < _screenDest.w; x++) {
+				*dst++ = *(src + *(_scaleTableX + x));
 			}
-			// copy the second to the next line
-			MemMove(dst, dst - 480, 480 * 2);
-			dst += 480;
 		}
 
 	} else {
-		byte *src = _offScreenP;
 		o = _current_shake_pos;
 
-		for (y = 0; y < 100; y++) {
-			// draw 2 lines
-			for (x = 0; x < 320; x++) {
-				*dst++ = _nativePal[*src++];
-				*dst++ = _nativePal[*src];
-				*dst++ = _nativePal[*src++];
+		for (y = 0; y < _screenDest.h; y++) {
+			byte *src = _offScreenP + *(_scaleTableY + y);
+			for (x = 0; x < _screenDest.w; x++) {
+				*dst++ = *(_nativePal + *(src + *(_scaleTableX + x)));
 			}
-			// copy the second to the next line
-			MemMove(dst, dst - 480, 480 * 2);
-			dst += 480;
 		}
 	}
 
 	p.x = _screenOffset.x;
 	p.y = _screenOffset.y + o;
-	RctSetRectangle(&r, 0, 0, 480, 300 - o);
+	RctSetRectangle(&r, 0, 0,  _screenDest.w,  _screenDest.h - o);
 }
-
-void OSystem_PalmOS5::render_portrait(RectangleType &r, PointType &p) {
-	Coord x, y, o = 0;
-	int16 *dst =  _workScreenP;
-
-	if (_overlayVisible) {
-		int16 *src = _overlayP + 320 - 1;
-		int16 *src2 = src;
-
-		for (x = 0; x < 160; x++) {
-			for (y = 0; y < 100; y++) {
-				*dst++ = *src;
-				src += 320;
-				*dst++ = *src;
-				*dst++ = *src;
-				src += 320;
-			}
-			src = --src2;
-
-			for (y = 0; y < 100; y++) {
-				*dst++ = *src;
-				src += 320;
-				*dst++ = *src;
-				*dst++ = *src;
-				src += 320;
-			}
-			src = --src2;
-
-			MemMove(dst, dst - 300, 300 * 2);	// 300 = 200 x 1.5
-			dst += 300;
-		}
-
-	} else {
-		byte *src = _offScreenP + 320 - 1;
-		byte *src2 = src;
-		o = _current_shake_pos;
-
-		for (x = 0; x < 160; x++) {
-			for (y = 0; y < 100; y++) {
-				*dst++ = _nativePal[*src];
-				src += 320;
-				*dst++ = _nativePal[*src];
-				*dst++ = _nativePal[*src];
-				src += 320;
-			}
-			src = --src2;
-
-			for (y = 0; y < 100; y++) {
-				*dst++ = _nativePal[*src];
-				src += 320;
-				*dst++ = _nativePal[*src];
-				*dst++ = _nativePal[*src];
-				src += 320;
-			}
-			src = --src2;
-
-			MemMove(dst, dst - 300, 300 * 2);	// 300 = 200 x 1.5
-			dst += 300;
-		}
-	}
-
-	p.y = _screenOffset.x;
-	p.x = _screenOffset.y + o;
-	RctSetRectangle(&r, 0, 0, 300 - o, 480);
-}
-


This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.




More information about the Scummvm-git-logs mailing list