Fixes ScummEngine_v70he::setDefaultCursor to work in 16-bit, using a temporary hack.
svn-id: r41204
This commit is contained in:
parent
ccee18a489
commit
d65bbe1d7a
5 changed files with 101 additions and 9 deletions
|
@ -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();
|
||||||
}
|
}
|
||||||
|
|
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -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;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -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();
|
||||||
|
|
|
@ -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;
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue