diff options
Diffstat (limited to 'backends/PalmOS/Src/palmgfx.cpp')
-rw-r--r-- | backends/PalmOS/Src/palmgfx.cpp | 654 |
1 files changed, 0 insertions, 654 deletions
diff --git a/backends/PalmOS/Src/palmgfx.cpp b/backends/PalmOS/Src/palmgfx.cpp deleted file mode 100644 index 63077626b5..0000000000 --- a/backends/PalmOS/Src/palmgfx.cpp +++ /dev/null @@ -1,654 +0,0 @@ -/* ScummVM - Scumm Interpreter - * Copyright (C) 2001 Ludvig Strigeus - * Copyright (C) 2001-2005 The ScummVM project - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; either version 2 - * of the License, or (at your option) any later version. - - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - * - * $Header$ - * - */ -#include "common/stdafx.h" -#include "palm.h" - -#include "common/scaler.h" -#include "common/util.h" -#include "common/config-manager.h" - -#include <BmpGlue.h> -#include "palmdefs.h" -#include "features.h" -#include "globals.h" - -#ifndef DISABLE_TAPWAVE -#include <tapwave.h> -#include "i_zodiac.h" -#endif - -#include "init_arm.h" -#include "arm/native.h" -#include "arm/macros.h" - -static const OSystem::GraphicsMode s_supportedGraphicsModes[] = { - {"normal", "Normal (no scaling)", GFX_NORMAL}, - {"flipping", "Page Flipping", GFX_FLIPPING}, - {"buffered", "Buffered", GFX_BUFFERED}, - {"wide", "Wide (HiRes+ only)", GFX_WIDE}, - {0, 0, 0} -}; - -int OSystem_PALMOS::getDefaultGraphicsMode() const { - return GFX_NORMAL;//GFX_WIDE; -} - -const OSystem::GraphicsMode *OSystem_PALMOS::getSupportedGraphicsModes() const { - return s_supportedGraphicsModes; -} - -int OSystem_PALMOS::getGraphicsMode() const { - return _mode; -} - -bool OSystem_PALMOS::setGraphicsMode(int mode) { - switch(mode) { - case GFX_NORMAL: - case GFX_FLIPPING: - case GFX_BUFFERED: - case GFX_WIDE: - _setMode = mode; - break; - - default: - warning("unknown gfx mode %d", mode); - _setMode = GFX_NORMAL; - return false; - } - - return true; -} - -void OSystem_PALMOS::initSize(uint w, uint h, int overlayScale) { - _screenWidth = w; - _screenHeight = h; - _offScreenPitch = gVars->screenPitch; // direct screen / flipping use this, reset later if buffered - _screenPitch = gVars->screenPitch; - - _overlayVisible = false; - - // lock the graffiti sizer - if (gVars->slkRefNum != sysInvalidRefNum) { - if (gVars->slkVersion == vskVersionNum1) - SilkLibDisableResize(gVars->slkRefNum); - else - VskSetState(gVars->slkRefNum, vskStateEnable, vskResizeDisable); - - // Tapwave Zodiac and other DIA compatible devices - } else if (OPTIONS_TST(kOptModeWide)) { - PINSetInputTriggerState(pinInputTriggerDisabled); - } - - // don't allow orientation change - if (OPTIONS_TST(kOptCollapsible)) - SysSetOrientationTriggerState(sysOrientationTriggerDisabled); - - set_mouse_pos(200,150); - - unload_gfx_mode(); - - // force WIDE mode for 640x480 games - if (h == 480) - _setMode = GFX_WIDE; - - _mode = _setMode; - _initMode = _mode; - load_gfx_mode(); -} - -int16 OSystem_PALMOS::getHeight() { - return _screenHeight; -} - -int16 OSystem_PALMOS::getWidth() { - return _screenWidth; -} - -static void HotSwap16bitMode(Boolean swap) { - UInt32 width = hrWidth; - UInt32 height= hrHeight; - UInt32 depth = swap ? 16 : 8; - Boolean color = true; - - if (OPTIONS_TST(kOptMode16Bit)) { - WinScreenMode(winScreenModeSet, &width, &height, &depth, &color); - OPTIONS_SET(kOptDisableOnScrDisp); - } -} - -void OSystem_PALMOS::load_gfx_mode() { - Err e; - - if (!_modeChanged) { - // get command line config - _fullscreen = (ConfMan.getBool("fullscreen") && OPTIONS_TST(kOptModeWide)); - _adjustAspectRatio = ConfMan.getBool("aspect_ratio"); - - // get the actual palette - WinPalette(winPaletteGet, 0, 256, _currentPalette); - - // set only if _mode not changed - 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 - }; - - // palette for preload dialog - setPalette(startupPalette, 0, 16); - } - - // check HiRes+ - if (_mode == GFX_WIDE) { - if (OPTIONS_TST(kOptModeWide)) { - Boolean std = true; - -#ifndef DISABLE_TAPWAVE - // check Zodiac - if (OPTIONS_TST(kOptDeviceZodiac)) { - if (ZodiacInit(ptrP, _screenWidth, _screenHeight)) { - OPTIONS_RST(kOptDeviceZodiac); - warning("Failed to initialize Zodiac device, switching to standard GFX_WIDE mode."); - } else { - std = false; - } - } -#endif - if (std) { - // 640x480 only on Zodiac and in GFX_WIDE mode - if (_screenWidth == 640) - error("640x480 games can only be run on Zodiac in wide mode."); - - // only for 320x200 games - if (!(_screenWidth == 320 && _screenHeight == 200)) { - warning("Wide display not available for this game, switching to GFX_NORMAL mode."); - _mode = GFX_NORMAL; - } - } - - } else { - warning("HiRes+ not available 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 (_modeChanged) { - WinSetBackColor(RGBToColor(0,0,0)); - WinEraseWindow(); - } - - if (_mode == GFX_WIDE) { - OPTIONS_SET(kOptDisableOnScrDisp); - _fullscreen = false; - _wide = true; - - if (OPTIONS_TST(kOptDeviceZodiac)) { - // landscape - _screenOffset.x = 0; - _screenOffset.y = (_adjustAspectRatio) ? 10 : 0; - _screenOffset.addr = _screenOffset.y * _screenPitch; - - // others only for 320x200 - } else { - _wide = false; - - _screenOffset.x = 0; - _screenOffset.y = 10; - _screenOffset.addr = (OPTIONS_TST(kOptModeLandscape) ? _screenOffset.y : _screenOffset.x) * _screenPitch; - } - - } else { - OPTIONS_RST(kOptDisableOnScrDisp); - - _screenOffset.x = ((_fullscreen ? gVars->screenFullWidth : gVars->screenWidth) - _screenWidth) >> 1; - _screenOffset.y = ((_fullscreen ? gVars->screenFullHeight : gVars->screenHeight) - _screenHeight) >> 1; - _screenOffset.addr = _screenOffset.x + _screenOffset.y * _screenPitch; - } - - if (OPTIONS_TST(kOptModeHiDensity)) - WinSetCoordinateSystem(kCoordinatesNative); - - // 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, nativeFormat, &e); - _offScreenP = (byte *)(BmpGetBits(WinGetBitmap(_offScreenH))); - - if (_mode == GFX_WIDE) { -#ifndef DISABLE_TAPWAVE - if (OPTIONS_TST(kOptDeviceZodiac)) { - HotSwap16bitMode(true); - clearScreen(); - _twBmpV3 = (void *)WinGetBitmap(_offScreenH); - - // TODO : change _screenP with the correct value (never used in this mode ?) - _screenP = (byte *)(BmpGetBits(WinGetBitmap(_screenH))); - _renderer_proc = &OSystem_PALMOS::updateScreen_wideZodiac; - } else -#endif - { - gVars->screenLocked = true; - _screenP = WinScreenLock(winLockErase) + _screenOffset.addr; - - _renderer_proc = (OPTIONS_TST(kOptModeLandscape)) ? - &OSystem_PALMOS::updateScreen_wideLandscape : - &OSystem_PALMOS::updateScreen_widePortrait; - } - - } 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 (!_modeChanged) { - // try to allocate on storage heap, TODO : error if failed - FtrPtrNew(appFileCreator, ftrBufferOverlay, _screenWidth * _screenHeight, (void **)&_tmpScreenP); - FtrPtrNew(appFileCreator, ftrBufferBackup, _screenWidth * _screenHeight, (void **)&_tmpBackupP); - // only if wide mode available - if OPTIONS_TST(kOptModeWide) - FtrPtrNew(appFileCreator, ftrBufferHotSwap, _screenWidth * _screenHeight, (void **)&_tmpHotSwapP); - - _gfxLoaded = true; - } - -} - -void OSystem_PALMOS::unload_gfx_mode() { - if (!_gfxLoaded) - return; - - WinSetDrawWindow(WinGetDisplayWindow()); - - if (OPTIONS_TST(kOptModeHiDensity)) - WinSetCoordinateSystem(kCoordinatesStandard); - - switch (_mode) { - case GFX_FLIPPING: - WinScreenUnlock(); - gVars->screenLocked = false; - break; - - case GFX_WIDE: -#ifndef DISABLE_TAPWAVE - if (OPTIONS_TST(kOptDeviceZodiac)) { - ZodiacRelease(ptrP); - HotSwap16bitMode(false); - clearScreen(); - } else -#endif - { - WinScreenUnlock(); - gVars->screenLocked = false; - } - // continue to GFX_BUFFERED - - case GFX_BUFFERED: - WinDeleteWindow(_offScreenH, false); - break; - } - - // restore silkarea - // -- Sony wide - if (gVars->slkRefNum != sysInvalidRefNum) { - if (gVars->slkVersion == vskVersionNum1) { - SilkLibEnableResize (gVars->slkRefNum); - SilkLibResizeDispWin(gVars->slkRefNum, silkResizeNormal); - SilkLibDisableResize(gVars->slkRefNum); - } else { - VskSetState(gVars->slkRefNum, vskStateEnable, (gVars->slkVersion != vskVersionNum3 ? vskResizeVertically : vskResizeHorizontally)); - VskSetState(gVars->slkRefNum, vskStateResize, vskResizeMax); - VskSetState(gVars->slkRefNum, vskStateEnable, vskResizeDisable); - } - - // -- Tapwave Zodiac and other DIA compatible devices - } else if (OPTIONS_TST(kOptModeWide)) { - StatShow(); - PINSetInputAreaState(pinInputAreaOpen); - } - - if (!_modeChanged) { - // free only if _mode not changed - if (_tmpScreenP) - FtrPtrFree(appFileCreator, ftrBufferOverlay); - - if (_tmpBackupP) - FtrPtrFree(appFileCreator, ftrBufferBackup); - - if OPTIONS_TST(kOptModeWide) - if (_tmpHotSwapP) - FtrPtrFree(appFileCreator, ftrBufferHotSwap); - } -} - -void OSystem_PALMOS::hotswap_gfx_mode(int mode) { - // save current offscreen - byte *src = _offScreenP; - byte *dst = _tmpHotSwapP; - int h = _screenHeight; - - undraw_mouse(); - - UInt32 offset = 0; - do { - DmWrite(dst, offset, src, _screenWidth); - offset += _screenWidth; - src += _offScreenPitch; - } while (--h); - _modeChanged = true; - - // reset offscreen pitch - _offScreenPitch = gVars->screenPitch; - - // free old mode memory - unload_gfx_mode(); - - // load new gfx mode - _mode = mode; - load_gfx_mode(); - - // restore offscreen - WinPalette(winPaletteSet, 0, 256, _currentPalette); - clearScreen(); - copyRectToScreen(_tmpHotSwapP, _screenWidth, 0, 0, _screenWidth, _screenHeight); - _modeChanged = false; - - // force palette update - _paletteDirtyStart = 0; - _paletteDirtyEnd = 256; - - updateScreen(); -} - -// TODO : move GFX functions here - -void OSystem_PALMOS::setPalette(const byte *colors, uint start, uint num) { - 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; -} - -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; - } - } - } - - return color; -} - -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 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) - undraw_mouse(); - - byte *dst = _offScreenP + y * _offScreenPitch + x; - - // if ARM - ARM_CHECK_EXEC(w > 8 && h > 8) - ARM_START(CopyRectangleType) - ARM_INIT(COMMON_COPYRECT) - ARM_ADDM(dst) - ARM_ADDM(buf) - ARM_ADDM(pitch) - ARM_ADDM(_offScreenPitch) - ARM_ADDM(w) - ARM_ADDM(h) - ARM_CALL(ARM_COMMON, PNO_DATA()); - ARM_END() - ARM_CHECK_END() - // if no ARM - if (w == pitch && w == _offScreenPitch) { - MemMove(dst, buf, w*h); - } else { - do { - MemMove(dst, buf, w); - dst += _offScreenPitch; - buf += pitch; - } while (--h); - } -} - -void OSystem_PALMOS::updateScreen() { - // 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 (_showBatLow) - draw1BitGfx(kDrawBatLow, (getWidth() >> 1), -16, true); - } - } - - // Make sure the mouse is drawn, if it should be drawn. - draw_mouse(); - - 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))(); -} - -void OSystem_PALMOS::draw1BitGfx(UInt16 id, Int32 x, Int32 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::clearScreen() { - Coord w, h; - RectangleType r; - - WinSetDrawWindow(WinGetDisplayWindow()); - WinGetDisplayExtent(&w, &h); - RctSetRectangle(&r, 0, 0, w, h); - WinSetForeColor(RGBToColor(0,0,0)); - WinDrawRectangle(&r,0); -} |