Fixes ScummEngine_v70he::setDefaultCursor to work in 16-bit, using a temporary hack.

svn-id: r41204
This commit is contained in:
Jody Northup 2009-06-05 23:59:40 +00:00
parent ccee18a489
commit d65bbe1d7a
5 changed files with 101 additions and 9 deletions

View file

@ -112,7 +112,7 @@ void ScummEngine_v6::setCursorTransparency(int a) {
void ScummEngine::updateCursor() { void ScummEngine::updateCursor() {
int transColor = (_game.heversion >= 80) ? 5 : 255; int transColor = (_game.heversion >= 80) ? 5 : 255;
if (_game.features & GF_16BIT_COLOR && _hePalettes) { if (_game.features & GF_16BIT_COLOR) {
//HACK Had to make a second method to avoid many, many linker errors from other engines //HACK Had to make a second method to avoid many, many linker errors from other engines
//this requires ENABLE_16BIT to be defined in the Scumm project, again, because I #ifdef'ed //this requires ENABLE_16BIT to be defined in the Scumm project, again, because I #ifdef'ed
//the method's definition and declaration in cursorman.h //the method's definition and declaration in cursorman.h
@ -176,8 +176,13 @@ void ScummEngine_v70he::setDefaultCursor() {
static const byte palette[] = {0, 0, 0, 0, static const byte palette[] = {0, 0, 0, 0,
0xff, 0xff, 0xff, 0, 0xff, 0xff, 0xff, 0,
0, 0, 0, 0}; 0, 0, 0, 0};
memset(_grabbedCursor, 5, sizeof(_grabbedCursor)); if (_bitDepth == 2) {
for (i = 0; i < 1024; i++)
WRITE_UINT16(_grabbedCursor + i * 2, 5);
} else {
memset(_grabbedCursor, 5, sizeof(_grabbedCursor));
}
_cursor.hotspotX = _cursor.hotspotY = 2; _cursor.hotspotX = _cursor.hotspotY = 2;
src = default_he_cursor; src = default_he_cursor;
@ -190,10 +195,16 @@ void ScummEngine_v70he::setDefaultCursor() {
for (j = 0; j < 32; j++) { for (j = 0; j < 32; j++) {
switch ((p & (0x3 << 14)) >> 14) { switch ((p & (0x3 << 14)) >> 14) {
case 1: case 1:
_grabbedCursor[32 * i + j] = 0xfe; if (_bitDepth == 2)
WRITE_UINT16(_grabbedCursor + 64 * i + j * 2, get16BitColor(palette[4], palette[5], palette[6]));
else
_grabbedCursor[32 * i + j] = 0xfe;
break; break;
case 2: case 2:
_grabbedCursor[32 * i + j] = 0xfd; if (_bitDepth == 2)
WRITE_UINT16(_grabbedCursor + 64 * i + j * 2, get16BitColor(palette[0], palette[1], palette[2]));
else
_grabbedCursor[32 * i + j] = 0xfd;
break; break;
default: default:
break; break;
@ -205,9 +216,11 @@ void ScummEngine_v70he::setDefaultCursor() {
} }
} }
// Since white color position is not guaranteed if (_bitDepth == 1) {
// we setup our own palette if supported by backend // Since white color position is not guaranteed
CursorMan.replaceCursorPalette(palette, 0xfd, 3); // we setup our own palette if supported by backend
CursorMan.replaceCursorPalette(palette, 0xfd, 3);
}
updateCursor(); updateCursor();
} }

View file

@ -56,6 +56,33 @@ bool CursorManager::showMouse(bool visible) {
// Should work, even if there's just a dummy cursor on the stack. // Should work, even if there's just a dummy cursor on the stack.
return g_system->showMouse(visible); 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::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);
}
g_system->showMouse(isVisible());
}
#endif
void CursorManager::pushCursor(const byte *buf, uint w, uint h, int hotspotX, int hotspotY, byte keycolor, int targetScale) { 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); Cursor *cur = new Cursor(buf, w, h, hotspotX, hotspotY, keycolor, targetScale);
@ -104,7 +131,7 @@ void CursorManager::popAllCursors() {
//HACK Made a separate method to avoid massive linker errors on every engine //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) { void CursorManager::replaceCursor16(const byte *buf, uint w, uint h, int hotspotX, int hotspotY, uint16 keycolor, int targetScale) {
if (_cursorStack.empty()) { if (_cursorStack.empty()) {
pushCursor(buf, w, h, hotspotX, hotspotY, keycolor, targetScale); pushCursor16(buf, w, h, hotspotX, hotspotY, keycolor, targetScale);
return; return;
} }

View file

@ -64,6 +64,13 @@ public:
*/ */
void popCursor(); void popCursor();
#ifdef ENABLE_16BIT
//HACK This is such a incredible hack
//I really need to make the one method
//work under multiple bitdepths
void pushCursor16(const byte *buf, uint w, uint h, int hotspotX, int hotspotY, uint16 keycolor = 65535, int targetScale = 1);
void popCursor16();
#endif
/** /**
* Replace the current cursor on the stack. If the stack is empty, the * Replace the current cursor on the stack. If the stack is empty, the
* cursor is pushed instead. It's a slightly more optimized way of * cursor is pushed instead. It's a slightly more optimized way of
@ -137,7 +144,37 @@ public:
private: private:
friend class Common::Singleton<SingletonBaseType>; friend class Common::Singleton<SingletonBaseType>;
CursorManager(); CursorManager();
#ifdef ENABLE_16BIT
struct Cursor16 {
byte *_data;
bool _visible;
uint _width;
uint _height;
int _hotspotX;
int _hotspotY;
uint16 _keycolor;
byte _targetScale;
uint _size;
Cursor16(const byte *data, uint w, uint h, int hotspotX, int hotspotY, uint16 keycolor = 65535, int targetScale = 1) {
_size = w * h * 2;
_data = new byte[_size];
if (data && _data)
memcpy(_data, data, _size);
_width = w;
_height = h;
_hotspotX = hotspotX;
_hotspotY = hotspotY;
_keycolor = keycolor;
_targetScale = targetScale;
}
~Cursor16() {
delete[] _data;
}
};
#endif
struct Cursor { struct Cursor {
byte *_data; byte *_data;
bool _visible; bool _visible;
@ -197,6 +234,9 @@ private:
}; };
Common::Stack<Cursor *> _cursorStack; Common::Stack<Cursor *> _cursorStack;
#ifdef ENABLE_16BIT
Common::Stack<Cursor16 *> _cursor16Stack;
#endif
Common::Stack<Palette *> _cursorPaletteStack; Common::Stack<Palette *> _cursorPaletteStack;
}; };

View file

@ -135,8 +135,12 @@ bool GuiManager::loadNewTheme(Common::String id, ThemeEngine::GraphicsMode gfx)
delete _theme; delete _theme;
if (_useStdCursor) { if (_useStdCursor) {
#ifdef ENABLE_16BIT
CursorMan.popCursor16();
#else
CursorMan.popCursorPalette(); CursorMan.popCursorPalette();
CursorMan.popCursor(); CursorMan.popCursor();
#endif
} }
// //
@ -382,8 +386,12 @@ void GuiManager::saveState() {
void GuiManager::restoreState() { void GuiManager::restoreState() {
if (_useStdCursor) { if (_useStdCursor) {
#ifdef ENABLE_16BIT
CursorMan.popCursor16();
#else
CursorMan.popCursor(); CursorMan.popCursor();
CursorMan.popCursorPalette(); CursorMan.popCursorPalette();
#endif
} }
_system->updateScreen(); _system->updateScreen();

View file

@ -462,8 +462,12 @@ void ThemeEngine::disable() {
_system->hideOverlay(); _system->hideOverlay();
if (_useCursor) { if (_useCursor) {
#ifdef ENABLE_16BIT
CursorMan.popCursor16();
#else
CursorMan.popCursorPalette(); CursorMan.popCursorPalette();
CursorMan.popCursor(); CursorMan.popCursor();
#endif
} }
_enabled = false; _enabled = false;