From c34e30ea79d146dd67ce0067bc96098b87fbfcbf Mon Sep 17 00:00:00 2001 From: Travis Howell Date: Sun, 30 Apr 2006 12:56:13 +0000 Subject: Revert last change to mouse cursors in FF, causes odd glitches svn-id: r22243 --- engines/simon/cursor.cpp | 110 +++++++++++++++++++++++++++++++++++++++-------- engines/simon/simon.cpp | 2 +- engines/simon/simon.h | 5 ++- 3 files changed, 98 insertions(+), 19 deletions(-) (limited to 'engines') 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); -- cgit v1.2.3