aboutsummaryrefslogtreecommitdiff
path: root/engines/simon/cursor.cpp
diff options
context:
space:
mode:
authorTorbjörn Andersson2006-05-02 18:04:22 +0000
committerTorbjörn Andersson2006-05-02 18:04:22 +0000
commit5b779be4ac803e4dd3a08cd5d60a13a696a29f96 (patch)
treee7092d38f1a6301fb1d8e24591ca263db7a84100 /engines/simon/cursor.cpp
parent7bc4944a3bf20598b2663f3ffa5c545da1fc5f65 (diff)
downloadscummvm-rg350-5b779be4ac803e4dd3a08cd5d60a13a696a29f96.tar.gz
scummvm-rg350-5b779be4ac803e4dd3a08cd5d60a13a696a29f96.tar.bz2
scummvm-rg350-5b779be4ac803e4dd3a08cd5d60a13a696a29f96.zip
Let's try this again: Let the backend draw the mouse cursor, instead of drawing
it ourselves. This time it seems to work. svn-id: r22279
Diffstat (limited to 'engines/simon/cursor.cpp')
-rw-r--r--engines/simon/cursor.cpp138
1 files changed, 30 insertions, 108 deletions
diff --git a/engines/simon/cursor.cpp b/engines/simon/cursor.cpp
index cc18971db8..b6bc9f30b3 100644
--- a/engines/simon/cursor.cpp
+++ b/engines/simon/cursor.cpp
@@ -393,15 +393,9 @@ const byte _mouseOffs[] = {
0,0,10,7,10,6,10,5,10,4,10,3,10,4,10,5,10,6,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
};
-// TODO: Convert to our mouse code in system
void SimonEngine::drawMousePointer_FF() {
- byte *dst;
- uint curCursor;
+ uint cursor;
int image, offs;
- int pitch;
-
- dst = getBackBuf();
- pitch = _screenWidth;
if (_animatePointer != 0) {
if (getBitFlag(99)) {
@@ -415,128 +409,56 @@ void SimonEngine::drawMousePointer_FF() {
_mouseAnim = 1;
}
- _mouseCountY = 40;
- _mouseCountX = 40;
-
- if (_mouseY < 19)
- _mouseCountY -= 19 - _mouseY;
- else
- dst += (((_mouseY - 19) * (pitch / 16)) & 0xffff) * 16;
-
- if (_mouseX < 19)
- _mouseCountX -= 19 - _mouseX;
- else
- dst += _mouseX - 19;
-
- if (_mouseCountY == 40) {
- _mouseCountY = 499 - _mouseY;
- if (_mouseCountY > 40)
- _mouseCountY = 40;
- }
-
- if (_mouseCountX == 40) {
- _mouseCountX = 659 - _mouseX;
- if (_mouseCountX > 40)
- _mouseCountX = 40;
- }
+ cursor = _mouseCursor;
- curCursor = _mouseCursor;
if (_animatePointer == 0 && getBitFlag(99)) {
_mouseAnim = 1;
- curCursor = 6;
+ cursor = 6;
} else if (_mouseCursor != 5 && getBitFlag(72)) {
- curCursor += 7;
+ cursor += 7;
}
- image = curCursor * 16 + 1;
- offs = curCursor * 32;
- drawMousePart(dst, pitch, image, offs);
+ if (cursor != _currentMouseCursor || _mouseAnim != _currentMouseAnim) {
+ _currentMouseCursor = cursor;
+ _currentMouseAnim = _mouseAnim;
+
+ memset(_mouseData, 0, sizeof(_mouseData));
+
+ image = cursor * 16 + 1;
+ offs = cursor * 32;
+ drawMousePart(image, _mouseOffs[offs], _mouseOffs[offs + 1]);
+
+ image = cursor * 16 + 1 + _mouseAnim;
+ offs = cursor * 32 + _mouseAnim * 2;
+ drawMousePart(image, _mouseOffs[offs], _mouseOffs[offs + 1]);
- image = curCursor * 16 + 1 + _mouseAnim;
- offs = curCursor * 32 + _mouseAnim * 2;
- drawMousePart(dst, pitch, image, offs);
+ _system->setMouseCursor(_mouseData, kMaxCursorWidth, kMaxCursorHeight, 19, 19, 0);
+ }
}
-void SimonEngine::drawMousePart(byte *dst, int pitch, int image, int offs) {
+void SimonEngine::drawMousePart(int image, byte x, byte y) {
VgaPointersEntry *vpe = &_vgaBufferPointers[7];
byte *src;
- int x, y, width, height;
- int tmp, srcw;
-
- x = _mouseOffs[offs];
- y = _mouseOffs[offs + 1];
+ int width, height;
- dst += y * pitch + x;
+ byte *dst = _mouseData + y * kMaxCursorWidth + x;
src = vpe->vgaFile2 + image * 8;
- srcw = width = READ_LE_UINT16(src + 6);
+ width = READ_LE_UINT16(src + 6);
height = READ_LE_UINT16(src + 4);
- src = vpe->vgaFile2 + readUint32Wrapper(src);
+ src = vpe->vgaFile2 + READ_LE_UINT32(src);
- if (_mouseCountX != 40) {
- if (_mouseX >= 600) {
- tmp = _mouseOffs[offs] + width - _mouseCountX;
- if (tmp >= 0) {
- width -= tmp;
- if (width <= 0)
- return;
- }
- } else {
- if (_mouseOffs[offs] + _mouseCountX >= 40) {
- dst -= 40 - _mouseCountX;
- } else {
- dst -= _mouseOffs[offs];
- tmp = -(_mouseOffs[offs] + _mouseCountX - 40);
- width -= tmp;
- if (width <= 0)
- return;
- src += tmp;
- }
- }
- }
+ assert(width + x <= kMaxCursorWidth);
+ assert(height + y <= kMaxCursorWidth);
- if (_mouseCountY != 40) {
- if (_mouseY >= 200) {
- tmp = _mouseOffs[offs + 1] + height - _mouseCountY;
- if (tmp >= 0) {
- height -= tmp;
- if (height <= 0)
- return;
- }
- } else {
- if (_mouseOffs[offs + 1] + _mouseCountY >= 40) {
- tmp = 40 - _mouseCountY;
- while (tmp--)
- dst -= pitch;
- } else {
- tmp = _mouseOffs[offs + 1];
- while (tmp--)
- dst -= pitch;
- tmp = -(_mouseOffs[offs + 1] + _mouseCountY - 40);
- height -= tmp;
- if (height <= 0)
- return;
- while (tmp--)
- src += srcw;
- }
- }
- }
-
- drawMouse(dst, pitch, src, srcw, width, height);
-}
-
-void SimonEngine::drawMouse(byte *dst, int pitch, byte *src, int srcw, int width, int height) {
- int h, w;
-
- for (h = 0; h < height; h++) {
- for (w = 0; w < width; w++) {
+ for (int h = 0; h < height; h++) {
+ for (int w = 0; w < width; w++) {
if (src[w] != 0)
dst[w] = src[w];
-
}
- src += srcw;
- dst += pitch;
+ src += width;
+ dst += kMaxCursorWidth;
}
}