aboutsummaryrefslogtreecommitdiff
path: root/backends/PalmOS/Src
diff options
context:
space:
mode:
authorChris Apers2004-05-25 14:18:51 +0000
committerChris Apers2004-05-25 14:18:51 +0000
commit530fd01fa365f5f9fa35d193ccbe33d7d4a51ce9 (patch)
tree0ee69b0156888a79c7008f4622603158b946a3d9 /backends/PalmOS/Src
parentb9d56f4424e2ed30c3644c0fb8cff0f0b0eccc5e (diff)
downloadscummvm-rg350-530fd01fa365f5f9fa35d193ccbe33d7d4a51ce9.tar.gz
scummvm-rg350-530fd01fa365f5f9fa35d193ccbe33d7d4a51ce9.tar.bz2
scummvm-rg350-530fd01fa365f5f9fa35d193ccbe33d7d4a51ce9.zip
New file : OSystem mouse only, removed memory check using overlays
svn-id: r13881
Diffstat (limited to 'backends/PalmOS/Src')
-rw-r--r--backends/PalmOS/Src/palmmos.cpp188
1 files changed, 188 insertions, 0 deletions
diff --git a/backends/PalmOS/Src/palmmos.cpp b/backends/PalmOS/Src/palmmos.cpp
new file mode 100644
index 0000000000..2586a50001
--- /dev/null
+++ b/backends/PalmOS/Src/palmmos.cpp
@@ -0,0 +1,188 @@
+/* ScummVM - Scumm Interpreter
+ * Copyright (C) 2001 Ludvig Strigeus
+ * Copyright (C) 2001-2004 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+ *
+ * $Header$
+ *
+ */
+#include "stdafx.h"
+#include "palm.h"
+
+
+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 = (byte *)malloc(w * h);
+ memcpy(_mouseDataP, buf, w * h);
+
+ undraw_mouse();
+}
+
+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 {
+ int offset = y * _screenWidth + x;
+ dst = _tmpScreenP;
+
+ while (h > 0) {
+ width = w;
+ while (width > 0) {
+ *bak++ = *(dst + offset);
+ color = *src++;
+ if (color != _mouseKeyColor) // transparent, don't draw
+ DmWrite(dst, offset, &color, 1);
+ offset++;
+ width--;
+ }
+ src += _mouseCurState.w - w;
+ bak += MAX_MOUSE_W - w;
+ offset += _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 {
+ 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);
+ }
+}
+