diff options
-rw-r--r-- | engines/scumm/akos.cpp | 14 | ||||
-rw-r--r-- | engines/scumm/akos.h | 4 | ||||
-rw-r--r-- | engines/scumm/he/wiz_he.cpp | 21 | ||||
-rw-r--r-- | engines/scumm/he/wiz_he.h | 6 | ||||
-rw-r--r-- | engines/scumm/palette.cpp | 10 |
5 files changed, 45 insertions, 10 deletions
diff --git a/engines/scumm/akos.cpp b/engines/scumm/akos.cpp index 19c7c3320b..fc4aabcf88 100644 --- a/engines/scumm/akos.cpp +++ b/engines/scumm/akos.cpp @@ -303,6 +303,19 @@ void AkosRenderer::setPalette(byte *new_palette) { if (_vm->_game.heversion >= 99 && _paletteNum) { for (i = 0; i < size; i++) _palette[i] = (byte)_vm->_hePalettes[_paletteNum * 1024 + 768 + akpl[i]]; + } else if (_vm->_game.heversion >= 99 && rgbs) { + for (i = 0; i < size; i++) { + if (new_palette[i] == 0xFF) { + uint8 col = akpl[i]; + uint8 r = rgbs[col * 3 + 0]; + uint8 g = rgbs[col * 3 + 1]; + uint8 b = rgbs[col * 3 + 2]; + + _palette[i] = _vm->remapPaletteColor(r, g, b, -1); + } else { + _palette[i] = new_palette[i]; + } + } } else { for (i = 0; i < size; i++) { _palette[i] = new_palette[i] != 0xFF ? new_palette[i] : akpl[i]; @@ -336,6 +349,7 @@ void AkosRenderer::setCostume(int costume, int shadow) { akpl = _vm->findResourceData(MKID_BE('AKPL'), akos); _codec = READ_LE_UINT16(&akhd->codec); akct = _vm->findResourceData(MKID_BE('AKCT'), akos); + rgbs = _vm->findResourceData(MKID_BE('RGBS'), akos); xmap = 0; if (shadow) { diff --git a/engines/scumm/akos.h b/engines/scumm/akos.h index d38ae4b1ad..be532b804d 100644 --- a/engines/scumm/akos.h +++ b/engines/scumm/akos.h @@ -73,7 +73,8 @@ protected: const byte *akcd; // costume data (contains the data for the codecs) const byte *akct; // HE specific: condition table - const uint8 *xmap; // HE specific: shadow color table ?!? + const byte *rgbs; // HE specific: RGB table + const uint8 *xmap; // HE specific: shadow color table struct { bool repeatMode; @@ -97,6 +98,7 @@ public: akof = 0; akcd = 0; akct = 0; + rgbs = 0; xmap = 0; _actorHitMode = false; } diff --git a/engines/scumm/he/wiz_he.cpp b/engines/scumm/he/wiz_he.cpp index c2637e9526..fb1eb28765 100644 --- a/engines/scumm/he/wiz_he.cpp +++ b/engines/scumm/he/wiz_he.cpp @@ -570,7 +570,12 @@ void Wiz::copyRaw16BitWizImage(uint8 *dst, const uint8 *src, int dstw, int dsth, dst += r2.left + r2.top * dstw; while (h--) { for (int i = 0; i < w; ++i) { - uint16 col = READ_LE_UINT16(src + 2 * i) / 256; + uint16 col = READ_LE_UINT16(src + 2 * i); + uint8 r = ((col >> 10) & 0x1F) << 3; + uint8 g = ((col >> 5) & 0x1F) << 3; + uint8 b = ((col >> 0) & 0x1F) << 3; + col = _vm->remapPaletteColor(r, g, b, -1); + if (transColor == -1 || transColor != col) { dst[i] = palPtr[col]; } @@ -653,7 +658,12 @@ void Wiz::decompress16BitWizImage(uint8 *dst, int dstPitch, const uint8 *src, co code += w; } while (code--) { - uint16 col = READ_LE_UINT16(dataPtr) / 256; + uint16 col = READ_LE_UINT16(dataPtr); + uint8 r = ((col >> 10) & 0x1F) << 3; + uint8 g = ((col >> 5) & 0x1F) << 3; + uint8 b = ((col >> 0) & 0x1F) << 3; + col = _vm->remapPaletteColor(r, g, b, -1); + if (type == kWizXMap) { *dstPtr = xmapPtr[col * 256 + *dstPtr]; } @@ -682,7 +692,12 @@ void Wiz::decompress16BitWizImage(uint8 *dst, int dstPitch, const uint8 *src, co code += w; } while (code--) { - uint16 col = READ_LE_UINT16(dataPtr) / 256; + uint16 col = READ_LE_UINT16(dataPtr); + uint8 r = ((col >> 10) & 0x1F) << 3; + uint8 g = ((col >> 5) & 0x1F) << 3; + uint8 b = ((col >> 0) & 0x1F) << 3; + col = _vm->remapPaletteColor(r, g, b, -1); + if (type == kWizXMap) { *dstPtr = xmapPtr[col * 256 + *dstPtr]; } diff --git a/engines/scumm/he/wiz_he.h b/engines/scumm/he/wiz_he.h index b2baf8f2b0..86df15c3e6 100644 --- a/engines/scumm/he/wiz_he.h +++ b/engines/scumm/he/wiz_he.h @@ -203,11 +203,11 @@ public: static void copyAuxImage(uint8 *dst1, uint8 *dst2, const uint8 *src, int dstw, int dsth, int srcx, int srcy, int srcw, int srch); static void copyWizImage(uint8 *dst, const uint8 *src, int dstw, int dsth, int srcx, int srcy, int srcw, int srch, const Common::Rect *rect, int flags = 0, const uint8 *palPtr = NULL, const uint8 *xmapPtr = NULL); static void copyWizImageWithMask(uint8 *dst, const uint8 *src, int dstw, int dsth, int srcx, int srcy, int srcw, int srch, const Common::Rect *rect, int maskT, int maskP); - static void copy16BitWizImage(uint8 *dst, const uint8 *src, int dstw, int dsth, int srcx, int srcy, int srcw, int srch, const Common::Rect *rect, int flags = 0, const uint8 *palPtr = NULL, const uint8 *xmapPtr = NULL); + void copy16BitWizImage(uint8 *dst, const uint8 *src, int dstw, int dsth, int srcx, int srcy, int srcw, int srch, const Common::Rect *rect, int flags = 0, const uint8 *palPtr = NULL, const uint8 *xmapPtr = NULL); static void copyRawWizImage(uint8 *dst, const uint8 *src, int dstw, int dsth, int srcx, int srcy, int srcw, int srch, const Common::Rect *rect, int flags, const uint8 *palPtr, int transColor); - static void copyRaw16BitWizImage(uint8 *dst, const uint8 *src, int dstw, int dsth, int srcx, int srcy, int srcw, int srch, const Common::Rect *rect, int flags, const uint8 *palPtr, int transColor); + void copyRaw16BitWizImage(uint8 *dst, const uint8 *src, int dstw, int dsth, int srcx, int srcy, int srcw, int srch, const Common::Rect *rect, int flags, const uint8 *palPtr, int transColor); template<int type> static void decompressWizImage(uint8 *dst, int dstPitch, const uint8 *src, const Common::Rect &srcRect, int flags, const uint8 *palPtr = NULL, const uint8 *xmapPtr = NULL); - template<int type> static void decompress16BitWizImage(uint8 *dst, int dstPitch, const uint8 *src, const Common::Rect &srcRect, int flags, const uint8 *palPtr = NULL, const uint8 *xmapPtr = NULL); + template<int type> void decompress16BitWizImage(uint8 *dst, int dstPitch, const uint8 *src, const Common::Rect &srcRect, int flags, const uint8 *palPtr = NULL, const uint8 *xmapPtr = NULL); template<int type> static void decompressRawWizImage(uint8 *dst, int dstPitch, const uint8 *src, int srcPitch, int w, int h, int transColor, const uint8 *palPtr = NULL); int isWizPixelNonTransparent(const uint8 *data, int x, int y, int w, int h, uint bitdepth); uint8 getWizPixelColor(const uint8 *data, int x, int y, int w, int h, uint bitDepth, uint8 color); diff --git a/engines/scumm/palette.cpp b/engines/scumm/palette.cpp index 6d6c499462..4214ab2330 100644 --- a/engines/scumm/palette.cpp +++ b/engines/scumm/palette.cpp @@ -811,12 +811,16 @@ void ScummEngine_v8::desaturatePalette(int hueScale, int satScale, int lightScal int ScummEngine::remapPaletteColor(int r, int g, int b, int threshold) { - int i; - int ar, ag, ab; + byte *pal; + int ar, ag, ab, i; uint sum, bestsum, bestitem = 0; int startColor = (_game.version == 8) ? 24 : 1; - byte *pal = _currentPalette + startColor * 3; + + if (_game.heversion >= 99) + pal = _hePalettes + 1024 + startColor * 3; + else + pal = _currentPalette + startColor * 3; if (r > 255) r = 255; |