aboutsummaryrefslogtreecommitdiff
path: root/backends/platform/android/gfx.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'backends/platform/android/gfx.cpp')
-rw-r--r--backends/platform/android/gfx.cpp48
1 files changed, 38 insertions, 10 deletions
diff --git a/backends/platform/android/gfx.cpp b/backends/platform/android/gfx.cpp
index 10ffa3a7f6..90b1c3ec57 100644
--- a/backends/platform/android/gfx.cpp
+++ b/backends/platform/android/gfx.cpp
@@ -25,6 +25,8 @@
#if defined(__ANDROID__)
+#include "graphics/conversion.h"
+
#include "backends/platform/android/android.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)
LOGD("switching to rgb mouse cursor");
- initTexture(&_mouse_texture_rgb, w, h, format, true);
-
+ _mouse_texture_rgb = new GLES5551Texture();
_mouse_texture = _mouse_texture_rgb;
} else {
if (_mouse_texture != _mouse_texture_palette)
LOGD("switching to paletted mouse cursor");
- initTexture((GLESTexture **)&_mouse_texture_palette, w, h, format,
- true);
-
_mouse_texture = _mouse_texture_palette;
delete _mouse_texture_rgb;
_mouse_texture_rgb = 0;
}
-#else
- _mouse_texture_palette->allocBuffer(w, h);
#endif
- if (_mouse_texture->getPixelFormat().bytesPerPixel == 1) {
+ _mouse_texture->allocBuffer(w, h);
+
+ if (_mouse_texture == _mouse_texture_palette) {
// Update palette alpha based on keycolor
byte *palette = _mouse_texture_palette->palette();
for (uint i = 0; i < 256; ++i, palette += 4)
palette[3] = 0xff;
- _mouse_texture_palette->palette()[keycolor * 4 + 3] = 0x00;
+ _mouse_texture_palette->palette()[keycolor * 4 + 3] = 0;
}
if (w == 0 || h == 0)
return;
- _mouse_texture->updateBuffer(0, 0, w, h, buf, w);
+ if (_mouse_texture == _mouse_texture_palette) {
+ _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_targetscale = cursorTargetScale;