diff options
author | Johannes Schickel | 2010-08-03 16:21:45 +0000 |
---|---|---|
committer | Johannes Schickel | 2010-08-03 16:21:45 +0000 |
commit | 14c9522d776a6a7ceb01b9b3076d43729e7780f4 (patch) | |
tree | 0b05eda0d2ced544f876314d81958d701b1b38ac | |
parent | 14e7ba5d91be70e4c4479916875a0d782c02b1ee (diff) | |
download | scummvm-rg350-14c9522d776a6a7ceb01b9b3076d43729e7780f4.tar.gz scummvm-rg350-14c9522d776a6a7ceb01b9b3076d43729e7780f4.tar.bz2 scummvm-rg350-14c9522d776a6a7ceb01b9b3076d43729e7780f4.zip |
KYRA: Fix Screen_v2::generateOverlay implementation.
svn-id: r51703
-rw-r--r-- | engines/kyra/screen_v2.cpp | 61 | ||||
-rw-r--r-- | engines/kyra/screen_v2.h | 2 |
2 files changed, 41 insertions, 22 deletions
diff --git a/engines/kyra/screen_v2.cpp b/engines/kyra/screen_v2.cpp index f493b39f19..dec380c3e8 100644 --- a/engines/kyra/screen_v2.cpp +++ b/engines/kyra/screen_v2.cpp @@ -38,38 +38,57 @@ Screen_v2::~Screen_v2() { delete[] _wsaFrameAnimBuffer; } -uint8 *Screen_v2::generateOverlay(const Palette &pal, uint8 *buffer, int startColor, uint16 factor) { +uint8 *Screen_v2::generateOverlay(const Palette &pal, uint8 *buffer, int opColor, uint weight) { if (!buffer) return buffer; - factor = MIN<uint16>(255, factor); - factor >>= 1; - factor &= 0xFF; + weight = MIN<uint>(weight, 255) >> 1; - const byte col1 = pal[startColor * 3 + 0]; - const byte col2 = pal[startColor * 3 + 1]; - const byte col3 = pal[startColor * 3 + 2]; + const byte opR = pal[opColor * 3 + 0]; + const byte opG = pal[opColor * 3 + 1]; + const byte opB = pal[opColor * 3 + 2]; uint8 *dst = buffer; *dst++ = 0; - for (int i = 1; i != 256; ++i) { - uint8 processedPalette[3]; - byte col; - - col = pal[i * 3 + 0]; - col -= ((((col - col1) * factor) << 1) >> 8) & 0xFF; - processedPalette[0] = col; + const int maxIndex = (_vm->gameFlags().gameID == GI_LOL) ? (_use16ColorMode ? 255 : 127) : 255; - col = pal[i * 3 + 1]; - col -= ((((col - col2) * factor) << 1) >> 8) & 0xFF; - processedPalette[1] = col; + for (int i = 1; i != 256; ++i) { + const byte curR = pal[i * 3 + 0] - ((((pal[i * 3 + 0] - opR) * weight) >> 7) & 0x7F); + const byte curG = pal[i * 3 + 1] - ((((pal[i * 3 + 1] - opG) * weight) >> 7) & 0x7F); + const byte curB = pal[i * 3 + 2] - ((((pal[i * 3 + 2] - opB) * weight) >> 7) & 0x7F); + + uint16 idxSum = _use16ColorMode ? 0xFFFF : 0x7FFF; + byte index = opColor; + + for (int curIdx = 1; curIdx <= maxIndex; ++curIdx) { + if (!_use16ColorMode && i == curIdx) + continue; + + int diff = 0; + uint16 sum = 0; + + diff = pal[curIdx * 3 + 0] - curR; + sum += diff * diff; + diff = pal[curIdx * 3 + 1] - curG; + sum += diff * diff; + diff = pal[curIdx * 3 + 2] - curB; + sum += diff * diff; + + if (!sum) { + index = curIdx; + break; + } - col = pal[i * 3 + 2]; - col -= ((((col - col3) * factor) << 1) >> 8) & 0xFF; - processedPalette[2] = col; + if (sum <= idxSum) { + if (!_use16ColorMode || (curIdx == opColor || curIdx != i)) { + idxSum = sum; + index = curIdx; + } + } + } - *dst++ = findLeastDifferentColor(processedPalette, pal, 1, 255) + 1; + *dst++ = index; } return buffer; diff --git a/engines/kyra/screen_v2.h b/engines/kyra/screen_v2.h index 7be68e7b6d..2850c96e02 100644 --- a/engines/kyra/screen_v2.h +++ b/engines/kyra/screen_v2.h @@ -40,7 +40,7 @@ public: void checkedPageUpdate(int srcPage, int dstPage); // palette handling - uint8 *generateOverlay(const Palette &pal, uint8 *buffer, int color, uint16 factor); + uint8 *generateOverlay(const Palette &pal, uint8 *buffer, int color, uint weight); void applyOverlay(int x, int y, int w, int h, int pageNum, const uint8 *overlay); int findLeastDifferentColor(const uint8 *paletteEntry, const Palette &pal, uint8 firstColor, uint16 numColors, bool skipSpecialColors = false); |