diff options
Diffstat (limited to 'backends')
| -rw-r--r-- | backends/PalmOS/Src/palm.cpp | 1821 | 
1 files changed, 141 insertions, 1680 deletions
| diff --git a/backends/PalmOS/Src/palm.cpp b/backends/PalmOS/Src/palm.cpp index 7f2de9fd3e..edde43bb9f 100644 --- a/backends/PalmOS/Src/palm.cpp +++ b/backends/PalmOS/Src/palm.cpp @@ -20,719 +20,20 @@   *   */  #include "stdafx.h" +#include "palm.h" -#include "backends/intern.h"  #include "scumm.h"  #include "common/scaler.h" -#include "common/config-manager.h" - -#include "shared.h" -#include "ArmNative.h" - -#include <BmpGlue.h> -#include "start.h" -#include "palm.h" -#include "vibrate.h" -#include <PalmNavigator.h>  #include "cd_msa.h" +#include "cd_default.h" -#ifndef DISABLE_TAPWAVE -// Tapwave code will come here -#endif - -#define EXITDELAY			(500) // delay to exit : calc button : double tap 1/500 sec -#define ftrOverlayPtr		(1000) -#define ftrBackupPtr		(1001) -//#define	SND_BLOCK			(8192) -#define	SND_BLOCK			(3072) - -enum { -	GFX_FLIPPING = 100,	// Palmos -	GFX_BUFFERED = 101,	// Palmos -	GFX_WIDE = 102 // palmos -}; - - -OSystem *OSystem_PALMOS_create(int gfx_mode) { -	return OSystem_PALMOS::create(gfx_mode); -} - -OSystem *OSystem_PALMOS::create(UInt16 gfx_mode) { -	OSystem_PALMOS *syst = new OSystem_PALMOS(); -	syst->init_intern(gfx_mode); -	return syst; -} - -void OSystem_PALMOS::init_intern(UInt16 gfx_mode) { -	_mode = gfx_mode; -	_vibrate = gVars->vibrator; -	_fullscreen = (ConfMan.getBool("fullscreen") && OPTIONS_TST(kOptModeWide)); -	_adjustAspectRatio = ConfMan.getBool("aspect_ratio"); -	_mouseDataP = NULL; -} - -void OSystem_PALMOS::setPalette(const byte *colors, uint start, uint num) { -	if (_quitCount) -		return; - -	const byte *b = colors; -	uint i; -	RGBColorType *base = _currentPalette + start; -	for(i=0; i < num; i++) { -		base[i].r = b[0]; -		base[i].g = b[1]; -		base[i].b = b[2]; -		b += 4; -	} - -	if (start < _paletteDirtyStart) -		_paletteDirtyStart = start; - -	if (start + num > _paletteDirtyEnd) -		_paletteDirtyEnd = start + num; -} - -static void ClearScreen() { -	RGBColorType rgb	= {0, 0,0,0}; -	RectangleType r		= {0, 0, gVars->screenFullWidth, gVars->screenFullHeight}; -	WinSetForeColor(WinRGBToIndex(&rgb)); -	WinDrawRectangle(&r,0); -} - -static void SwitchTo16bit() { -	if (OPTIONS_TST(kOptMode16Bit)) { -		UInt32 width = hrWidth; -		UInt32 height= hrHeight; -		UInt32 depth = 16; -		Boolean color = true; -		 -		WinScreenMode(winScreenModeSet, &width, &height, &depth, &color); -		ClearScreen(); -		OPTIONS_SET(kOptDisableOnScrDisp); -	} +OSystem *OSystem_PALMOS_create() { +	return OSystem_PALMOS::create();  } -void OSystem_PALMOS::load_gfx_mode() { -	Err e; -	const byte startupPalette[] = { -		0	,0	,0	,0, -		0	,0	,171,0, -		0	,171, 0	,0, -		0	,171,171,0, -		171	,0	,0	,0,  -		171	,0	,171,0, -		171	,87	,0	,0, -		171	,171,171,0, -		87	,87	,87	,0, -		87	,87	,255,0, -		87	,255,87	,0, -		87	,255,255,0, -		255	,87	,87	,0, -		255	,87	,255,0, -		255	,255,87	,0, -		255	,255,255,0 -	}; - -	// init screens -	switch(_mode) { -		case GFX_FLIPPING: -			gVars->screenLocked = true; -			_offScreenP	= WinScreenLock(winLockErase) + _screenOffset.addr; -			_screenP	= _offScreenP; -			_offScreenH	= WinGetDisplayWindow(); -			_screenH	= _offScreenH;	 -			_renderer_proc = &OSystem_PALMOS::updateScreen__flipping; -			break; -		case GFX_WIDE: -		case GFX_BUFFERED: -			_screenH	= WinGetDisplayWindow(); -			_offScreenH	= WinCreateOffscreenWindow(_screenWidth, _screenHeight, screenFormat, &e); -			_offScreenP	= (byte *)(BmpGetBits(WinGetBitmap(_offScreenH))); - -			if (_mode == GFX_WIDE) { -#ifndef DISABLE_TAPWAVE -// Tapwave code will come here -#endif			 -				{ -					if (OPTIONS_TST(kOptDeviceARM)) -						_arm.pnoPtr = PceNativeCallInit(ARMCODE_1, &_arm.pnoDesc); - -					gVars->screenLocked = true; -					_screenP = WinScreenLock(winLockErase) + _screenOffset.addr; -					_renderer_proc = (OPTIONS_TST(kOptModeLandscape)) ? -						&OSystem_PALMOS::updateScreen__wide_landscape : -						&OSystem_PALMOS::updateScreen__wide_portrait; -				} - -			} else { -				_screenP = (byte *)(BmpGetBits(WinGetBitmap(_screenH))) + _screenOffset.addr; -				_renderer_proc =  &OSystem_PALMOS::updateScreen__buffered; -			} -			_offScreenPitch = _screenWidth; -			break; - -		case GFX_NORMAL: -		default: -			_offScreenH	= WinGetDisplayWindow(); -			_screenH = _offScreenH; -			_offScreenP	= (byte *)(BmpGetBits(WinGetBitmap(_offScreenH))) + _screenOffset.addr; -			_screenP	= _offScreenP; -			_renderer_proc =  &OSystem_PALMOS::updateScreen__direct; -			break; -	} - -	if (OPTIONS_TST(kOptModeHiDensity)) -		WinSetCoordinateSystem(kCoordinatesNative); - -	// palette for preload dialog -	setPalette(startupPalette,0,16); - -	// try to allocate on storage heap -	FtrPtrNew(appFileCreator, ftrOverlayPtr, _screenWidth * _screenHeight, (void **)&_tmpScreenP); -	FtrPtrNew(appFileCreator, ftrBackupPtr, _screenWidth * _screenHeight, (void **)&_tmpBackupP); -	// failed ? dynamic heap -	if (!_tmpScreenP) _tmpScreenP = (byte *)malloc(_screenWidth * _screenHeight); -	if (!_tmpBackupP) _tmpBackupP = (byte *)malloc(_screenWidth * _screenHeight); -} - -void OSystem_PALMOS::unload_gfx_mode() { - -	WinSetDrawWindow(WinGetDisplayWindow()); - -	if (OPTIONS_TST(kOptModeHiDensity)) -		WinSetCoordinateSystem(kCoordinatesStandard); - -	switch (_mode) { -		case GFX_FLIPPING: -			WinScreenUnlock(); -			break; - -		case GFX_WIDE: -#ifndef DISABLE_TAPWAVE -// Tapwave code will come here -#endif -			{ -				WinScreenUnlock(); -				if (OPTIONS_TST(kOptDeviceARM) && _arm.pnoPtr) -					PceNativeCallRelease(&_arm.pnoDesc, _arm.pnoPtr); -			} -				// continue to GFX_BUFFERED - -		case GFX_BUFFERED: -			WinDeleteWindow(_offScreenH,false); -			break; -	} - -	if (_tmpScreenP) -		if (MemPtrDataStorage(_tmpScreenP)) -			FtrPtrFree(appFileCreator, ftrOverlayPtr); -		else -			free(_tmpScreenP); - -	if (_tmpBackupP) -		if (MemPtrDataStorage(_tmpBackupP)) -			FtrPtrFree(appFileCreator, ftrBackupPtr); -		else -			free(_tmpBackupP); - -} - -void OSystem_PALMOS::initSize(uint w, uint h) { -	_screenWidth = w; -	_screenHeight = h; -	_offScreenPitch = gVars->screenPitch;	// direct screen / flipping use this, reset later if buffered -	_screenPitch = gVars->screenPitch; - -	_overlayVisible = false; -	_quitCount = 0; - -	// 640x480 only on Zodiac and in GFX_WIDE mode -	if (h == 480) -		if (!(_mode == GFX_WIDE && OPTIONS_TST(kOptDeviceZodiac))) -			error("640x480 game can only be run on Zodiac in wide mode."); - -	if (OPTIONS_TST(kOptCollapsible)) -		SysSetOrientationTriggerState(sysOrientationTriggerDisabled); - -	// check HiRes+ -	if (_mode == GFX_WIDE) { -		if (OPTIONS_TST(kOptModeWide)) { -			Boolean std = true; - -#ifndef DISABLE_TAPWAVE -// Tapwave code will come here -#endif -			if (std) { -				// only for 320x200 games -				if (!(w == 320 && h == 200)) { -/*					if (OPTIONS_TST(kOptModeLandscape)) { -						// not for landscape display at this time, only for portrait -						warning("Wide display not avalaible on this mode, switching to GFX_NORMAL mode."); -						_mode = GFX_NORMAL; -					} -				} else {*/ -					warning("Wide display not avalaible for this game, switching to GFX_NORMAL mode."); -					_mode = GFX_NORMAL; -				} -			} - -		} else { -			warning("HiRes+ not avalaible on this device, switching to GFX_NORMAL mode."); -			_mode = GFX_NORMAL; -		} -	} - -	if (_fullscreen || _mode == GFX_WIDE) { -		// Sony wide -		if (gVars->slkRefNum != sysInvalidRefNum) { -			if (gVars->slkVersion == vskVersionNum1) { -				SilkLibEnableResize (gVars->slkRefNum); -				SilkLibResizeDispWin(gVars->slkRefNum, silkResizeMax); -				SilkLibDisableResize(gVars->slkRefNum); -			} else { -				VskSetState(gVars->slkRefNum, vskStateEnable, (gVars->slkVersion != vskVersionNum3 ? vskResizeVertically : vskResizeHorizontally)); -				VskSetState(gVars->slkRefNum, vskStateResize, vskResizeNone); -				VskSetState(gVars->slkRefNum, vskStateEnable, vskResizeDisable); -			} - -		// Tapwave Zodiac and other DIA compatible devices -		} else if (OPTIONS_TST(kOptModeWide)) { -			PINSetInputAreaState(pinInputAreaClosed); -			StatHide(); -		} -	} - -	if (_mode == GFX_WIDE) { -		OPTIONS_SET(kOptDisableOnScrDisp); - -		if (OPTIONS_TST(kOptDeviceZodiac)) { -			// landscape -			_screenOffset.x = 0; -			_screenOffset.y = (_adjustAspectRatio) ? 10 : 0; -			_screenOffset.addr = _screenOffset.y * _screenPitch; - -		// others only for 320x200 -		} else { -			_screenOffset.x = 0; -			_screenOffset.y = 10; -			_screenOffset.addr = (OPTIONS_TST(kOptModeLandscape) ? _screenOffset.y : _screenOffset.x) * _screenPitch; -		} -	} else { -		_screenOffset.x = ((_fullscreen ? gVars->screenFullWidth : gVars->screenWidth) - w) >> 1; -		_screenOffset.y = ((_fullscreen ? gVars->screenFullHeight : gVars->screenHeight) - h) >> 1; -		_screenOffset.addr = _screenOffset.x + _screenOffset.y * _screenPitch; -	} - -	set_mouse_pos(200,150); - -	_currentPalette = (RGBColorType*)calloc(sizeof(RGBColorType), 256); -	_mouseBackupP = (byte*)malloc(MAX_MOUSE_W * MAX_MOUSE_H); -	 -	load_gfx_mode(); -} - -void OSystem_PALMOS::copyRectToScreen(const byte *buf, int pitch, int x, int y, int w, int h) { -	/* Clip the coordinates */ -	if (x < 0) { -		w += x; -		buf -= x; -		x = 0; -	} - -	if (y < 0) { -		h += y; -		buf -= y * pitch; -		y = 0; -	} - -	if (w > _screenWidth - x) -		w = _screenWidth - x; - -	if (h > _screenHeight - y) -		h = _screenHeight - y; - -	if (w <= 0 || h <= 0) -		return; - -	/* FIXME: undraw mouse only if the draw rect intersects with the mouse rect */ -	if (_mouseDrawn) { -/*		RectangleType mouse = {_mouseCurState.x, _mouseCurState.y, _mouseCurState.w, _mouseCurState.h}; -		RectangleType copy	= {x, y, w, h}; -		RectangleType result; -		 -		RctGetIntersection(&mouse, ©, &result); -		 -		if (result.extent.x !=0 && result.extent.y !=0)*/ -			undraw_mouse(); -	} - -	byte *dst = _offScreenP + y * _offScreenPitch + x; -/* -	if (OPTIONS_TST(kOptDeviceARM)) { -		DataOSysCopyRectType userData = { kOSysCopyRect, dst, buf, pitch, _offScreenPitch, w, h }; -		PceNativeRsrcCall(ARMCODE_1, &userData); -		 -#ifdef DEBUG_ARM -	} else if (OPTIONS_TST(kOptDeviceProcX86)) { -		DataOSysCopyRectType userData = { kOSysCopyRect, dst, buf, pitch, _offScreenPitch, w, h }; -		UInt32 result = PceNativeCall((NativeFuncType*)"ARMlet.dll\0ARMlet_Main", &userData);		 -#endif - -	} else { -*/ -		if (_offScreenPitch == pitch && pitch == w) { -			MemMove (dst, buf, h * w); -		} else { -			do { -				MemMove(dst, buf, w); -				dst += _offScreenPitch; -				buf += pitch; -			} while (--h); -		} -//	} -} - -#ifndef DISABLE_TAPWAVE -// Tapwave code will come here -#endif - -void OSystem_PALMOS::updateScreen__wide_portrait() { -	UInt8 *dst = _screenP + _screenOffset.y; -	UInt8 *src1 = _offScreenP + WIDE_PITCH - 1; - -	if (OPTIONS_TST(kOptDeviceARM)) { -		DataOSysWideType userData = { kOSysWidePortrait, dst, src1 }; -		PceNativeRsrcCall(&_arm.pnoDesc, &userData); -		 -#ifdef DEBUG_ARM -	} else if (OPTIONS_TST(kOptDeviceProcX86)) { -		DataOSysWideType userData = { kOSysWidePortrait, dst, src1 }; -		UInt32 result = PceNativeCall((NativeFuncType*)"ARMlet.dll\0ARMlet_Main", &userData);		 -#endif - -	} else { -		Coord x, y; -		UInt8 *src2 = src1; - -		for (x = 0; x < WIDE_HALF_WIDTH; x++) { -			for (y = 0; y < WIDE_HALF_HEIGHT; y++) { -				*dst++ = *src1; -				src1 += WIDE_PITCH; -				*dst++ = *src1; -				*dst++ = *src1; -				src1 += WIDE_PITCH; -			} -			src1 = --src2; -			dst += 20; // we draw 200pix scaled to 1.5 = 300, screen width=320, so next is 20 - -			for (y = 0; y < WIDE_HALF_HEIGHT; y++) { -				*dst++ = *src1; -				src1 += WIDE_PITCH; -				*dst++ = *src1; -				*dst++ = *src1; -				src1 += WIDE_PITCH; -			} -			src1 = --src2; -			dst += 20; - -			MemMove(dst, dst - WIDE_PITCH, 300);	// 300 = 200 x 1.5 -			dst += WIDE_PITCH; -		} -	} - -	WinScreenUnlock(); -	_screenP = WinScreenLock(winLockCopy) + _screenOffset.addr; -} - -void OSystem_PALMOS::updateScreen__wide_landscape() { -	UInt8 *dst = _screenP; -	UInt8 *src = _offScreenP; - - -	if (OPTIONS_TST(kOptDeviceARM)) { -		DataOSysWideType userData = { kOSysWideLandscape, dst, src }; -		PceNativeRsrcCall(&_arm.pnoDesc, &userData); - -#ifdef DEBUG_ARM -	} else if (OPTIONS_TST(kOptDeviceProcX86)) { -		DataOSysWideType userData = { kOSysWideLandscape, dst, src }; -		UInt32 result = PceNativeCall((NativeFuncType*)"ARMlet.dll\0ARMlet_Main", &userData);		 -#endif -	} else { -		Coord x, y; - -		for (y = 0; y < WIDE_HALF_HEIGHT; y++) { -			for (x = 0; x < WIDE_HALF_WIDTH; x++) { -				*dst++ = *src++; -				*dst++ = *src; -				*dst++ = *src++; -			} -			for (x = 0; x < WIDE_HALF_WIDTH; x++) { -				*dst++ = *src++; -				*dst++ = *src; -				*dst++ = *src++; -			} - -			MemMove(dst, dst - 480, 480); -			dst += 480; -		} -	} - -	WinScreenUnlock(); -	_screenP = WinScreenLock(winLockCopy) + _screenOffset.addr; -} - -void OSystem_PALMOS::updateScreen__flipping() { -	RectangleType r, dummy; -	Boolean shaked = false; - -	// shake screen -	if (_current_shake_pos != _new_shake_pos) { -		RctSetRectangle(&r, _screenOffset.x, _screenOffset.y - _new_shake_pos, _screenWidth, _screenHeight + (_new_shake_pos << 2)); - -		if (_useHRmode) -			HRWinScrollRectangle(gVars->HRrefNum, &r, winDown, _new_shake_pos, &dummy); -		else -			WinScrollRectangle(&r, winDown, _new_shake_pos, &dummy); - -		if (_vibrate) { -			Boolean active = (_new_shake_pos >= 3); -			HwrVibrateAttributes(1, kHwrVibrateActive, &active); -		} - -		_current_shake_pos = _new_shake_pos; -		shaked = true; -	} - -	// update screen -	WinScreenUnlock(); -	_offScreenP = WinScreenLock(winLockCopy) + _screenOffset.addr; -	_screenP = _offScreenP; - -	if (shaked) { -		if (_useHRmode) -			HRWinScrollRectangle(gVars->HRrefNum, &r, winUp, _new_shake_pos, &dummy); -		else -			WinScrollRectangle(&r, winUp, _new_shake_pos, &dummy); -	} - -} - -void OSystem_PALMOS::updateScreen__buffered() { -	UInt32 move = 0; -	UInt32 size = _screenWidth * _screenHeight; - -	// shake screen -	if (_current_shake_pos != _new_shake_pos) { -		move = (_new_shake_pos * _screenPitch); -		// copy clear bottom of the screen to top to cover shaking image - -		if (_screenPitch == _screenWidth) { -			MemMove(_screenP, _screenP + size , move); -			MemMove(_screenP + move, _offScreenP, size - move); -		} else if (_new_shake_pos != 0) { -			UInt16 h = _new_shake_pos; -			byte *src = _screenP + _screenPitch * _screenHeight; -			byte *dst = _screenP; -			do { -				memcpy(dst, src, _screenWidth); -				dst += _screenPitch; -				src += _screenPitch; -			} while (--h); -		} - -		if (_vibrate) { -			Boolean active = (_new_shake_pos >= 3); -			HwrVibrateAttributes(1, kHwrVibrateActive, &active); -		} - -		_current_shake_pos = _new_shake_pos; -	} -	// update screen -	if (_screenPitch == _screenWidth) { -		MemMove(_screenP + move, _offScreenP, size - move); -	} else { -		byte *src = _offScreenP; -		byte *dst = _screenP + move; -		UInt16 h = _screenHeight - _new_shake_pos; -		do { -			memcpy(dst, src, _screenWidth); -			dst += _screenPitch; -			src += _offScreenPitch; -		} while (--h); -	} - -} - -void OSystem_PALMOS::updateScreen__direct() { -	if (_current_shake_pos != _new_shake_pos) { -		if (_vibrate) { -			Boolean active = (_new_shake_pos >= 3); -			HwrVibrateAttributes(1, kHwrVibrateActive, &active); -		}	 -		_current_shake_pos = _new_shake_pos; -	} -} - -enum { -	MD_NONE = 0, -	MD_CMD, -	MD_ALT, -	MD_CTRL -}; - -#define kDrawKeyState	3000 -#define kDrawNumPad		3010 - -void OSystem_PALMOS::draw1BitGfx(UInt16 id, UInt32 x, UInt32 y, Boolean show) { -	if (OPTIONS_TST(kOptDisableOnScrDisp)) -		return; - -	MemHandle hTemp = DmGetResource(bitmapRsc, id); -	 -	if (hTemp) { -		BitmapType *bmTemp; -		UInt32 *bmData; -		UInt8 ih, iw, ib; -		Coord w, h; -		Int16 blocks, next; - -		UInt8 *scr = _screenP + x + _screenPitch * y; - -		bmTemp	= (BitmapType *)MemHandleLock(hTemp); -		bmData	= (UInt32 *)BmpGetBits(bmTemp); -		BmpGlueGetDimensions(bmTemp, &w, &h, 0); - -		blocks = w >> 5; -		next = w - (blocks << 5); - -		if (next) -			blocks++; -		 -		for (ih = 0; ih < h; ih++) {			// line -			for (ib = 0; ib < blocks; ib++) {	// 32pix block -				next = w - (ib << 5); -				next = MIN(next, (Coord)32); -		 -				for (iw = 0; iw < next; iw++) {	// row - -					*scr++ = ((*bmData & (1 << (31 - iw))) && show) ? -						gVars->indicator.on : -						gVars->indicator.off; -				} - -				bmData++; -			} -			scr += _screenPitch - w; -		} - -		MemPtrUnlock(bmTemp); -		DmReleaseResource(hTemp); -	} -} - -void OSystem_PALMOS::updateScreen() { -	if(_quitCount) -		return; - -	// Make sure the mouse is drawn, if it should be drawn. -	draw_mouse(); - -	// Check whether the palette was changed in the meantime and update the -	// screen surface accordingly.  -	if (_paletteDirtyEnd != 0) { -		UInt8 oldCol; - -		if (gVars->stdPalette) { -			WinSetDrawWindow(WinGetDisplayWindow());	// hack by Doug -			WinPalette(winPaletteSet, _paletteDirtyStart, _paletteDirtyEnd - _paletteDirtyStart,_currentPalette + _paletteDirtyStart); -		} else { -			HwrDisplayPalette(winPaletteSet, _paletteDirtyStart, _paletteDirtyEnd - _paletteDirtyStart,_currentPalette + _paletteDirtyStart); -		} -		_paletteDirtyEnd = 0; -		oldCol = gVars->indicator.on; -		gVars->indicator.on = RGBToColor(0,255,0); - -		if (oldCol != gVars->indicator.on) {	 -			// redraw if needed -			if (_lastKeyModifier) -				draw1BitGfx((kDrawKeyState + _lastKeyModifier - 1), 2, getHeight() + 2, true); -			 -			if(_useNumPad) -				draw1BitGfx(kDrawNumPad, (getWidth() >> 1) - 32, getHeight() + 2, true); -		} -	} - -	if (_overlayVisible) { -		byte *src = _tmpScreenP; -		byte *dst = _offScreenP; -		UInt16 h = _screenHeight; -		 -		do { -			memcpy(dst, src, _screenWidth); -			dst += _offScreenPitch; -			src += _screenWidth; -		} while (--h); -	} - -	// redraw the screen -	((this)->*(_renderer_proc))(); - - -} - -bool OSystem_PALMOS::showMouse(bool visible) { -	if (_mouseVisible == visible) -		return visible; -	 -	bool last = _mouseVisible; -	_mouseVisible = visible; - -	if (visible) -		draw_mouse(); -	else -		undraw_mouse(); - -	return last; -} - -void OSystem_PALMOS::warpMouse(int x, int y) { -	set_mouse_pos(x, y); -} - -void OSystem_PALMOS::set_mouse_pos(int x, int y) { -	if (x != _mouseCurState.x || y != _mouseCurState.y) { -		_mouseCurState.x = x; -		_mouseCurState.y = y; -		undraw_mouse(); -	} -} - -void OSystem_PALMOS::setMouseCursor(const byte *buf, uint w, uint h, int hotspot_x, int hotspot_y, byte keycolor) { -	_mouseCurState.w = w; -	_mouseCurState.h = h; - -	_mouseHotspotX = hotspot_x; -	_mouseHotspotY = hotspot_y; - -	_mouseKeycolor = keycolor; - -	if (_mouseDataP) -		free(_mouseDataP); -	_mouseDataP = malloc(w * h); -	memcpy(_mouseDataP, buf, w * h); - -	undraw_mouse(); -} - -void OSystem_PALMOS::set_shake_pos(int shake_pos) { -	_new_shake_pos = shake_pos; -	 -	if (shake_pos == 0 && _vibrate) { -		Boolean active = false; -		HwrVibrateAttributes(1, kHwrVibrateActive, &active); -	} +OSystem *OSystem_PALMOS::create() { +	return new OSystem_PALMOS();  }  uint32 OSystem_PALMOS::get_msecs() { @@ -752,503 +53,137 @@ void OSystem_PALMOS::delay_msecs(uint msecs) {  	} while (current < last);  } -void OSystem_PALMOS::setTimerCallback(TimerProc callback, int timer) { -	if (callback != NULL) { -		_timer.duration = timer; -		_timer.nextExpiry = get_msecs() + timer; -		_timer.callback = callback; -		_timer.active = true; -	} else { -		_timer.active = false; -	} -} - -/* Mutex handling */  OSystem::MutexRef OSystem_PALMOS::createMutex() {return NULL;}  void OSystem_PALMOS::lockMutex(MutexRef mutex) {}  void OSystem_PALMOS::unlockMutex(MutexRef mutex) {}  void OSystem_PALMOS::deleteMutex(MutexRef mutex) {} -void OSystem_PALMOS::SimulateArrowKeys(Event *event, Int8 iHoriz, Int8 iVert, Boolean repeat) { -	Int16 x = _mouseCurState.x; -	Int16 y = _mouseCurState.y; +void OSystem_PALMOS::battery_handler() { +	UInt16 voltage, warnThreshold, criticalThreshold; +	voltage = SysBatteryInfo(false, &warnThreshold, &criticalThreshold, NULL, NULL, NULL, NULL); -	if (_lastKeyPressed != kLastKeyNone || repeat) { -		_lastKeyRepeat += 2; - -		if (_lastKeyRepeat > 32) -			_lastKeyRepeat = 32; +	if (voltage <= warnThreshold) { +		if (!_showBatLow) { +			_showBatLow = true; +			draw1BitGfx(kDrawBatLow, (getWidth() >> 1), -16, true); +		} +	} else { +		if (_showBatLow) { +			_showBatLow = false; +			draw1BitGfx(kDrawBatLow, (getWidth() >> 1), -16, false); +		}  	} -	else -		_lastKeyRepeat = 0; - -	x = x + iHoriz * (_lastKeyRepeat >> 1); -	y = y + iVert * (_lastKeyRepeat >> 1); - -	x = (x < 0				) ? 0					: x; -	x = (x >= _screenWidth	) ? _screenWidth - 1	: x; -	y = (y < 0				) ? 0					: y; -	y = (y >= _screenHeight	) ? _screenHeight - 1	: y; -	event->event_code = EVENT_MOUSEMOVE; -	event->mouse.x = x; -	event->mouse.y = y; -	set_mouse_pos(x, y); +	if (voltage <= criticalThreshold) { +		EventType event; +		event.eType = keyDownEvent; +		event.data.keyDown.chr = vchrAutoOff; +		event.data.keyDown.modifiers = commandKeyMask; +		EvtAddUniqueEventToQueue(&event, 0, true); +	}  } -void OSystem_PALMOS::getCoordinates(EventPtr event, Coord *x, Coord *y) { -	if (OPTIONS_TST(kOptModeHiDensity)) { -		Boolean dummy; -		EvtGetPenNative(WinGetDisplayWindow(), &event->screenX, &event->screenY, &dummy); -	} else { -		event->screenX <<= 1; -		event->screenY <<= 1; +void OSystem_PALMOS::timer_handler(UInt32 current_msecs) { +	if (_timer.active && (current_msecs >= _timer.nextExpiry)) { +		_timer.duration = _timer.callback(_timer.duration); +		_timer.nextExpiry = current_msecs + _timer.duration;  	} +} -	if (_mode == GFX_WIDE) { -		// wide landscape -		if (OPTIONS_TST(kOptModeLandscape)) { - -			// zodiac have mutliple ratio  -			if (OPTIONS_TST(kOptDeviceZodiac)) { -				Int32 w,h; - -				h = (_adjustAspectRatio ? ((_screenHeight == 200) ? 300 : 360) : 320); -				w = gVars->screenFullWidth; - -				*x = ((event->screenX - _screenOffset.x) << 8) / ((w << 8) / _screenWidth); -				*y = ((event->screenY - _screenOffset.y) << 8) / ((h << 8) / _screenHeight); - -			// default (NR, NZ, NX, UX50, TT3, ...), wide only for 320x200 -			} else { -				*x = ((event->screenX - _screenOffset.x) << 1) / 3; -				*y = ((event->screenY - _screenOffset.y) << 1) / 3; -			} - -		// wide portrait, only for 320x200 -		} else { -			*y =       ((event->screenX - _screenOffset.y) << 1) / 3; -			*x = 320 - ((event->screenY - _screenOffset.x) << 1) / 3 - 1;	 -		} - -	// normal coord +void OSystem_PALMOS::setTimerCallback(TimerProc callback, int timer) { +	if (callback != NULL) { +		_timer.duration = timer; +		_timer.nextExpiry = get_msecs() + timer; +		_timer.callback = callback; +		_timer.active = true;  	} else { -		*x = (event->screenX - _screenOffset.x); -		*y = (event->screenY - _screenOffset.y); +		_timer.active = false;  	}  } -bool OSystem_PALMOS::poll_event(Event *event) { -	EventType ev; -	Boolean handled; -	//UInt32 current_msecs; -	UInt32 keyCurrentState; -	Coord x, y; +void OSystem_PALMOS::setWindowCaption(const char *caption) { +	Char *loading = "Loading, please wait\0"; +	Coord h = FntLineHeight() + 2; +	Coord w, y; -	if(_quitCount) { -		if (_quitCount >= 10) -			SysReset(); -		else -			_quitCount++; +	// quick erase the screen +	WinScreenLock(winLockErase); +	WinScreenUnlock(); -		event->event_code = EVENT_QUIT; -		exit(0);	// resend an exit event -		return false; -	} - -	//current_msecs = get_msecs(); - -	// sound handler -	sound_handler(); - -	// timer handler -	timer_handler(get_msecs()); - -	if (_selfQuit) -		quit(); - -	for(;;) { -		EvtGetEvent(&ev, evtNoWait); - -		// check for hardkey repeat for mouse emulation (no 5way only) -		keyCurrentState = KeyCurrentState(); -		if (_lastKeyPressed != kLastKeyNone && _lastKeyPressed != kLastKeyCalc && -			!(	(keyCurrentState & keyBitHard2) ||		// left -				(keyCurrentState & keyBitPageUp) ||		// up -				(keyCurrentState & keyBitPageDown) ||	// down -				(keyCurrentState & keyBitHard3)			// right -				) -			) { -					_lastKeyPressed = kLastKeyNone; -		} - -		if (ev.eType == nilEvent) -			return false; - -		if (ev.eType == keyDownEvent) { -			switch (ev.data.keyDown.chr) { -				// ESC key -				case vchrLaunch: -					_lastKeyPressed = kLastKeyNone; -					event->event_code = EVENT_KEYDOWN; -					event->kbd.keycode = 27; -					event->kbd.ascii = 27; -					event->kbd.flags = 0; -					return true; -				 -				// F5 = menu -				case vchrJogPushRepeat: -				case vchrMenu: -					_lastKeyPressed = kLastKeyNone; -					event->event_code = EVENT_KEYDOWN; -					event->kbd.keycode = 319; -					event->kbd.ascii = 319; -					event->kbd.flags = 0; -					return true; - -				case vchrFind: -					// do nothing -					return true; - -				case vchrBrightness: -				case vchrContrast: -					WinPalette(winPaletteSet, 0, 256, _currentPalette); -					break; - -				case vchrCalc: -					if (_lastKeyPressed & kLastKeyCalc) -						if ((get_msecs() - _exit_delay) <= (EXITDELAY)) { -							event->event_code = EVENT_QUIT; -							_selfQuit = true; -						} - -					_exit_delay = get_msecs(); -					_lastKeyPressed = kLastKeyCalc; -					return true; - -				// wheel -				case vchrJogUp: -					event->event_code = EVENT_WHEELUP; -					return true; - -				case vchrJogDown: -					event->event_code = EVENT_WHEELDOWN; -					return true; - -				// if hotsync pressed -				case vchrHardCradle: -				case vchrHardCradle2: -					_selfQuit = true; -					break; - -				// mouse button -				case vchrJogBack: -				case vchrHard4: // right button -					event->event_code = EVENT_RBUTTONDOWN; -					event->mouse.x = _mouseCurState.x; -					event->mouse.y = _mouseCurState.y; -					_lastKeyPressed = kLastKeyNone; -					return true; - -				case vchrJogPush: -				case vchrHard1: // left button -					event->event_code = EVENT_LBUTTONDOWN; -					event->mouse.x = _mouseCurState.x; -					event->mouse.y = _mouseCurState.y; -					_lastKeyPressed = kLastKeyNone; -					return true; -			} -			 -			if (OPTIONS_TST(kOpt5WayNavigator)) { -				// mouse emulation for device with 5-Way navigator -				switch (ev.data.keyDown.chr) { -					// ESC key -					case vchrHard2: -						_lastKeyPressed = kLastKeyNone; -						event->event_code = EVENT_KEYDOWN; -						event->kbd.keycode = 27; -						event->kbd.ascii = 27; -						event->kbd.flags = 0; -						return true; -					 -					// F5 = menu -					case vchrHard3: -						_lastKeyPressed = kLastKeyNone; -						event->event_code = EVENT_KEYDOWN; -						event->kbd.keycode = 319; -						event->kbd.ascii = 319; -						event->kbd.flags = 0; -						return true; -					 -					case vchrPageUp: -					case vchrPageDown: -					case vchrNavChange: -						// left mouse button -						if (ev.data.keyDown.keyCode & (navBitSelect|navChangeSelect)) { -							event->event_code = EVENT_LBUTTONDOWN; -							event->mouse.x = _mouseCurState.x; -							event->mouse.y = _mouseCurState.y; -							_lastKeyPressed = kLastKeyNone; -							return true;						 - -						// mouse move -						} else { -							Boolean kUp		= (ev.data.keyDown.keyCode & navBitUp); -							Boolean kDown	= (ev.data.keyDown.keyCode & navBitDown); -							Boolean kLeft	= (ev.data.keyDown.keyCode & navBitLeft); -							Boolean kRight	= (ev.data.keyDown.keyCode & navBitRight); -							Boolean kRepeat	= (ev.data.keyDown.modifiers & autoRepeatKeyMask); -							Boolean process	= (kUp || kDown || kLeft || kRight); -							 -							if (process) { -								Int8 stepX = 0; -								Int8 stepY = 0; - -								if (kLeft) -									stepX = -1; -								else if (kRight) -									stepX = +1; -									 -								if (kUp) -									stepY = -1; -								else if (kDown) -									stepY = +1; -								 -								SimulateArrowKeys(event, stepX, stepY, kRepeat); -								_lastKeyPressed = kLastKeyNone;	// use only repeat flag -								return true; -							} -						} -						break; -				} - -			} else { -				// mouse emulation for device without 5-Way navigator -				switch (ev.data.keyDown.chr) { -					case vchrHard2:	// move left -						SimulateArrowKeys(event, -1, 0); -						_lastKeyPressed = kLastKeyMouseLeft; -						return true; -						 -					case vchrPageUp: // move up -						SimulateArrowKeys(event, 0, -1); -						_lastKeyPressed = kLastKeyMouseUp; -						return true; - -					case vchrPageDown: // move down -						SimulateArrowKeys(event, 0, 1); -						_lastKeyPressed = kLastKeyMouseDown; -						return true; - -					case vchrHard3: // move right -						SimulateArrowKeys(event, 1, 0); -						_lastKeyPressed = kLastKeyMouseRight; -						return true; -				} -			} -		} - -		// prevent crash when alarm is raised -		handled = ((ev.eType == keyDownEvent) &&  -						(ev.data.keyDown.modifiers & commandKeyMask) &&  -						((ev.data.keyDown.chr == vchrAttnStateChanged) ||  -						(ev.data.keyDown.chr == vchrAttnUnsnooze)));  - -		// graffiti strokes, auto-off, etc... -		if (!handled) -			if (SysHandleEvent(&ev)) -				continue; +	WinSetTextColor(255); +	WinSetForeColor(255); + +	if (_useHRmode) { +		y = 160 - (h >> 1) - 10; +		HRFntSetFont(gVars->HRrefNum,hrTinyBoldFont); +		w = FntCharsWidth(loading,StrLen(loading)); +		w = (320 - w) >> 1; +		HRWinDrawChars(gVars->HRrefNum, loading, StrLen(loading), w, y + h); + +		HRFntSetFont(gVars->HRrefNum,hrTinyFont); +		w = FntCharsWidth(caption, StrLen(caption)); +		w = (320 - w) >> 1; +		HRWinDrawChars(gVars->HRrefNum, caption, StrLen(caption), w, y); +	} else { +		Err e; +		BitmapTypeV3 *bmp2P; +		BitmapType *bmp1P = BmpCreate(320, (h << 1), 8, NULL, &e); +		WinHandle tmpH = WinCreateBitmapWindow(bmp1P, &e); -		// others events -		switch(ev.eType) { +		WinSetDrawWindow(tmpH); -		case keyDownEvent: { -				_lastEvent = keyDownEvent; -				_lastKeyPressed = kLastKeyNone; +		FntSetFont(boldFont); +		y = 80 - (h >> 2) - 5; +		w = FntCharsWidth(loading, StrLen(loading)); +		w = (320 - w) >> 1; +		WinDrawChars(loading, StrLen(loading), w, 0 + h); -				if (ev.data.keyDown.chr == vchrCommand && (ev.data.keyDown.modifiers & commandKeyMask)) { -					_lastKeyModifier++; -					_lastKeyModifier %= 4; -					 -					if (_lastKeyModifier) -						draw1BitGfx((kDrawKeyState + _lastKeyModifier - 1), 2, getHeight() + 2, true); -					else -						draw1BitGfx(kDrawKeyState, 2, getHeight() + 2, false); +		FntSetFont(stdFont); +		w = FntCharsWidth(caption, StrLen(caption)); +		w = (320 - w) >> 1; +		WinDrawChars(caption, StrLen(caption), w, 0); -				} else { -					byte b = 0; -					if (_lastKeyModifier == MD_CMD) b = KBD_CTRL|KBD_ALT; -					if (_lastKeyModifier == MD_ALT) b = KBD_ALT; -					if (_lastKeyModifier == MD_CTRL) b = KBD_CTRL; -					 -					if  ((ev.data.keyDown.chr == 'z' && b == KBD_CTRL) || (b == KBD_ALT && ev.data.keyDown.chr == 'x')) { -						event->event_code = EVENT_QUIT; -						_selfQuit = true; +		WinSetDrawWindow(WinGetDisplayWindow()); +		bmp2P = BmpCreateBitmapV3(bmp1P, kDensityDouble, BmpGetBits(bmp1P), NULL); +		WinDrawBitmap((BitmapPtr)bmp2P, 0, y); -					} else if (ev.data.keyDown.chr == 'n' && b == KBD_CTRL) { -						UInt8 *scr = _screenP + _screenWidth * (_screenHeight + 2); -						_useNumPad = !_useNumPad; -						draw1BitGfx(kDrawNumPad, (getWidth() >> 1) - 32, getHeight() + 2, _useNumPad); +		BmpDelete((BitmapPtr)bmp2P); +		WinDeleteWindow(tmpH,0); +		BmpDelete(bmp1P); +	} +} -					} else if (ev.data.keyDown.chr == 'a' && b == (KBD_CTRL|KBD_ALT)) { -						property(PROP_TOGGLE_ASPECT_RATIO, NULL); -						break; -					} +bool OSystem_PALMOS::hasFeature(Feature f) { +	return	(f == kFeatureFullscreenMode && OPTIONS_TST(kOptModeWide)) || +			(f == kFeatureAspectRatioCorrection); +} -					event->event_code = EVENT_KEYDOWN; -					event->kbd.keycode = ev.data.keyDown.chr; -					event->kbd.ascii = (ev.data.keyDown.chr>='a' && ev.data.keyDown.chr<='z' && (event->kbd.flags & KBD_SHIFT) ? ev.data.keyDown.chr &~ 0x20 : ev.data.keyDown.chr); -					event->kbd.flags = b; -					 -					if (_lastKeyModifier) { -						_lastKeyModifier = MD_NONE; -						draw1BitGfx(kDrawKeyState, 2, getHeight() + 2, false); -					} +void OSystem_PALMOS::setFeatureState(Feature f, bool enable) { +	switch (f) { +		case kFeatureFullscreenMode: +			if (_gfxLoaded) +				if (OPTIONS_TST(kOptModeWide) && _initMode != GFX_WIDE) { +					_fullscreen = enable; +					hotswap_gfx_mode(_mode);  				} -				return true; -			} - -		case penMoveEvent: -			getCoordinates(&ev, &x, &y); - -			if (y > _screenHeight || y < 0 || x > _screenWidth || x < 0) -				return true; - -			if (_lastEvent != penMoveEvent && (abs(y - event->mouse.y) <= 2 || abs(x - event->mouse.x) <= 2)) // move only if -				return true; - -			_lastEvent = penMoveEvent; -			event->event_code = EVENT_MOUSEMOVE; -			event->mouse.x = x; -			event->mouse.y = y; -			set_mouse_pos(event->mouse.x, event->mouse.y); -			return true; - -		case penDownEvent: -			getCoordinates(&ev, &x, &y); - -			if (_useNumPad) { -				Coord x2 = (_screenWidth >> 1) - 20; // - 64 / 2 + 12 -				Coord y2 = _screenHeight + 2; +			break; -				if (y >= y2 && y < (y2 + 34) && x >= x2 && x < (x2 + 40)) {	// numpad location -					UInt8 key = '1'; -					key += 9 - ( (3 - ((x - x2) / 13)) + (3 * ((y - y2) / 11)) ); -					 -					_lastEvent = keyDownEvent; -					_lastKeyPressed = kLastKeyNone; -					 -					event->event_code = EVENT_KEYDOWN; -					event->kbd.keycode = key; -					event->kbd.ascii = key; -					event->kbd.flags = 0; -					return true; -				} +		case kFeatureAspectRatioCorrection: +			if (_mode == GFX_WIDE && OPTIONS_TST(kOptDeviceZodiac)) { +				_adjustAspectRatio ^= true; +				ClearScreen();  			} - -			_lastEvent = penDownEvent; -			if (y > _screenHeight || y < 0 || x > _screenWidth || x < 0) -				return true; - -			event->event_code = EVENT_LBUTTONDOWN; -			event->mouse.x = x; -			event->mouse.y = y; -			set_mouse_pos(event->mouse.x, event->mouse.y); -			return true; - -		case penUpEvent: -			getCoordinates(&ev, &x, &y); -			event->event_code = EVENT_LBUTTONUP; - -			if (y > _screenHeight || y < 0 || x > _screenWidth || x < 0) -				return true; - -			event->mouse.x = x; -			event->mouse.y = y; -			set_mouse_pos(event->mouse.x, event->mouse.y); -			return true; - -		default: -			return false; -		} +			break;  	}  } -/////////////////////////////////////////////////////////////////////////////// -uint32 OSystem_PALMOS::property(int param, Property *value) { -	switch(param) { - -	case PROP_SET_WINDOW_CAPTION: -		 -		Char *caption = "Loading, please wait\0"; -		Coord h = FntLineHeight() + 2; -		Coord w, y; - -		// quick erase the screen -		WinScreenLock(winLockErase); -		WinScreenUnlock(); -		 -		WinSetTextColor(255); -		WinSetForeColor(255); - -		if (_useHRmode) { -			y = 160 - (h >> 1) - 10; -			HRFntSetFont(gVars->HRrefNum,hrTinyBoldFont); -			w = FntCharsWidth(caption,StrLen(caption)); -			w = (320 - w) >> 1; -			HRWinDrawChars(gVars->HRrefNum, caption, StrLen(caption), w, y + h); - -			HRFntSetFont(gVars->HRrefNum,hrTinyFont); -			w = FntCharsWidth(value->caption, StrLen(value->caption)); -			w = (320 - w) >> 1; -			HRWinDrawChars(gVars->HRrefNum, value->caption, StrLen(value->caption), w, y); -		} else { -			Err e; -			BitmapTypeV3 *bmp2P; -			BitmapType *bmp1P = BmpCreate(320, (h << 1), 8, NULL, &e); -			WinHandle tmpH = WinCreateBitmapWindow(bmp1P, &e); - -			WinSetDrawWindow(tmpH); - -			FntSetFont(boldFont); -			y = 80 - (h >> 2) - 5; -			w = FntCharsWidth(caption, StrLen(caption)); -			w = (320 - w) >> 1; -			WinDrawChars(caption, StrLen(caption), w, 0 + h); - -			FntSetFont(stdFont); -			w = FntCharsWidth(value->caption, StrLen(value->caption)); -			w = (320 - w) >> 1; -			WinDrawChars(value->caption, StrLen(value->caption), w, 0); - -			WinSetDrawWindow(WinGetDisplayWindow()); -			bmp2P = BmpCreateBitmapV3(bmp1P, kDensityDouble, BmpGetBits(bmp1P), NULL); -			WinDrawBitmap((BitmapPtr)bmp2P, 0, y); - -			BmpDelete((BitmapPtr)bmp2P); -			WinDeleteWindow(tmpH,0); -			BmpDelete(bmp1P); -		} -		return 1; - -	case PROP_OPEN_CD: -		break; - -	case PROP_TOGGLE_ASPECT_RATIO: -		if (_mode == GFX_WIDE && OPTIONS_TST(kOptDeviceZodiac)) { -			_adjustAspectRatio ^= true; -			ClearScreen(); -		} -		break; - -	case PROP_GET_SAMPLE_RATE: -		return 8000; -	 -	case PROP_HAS_SCALER: -		return 0; +bool OSystem_PALMOS::getFeatureState(Feature f) { +	switch (f) { +	case kFeatureAspectRatioCorrection: +		return _adjustAspectRatio; +	default: +		return false;  	} - -	return 0;  }  void OSystem_PALMOS::quit() { @@ -1261,11 +196,16 @@ void OSystem_PALMOS::quit() {  	if (_quitCount)  		return; +#ifndef DISABLE_SCUMM  	if (_selfQuit && Scumm::g_scumm)  		Scumm::g_scumm->_quit = true; +#endif  	free(_currentPalette);  	free(_mouseBackupP); +	free(_mouseDataP); +	 +	_PnoFree(&_arm[PNO_COPY].pnoDesc, _arm[PNO_COPY].pnoPtr);  	if (_cdPlayer) {  		_cdPlayer->release(); @@ -1277,182 +217,6 @@ void OSystem_PALMOS::quit() {  	exit(1);  } -void OSystem_PALMOS::draw_mouse() { -	if (_mouseDrawn || !_mouseVisible || _quitCount) -		return; - -	_mouseCurState.y = _mouseCurState.y >= _screenHeight ? _screenHeight - 1 : _mouseCurState.y; - -	int x = _mouseCurState.x - _mouseHotspotX; -	int y = _mouseCurState.y - _mouseHotspotY; -	int w = _mouseCurState.w; -	int h = _mouseCurState.h; -	byte color; -	byte *src = _mouseDataP;		// Image representing the mouse -	byte *bak = _mouseBackupP;		// Surface used to backup the area obscured by the mouse -	byte *dst;						// Surface we are drawing into -	int width; - -	// clip the mouse rect, and addjust the src pointer accordingly -	if (x < 0) { -		w += x; -		src -= x; -		x = 0; -	} -	if (y < 0) { -		h += y; -		src -= y * _mouseCurState.w; -		y = 0; -	} -	if (w > _screenWidth - x) -		w = _screenWidth - x; -	if (h > _screenHeight - y) -		h = _screenHeight - y; - -	// Quick check to see if anything has to be drawn at all -	if (w <= 0 || h <= 0) -		return; - -	// Store the bounding box so that undraw mouse can restore the area the -	// mouse currently covers to its original content. -	_mouseOldState.x = x; -	_mouseOldState.y = y; -	_mouseOldState.w = w; -	_mouseOldState.h = h; - -	// Draw the mouse cursor; backup the covered area in "bak" -	if (!_overlayVisible) { -		dst = _offScreenP + y * _offScreenPitch + x; - -		while (h > 0) { -			width = w; -			while (width > 0) { -				*bak++ = *dst; -				color = *src++; -				if (color != _mouseKeycolor)	// transparent, don't draw -					*dst = color; -				dst++; -				width--; -			} -			src += _mouseCurState.w - w; -			bak += MAX_MOUSE_W - w; -			dst += _offScreenPitch - w; -			h--; -		} -	} else { -		if (MemPtrDataStorage(_tmpScreenP)) { -			int offset = y * _screenWidth + x; -			dst = _tmpScreenP; -			 -			while (h > 0) { -				width = w; -				while (width > 0) { -					*bak++ = *(dst + offset); -					color = *src++; -					if (color != 0xFF) -						DmWrite(dst, offset, &color, 1); -					offset++; -					width--; -				} -				src += _mouseCurState.w - w; -				bak += MAX_MOUSE_W - w; -				offset += _screenWidth - w; -				h--; -			} -		} else { -			dst = _tmpScreenP + y * _screenWidth + x; - -			while (h > 0) { -				width = w; -				while (width > 0) { -					*bak++ = *dst; -					color = *src++; -					if (color != 0xFF) -						*dst = color; -					dst++; -					width--; -				} -				src += _mouseCurState.w - w; -				bak += MAX_MOUSE_W - w; -				dst += _screenWidth - w; -				h--; -			} -		} -	} - -	// Finally, set the flag to indicate the mouse has been drawn -	_mouseDrawn = true; -} - -void OSystem_PALMOS::undraw_mouse() { -	if (!_mouseDrawn || _quitCount) -		return; - -	_mouseDrawn = false; - -	byte *dst, *bak = _mouseBackupP; -	const int old_mouse_x = _mouseOldState.x; -	const int old_mouse_y = _mouseOldState.y; -	const int old_mouse_w = _mouseOldState.w; -	int old_mouse_h = _mouseOldState.h; - -	// No need to do clipping here, since draw_mouse() did that already -	if (!_overlayVisible) { -		dst = _offScreenP + old_mouse_y * _offScreenPitch + old_mouse_x; -		do { -			memcpy(dst, bak, old_mouse_w); -			bak += MAX_MOUSE_W; -			dst += _offScreenPitch; -		} while (--old_mouse_h); - -	} else { -		if (MemPtrDataStorage(_tmpScreenP)) { -			int offset = old_mouse_y * _screenWidth + old_mouse_x; -			do { -				DmWrite(_tmpScreenP, offset, bak, old_mouse_w); -				bak += MAX_MOUSE_W; -				offset += _screenWidth; -			} while (--old_mouse_h); - -		} else { -			dst = _tmpScreenP + old_mouse_y * _screenWidth + old_mouse_x; -			do { -				memcpy(dst, bak, old_mouse_w); -				bak += MAX_MOUSE_W; -				dst += _screenWidth; -			} while (--old_mouse_h); -		} -	} -} - -void OSystem_PALMOS::stop_cdrom() { -	if (!_cdPlayer) -		return; - -	_cdPlayer->stop(); -} - -void OSystem_PALMOS::play_cdrom(int track, int num_loops, int start_frame, int duration) { -	if (!_cdPlayer) -		return; - -	_cdPlayer->play(track, num_loops, start_frame, duration); -} - -bool OSystem_PALMOS::poll_cdrom() { -	if (!_cdPlayer) -		return false; -	 -	return _cdPlayer->poll(); -} - -void OSystem_PALMOS::update_cdrom() { -	if (!_cdPlayer) -		return; - -	_cdPlayer->update(); -} -  OSystem_PALMOS::OSystem_PALMOS() {  	_quitCount = 0;  	_selfQuit = false; // prevent illegal access to g_scumm @@ -1465,12 +229,15 @@ OSystem_PALMOS::OSystem_PALMOS() {  	memset(&_sound, 0, sizeof(SoundDataType));  	_currentPalette = NULL; +	_modeChanged = false; +	_gfxLoaded = false;  	_lastKeyPressed = kLastKeyNone;  	_lastKeyRepeat = 100;  	_lastKeyModifier = MD_NONE;  	_useNumPad = false; +	_showBatLow = false;  	// mouse  	memset(&_mouseOldState,0,sizeof(MousePos)); @@ -1478,6 +245,10 @@ OSystem_PALMOS::OSystem_PALMOS() {  	_mouseDrawn = false;  	_mouseBackupP = NULL;  	_mouseVisible = false; +	_mouseDataP = NULL; + +	_currentPalette = (RGBColorType*)calloc(sizeof(RGBColorType), 256); +	_mouseBackupP = (byte*)malloc(MAX_MOUSE_W * MAX_MOUSE_H);  	// overlay  	_tmpScreenP = NULL; @@ -1487,349 +258,39 @@ OSystem_PALMOS::OSystem_PALMOS() {  	_useHRmode	= (gVars->HRrefNum != sysInvalidRefNum);  	// ARM -	_arm.pnoPtr = NULL; +	memset(_arm, 0, sizeof(_arm)); +	_arm[PNO_COPY].pnoPtr = _PnoInit(ARM_OCOPYRECT, &_arm[PNO_COPY].pnoDesc);  	// enable cdrom ? -	// TODO : defaultTrackLength player  	_cdPlayer = NULL; -	if (gVars->music.MP3) { -		_cdPlayer = new MsaCDPlayer(this); -//		_cdPlayer = new ZodiacCDPlayer(this); -		_cdPlayer->init(); -		 -		// TODO : use setDefaultTrackLength -//		_isCDRomAvalaible = _cdPlayer->init(); -//		if (!_isCDRomAvalaible) -//			_cdPlayer->release(); -	} -	 -	// sound -//	_isSndPlaying = false; -	memset(&_sound,0,sizeof(SoundDataType)); -} - -void OSystem_PALMOS::move_screen(int dx, int dy, int height) { -	// Short circuit check - do we have to do anything anyway? -	if ((dx == 0 && dy == 0) || height <= 0) -		return; - -	// Hide the mouse -	if (_mouseDrawn) -		undraw_mouse(); - -	RectangleType r, dummy; -	WinSetDrawWindow(_offScreenH); -	RctSetRectangle(&r, ((_offScreenH != _screenH) ? 0 : _screenOffset.x), ((_offScreenH != _screenH) ? 0 : _screenOffset.y), _screenWidth, _screenHeight); - -	// vertical movement -	if (dy > 0) { -		// move down - copy from bottom to top -		if (_useHRmode) { -			// need to set the draw window -			HRWinScrollRectangle(gVars->HRrefNum, &r, winDown, dy, &dummy); -		} else { -			WinScrollRectangle(&r, winDown, dy, &dummy); -		} -	} else if (dy < 0) { -		// move up - copy from top to bottom -		dy = -dy; -		if (_useHRmode) { -			// need to set the draw window -			HRWinScrollRectangle(gVars->HRrefNum, &r, winUp, dy, &dummy); -		} else { -			WinScrollRectangle(&r, winUp, dy, &dummy); -		} -	} - -	// horizontal movement -	if (dx > 0) { -		// move right - copy from right to left -		if (_useHRmode) { -			// need to set the draw window -			HRWinScrollRectangle(gVars->HRrefNum, &r, winRight, dx, &dummy); -		} else { -			WinScrollRectangle(&r, winRight, dx, &dummy); -		} -	} else if (dx < 0)  { -		// move left - copy from left to right -		dx = -dx; -		if (_useHRmode) { -			// need to set the draw window -			HRWinScrollRectangle(gVars->HRrefNum, &r, winLeft, dx, &dummy); -		} else { -			WinScrollRectangle(&r, winLeft, dx, &dummy); -		} -	} - - -	WinSetDrawWindow(_screenH); -	// Prevent crash on Clie device using successive [HR]WinScrollRectangle ! -	SysTaskDelay(1); -} - -static Err sndCallback(void* UserDataP, SndStreamRef stream, void* bufferP, UInt32 *bufferSizeP) { -	SoundDataType *snd = (SoundDataType *)UserDataP; -//	snd->proc(snd->param, (UInt8 *)bufferP, *bufferSizeP); -	MemSet(bufferP, *bufferSizeP, 0); - - -/*	if (snd->lock || !snd->started) { -		MemSet(bufferP, *bufferSizeP, 0); -		return errNone; -	} -	 -	if ((snd->lastSize + *bufferSizeP) <= MemPtrSize(snd->dataP)) { -		snd->lock = true; -		MemMove(bufferP, (UInt8 *)snd->dataP + snd->lastSize , *bufferSizeP); -		snd->lastSize += *bufferSizeP; -		snd->lock = false; -	} else { -		MemSet(bufferP, *bufferSizeP, 0); -	}*/ -//	if (!snd->timerMode) { -//		snd->proc(snd->param, (UInt8 *)bufferP, *bufferSizeP); -/*	} else { -		if (!snd->active) { -			snd->dataP = MemPtrNew(*bufferSizeP); -			MemSet(snd->dataP, *bufferSizeP, 0); -			snd->active = true; -		} -		 -		if (snd->filled) -			MemMove(bufferP, snd->dataP, *bufferSizeP); -		else -			MemSet(bufferP, *bufferSizeP, 0); - -		snd->filled = false; -	}*/ - -	return errNone; -} - -bool OSystem_PALMOS::setSoundCallback(SoundProc proc, void *param) { -	Boolean success = false; - -	if (!_sound.active) { -		_sound.proc = proc; -		_sound.param = param; -		_sound.active = true;	// always true when we call this function -		 -		// try to create sound stream -		if (OPTIONS_TST(kOptPalmSoundAPI)) { -			Err e = SndStreamCreateExtended(&_sound.sndRefNum, sndOutput,sndFormatPCM, 8000, sndInt16Big, sndStereo, &sndCallback, &_sound, 1024, false); -			e = (e) ? e : SndStreamStart(_sound.sndRefNum); -			//e = e ? e :	SndStreamSetVolume(_sound.sndRefNum, 32767 * gVars->soundVolume / 256); - -			_sound.dataP = NULL;		// sound buffer is set by the system -			_sound.useHandler = true;	// don't execute sound_handler -			success = (e == errNone); -		} -		// failed or not supported  -		if (!success) { -			_sound.useHandler = true; -			_sound.dataP = calloc(1,SND_BLOCK);	// required by sound_handler -			success = true;					// don't generate samples -		} -	} -	return success; -} - -void OSystem_PALMOS::clearSoundCallback() { -	if (_sound.active) { -		if (!_sound.useHandler) { -			SndStreamStop(_sound.sndRefNum); -			SndStreamDelete(_sound.sndRefNum); +	if (gVars->CD.enable) { +		switch (gVars->CD.driver) { +			case 0:	// No CD +				_cdPlayer = new DefaultCDPlayer(this); +				break; +			case 1:	// MSA Library +				_cdPlayer = new MsaCDPlayer(this); +				break;  		} - -		free(_sound.dataP); -	} - -	_sound.active = false; -	_sound.useHandler = false; -	_sound.dataP = NULL; -} - -void OSystem_PALMOS::sound_handler() { -	if (_sound.useHandler) { -		_sound.proc(_sound.param, (byte *)_sound.dataP, SND_BLOCK); -	} -} - -void OSystem_PALMOS::timer_handler(UInt32 current_msecs) { -	if (_timer.active && (current_msecs >= _timer.nextExpiry)) { -		_timer.duration = _timer.callback(_timer.duration); -		_timer.nextExpiry = current_msecs + _timer.duration; -	} -} - -void OSystem_PALMOS::showOverlay() { -	// hide the mouse -	undraw_mouse(); -	// save background -	byte *src = _offScreenP; -	byte *dst = _tmpBackupP; -	int h = _screenHeight; - -	if (MemPtrDataStorage(_tmpScreenP)) { -		UInt32 offset = 0; -		do { -			DmWrite(dst, offset, src, _screenWidth); -			offset += _screenWidth; -			src += _offScreenPitch; -		} while (--h);	 -	} else { -		do { -			memcpy(dst, src, _screenWidth); -			dst += _screenWidth; -			src += _offScreenPitch; -		} while (--h);	 -	} - -	_overlayVisible = true; -	clearOverlay(); -} - -void OSystem_PALMOS::hideOverlay() { -	// hide the mouse -	undraw_mouse(); - -	_overlayVisible = false; -	copyRectToScreen(_tmpBackupP, _screenWidth, 0, 0, _screenWidth, _screenHeight); -} - -void OSystem_PALMOS::clearOverlay() { -	if (!_overlayVisible) -		return; - -	// hide the mouse -	undraw_mouse(); -	// restore background -	if (MemPtrDataStorage(_tmpScreenP)) -		DmWrite(_tmpScreenP, 0, _tmpBackupP, _screenWidth * _screenHeight); -	else -		MemMove(_tmpScreenP, _tmpBackupP, _screenWidth * _screenHeight); -} - -void OSystem_PALMOS::grabOverlay(byte *buf, int pitch) { -	if (!_overlayVisible) -		return; - -	// hide the mouse -	undraw_mouse(); - -	byte *src = _tmpScreenP; -	int h = _screenHeight; - -	do { -		memcpy(buf, src, _screenWidth); -		src += _screenWidth; -		buf += pitch; -	} while (--h); -} - -void OSystem_PALMOS::copyRectToOverlay(const byte *buf, int pitch, int x, int y, int w, int h) { -	if (!_overlayVisible) -		return; - -	if (!_tmpScreenP) -		return; - -	// Clip the coordinates -	if (x < 0) { -		w += x; -		buf -= x; -		x = 0; -	} - -	if (y < 0) { -		h += y; buf -= y * pitch; -		y = 0; -	} - -	if (w > _screenWidth - x) -		w = _screenWidth - x; - -	if (h > _screenHeight - y) -		h = _screenHeight - y; - -	if (w <= 0 || h <= 0) -		return; - -	/* FIXME: undraw mouse only if the draw rect intersects with the mouse rect */ -	if (_mouseDrawn) { -/*		RectangleType mouse = {_mouseCurState.x, _mouseCurState.y, _mouseCurState.w, _mouseCurState.h}; -		RectangleType copy	= {x, y, w, h}; -		RectangleType result; -		 -		RctGetIntersection(&mouse, ©, &result); -		if (result.extent.x !=0 && result.extent.y !=0)*/ -			undraw_mouse(); -	} - -	if (MemPtrDataStorage(_tmpScreenP)) { -		byte *dst = _tmpScreenP; -		int offset = y * _screenWidth + x; -		do { -			DmWrite(dst, offset, buf, w); -			offset += _screenWidth; -			buf += pitch; -		} while (--h); -	} else { -		byte *dst = _tmpScreenP + y * _screenWidth + x; -		do { -			memcpy(dst, buf, w); -			dst += _screenWidth; -			buf += pitch; -		} while (--h); -	} -} - - -int16 OSystem_PALMOS::getHeight() { -	return _screenHeight; -} - -int16 OSystem_PALMOS::getWidth() { -	return _screenWidth; -} - -byte OSystem_PALMOS::RGBToColor(uint8 r, uint8 g, uint8 b) { -	byte color; - -	if (gVars->stdPalette) { -		RGBColorType rgb = {0, r, g, b}; -		color = WinRGBToIndex(&rgb); - -	} else { -		byte nearest = 255; -		byte check; -		byte r2, g2, b2; - -		color = 255; - -		for (int i = 0; i < 256; i++) -		{ -			r2 = _currentPalette[i].r; -			g2 = _currentPalette[i].g; -			b2 = _currentPalette[i].b; - -			check = (ABS(r2 - r) + ABS(g2 - g) + ABS(b2 - b)) / 3; - -			if (check == 0)				// perfect match -				return i; -			else if (check < nearest) { // else save and continue -				color = i; -				nearest = check; +		if (_cdPlayer) { +			if (!_cdPlayer->init()) { +				_cdPlayer->release(); +				_cdPlayer = NULL;  			}  		}  	} -	return color; +	// sound +	memset(&_sound,0,sizeof(SoundDataType)); + +	// init +	_vibrate = gVars->vibrator;  } -void OSystem_PALMOS::ColorToRGB(byte color, uint8 &r, uint8 &g, uint8 &b) { -	r = _currentPalette[color].r; -	g = _currentPalette[color].g; -	b = _currentPalette[color].b; +void ClearScreen() { +	RGBColorType rgb	= {0, 0,0,0}; +	RectangleType r		= {0, 0, gVars->screenFullWidth, gVars->screenFullHeight}; +	WinSetForeColor(WinRGBToIndex(&rgb)); +	WinDrawRectangle(&r,0);  } | 
