[Scummvm-cvs-logs] CVS: scummvm/backends/PalmOS/Src os5_renderer.cpp,NONE,1.1 be_os5.cpp,1.5,1.6 be_os5.h,1.5,1.6 os5_event.cpp,1.3,1.4 os5_gfx.cpp,1.3,1.4 os5_mouse.cpp,1.3,1.4 os5_overlay.cpp,1.3,1.4 os5_sound.cpp,1.4,1.5
Chris Apers
chrilith at users.sourceforge.net
Mon Jan 23 11:25:01 CET 2006
Update of /cvsroot/scummvm/scummvm/backends/PalmOS/Src
In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv19643
Modified Files:
be_os5.cpp be_os5.h os5_event.cpp os5_gfx.cpp os5_mouse.cpp
os5_overlay.cpp os5_sound.cpp
Added Files:
os5_renderer.cpp
Log Message:
New OS5 backend :
- 16bit support
- Added SetWindowCaption function
- New 'no thread' sound code
- Wide mode support
- OSD support
--- NEW FILE: os5_renderer.cpp ---
/* ScummVM - Scumm Interpreter
* Copyright (C) 2001 Ludvig Strigeus
* Copyright (C) 2001-2006 The ScummVM project
* Copyright (C) 2002-2006 Chris Apers - PalmOS Backend
*
* 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.
*
* $Header: /cvsroot/scummvm/scummvm/backends/PalmOS/Src/os5_renderer.cpp,v 1.1 2006/01/23 19:23:52 chrilith Exp $
*
*/
#include "be_os5.h"
void OSystem_PalmOS5::render_1x(RectangleType &r, PointType &p) {
Coord o = 0;
if (_overlayVisible) {
int16 *src = _overlayP;
int16 *dst = _workScreenP;
MemMove(dst, src, _screenWidth * _screenHeight * 2);
} else {
byte *src = _offScreenP;
int16 *dst = _workScreenP;
int cnt = _screenWidth * _screenHeight;
o = _current_shake_pos;
do {
*dst++ = _nativePal[*src++];
} while (--cnt);
}
p.x = _screenOffset.x;
p.y = _screenOffset.y + o;
RctSetRectangle(&r, 0, 0, _screenWidth, _screenHeight - o);
}
void OSystem_PalmOS5::render_landscape(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++;
}
// 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++];
}
// 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);
}
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);
}
Index: be_os5.cpp
===================================================================
RCS file: /cvsroot/scummvm/scummvm/backends/PalmOS/Src/be_os5.cpp,v
retrieving revision 1.5
retrieving revision 1.6
diff -u -d -r1.5 -r1.6
--- be_os5.cpp 18 Jan 2006 17:39:29 -0000 1.5
+++ be_os5.cpp 23 Jan 2006 19:23:52 -0000 1.6
@@ -1,7 +1,7 @@
/* ScummVM - Scumm Interpreter
* Copyright (C) 2001 Ludvig Strigeus
* Copyright (C) 2001-2006 The ScummVM project
- * Copyright (C) 2002-2005 Chris Apers - PalmOS Backend
+ * Copyright (C) 2002-2006 Chris Apers - PalmOS Backend
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
@@ -22,66 +22,24 @@
*/
#include "be_os5.h"
-#include "oscalls.h"
-#include "palmdefs.h"
#ifndef __TWKEYS_H__
#include <PalmNavigator.h>
#include <HsKeyCommon.h>
#endif
-static TimerExType _timerEx;
-
OSystem_PalmOS5::OSystem_PalmOS5() : OSystem_PalmBase() {
_sound.active = false;
- _timerEx.timerID = 0;
- _timerEx.timer = &_timer;
-
-#ifdef PALMOS_ARM
- // CHECK : is this ok for OS5 too ?
- if (HALHRTimerTicksPerSecond(&_timerEx.ticks))
- _timerEx.ticks = SysTicksPerSecond();
-#endif
-}
-
-#ifdef PALMOS_ARM
-
-static SYSTEM_CALLBACK void timer_handler(void *userDataP) {
- CALLBACK_PROLOGUE
- TimerExPtr _timerEx = (TimerExPtr)userDataP;
- TimerPtr _timer = _timerEx->timer;
- _timer->duration = _timer->callback(_timer->duration);
- KALTimerSet(_timerEx->timerID, (_timer->duration * _timerEx->ticks / 1000));
- CALLBACK_EPILOGUE
-}
-
-void OSystem_PalmOS5::setTimerCallback(TimerProc callback, int timer) {
- if (_timer.active && _timerEx.timerID)
- KALTimerDelete(_timerEx.timerID);
-
- if (callback != NULL) {
- Err e;
- CALLBACK_INIT(_timerEx);
- _timer.duration = timer;
- _timer.callback = callback;
-
- // create the timer
- e = KALTimerCreate(&_timerEx.timerID, appFileCreator, &::timer_handler, &_timerEx);
- if (!e) {
- e = KALTimerSet(_timerEx.timerID, (timer * _timerEx.ticks / 1000));
- if (e) KALTimerDelete(_timerEx.timerID);
- }
- _timer.active = (!e);
-
- } else {
- _timer.active = false;
- }
+ _setPalette = false;
- if (!_timer.active)
- _timerEx.timerID = 0;
-}
+ _workScreenH = NULL;
+ _overlayH = NULL;
+ _isSwitchable = false;
+ _wasRotated = false;
-#endif
+ MemSet(&_soundEx, sizeof(SoundExType), 0);
+ _soundEx.sound = &_sound;
+}
void OSystem_PalmOS5::int_initBackend() {
if (OPTIONS_TST(kOpt5WayNavigatorV1)) {
@@ -93,8 +51,8 @@
_keyMouse.hasMore = true;
} else if (OPTIONS_TST(kOpt5WayNavigatorV2)) {
- _keyMouse.bitUp = keyBitRockerUp;
- _keyMouse.bitDown = keyBitRockerDown;
+ _keyMouse.bitUp = keyBitRockerUp|keyBitPageUp;
+ _keyMouse.bitDown = keyBitRockerDown|keyBitPageDown;
_keyMouse.bitLeft = keyBitRockerLeft;
_keyMouse.bitRight = keyBitRockerRight;
_keyMouse.bitButLeft= keyBitRockerCenter;
@@ -102,12 +60,51 @@
}
}
-void OSystem_PalmOS5::int_quit() {
-#ifdef PALMOS_ARM
- if (_timerEx.timerID)
- KALTimerDelete(_timerEx.timerID);
-#endif
- clearSoundCallback();
- unload_gfx_mode();
- exit(0);
+void OSystem_PalmOS5::setWindowCaption(const char *caption) {
+ Err e;
+ Char buf[64];
+ Coord w, y, h = FntLineHeight() + 2;
+ const Char *loading = "Loading, please wait\0";
+
+ // allocate bitmap
+ BitmapTypeV3 *bmp2P;
+ BitmapType *bmp1P = BmpCreate(320, (h * 3), 8, NULL, &e);
+ WinHandle tmpH = WinCreateBitmapWindow(bmp1P, &e);
+
+ WinSetDrawWindow(tmpH);
+ WinSetBackColor(0);
+ WinSetTextColor(255);
+ WinEraseWindow();
+
+ // loading message
+ FntSetFont(boldFont);
+ w = FntCharsWidth(loading, StrLen(loading));
+ w = (320 - w) / 2;
+ WinDrawChars(loading, StrLen(loading), w, 0 + h);
+
+ // caption
+ FntSetFont(stdFont);
+ w = FntCharsWidth(caption, StrLen(caption));
+ w = (320 - w) / 2;
+ WinDrawChars(caption, StrLen(caption), w, 0);
+
+ // memory size
+ StrPrintF(buf, "memory : %ld KB", gVars->startupMemory);
+ w = FntCharsWidth(buf, StrLen(buf));
+ w = (320 - w) / 2;
+ WinDrawChars(buf, StrLen(buf), w, h * 2);
+
+ // set the bitmap as v3
+ bmp2P = BmpCreateBitmapV3(bmp1P, kDensityDouble, BmpGetBits(bmp1P), NULL);
+ y = (80 - (h / 4) - 5);
+
+ // draw it
+ WinSetDrawWindow(WinGetDisplayWindow());
+ WinEraseWindow();
+ WinDrawBitmap((BitmapPtr)bmp2P, 0, y);
+
+ // free
+ WinDeleteWindow(tmpH, 0);
+ BmpDelete((BitmapPtr)bmp2P);
+ BmpDelete(bmp1P);
}
Index: be_os5.h
===================================================================
RCS file: /cvsroot/scummvm/scummvm/backends/PalmOS/Src/be_os5.h,v
retrieving revision 1.5
retrieving revision 1.6
diff -u -d -r1.5 -r1.6
--- be_os5.h 18 Jan 2006 17:39:29 -0000 1.5
+++ be_os5.h 23 Jan 2006 19:23:52 -0000 1.6
@@ -1,7 +1,7 @@
/* ScummVM - Scumm Interpreter
* Copyright (C) 2001 Ludvig Strigeus
* Copyright (C) 2001-2006 The ScummVM project
- * Copyright (C) 2002-2005 Chris Apers - PalmOS Backend
+ * Copyright (C) 2002-2006 Chris Apers - PalmOS Backend
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
@@ -68,30 +68,46 @@
# define CALLBACK_INIT(regs)
#endif
+// TODO : change / remove this
+#define gfxMakeDisplayRGB_BigEndian(_r,_g,_b) \
+ ( (((_g) & 0xFC) << 11) | (((_b) & 0xF8) << 5) | ((_r) & 0xF8) | (((_g) & 0xFF) >> 5) )
+
+#define gfxMakeDisplayRGB_LittleEndian(_r,_g,_b) \
+ ( (((_r) & 0xF8) << 8) | (((_g) & 0xFC) << 3) | (((_b) & 0xF8) >> 3) )
+
+#if CPU_TYPE == CPU_68K
+#define gfxMakeDisplayRGB(_r,_g,_b) gfxMakeDisplayRGB_BigEndian(_r,_g,_b)
+#else
+#define gfxMakeDisplayRGB(_r,_g,_b) gfxMakeDisplayRGB_LittleEndian(_r,_g,_b)
+#endif
+
typedef struct {
+ // for real thread version only
UInt32 __reg1;
UInt32 __reg2;
- void *proc;
- void *param;
+ // no real thread version
+ Boolean set;
+ UInt32 size;
+ void *dataP;
+ // default sound stuff
SndStreamRef handle;
- Boolean active;
-} SoundDataType;
-extern SoundDataType _sound;
-
-typedef struct {
- UInt32 __r9;
- UInt32 __r10;
- TimerPtr timer;
- UInt32 timerID;
- UInt32 ticks;
-} TimerExType, *TimerExPtr;
+ SoundPtr sound;
+} SoundExType, *SoundExPtr;
+extern SoundExType _soundEx;
class OSystem_PalmOS5 : public OSystem_PalmBase {
private:
- byte *_overlayP;
- WinHandle _overlayH;
+ typedef void (OSystem_PalmOS5::*RendererProc)(RectangleType &r, PointType &p);
+ RendererProc _render;
+
+ OverlayColor *_overlayP;
+ WinHandle _overlayH, _workScreenH;
+ int16 _nativePal[256];
+ int16 *_workScreenP;
+
+ Boolean _isSwitchable, _wasRotated;
virtual void int_initBackend();
virtual void int_updateScreen();
@@ -99,18 +115,26 @@
virtual void unload_gfx_mode();
virtual void load_gfx_mode();
+ virtual void hotswap_gfx_mode(int mode);
void draw_mouse();
void undraw_mouse();
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);
-#ifdef PALMOS_ARM
- void timer_handler() {};
-#endif
+ void render_landscape(RectangleType &r, PointType &p);
+ void render_portrait(RectangleType &r, PointType &p);
+ void render_1x(RectangleType &r, PointType &p);
+ WinHandle alloc_screen(Coord w, Coord h);
+ virtual void draw_osd(UInt16 id, Int32 x, Int32 y, Boolean show, UInt8 color = 0);
+
+ virtual SndStreamVariableBufferCallback sound_callback();
+ virtual void sound_handler();
protected:
UInt16 _sysOldCoord, _sysOldOrientation;
+ Boolean _stretched;
public:
OSystem_PalmOS5();
@@ -119,25 +143,20 @@
void copyRectToScreen(const byte *buf, int pitch, int x, int y, int w, int h);
void clearScreen();
- virtual void setMouseCursor(const byte *buf, uint w, uint h, int hotspotX, int hotspotY, byte keycolor, int cursorTargetScale);
+ void setMouseCursor(const byte *buf, uint w, uint h, int hotspotX, int hotspotY, byte keycolor, int cursorTargetScale);
- virtual void showOverlay();
- virtual void hideOverlay();
+ void showOverlay();
+ void hideOverlay();
virtual void clearOverlay();
virtual void grabOverlay(OverlayColor *buf, int pitch);
virtual void copyRectToOverlay(const OverlayColor *buf, int pitch, int x, int y, int w, int h);
virtual OverlayColor RGBToColor(uint8 r, uint8 g, uint8 b);
virtual void colorToRGB(OverlayColor color, uint8 &r, uint8 &g, uint8 &b);
-#ifdef PALMOS_ARM
- void setTimerCallback(TimerProc callback, int interval);
-#endif
-
- bool setSoundCallback(SoundProc proc, void *param);
+ virtual bool setSoundCallback(SoundProc proc, void *param);
void clearSoundCallback();
-
- void int_quit();
- void setWindowCaption(const char *caption) {};
+
+ void setWindowCaption(const char *caption);
};
Index: os5_event.cpp
===================================================================
RCS file: /cvsroot/scummvm/scummvm/backends/PalmOS/Src/os5_event.cpp,v
retrieving revision 1.3
retrieving revision 1.4
diff -u -d -r1.3 -r1.4
--- os5_event.cpp 18 Jan 2006 17:39:29 -0000 1.3
+++ os5_event.cpp 23 Jan 2006 19:23:52 -0000 1.4
@@ -1,7 +1,7 @@
/* ScummVM - Scumm Interpreter
* Copyright (C) 2001 Ludvig Strigeus
* Copyright (C) 2001-2006 The ScummVM project
- * Copyright (C) 2002-2005 Chris Apers - PalmOS Backend
+ * Copyright (C) 2002-2006 Chris Apers - PalmOS Backend
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
@@ -29,4 +29,71 @@
x = (ev->screenX - _screenOffset.x);
y = (ev->screenY - _screenOffset.y);
+
+ if (_stretched) {
+ if (OPTIONS_TST(kOptModeLandscape)) {
+ x = (x * 2 / 3);
+ y = (y * 2 / 3);
+ } else {
+ y = ((ev->screenX - _screenOffset.y) * 2) / 3;
+ x = 320 - ((ev->screenY - _screenOffset.x) * 2) / 3 - 1;
+ }
+ }
+}
+
+bool OSystem_PalmOS5::check_event(Event &event, EventPtr ev) {
+ if (ev->eType == keyDownEvent) {
+ switch (ev->data.keyDown.chr) {
+ case vchrHard4:
+ _lastKey = kKeyNone;
+ event.type = EVENT_RBUTTONDOWN;
+ event.mouse.x = _mouseCurState.x;
+ event.mouse.y = _mouseCurState.y;
+ return true;
+
+ // trun off
+ case vchrAutoOff:
+ case vchrPowerOff:
+ // pause the sound thread if any
+ if (_sound.active)
+ SndStreamPause(_soundEx.handle, true);
+ break;
+
+ case vchrLateWakeup:
+ // resume the sound thread if any
+ if (_sound.active)
+ SndStreamPause(_soundEx.handle, false);
+ break;
+ }
+
+ if (_keyMouse.hasMore) {
+ switch (ev->data.keyDown.chr) {
+ // hot swap gfx
+ case vchrHard1:
+ if (OPTIONS_TST(kOptCollapsible))
+ hotswap_gfx_mode(_mode == GFX_WIDE ? GFX_NORMAL: GFX_WIDE);
+ return false; // not a key
+
+ // ESC key
+ case vchrHard2:
+ _lastKey = kKeyNone;
+ event.type = EVENT_KEYDOWN;
+ event.kbd.keycode = 27;
+ event.kbd.ascii = 27;
+ event.kbd.flags = 0;
+ return true;
+
+ // F5 = menu
+ case vchrHard3:
+ _lastKey = kKeyNone;
+ event.type = EVENT_KEYDOWN;
+ event.kbd.keycode = 319;
+ event.kbd.ascii = 319;
+ event.kbd.flags = 0;
+ return true;
+ }
+ }
+ }
+
+ return false;
}
Index: os5_gfx.cpp
===================================================================
RCS file: /cvsroot/scummvm/scummvm/backends/PalmOS/Src/os5_gfx.cpp,v
retrieving revision 1.3
retrieving revision 1.4
diff -u -d -r1.3 -r1.4
--- os5_gfx.cpp 18 Jan 2006 17:39:29 -0000 1.3
+++ os5_gfx.cpp 23 Jan 2006 19:23:52 -0000 1.4
@@ -1,7 +1,7 @@
/* ScummVM - Scumm Interpreter
* Copyright (C) 2001 Ludvig Strigeus
* Copyright (C) 2001-2006 The ScummVM project
- * Copyright (C) 2002-2005 Chris Apers - PalmOS Backend
+ * Copyright (C) 2002-2006 Chris Apers - PalmOS Backend
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
@@ -22,37 +22,168 @@
*/
#include "be_os5.h"
+#include <PenInputMgr.h>
+#include <palmOneResources.h>
#ifdef PALMOS_ARM
-#include "pace.h"
-#include "oscalls.h"
+#include <System/WIP.h>
+#include <Libraries/AIA/palmOneStatusBarMgrARM.h>
#endif
+#include "oscalls.h"
+
void OSystem_PalmOS5::int_initSize(uint w, uint h, int overlayScale) {
}
-void OSystem_PalmOS5::load_gfx_mode() {
+WinHandle OSystem_PalmOS5::alloc_screen(Coord w, Coord h) {
Err e;
+ WinHandle winH;
+ UInt16 old = WinSetCoordinateSystem(kCoordinatesNative);
+ winH = WinCreateOffscreenWindow(w, h, nativeFormat, &e);
+ WinSetCoordinateSystem(old);
+ return winH;
+}
+
+void OSystem_PalmOS5::load_gfx_mode() {
+ Err e;
+
if (_gfxLoaded)
return;
_gfxLoaded = true;
- _sysOldCoord = WinSetCoordinateSystem(kCoordinatesNative);
-#ifdef PALMOS_68K
- // init mouse (must be here, after WinSetCoordinateSystem)
- _mouseBackupH = WinCreateOffscreenWindow(MAX_MOUSE_W, MAX_MOUSE_H, nativeFormat, &e);
- _mouseBackupP = (byte *)(BmpGetBits(WinGetBitmap(_mouseBackupH)));
+ _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);
- _offScreenH = WinCreateOffscreenWindow(_screenWidth, _screenHeight, nativeFormat, &e);
+ UInt32 depth = 16;
+ WinScreenMode(winScreenModeSet, NULL, NULL, &depth, NULL);
+ clearScreen();
+
+ gVars->indicator.on = RGBToColor(0,255,0);
+ gVars->indicator.off = RGBToColor(0,0,0);
+
+ _overlayH = alloc_screen(_screenWidth, _screenHeight);
_screenH = WinGetDisplayWindow();
- _offScreenP = (byte *)(BmpGetBits(WinGetBitmap(_offScreenH)));
+
+ _overlayP = (OverlayColor *)(BmpGetBits(WinGetBitmap(_overlayH)));
_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)
+ _mode = GFX_NORMAL;
+
+ hotswap_gfx_mode(_mode);
+}
+
+void OSystem_PalmOS5::hotswap_gfx_mode(int mode) {
+ Err e;
+ UInt32 device;
+ Boolean isT3;
+
+ if (_mode != GFX_NORMAL && !_isSwitchable)
+ return;
+
+ if (_workScreenH)
+ WinDeleteWindow(_workScreenH, false);
+ _workScreenH = NULL;
+
+ isT3 = false;
+#ifdef PALMOS_ARM
+ if (!FtrGet(sysFileCSystem, sysFtrNumOEMDeviceID, &device))
+ isT3 = (device == kPalmOneDeviceIDTungstenT3);
#endif
- _screenOffset.x = (gVars->screenWidth - _screenWidth) / 2;
- _screenOffset.y = (gVars->screenHeight - _screenHeight) / 2;
+ // prevent bad DIA redraw (Stat part)
+ if (mode == GFX_NORMAL) {
+ // only if this API is available
+ if (_stretched && OPTIONS_TST(kOptCollapsible)) {
+#ifdef PALMOS_ARM
+ if (isT3) {
+ //AiaSetInputAreaState(aiaInputAreaShow);
+ StatShow_68k();
+ PINSetInputAreaState_68k(pinInputAreaOpen);
+ } else
+#endif
+ {
+ 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;
+ }
+
+ _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 {
+#ifdef PALMOS_ARM
+ // T3 DIA library is 68k base, there is no possible native call
+ if (isT3) {
+ //AiaSetInputAreaState(aiaInputAreaFullScreen);
+ PINSetInputAreaState_68k(pinInputAreaClosed);
+ StatHide_68k();
+ } else
+#endif
+ {
+ PINSetInputAreaState(pinInputAreaClosed);
+ StatHide();
+ }
+
+ _redawOSD = false;
+ _stretched = true;
+ OPTIONS_SET(kOptDisableOnScrDisp);
+
+ 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;
+ }
+
+ _mode = mode;
+ clearScreen();
}
void OSystem_PalmOS5::unload_gfx_mode() {
@@ -60,8 +191,23 @@
return;
_gfxLoaded = false;
- if (_mouseBackupH)
- WinDeleteWindow(_mouseBackupH, false);
+ MemPtrFree(_mouseBackupP);
+ MemPtrFree(_mouseDataP);
+ free(_offScreenP);
+
+ if (_workScreenH)
+ WinDeleteWindow(_workScreenH, false);
+ if (_overlayH)
+ WinDeleteWindow(_overlayH, false);
+
+ _workScreenH = NULL;
+ _overlayH = NULL;
+
+ UInt32 depth = 8;
+ WinScreenMode(winScreenModeSet, NULL, NULL, &depth, NULL);
+ clearScreen();
+
+ WinSetCoordinateSystem(_sysOldCoord);
}
void OSystem_PalmOS5::copyRectToScreen(const byte *buf, int pitch, int x, int y, int w, int h) {
@@ -87,23 +233,10 @@
if (w <= 0 || h <= 0)
return;
-#ifdef PALMOS_68K
- BitmapTypeV1 nfo = {
- w, h, pitch,
- {0,0,0,0,0,0,0,0,0},
- 8, BitmapVersionOne, 0
- };
-
- BitmapTypeV3 *v3 = BmpCreateBitmapV3((BitmapType*)&nfo, kDensityDouble, (void *)buf, 0);
-
- WinSetDrawWindow(_offScreenH);
- WinDrawBitmap((BitmapPtr)v3, x, y);
- BmpDelete((BitmapPtr)v3);
-#else
byte *dst = _offScreenP + y * _screenWidth + x;
if (w == pitch && w == _screenWidth) {
- MemMove(dst, buf, w*h);
+ MemMove(dst, buf, w * h);
} else {
do {
MemMove(dst, buf, w);
@@ -111,15 +244,19 @@
buf += pitch;
} while (--h);
}
-#endif
}
void OSystem_PalmOS5::int_updateScreen() {
-#ifdef PALMOS_68K
RectangleType r;
- RctSetRectangle(&r, 0, 0, _screenWidth, _screenHeight - _current_shake_pos);
- WinCopyRectangle(_offScreenH, _screenH, &r, _screenOffset.x, _screenOffset.y + _current_shake_pos, winPaint);
-#endif
+ PointType p;
+
+ draw_mouse();
+ ((this)->*(_render))(r, p);
+
+ _sysOldCoord = WinSetCoordinateSystem(kCoordinatesNative);
+ WinCopyRectangle(_workScreenH, _screenH, &r, p.x, p.y, winPaint);
+ WinSetCoordinateSystem(_sysOldCoord);
+ undraw_mouse();
}
void OSystem_PalmOS5::clearScreen() {
@@ -128,3 +265,53 @@
WinSetBackColorRGB(&rgb, 0);
WinEraseWindow();
}
+
+void OSystem_PalmOS5::extras_palette(uint8 index, uint8 r, uint8 g, uint8 b) {
+ _nativePal[index] = gfxMakeDisplayRGB( r, g, b);
+}
+
+void OSystem_PalmOS5::draw_osd(UInt16 id, Int32 x, Int32 y, Boolean show, UInt8 color) {
+ if (_mode != GFX_NORMAL)
+ return;
+// MemHandle hTemp = DmGetResource(bitmapRsc, id);
+ MemHandle hTemp = DmGetResource('abmp', id + 100);
+
+ if (hTemp) {
+ RGBColorType oldRGB;
+ static const RGBColorType pal[4] = {
+ {0,0,255,0},
+ {0,255,255,0},
+ {0,255,0,0},
+ {0,0,0,0}
+ };
+
+ BitmapType *bmTemp;
+ bmTemp = (BitmapType *)MemHandleLock(hTemp);
+
+ Coord w, h;
+ BmpGetDimensions(bmTemp, &w, &h, 0);
+
+ PointType dst = { _screenOffset.x + x, _screenOffset.y + y };
+ RectangleType c, r = { dst.x, dst.y, w, h };
+
+ UInt16 old = WinSetCoordinateSystem(kCoordinatesNative);
+ WinSetDrawWindow(_screenH);
+ WinGetClip(&c);
+ WinResetClip();
+
+ if (show) {
+ WinSetForeColorRGB(&pal[3], &oldRGB);
+ WinSetBackColorRGB(&pal[color], &oldRGB);
+ WinDrawBitmap(bmTemp, dst.x, dst.y);
+ } else {
+ WinSetBackColorRGB(&pal[3], &oldRGB);
+ WinFillRectangle(&r, 0);
+ }
+
+ WinSetClip(&c);
+ WinSetCoordinateSystem(old);
+
+ MemPtrUnlock(bmTemp);
+ DmReleaseResource(hTemp);
+ }
+}
Index: os5_mouse.cpp
===================================================================
RCS file: /cvsroot/scummvm/scummvm/backends/PalmOS/Src/os5_mouse.cpp,v
retrieving revision 1.3
retrieving revision 1.4
diff -u -d -r1.3 -r1.4
--- os5_mouse.cpp 18 Jan 2006 17:39:29 -0000 1.3
+++ os5_mouse.cpp 23 Jan 2006 19:23:52 -0000 1.4
@@ -1,7 +1,7 @@
/* ScummVM - Scumm Interpreter
* Copyright (C) 2001 Ludvig Strigeus
* Copyright (C) 2001-2006 The ScummVM project
- * Copyright (C) 2002-2005 Chris Apers - PalmOS Backend
+ * Copyright (C) 2002-2006 Chris Apers - PalmOS Backend
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
@@ -35,38 +35,22 @@
_mouseKeyColor = keycolor;
-#ifdef PALMOS_68K
- // free old cursor if any
- if (_mouseDataH)
- WinDeleteWindow(_mouseDataH, false);
-
- // allocate new cursor
- Err e;
- _mouseDataH = WinCreateOffscreenWindow(w, h, nativeFormat, &e);
- _mouseDataP = (byte *)BmpGetBits(WinGetBitmap(_mouseDataH));
-
- // set bitmap transparency
- BmpSetTransparentValue(WinGetBitmap(_mouseDataH), _mouseKeyColor);
-
// copy new cursor
- BitmapTypeV1 nfo = {
- w, h, w,
- {0,0,0,0,0,0,0,0,0},
- 8, BitmapVersionOne, 0
- };
-
- BitmapTypeV3 *v3 = BmpCreateBitmapV3((BitmapType*)&nfo, kDensityDouble, (void *)buf, 0);
-
- WinSetDrawWindow(_mouseDataH);
- WinDrawBitmap((BitmapPtr)v3, 0, 0);
- BmpDelete((BitmapPtr)v3);
-#endif
+ byte *dst = _mouseDataP;
+ while (h--) {
+ memcpy(dst, buf, w);
+ dst += MAX_MOUSE_W;
+ buf += w;
+ }
}
void OSystem_PalmOS5::draw_mouse() {
if (_mouseDrawn || !_mouseVisible)
return;
- _mouseDrawn = true;
+
+ byte *src = _mouseDataP; // Image representing the mouse
+ byte color;
+ int width;
_mouseCurState.y = _mouseCurState.y >= _screenHeight ? _screenHeight - 1 : _mouseCurState.y;
@@ -81,10 +65,12 @@
// clip the mouse rect
if (x < 0) {
w += x;
+ src -= x;
x = 0;
}
if (y < 0) {
h += y;
+ src -= y * MAX_MOUSE_W;
y = 0;
}
if (w > _screenWidth - x)
@@ -103,31 +89,86 @@
_mouseOldState.w = w;
_mouseOldState.h = h;
-#ifdef PALMOS_68K
+ // 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;
+
// Backup the covered area draw the mouse cursor
if (_overlayVisible) {
+ int16 *bak = (int16 *)_mouseBackupP; // Surface used to backup the area obscured by the mouse
+ int16 *dst = _overlayP + y * _screenWidth + x;
+
+ do {
+ width = w;
+ do {
+ *bak++ = *dst;
+ color = *src++;
+ if (color != _mouseKeyColor) // transparent, don't draw
+ *dst = _nativePal[color];
+ dst++;
+ } while (--width);
+
+ src += MAX_MOUSE_W - w;
+ bak += MAX_MOUSE_W - w;
+ dst += _screenWidth - w;
+ } while (--h);
+
} else {
- // backup...
- RectangleType r = {x, y, w, h};
- WinCopyRectangle(_offScreenH, _mouseBackupH, &r, 0, 0, winPaint);
- // ...and draw
- WinSetDrawWindow(_offScreenH);
- WinDrawBitmap(WinGetBitmap(_mouseDataH), draw_x, draw_y);
+ byte *bak = _mouseBackupP; // Surface used to backup the area obscured by the mouse
+ byte *dst =_offScreenP + y * _screenWidth + x; // Surface we are drawing into
+
+ do {
+ width = w;
+ do {
+ *bak++ = *dst;
+ color = *src++;
+ if (color != _mouseKeyColor) // transparent, don't draw
+ *dst = color;
+ dst++;
+ } while (--width);
+
+ src += MAX_MOUSE_W - w;
+ bak += MAX_MOUSE_W - w;
+ dst += _screenWidth - w;
+ } while (--h);
}
-#endif
+
+ _mouseDrawn = true;
}
void OSystem_PalmOS5::undraw_mouse() {
if (!_mouseDrawn)
return;
- _mouseDrawn = false;
-#ifdef PALMOS_68K
+ int h = _mouseOldState.h;
// No need to do clipping here, since draw_mouse() did that already
if (_overlayVisible) {
+ int16 *bak = (int16 *)_mouseBackupP;
+ int16 *dst = _overlayP + _mouseOldState.y * _screenWidth + _mouseOldState.x;
+
+ do {
+ memcpy(dst, bak, _mouseOldState.w * 2);
+ bak += MAX_MOUSE_W;
+ dst += _screenWidth;
+ } while (--h);
+
} else {
- RectangleType r = {0, 0, _mouseOldState.w, _mouseOldState.h};
- WinCopyRectangle(_mouseBackupH, _offScreenH, &r, _mouseOldState.x, _mouseOldState.y, winPaint);
+ byte *dst, *bak = _mouseBackupP;
+ dst = _offScreenP + _mouseOldState.y * _screenWidth + _mouseOldState.x;
+
+ do {
+ memcpy(dst, bak, _mouseOldState.w);
+ bak += MAX_MOUSE_W;
+ dst += _screenWidth;
+ } while (--h);
}
-#endif
+
+ _mouseDrawn = false;
}
Index: os5_overlay.cpp
===================================================================
RCS file: /cvsroot/scummvm/scummvm/backends/PalmOS/Src/os5_overlay.cpp,v
retrieving revision 1.3
retrieving revision 1.4
diff -u -d -r1.3 -r1.4
--- os5_overlay.cpp 18 Jan 2006 17:39:29 -0000 1.3
+++ os5_overlay.cpp 23 Jan 2006 19:23:52 -0000 1.4
@@ -1,7 +1,7 @@
/* ScummVM - Scumm Interpreter
* Copyright (C) 2001 Ludvig Strigeus
* Copyright (C) 2001-2006 The ScummVM project
- * Copyright (C) 2002-2005 Chris Apers - PalmOS Backend
+ * Copyright (C) 2002-2006 Chris Apers - PalmOS Backend
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
@@ -23,15 +23,64 @@
#include "be_os5.h"
-OverlayColor OSystem_PalmOS5::RGBToColor(uint8 r, uint8 g, uint8 b) {
- RGBColorType rgb = {0, r, g, b};
- OverlayColor color = WinRGBToIndex(&rgb);
+void OSystem_PalmOS5::showOverlay() {
+ // hide fight indicator
+ draw_osd(kDrawFight, _screenDest.w - 34, _screenDest.h + 2, false);
- return color;
+ undraw_mouse();
+ _overlayVisible = true;
+ clearOverlay();
+}
+
+void OSystem_PalmOS5::hideOverlay() {
+ undraw_mouse();
+ _overlayVisible = false;
+ _redawOSD = true;
+}
+
+void OSystem_PalmOS5::clearOverlay() {
+ if (!_overlayVisible)
+ return;
+
+ byte *src = _offScreenP;
+ int16 *dst = _overlayP;
+ int cnt = _screenWidth * _screenHeight;
+ do {
+ *dst++ = _nativePal[*src++];
+ } while (--cnt);
+}
+
+void OSystem_PalmOS5::grabOverlay(OverlayColor *buf, int pitch) {
+ OverlayColor *src = _overlayP;
+ int h = _screenHeight;
+ do {
+ memcpy(buf, src, _screenWidth * 2);
+ src += _screenWidth;
+ buf += pitch;
+ } while (--h);
+}
+
+void OSystem_PalmOS5::copyRectToOverlay(const OverlayColor *buf, int pitch, int x, int y, int w, int h) {
+ if (w == 0 || h == 0)
+ return;
+
+ OverlayColor *dst = _overlayP + x + y * _screenWidth;
+ do {
+ memcpy(dst, buf, w * 2);
+ dst += _screenWidth;
+ buf += pitch;
+ } while (--h);
+}
+
+OverlayColor OSystem_PalmOS5::RGBToColor(uint8 r, uint8 g, uint8 b) {
+ return gfxMakeDisplayRGB(r, g, b);
}
void OSystem_PalmOS5::colorToRGB(OverlayColor color, uint8 &r, uint8 &g, uint8 &b) {
- r = _currentPalette[color].r;
- g = _currentPalette[color].g;
- b = _currentPalette[color].b;
+#ifdef PALMOS_68K
+ color = SWAP_BYTES_16(color);
+#endif
+ r = ((color >> 8) & 0xF8);
+ g = ((color >> 3) & 0xFC);
+ b = ((color << 3) & 0xF8);
}
Index: os5_sound.cpp
===================================================================
RCS file: /cvsroot/scummvm/scummvm/backends/PalmOS/Src/os5_sound.cpp,v
retrieving revision 1.4
retrieving revision 1.5
diff -u -d -r1.4 -r1.5
--- os5_sound.cpp 18 Jan 2006 17:39:29 -0000 1.4
+++ os5_sound.cpp 23 Jan 2006 19:23:52 -0000 1.5
@@ -1,7 +1,7 @@
/* ScummVM - Scumm Interpreter
* Copyright (C) 2001 Ludvig Strigeus
* Copyright (C) 2001-2006 The ScummVM project
- * Copyright (C) 2002-2005 Chris Apers - PalmOS Backend
+ * Copyright (C) 2002-2006 Chris Apers - PalmOS Backend
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
@@ -22,41 +22,44 @@
*/
#include "be_os5.h"
+#include "backends/intern.h"
#include "common/config-manager.h"
-#ifdef PALMOS_68K
-static void initRegs(void *addr) {
- asm (
- move.l addr, a0
- move.l a4, 0(a0)
- move.l a5, 4(a0)
- );
-}
+SoundExType _soundEx;
static Err sndCallback(void* UserDataP, SndStreamRef stream, void* bufferP, UInt32 *bufferSizeP) {
- asm (
-// movem.l a4-a5, -(sp)
- move.l UserDataP, a0
- move.l 0(a0), a4
- move.l 4(a0), a5
- );
-
- SoundDataType *_sound = (SoundDataType *)UserDataP;
- ((OSystem::SoundProc)_sound->proc)(_sound->param, (byte *)bufferP, *bufferSizeP);
+ SoundExType *_soundEx = (SoundExType *)UserDataP;
+ SoundType *_sound = _soundEx->sound;
+
+ if (_soundEx->set && _soundEx->size) {
+ MemMove(bufferP, _soundEx->dataP, _soundEx->size);
+ *bufferSizeP = _soundEx->size;
+ _soundEx->set = false;
-// asm ( movem.l (sp)+, a4-a5 );
+ } else {
+ _soundEx->size = *bufferSizeP;
+ MemSet(bufferP, 128, 0);
+ *bufferSizeP = 128;
+ }
+
return errNone;
}
-#else
+void OSystem_PalmOS5::sound_handler() {
+ if (_sound.active) {
+ if (_soundEx.size && !_soundEx.set) {
+ if (!_soundEx.dataP)
+ _soundEx.dataP = MemPtrNew(_soundEx.size);
-static SYSTEM_CALLBACK Err sndCallback(void* UserDataP, SndStreamRef stream, void* bufferP, UInt32 *bufferSizeP) {
- SoundDataType *_sound = (SoundDataType *)UserDataP;
- ((OSystem::SoundProc)_sound->proc)(_sound->param, (byte *)bufferP, *bufferSizeP);
- return errNone;
+ ((SoundProc)_sound.proc)(_sound.param, (byte *)_soundEx.dataP, _soundEx.size);
+ _soundEx.set = true;
+ }
+ }// TODO : no Sound API case
}
-#endif
+SndStreamVariableBufferCallback OSystem_PalmOS5::sound_callback() {
+ return sndCallback;
+}
bool OSystem_PalmOS5::setSoundCallback(SoundProc proc, void *param) {
Err e;
@@ -68,47 +71,54 @@
ConfMan.set("FM_high_quality", (gVars->fmQuality == FM_QUALITY_HI));
}
+#if defined (COMPILE_OS5)
+ CALLBACK_INIT(_soundEx);
+#endif
_sound.proc = proc;
_sound.param = param;
- _sound.active = true; // always true when we call this function, false when sound is off
- _sound.handle = NULL;
+ _sound.active = true; // always true when we call this function, false when sound is off
+
+ _soundEx.handle = 0;
+ _soundEx.size = 0; // set by the callback
+ _soundEx.set = false;
+ _soundEx.dataP = NULL; // set by the handler
if (ConfMan.hasKey("output_rate"))
_samplesPerSec = ConfMan.getInt("output_rate");
else
-#ifdef PALMOS_ARM
- _samplesPerSec = 44100; // default value
-#else
- _samplesPerSec = 8000; // default value
-#endif
+ _samplesPerSec = SAMPLES_PER_SEC;
// try to create sound stream
- if (1 || OPTIONS_TST(kOptPalmSoundAPI)) {
-#ifdef PALMOS_68K
- initRegs(&_sound);
-#endif
+ if (OPTIONS_TST(kOptPalmSoundAPI)) {
e = SndStreamCreateExtended(
- &_sound.handle,
+ &_soundEx.handle,
sndOutput,
sndFormatPCM,
_samplesPerSec,
-#ifdef PALMOS_ARM
- sndInt16Little,
-#else
+#ifdef PALMOS_68K
sndInt16Big,
+#else
+ sndInt16Little,
#endif
sndStereo,
- (SndStreamVariableBufferCallback)sndCallback,
- &_sound,
+ sound_callback(),
+ &_soundEx,
8192
#ifdef PALMOS_68K
,false
+#elif defined (COMPILE_OS5)
+ ,true
#endif
);
- e = e ? e : SndStreamStart(_sound.handle);
- e = e ? e : SndStreamSetVolume(_sound.handle, (32767L / 16) * gVars->palmVolume / 100);
+ e = e ? e : SndStreamStart(_soundEx.handle);
+ e = e ? e : SndStreamSetVolume(_soundEx.handle, 1024L * gVars->palmVolume / 100);
success = (e == errNone);
+
+ // no Sound API
+ } else {
+ _soundEx.size = 512;
+ _soundEx.dataP = MemPtrNew(_soundEx.size);
}
}
// if not true some scenes (indy3 256,...) may freeze (ESC to skip)
@@ -117,12 +127,16 @@
void OSystem_PalmOS5::clearSoundCallback() {
if (_sound.active) {
- if (1 || OPTIONS_TST(kOptPalmSoundAPI)) {
- SndStreamStop(_sound.handle);
- SndStreamDelete(_sound.handle);
+ if (OPTIONS_TST(kOptPalmSoundAPI)) {
+ SndStreamStop(_soundEx.handle);
+ SndStreamDelete(_soundEx.handle);
}
+
+ if (_soundEx.dataP)
+ free(_soundEx.dataP);
}
-
+
_sound.active = false;
- _sound.handle = NULL;
+ _soundEx.handle = NULL;
+ _soundEx.dataP = NULL;
}
More information about the Scummvm-git-logs
mailing list