BACKENDS: Fix GraphicsManager handling of empty cursors

The SDL graphics manager was just ignoring calls from CursorMan to
set the cursor to a blank cursor, which meant engines that did not
immediately send a cursor to CursorMan at startup would still show
the launcher's cursor (usually with a broken palette).

The OpenGL graphics manager would try to generate and draw an
invalid cursor surface when receiving an empty cursor.
This commit is contained in:
Colin Snover 2017-09-13 00:47:44 -05:00
parent da0a8db704
commit 5d8cf6ba42
2 changed files with 25 additions and 18 deletions

View file

@ -567,6 +567,18 @@ void applyColorKey(DstPixel *dst, const SrcPixel *src, uint w, uint h, uint dstP
} // End of anonymous namespace
void OpenGLGraphicsManager::setMouseCursor(const void *buf, uint w, uint h, int hotspotX, int hotspotY, uint32 keycolor, bool dontScale, const Graphics::PixelFormat *format) {
_cursorKeyColor = keycolor;
_cursorHotspotX = hotspotX;
_cursorHotspotY = hotspotY;
_cursorDontScale = dontScale;
if (!w || !h) {
delete _cursor;
_cursor = nullptr;
return;
}
Graphics::PixelFormat inputFormat;
#ifdef USE_RGB_COLOR
if (format) {
@ -602,11 +614,6 @@ void OpenGLGraphicsManager::setMouseCursor(const void *buf, uint w, uint h, int
_cursor->enableLinearFiltering(_currentState.filtering);
}
_cursorKeyColor = keycolor;
_cursorHotspotX = hotspotX;
_cursorHotspotY = hotspotY;
_cursorDontScale = dontScale;
_cursor->allocate(w, h);
if (inputFormat.bytesPerPixel == 1) {
// For CLUT8 cursors we can simply copy the input data into the

View file

@ -1876,9 +1876,6 @@ void SurfaceSdlGraphicsManager::setMouseCursor(const void *buf, uint w, uint h,
assert(keycolor <= 0xFF);
#endif
if (w == 0 || h == 0)
return;
_mouseCurState.hotX = hotspot_x;
_mouseCurState.hotY = hotspot_y;
@ -1890,6 +1887,10 @@ void SurfaceSdlGraphicsManager::setMouseCursor(const void *buf, uint w, uint h,
_mouseCurState.w = w;
_mouseCurState.h = h;
if (!w || !h) {
return;
}
if (_mouseOrigSurface)
SDL_FreeSurface(_mouseOrigSurface);
@ -1928,22 +1929,21 @@ void SurfaceSdlGraphicsManager::blitCursor() {
#else
byte color;
#endif
int w, h, i, j;
if (!_mouseOrigSurface || !_mouseData)
int w = _mouseCurState.w;
int h = _mouseCurState.h;
if (!_mouseOrigSurface || !_mouseData || !w || !h)
return;
_cursorNeedsRedraw = true;
w = _mouseCurState.w;
h = _mouseCurState.h;
SDL_LockSurface(_mouseOrigSurface);
// Make whole surface transparent
for (i = 0; i < h + 2; i++) {
for (int i = 0; i < h + 2; i++) {
dstPtr = (byte *)_mouseOrigSurface->pixels + _mouseOrigSurface->pitch * i;
for (j = 0; j < w + 2; j++) {
for (int j = 0; j < w + 2; j++) {
*(uint16 *)dstPtr = kMouseColorKey;
dstPtr += 2;
}
@ -1959,8 +1959,8 @@ void SurfaceSdlGraphicsManager::blitCursor() {
else
palette = _cursorPalette;
for (i = 0; i < h; i++) {
for (j = 0; j < w; j++) {
for (int i = 0; i < h; i++) {
for (int j = 0; j < w; j++) {
#ifdef USE_RGB_COLOR
if (_cursorFormat.bytesPerPixel > 1) {
if (_cursorFormat.bytesPerPixel == 2)
@ -2112,7 +2112,7 @@ void SurfaceSdlGraphicsManager::undrawMouse() {
}
void SurfaceSdlGraphicsManager::drawMouse() {
if (!_cursorVisible || !_mouseSurface) {
if (!_cursorVisible || !_mouseSurface || !_mouseCurState.w || !_mouseCurState.h) {
_mouseBackup.x = _mouseBackup.y = _mouseBackup.w = _mouseBackup.h = 0;
return;
}