diff options
author | Torbjörn Andersson | 2006-05-02 18:04:22 +0000 |
---|---|---|
committer | Torbjörn Andersson | 2006-05-02 18:04:22 +0000 |
commit | 5b779be4ac803e4dd3a08cd5d60a13a696a29f96 (patch) | |
tree | e7092d38f1a6301fb1d8e24591ca263db7a84100 | |
parent | 7bc4944a3bf20598b2663f3ffa5c545da1fc5f65 (diff) | |
download | scummvm-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
-rw-r--r-- | engines/simon/cursor.cpp | 138 | ||||
-rw-r--r-- | engines/simon/simon.cpp | 2 | ||||
-rw-r--r-- | engines/simon/simon.h | 12 |
3 files changed, 40 insertions, 112 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; } } diff --git a/engines/simon/simon.cpp b/engines/simon/simon.cpp index 24c94d3ed2..232e3ebe6f 100644 --- a/engines/simon/simon.cpp +++ b/engines/simon/simon.cpp @@ -163,6 +163,8 @@ SimonEngine::SimonEngine(OSystem *syst) _mouseAnim = 0; _mouseAnimMax = 0; _oldMouseCursor = 0; + _currentMouseCursor = 255; + _currentMouseAnim = 255; _oldMouseAnimMax = 0; _vgaVar9 = 0; diff --git a/engines/simon/simon.h b/engines/simon/simon.h index e46c108435..100b2f8658 100644 --- a/engines/simon/simon.h +++ b/engines/simon/simon.h @@ -321,11 +321,17 @@ protected: int _mouseX, _mouseY; int _mouseXOld, _mouseYOld; + enum { + kMaxCursorWidth = 40, + kMaxCursorHeight = 40 + }; + + byte _mouseData[kMaxCursorWidth * kMaxCursorHeight]; byte _animatePointer; byte _mouseCursor, _mouseAnim, _mouseAnimMax; + byte _currentMouseCursor, _currentMouseAnim; byte _oldMouseCursor, _oldMouseAnimMax; uint _mouseHideCount; - int _mouseCountX, _mouseCountY; bool _mouseToggle; byte _leftButtonDown; @@ -675,9 +681,7 @@ protected: void pollMouseXY(); void drawMousePointer(); void drawMousePointer_FF(); - 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 drawMousePart(int image, byte x, byte y); void defineArrowBoxes(WindowBlock *window); void removeArrows(WindowBlock *window, uint num); |