aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTravis Howell2006-04-30 12:56:13 +0000
committerTravis Howell2006-04-30 12:56:13 +0000
commitc34e30ea79d146dd67ce0067bc96098b87fbfcbf (patch)
tree4dd95e0f2c874aa029114fa8b336b46d28146019
parent49dbcc591e6f20615eb8fe18149a7fdb6a150aa7 (diff)
downloadscummvm-rg350-c34e30ea79d146dd67ce0067bc96098b87fbfcbf.tar.gz
scummvm-rg350-c34e30ea79d146dd67ce0067bc96098b87fbfcbf.tar.bz2
scummvm-rg350-c34e30ea79d146dd67ce0067bc96098b87fbfcbf.zip
Revert last change to mouse cursors in FF, causes odd glitches
svn-id: r22243
-rw-r--r--engines/simon/cursor.cpp110
-rw-r--r--engines/simon/simon.cpp2
-rw-r--r--engines/simon/simon.h5
3 files changed, 98 insertions, 19 deletions
diff --git a/engines/simon/cursor.cpp b/engines/simon/cursor.cpp
index bcb6a5dfb3..48e6fd8e3b 100644
--- a/engines/simon/cursor.cpp
+++ b/engines/simon/cursor.cpp
@@ -393,14 +393,15 @@ 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;
- int image, offs, pitch;
- int hotSpotX, hotSpotY;
+ int image, offs;
+ int pitch;
- dst = (byte *)calloc(80 * 80, 1);
- pitch = 80;
+ dst = getBackBuf();
+ pitch = _screenWidth;
if (_animatePointer != 0) {
if (getBitFlag(99)) {
@@ -414,6 +415,31 @@ 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 < 38)
+ _mouseCountX -= 38 - _mouseX;
+ else
+ dst += _mouseX - 38;
+
+ if (_mouseCountY == 40) {
+ _mouseCountY = 499 - _mouseY;
+ if (_mouseCountY > 40)
+ _mouseCountY = 40;
+ }
+
+ if (_mouseCountX == 40) {
+ _mouseCountX = 659 - _mouseX;
+ if (_mouseCountX > 40)
+ _mouseCountX = 40;
+ }
+
curCursor = _mouseCursor;
if (_animatePointer == 0 && getBitFlag(99)) {
_mouseAnim = 1;
@@ -424,21 +450,18 @@ void SimonEngine::drawMousePointer_FF() {
image = curCursor * 16 + 1;
offs = curCursor * 32;
- drawMousePart(dst, pitch, image, offs, hotSpotX, hotSpotY);
+ drawMousePart(dst, pitch, image, offs);
image = curCursor * 16 + 1 + _mouseAnim;
offs = curCursor * 32 + _mouseAnim * 2;
- drawMousePart(dst, pitch, image, offs, hotSpotX, hotSpotY);
-
- _system->setMouseCursor(dst, 80, 80, hotSpotX, hotSpotY, 0);
- free(dst);
+ drawMousePart(dst, pitch, image, offs);
}
-void SimonEngine::drawMousePart(byte *dst, int pitch, int image, int offs, int &hotSpotX, int &hotSpotY) {
+void SimonEngine::drawMousePart(byte *dst, int pitch, int image, int offs) {
VgaPointersEntry *vpe = &_vgaBufferPointers[7];
byte *src;
- int x, y, w, h;
- int width, height;
+ int x, y, width, height;
+ int tmp, srcw;
x = _mouseOffs[offs];
y = _mouseOffs[offs + 1];
@@ -446,23 +469,76 @@ void SimonEngine::drawMousePart(byte *dst, int pitch, int image, int offs, int &
dst += y * pitch + x;
src = vpe->vgaFile2 + image * 8;
- width = READ_LE_UINT16(src + 6);
+ srcw = width = READ_LE_UINT16(src + 6);
height = READ_LE_UINT16(src + 4);
src = vpe->vgaFile2 + readUint32Wrapper(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;
+ }
+ }
+ }
+
+ if (_mouseCountY != 40) {
+ if (_mouseY >= 200) {
+ tmp = _mouseOffs[offs + 1] + height - _mouseCountY;
+ if (tmp >= 0) {
+ height -= tmp;
+ if (height <= 0)
+ return;
+ }
+ } else {
+ tmp = _mouseOffs[offs + 1] + _mouseCountY;
+ if (tmp >= 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++) {
if (src[w] != 0)
dst[w] = src[w];
}
- src += width;
+ src += srcw;
dst += pitch;
}
-
- hotSpotX = (x + width) / 2;
- hotSpotY = (y + height) / 2;
}
} // End of namespace Simon
diff --git a/engines/simon/simon.cpp b/engines/simon/simon.cpp
index b634e8fa15..24c94d3ed2 100644
--- a/engines/simon/simon.cpp
+++ b/engines/simon/simon.cpp
@@ -31,6 +31,7 @@
#include "gui/about.h"
#include "simon/debugger.h"
+#include "simon/intern.h"
#include "simon/simon.h"
#include "simon/vga.h"
@@ -163,7 +164,6 @@ SimonEngine::SimonEngine(OSystem *syst)
_mouseAnimMax = 0;
_oldMouseCursor = 0;
_oldMouseAnimMax = 0;
- _mouseToggle = false;
_vgaVar9 = 0;
_chanceModifier = 0;
diff --git a/engines/simon/simon.h b/engines/simon/simon.h
index e03206c5e7..e46c108435 100644
--- a/engines/simon/simon.h
+++ b/engines/simon/simon.h
@@ -325,6 +325,7 @@ protected:
byte _mouseCursor, _mouseAnim, _mouseAnimMax;
byte _oldMouseCursor, _oldMouseAnimMax;
uint _mouseHideCount;
+ int _mouseCountX, _mouseCountY;
bool _mouseToggle;
byte _leftButtonDown;
@@ -674,7 +675,9 @@ protected:
void pollMouseXY();
void drawMousePointer();
void drawMousePointer_FF();
- void drawMousePart(byte *dst, int pitch, int image, int offs, int &hotSpotX, int &hotSpotY);
+ void drawMouse(byte *dst, int pitch, byte *src, int srcw, int width, int height);
+ void drawMousePart(byte *dst, int pitch, int image, int offs);
+
void defineArrowBoxes(WindowBlock *window);
void removeArrows(WindowBlock *window, uint num);