mirror of
https://github.com/libretro/scummvm.git
synced 2025-04-14 12:43:30 +00:00
ANDROID: Fix 16bit cursors
I hate this code
This commit is contained in:
parent
53ee7c5513
commit
12fb817751
@ -114,7 +114,7 @@ private:
|
|||||||
// Mouse layer
|
// Mouse layer
|
||||||
GLESTexture *_mouse_texture;
|
GLESTexture *_mouse_texture;
|
||||||
GLESPaletteTexture *_mouse_texture_palette;
|
GLESPaletteTexture *_mouse_texture_palette;
|
||||||
GLESTexture *_mouse_texture_rgb;
|
GLES5551Texture *_mouse_texture_rgb;
|
||||||
Common::Point _mouse_hotspot;
|
Common::Point _mouse_hotspot;
|
||||||
int _mouse_targetscale;
|
int _mouse_targetscale;
|
||||||
bool _show_mouse;
|
bool _show_mouse;
|
||||||
|
@ -25,6 +25,8 @@
|
|||||||
|
|
||||||
#if defined(__ANDROID__)
|
#if defined(__ANDROID__)
|
||||||
|
|
||||||
|
#include "graphics/conversion.h"
|
||||||
|
|
||||||
#include "backends/platform/android/android.h"
|
#include "backends/platform/android/android.h"
|
||||||
#include "backends/platform/android/jni.h"
|
#include "backends/platform/android/jni.h"
|
||||||
|
|
||||||
@ -578,39 +580,65 @@ void OSystem_Android::setMouseCursor(const byte *buf, uint w, uint h,
|
|||||||
if (_mouse_texture != _mouse_texture_rgb)
|
if (_mouse_texture != _mouse_texture_rgb)
|
||||||
LOGD("switching to rgb mouse cursor");
|
LOGD("switching to rgb mouse cursor");
|
||||||
|
|
||||||
initTexture(&_mouse_texture_rgb, w, h, format, true);
|
_mouse_texture_rgb = new GLES5551Texture();
|
||||||
|
|
||||||
_mouse_texture = _mouse_texture_rgb;
|
_mouse_texture = _mouse_texture_rgb;
|
||||||
} else {
|
} else {
|
||||||
if (_mouse_texture != _mouse_texture_palette)
|
if (_mouse_texture != _mouse_texture_palette)
|
||||||
LOGD("switching to paletted mouse cursor");
|
LOGD("switching to paletted mouse cursor");
|
||||||
|
|
||||||
initTexture((GLESTexture **)&_mouse_texture_palette, w, h, format,
|
|
||||||
true);
|
|
||||||
|
|
||||||
_mouse_texture = _mouse_texture_palette;
|
_mouse_texture = _mouse_texture_palette;
|
||||||
|
|
||||||
delete _mouse_texture_rgb;
|
delete _mouse_texture_rgb;
|
||||||
_mouse_texture_rgb = 0;
|
_mouse_texture_rgb = 0;
|
||||||
}
|
}
|
||||||
#else
|
|
||||||
_mouse_texture_palette->allocBuffer(w, h);
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
if (_mouse_texture->getPixelFormat().bytesPerPixel == 1) {
|
_mouse_texture->allocBuffer(w, h);
|
||||||
|
|
||||||
|
if (_mouse_texture == _mouse_texture_palette) {
|
||||||
// Update palette alpha based on keycolor
|
// Update palette alpha based on keycolor
|
||||||
byte *palette = _mouse_texture_palette->palette();
|
byte *palette = _mouse_texture_palette->palette();
|
||||||
|
|
||||||
for (uint i = 0; i < 256; ++i, palette += 4)
|
for (uint i = 0; i < 256; ++i, palette += 4)
|
||||||
palette[3] = 0xff;
|
palette[3] = 0xff;
|
||||||
|
|
||||||
_mouse_texture_palette->palette()[keycolor * 4 + 3] = 0x00;
|
_mouse_texture_palette->palette()[keycolor * 4 + 3] = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (w == 0 || h == 0)
|
if (w == 0 || h == 0)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
|
if (_mouse_texture == _mouse_texture_palette) {
|
||||||
_mouse_texture->updateBuffer(0, 0, w, h, buf, w);
|
_mouse_texture->updateBuffer(0, 0, w, h, buf, w);
|
||||||
|
} else {
|
||||||
|
uint16 pitch = _mouse_texture->pitch();
|
||||||
|
|
||||||
|
byte *tmp = new byte[pitch * h];
|
||||||
|
|
||||||
|
// meh, a 16bit cursor without alpha bits... this is so silly
|
||||||
|
if (!crossBlit(tmp, buf, pitch, w * 2, w, h,
|
||||||
|
_mouse_texture->getPixelFormat(),
|
||||||
|
*format)) {
|
||||||
|
LOGE("crossblit failed");
|
||||||
|
|
||||||
|
delete[] tmp;
|
||||||
|
|
||||||
|
_mouse_texture->fillBuffer(0);
|
||||||
|
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
uint16 *s = (uint16 *)buf;
|
||||||
|
uint16 *d = (uint16 *)tmp;
|
||||||
|
for (uint16 y = 0; y < h; ++y, d += pitch / 2 - w)
|
||||||
|
for (uint16 x = 0; x < w; ++x, d++)
|
||||||
|
if (*s++ != (keycolor & 0xffff))
|
||||||
|
*d |= 1;
|
||||||
|
|
||||||
|
_mouse_texture->updateBuffer(0, 0, w, h, tmp, pitch);
|
||||||
|
|
||||||
|
delete[] tmp;
|
||||||
|
}
|
||||||
|
|
||||||
_mouse_hotspot = Common::Point(hotspotX, hotspotY);
|
_mouse_hotspot = Common::Point(hotspotX, hotspotY);
|
||||||
_mouse_targetscale = cursorTargetScale;
|
_mouse_targetscale = cursorTargetScale;
|
||||||
|
@ -71,6 +71,10 @@ public:
|
|||||||
return _surface.h;
|
return _surface.h;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
inline uint16 pitch() const {
|
||||||
|
return _surface.pitch;
|
||||||
|
}
|
||||||
|
|
||||||
inline const Graphics::Surface *surface_const() const {
|
inline const Graphics::Surface *surface_const() const {
|
||||||
return &_surface;
|
return &_surface;
|
||||||
}
|
}
|
||||||
@ -84,7 +88,7 @@ public:
|
|||||||
return _all_dirty || !_dirty_rect.isEmpty();
|
return _all_dirty || !_dirty_rect.isEmpty();
|
||||||
}
|
}
|
||||||
|
|
||||||
inline Graphics::PixelFormat getPixelFormat() const {
|
inline const Graphics::PixelFormat &getPixelFormat() const {
|
||||||
return _pixelFormat;
|
return _pixelFormat;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user