Skip to content

Commit

Permalink
GUI: Allow GUI cursor creation to work with abitrary 2/4Bpp formats.
Browse files Browse the repository at this point in the history
  • Loading branch information
Johannes Schickel authored and rundfunk47 committed Aug 8, 2013
1 parent ece8b7f commit 969a33a
Showing 1 changed file with 13 additions and 5 deletions.
18 changes: 13 additions & 5 deletions gui/ThemeEngine.cpp
Expand Up @@ -1320,22 +1320,31 @@ bool ThemeEngine::createCursor(const Common::String &filename, int hotspotX, int
memset(_cursor, 0xFF, sizeof(byte) * _cursorWidth * _cursorHeight);

// the transparent color is 0xFF00FF
const int colTransparent = _overlayFormat.RGBToColor(0xFF, 0, 0xFF);
const uint32 colTransparent = _overlayFormat.RGBToColor(0xFF, 0, 0xFF);

// Now, scan the bitmap. We have to convert it from 16 bit color mode
// to 8 bit mode, and have to create a suitable palette on the fly.
uint colorsFound = 0;
Common::HashMap<int, int> colorToIndex;
const OverlayColor *src = (const OverlayColor *)cursor->getPixels();
const byte *src = (const byte *)cursor->getPixels();
for (uint y = 0; y < _cursorHeight; ++y) {
for (uint x = 0; x < _cursorWidth; ++x) {
uint32 color = colTransparent;
byte r, g, b;

if (cursor->format.bytesPerPixel == 2) {
color = READ_UINT16(src);
} else if (cursor->format.bytesPerPixel == 4) {
color = READ_UINT32(src);
}

src += cursor->format.bytesPerPixel;

// Skip transparency
if (src[x] == colTransparent)
if (color == colTransparent)
continue;

_overlayFormat.colorToRGB(src[x], r, g, b);
cursor->format.colorToRGB(color, r, g, b);
const int col = (r << 16) | (g << 8) | b;

// If there is no entry yet for this color in the palette: Add one
Expand All @@ -1357,7 +1366,6 @@ bool ThemeEngine::createCursor(const Common::String &filename, int hotspotX, int
const int index = colorToIndex[col];
_cursor[y * _cursorWidth + x] = index;
}
src += _cursorWidth;
}

_useCursor = true;
Expand Down

0 comments on commit 969a33a

Please sign in to comment.