scummvm/backends/PalmOS/Src/os5_gfx.cpp
Chris Apers 01fdeba50a New OS5 backend :
- 16bit support
- Added SetWindowCaption function
- New 'no thread' sound code
- Wide mode support
- OSD support

svn-id: r20145
2006-01-23 19:23:52 +00:00

318 lines
7.7 KiB
C++
Executable File

/* 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$
*
*/
#include "be_os5.h"
#include <PenInputMgr.h>
#include <palmOneResources.h>
#ifdef PALMOS_ARM
#include <System/WIP.h>
#include <Libraries/AIA/palmOneStatusBarMgrARM.h>
#endif
#include "oscalls.h"
void OSystem_PalmOS5::int_initSize(uint w, uint h, int overlayScale) {
}
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;
_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);
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();
_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
// 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() {
if (!_gfxLoaded)
return;
_gfxLoaded = 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) {
// 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;
byte *dst = _offScreenP + y * _screenWidth + x;
if (w == pitch && w == _screenWidth) {
MemMove(dst, buf, w * h);
} else {
do {
MemMove(dst, buf, w);
dst += _screenWidth;
buf += pitch;
} while (--h);
}
}
void OSystem_PalmOS5::int_updateScreen() {
RectangleType r;
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() {
RGBColorType rgb = { 0,0,0,0 };
WinSetDrawWindow(WinGetDisplayWindow());
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);
}
}