Corrected backend to be able to accept a 16-bit mouseKeyColor without overflow
svn-id: r41194
This commit is contained in:
parent
662a305752
commit
9789ba7f28
7 changed files with 105 additions and 15 deletions
|
@ -1403,6 +1403,49 @@ void OSystem_SDL::warpMouse(int x, int y) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#ifdef ENABLE_16BIT
|
||||||
|
void OSystem_SDL::setMouseCursor16(const byte *buf, uint w, uint h, int hotspot_x, int hotspot_y, uint16 keycolor, int cursorTargetScale) {
|
||||||
|
if (w == 0 || h == 0)
|
||||||
|
return;
|
||||||
|
|
||||||
|
_mouseCurState.hotX = hotspot_x;
|
||||||
|
_mouseCurState.hotY = hotspot_y;
|
||||||
|
|
||||||
|
_mouseKeyColor = keycolor;
|
||||||
|
|
||||||
|
_cursorTargetScale = cursorTargetScale;
|
||||||
|
|
||||||
|
if (_mouseCurState.w != (int)w || _mouseCurState.h != (int)h) {
|
||||||
|
_mouseCurState.w = w;
|
||||||
|
_mouseCurState.h = h;
|
||||||
|
|
||||||
|
if (_mouseOrigSurface)
|
||||||
|
SDL_FreeSurface(_mouseOrigSurface);
|
||||||
|
|
||||||
|
// Allocate bigger surface because AdvMame2x adds black pixel at [0,0]
|
||||||
|
_mouseOrigSurface = SDL_CreateRGBSurface(SDL_SWSURFACE | SDL_RLEACCEL | SDL_SRCCOLORKEY | SDL_SRCALPHA,
|
||||||
|
_mouseCurState.w + 2,
|
||||||
|
_mouseCurState.h + 2,
|
||||||
|
16,
|
||||||
|
_hwscreen->format->Rmask,
|
||||||
|
_hwscreen->format->Gmask,
|
||||||
|
_hwscreen->format->Bmask,
|
||||||
|
_hwscreen->format->Amask);
|
||||||
|
|
||||||
|
if (_mouseOrigSurface == NULL)
|
||||||
|
error("allocating _mouseOrigSurface failed");
|
||||||
|
SDL_SetColorKey(_mouseOrigSurface, SDL_RLEACCEL | SDL_SRCCOLORKEY | SDL_SRCALPHA, kMouseColorKey);
|
||||||
|
}
|
||||||
|
|
||||||
|
free(_mouseData);
|
||||||
|
|
||||||
|
_mouseData = (byte *)malloc(w * h * 2);
|
||||||
|
memcpy(_mouseData, buf, w * h * 2);
|
||||||
|
|
||||||
|
blitCursor();
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
void OSystem_SDL::setMouseCursor(const byte *buf, uint w, uint h, int hotspot_x, int hotspot_y, byte keycolor, int cursorTargetScale) {
|
void OSystem_SDL::setMouseCursor(const byte *buf, uint w, uint h, int hotspot_x, int hotspot_y, byte keycolor, int cursorTargetScale) {
|
||||||
if (w == 0 || h == 0)
|
if (w == 0 || h == 0)
|
||||||
return;
|
return;
|
||||||
|
@ -1438,13 +1481,9 @@ void OSystem_SDL::setMouseCursor(const byte *buf, uint w, uint h, int hotspot_x,
|
||||||
|
|
||||||
free(_mouseData);
|
free(_mouseData);
|
||||||
|
|
||||||
#ifdef ENABLE_16BIT
|
|
||||||
_mouseData = (byte *)malloc(w * h * 2);
|
|
||||||
memcpy(_mouseData, buf, w * h * 2);
|
|
||||||
#else
|
|
||||||
_mouseData = (byte *)malloc(w * h);
|
_mouseData = (byte *)malloc(w * h);
|
||||||
memcpy(_mouseData, buf, w * h);
|
memcpy(_mouseData, buf, w * h);
|
||||||
#endif
|
|
||||||
blitCursor();
|
blitCursor();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -112,6 +112,10 @@ public:
|
||||||
virtual void warpMouse(int x, int y); // overloaded by CE backend (FIXME)
|
virtual void warpMouse(int x, int y); // overloaded by CE backend (FIXME)
|
||||||
|
|
||||||
// Set the bitmap that's used when drawing the cursor.
|
// Set the bitmap that's used when drawing the cursor.
|
||||||
|
#ifdef ENABLE_16BIT
|
||||||
|
//HACK Made a second method as a quick and dirty workaround to avoid linker errors with engine libs
|
||||||
|
virtual void setMouseCursor16(const byte *buf, uint w, uint h, int hotspot_x, int hotspot_y, uint16 keycolor, int cursorTargetScale); // overloaded by CE backend (FIXME)
|
||||||
|
#endif
|
||||||
virtual void setMouseCursor(const byte *buf, uint w, uint h, int hotspot_x, int hotspot_y, byte keycolor, int cursorTargetScale); // overloaded by CE backend (FIXME)
|
virtual void setMouseCursor(const byte *buf, uint w, uint h, int hotspot_x, int hotspot_y, byte keycolor, int cursorTargetScale); // overloaded by CE backend (FIXME)
|
||||||
|
|
||||||
// Set colors of cursor palette
|
// Set colors of cursor palette
|
||||||
|
|
|
@ -687,8 +687,13 @@ public:
|
||||||
* @param keycolor transparency color index
|
* @param keycolor transparency color index
|
||||||
* @param cursorTargetScale scale factor which cursor is designed for
|
* @param cursorTargetScale scale factor which cursor is designed for
|
||||||
*/
|
*/
|
||||||
|
#ifdef ENABLE_16BIT
|
||||||
|
//HACK made a second method as a quick and dirty workaround to avoid linker errors with engine libs
|
||||||
|
virtual void setMouseCursor16(const byte *buf, uint w, uint h, int hotspotX, int hotspotY, uint16 keycolor = 65535, int cursorTargetScale = 1) = 0;
|
||||||
|
#endif
|
||||||
virtual void setMouseCursor(const byte *buf, uint w, uint h, int hotspotX, int hotspotY, byte keycolor = 255, int cursorTargetScale = 1) = 0;
|
virtual void setMouseCursor(const byte *buf, uint w, uint h, int hotspotX, int hotspotY, byte keycolor = 255, int cursorTargetScale = 1) = 0;
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Replace the specified range of cursor the palette with new colors.
|
* Replace the specified range of cursor the palette with new colors.
|
||||||
* The palette entries from 'start' till (start+num-1) will be replaced - so
|
* The palette entries from 'start' till (start+num-1) will be replaced - so
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
<?xml version="1.0" encoding="windows-1252"?>
|
<?xml version="1.0" encoding="windows-1252"?>
|
||||||
<VisualStudioProject
|
<VisualStudioProject
|
||||||
ProjectType="Visual C++"
|
ProjectType="Visual C++"
|
||||||
Version="8,00"
|
Version="8.00"
|
||||||
Name="scumm"
|
Name="scumm"
|
||||||
ProjectGUID="{B6AFD548-63D2-40CD-A652-E87095AFCBAF}"
|
ProjectGUID="{B6AFD548-63D2-40CD-A652-E87095AFCBAF}"
|
||||||
RootNamespace="scumm"
|
RootNamespace="scumm"
|
||||||
|
@ -43,7 +43,7 @@
|
||||||
Optimization="0"
|
Optimization="0"
|
||||||
InlineFunctionExpansion="0"
|
InlineFunctionExpansion="0"
|
||||||
AdditionalIncludeDirectories="../../;../../engines"
|
AdditionalIncludeDirectories="../../;../../engines"
|
||||||
PreprocessorDefinitions="WIN32;_DEBUG;ENABLE_SCUMM_7_8;ENABLE_HE;USE_ZLIB;USE_MAD;USE_VORBIS"
|
PreprocessorDefinitions="WIN32;_DEBUG;ENABLE_SCUMM_7_8;ENABLE_HE;USE_ZLIB;USE_MAD;USE_VORBIS; ENABLE_16BIT"
|
||||||
MinimalRebuild="true"
|
MinimalRebuild="true"
|
||||||
ExceptionHandling="1"
|
ExceptionHandling="1"
|
||||||
BasicRuntimeChecks="3"
|
BasicRuntimeChecks="3"
|
||||||
|
|
|
@ -112,10 +112,20 @@ 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) {
|
||||||
|
//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
|
||||||
|
//the method's definition and declaration in cursorman.h
|
||||||
|
CursorMan.replaceCursor16(_grabbedCursor, _cursor.width, _cursor.height,
|
||||||
|
_cursor.hotspotX, _cursor.hotspotY,
|
||||||
|
(_game.platform == Common::kPlatformNES ? _grabbedCursor[63] : transColor),
|
||||||
|
(_game.heversion == 70 ? 2 : 1));
|
||||||
|
} else {
|
||||||
CursorMan.replaceCursor(_grabbedCursor, _cursor.width, _cursor.height,
|
CursorMan.replaceCursor(_grabbedCursor, _cursor.width, _cursor.height,
|
||||||
_cursor.hotspotX, _cursor.hotspotY,
|
_cursor.hotspotX, _cursor.hotspotY,
|
||||||
(_game.platform == Common::kPlatformNES ? _grabbedCursor[63] : transColor),
|
(_game.platform == Common::kPlatformNES ? _grabbedCursor[63] : transColor),
|
||||||
(_game.heversion == 70 ? 2 : 1));
|
(_game.heversion == 70 ? 2 : 1));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void ScummEngine_v6::grabCursor(int x, int y, int w, int h) {
|
void ScummEngine_v6::grabCursor(int x, int y, int w, int h) {
|
||||||
|
|
|
@ -100,6 +100,37 @@ void CursorManager::popAllCursors() {
|
||||||
g_system->showMouse(isVisible());
|
g_system->showMouse(isVisible());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#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()) {
|
||||||
|
pushCursor(buf, w, h, hotspotX, hotspotY, keycolor, targetScale);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
Cursor *cur = _cursorStack.top();
|
||||||
|
|
||||||
|
uint size = w * h * 2;
|
||||||
|
|
||||||
|
if (cur->_size < size) {
|
||||||
|
delete[] cur->_data;
|
||||||
|
cur->_data = new byte[size];
|
||||||
|
cur->_size = size;
|
||||||
|
}
|
||||||
|
|
||||||
|
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) {
|
void CursorManager::replaceCursor(const byte *buf, uint w, uint h, int hotspotX, int hotspotY, byte keycolor, int targetScale) {
|
||||||
if (_cursorStack.empty()) {
|
if (_cursorStack.empty()) {
|
||||||
|
@ -108,11 +139,8 @@ void CursorManager::replaceCursor(const byte *buf, uint w, uint h, int hotspotX,
|
||||||
}
|
}
|
||||||
|
|
||||||
Cursor *cur = _cursorStack.top();
|
Cursor *cur = _cursorStack.top();
|
||||||
#ifdef ENABLE_16BIT
|
|
||||||
uint size = w * h * 2;
|
|
||||||
#else
|
|
||||||
uint size = w * h;
|
uint size = w * h;
|
||||||
#endif
|
|
||||||
|
|
||||||
if (cur->_size < size) {
|
if (cur->_size < size) {
|
||||||
delete[] cur->_data;
|
delete[] cur->_data;
|
||||||
|
|
|
@ -77,6 +77,10 @@ public:
|
||||||
* @param keycolor the index for the transparent color
|
* @param keycolor the index for the transparent color
|
||||||
* @param targetScale the scale for which the cursor is designed
|
* @param targetScale the scale for which the cursor is designed
|
||||||
*/
|
*/
|
||||||
|
#ifdef ENABLE_16BIT
|
||||||
|
//HACK made a separate method to avoid massive linker errors on every engine.
|
||||||
|
void replaceCursor16(const byte *buf, uint w, uint h, int hotspotX, int hotspotY, uint16 keycolor = 65535, int targetScale = 1);
|
||||||
|
#endif
|
||||||
void replaceCursor(const byte *buf, uint w, uint h, int hotspotX, int hotspotY, byte keycolor = 255, int targetScale = 1);
|
void replaceCursor(const byte *buf, uint w, uint h, int hotspotX, int hotspotY, byte keycolor = 255, int targetScale = 1);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue