diff options
Diffstat (limited to 'graphics/cursorman.cpp')
-rw-r--r-- | graphics/cursorman.cpp | 96 |
1 files changed, 43 insertions, 53 deletions
diff --git a/graphics/cursorman.cpp b/graphics/cursorman.cpp index 5fe58314b3..00932e55b0 100644 --- a/graphics/cursorman.cpp +++ b/graphics/cursorman.cpp @@ -56,42 +56,34 @@ bool CursorManager::showMouse(bool visible) { // Should work, even if there's just a dummy cursor on the stack. return g_system->showMouse(visible); } -#ifdef ENABLE_16BIT -void CursorManager::pushCursor16(const byte *buf, uint w, uint h, int hotspotX, int hotspotY, uint16 keycolor, int targetScale) { - Cursor16 *cur = new Cursor16(buf, w, h, hotspotX, hotspotY, keycolor, targetScale); - - cur->_visible = isVisible(); - _cursor16Stack.push(cur); - if (buf) { - g_system->setMouseCursor16(cur->_data, w, h, hotspotX, hotspotY, keycolor, targetScale); - } +void CursorManager::pushCursor(const byte *buf, uint w, uint h, int hotspotX, int hotspotY, byte keycolor, int targetScale) { +#ifdef ENABLE_16BIT + pushCursorReal(buf,w,h,hotspotX,hotspotY,keycolor,targetScale,8); } - -void CursorManager::popCursor16() { - if (_cursor16Stack.empty()) - return; - - Cursor16 *cur = _cursor16Stack.pop(); - delete cur; - - if (!_cursorStack.empty()) { - cur = _cursor16Stack.top(); - g_system->setMouseCursor16(cur->_data, cur->_width, cur->_height, cur->_hotspotX, cur->_hotspotY, cur->_keycolor, cur->_targetScale); +void CursorManager::pushCursorReal(const byte *buf, uint w, uint h, int hotspotX, int hotspotY, uint32 keycolor, int targetScale, uint8 bitDepth) { + uint32 colmask = 0xFF; + uint8 byteDepth = bitDepth >> 3; + for (int i = byteDepth; i > 1; i--) { + colmask <<= 8; + colmask |= 0xFF; } + keycolor &= colmask; - g_system->showMouse(isVisible()); -} -#endif - -void CursorManager::pushCursor(const byte *buf, uint w, uint h, int hotspotX, int hotspotY, byte keycolor, int targetScale) { + Cursor *cur = new Cursor(buf, w, h, hotspotX, hotspotY, keycolor, targetScale, bitDepth); +#else Cursor *cur = new Cursor(buf, w, h, hotspotX, hotspotY, keycolor, targetScale); +#endif cur->_visible = isVisible(); _cursorStack.push(cur); if (buf) { +#ifdef ENABLE_16BIT + g_system->setMouseCursor(cur->_data, w, h, hotspotX, hotspotY, keycolor, targetScale, bitDepth); +#else g_system->setMouseCursor(cur->_data, w, h, hotspotX, hotspotY, keycolor, targetScale); +#endif } } @@ -104,7 +96,11 @@ void CursorManager::popCursor() { if (!_cursorStack.empty()) { cur = _cursorStack.top(); +#ifdef ENABLE_16BIT + g_system->setMouseCursor(cur->_data, cur->_width, cur->_height, cur->_hotspotX, cur->_hotspotY, cur->_keycolor, cur->_targetScale, cur->_bitDepth); +#else g_system->setMouseCursor(cur->_data, cur->_width, cur->_height, cur->_hotspotX, cur->_hotspotY, cur->_keycolor, cur->_targetScale); +#endif } g_system->showMouse(isVisible()); @@ -127,47 +123,37 @@ void CursorManager::popAllCursors() { g_system->showMouse(isVisible()); } +void CursorManager::replaceCursor(const byte *buf, uint w, uint h, int hotspotX, int hotspotY, byte keycolor, int targetScale) { #ifdef ENABLE_16BIT -//HACK Made a separate method to avoid massive linker errors on every engine -void CursorManager::replaceCursor16(const byte *buf, uint w, uint h, int hotspotX, int hotspotY, uint16 keycolor, int targetScale) { - if (_cursorStack.empty()) { - pushCursor16(buf, w, h, hotspotX, hotspotY, keycolor, targetScale); - return; - } - - Cursor *cur = _cursorStack.top(); - - uint size = w * h * 2; + replaceCursorReal(buf,w,h,hotspotX,hotspotY,keycolor,targetScale); +} - if (cur->_size < size) { - delete[] cur->_data; - cur->_data = new byte[size]; - cur->_size = size; +void CursorManager::replaceCursorReal(const byte *buf, uint w, uint h, int hotspotX, int hotspotY, uint32 keycolor, int targetScale, uint8 bitDepth) { + uint32 colmask = 0xFF; + uint8 byteDepth = bitDepth >> 3; + for (int i = byteDepth; i > 1; i--) { + colmask <<= 8; + colmask |= 0xFF; } + keycolor &= colmask; - if (buf && cur->_data) - memcpy(cur->_data, buf, size); - - cur->_width = w; - cur->_height = h; - cur->_hotspotX = hotspotX; - cur->_hotspotY = hotspotY; - cur->_keycolor = keycolor; - cur->_targetScale = targetScale; - - g_system->setMouseCursor16(cur->_data, w, h, hotspotX, hotspotY, keycolor, targetScale); -} #endif - -void CursorManager::replaceCursor(const byte *buf, uint w, uint h, int hotspotX, int hotspotY, byte keycolor, int targetScale) { if (_cursorStack.empty()) { +#ifdef ENABLE_16BIT + pushCursorReal(buf, w, h, hotspotX, hotspotY, keycolor, targetScale, bitDepth); +#else pushCursor(buf, w, h, hotspotX, hotspotY, keycolor, targetScale); +#endif return; } Cursor *cur = _cursorStack.top(); +#ifdef ENABLE_16BIT + uint size = w * h * (bitDepth >> 3); +#else uint size = w * h; +#endif if (cur->_size < size) { delete[] cur->_data; @@ -185,7 +171,11 @@ void CursorManager::replaceCursor(const byte *buf, uint w, uint h, int hotspotX, cur->_keycolor = keycolor; cur->_targetScale = targetScale; +#ifdef ENABLE_16BIT + g_system->setMouseCursor(cur->_data, w, h, hotspotX, hotspotY, keycolor, targetScale, bitDepth); +#else g_system->setMouseCursor(cur->_data, w, h, hotspotX, hotspotY, keycolor, targetScale); +#endif } void CursorManager::disableCursorPalette(bool disable) { |