aboutsummaryrefslogtreecommitdiff
path: root/engines
diff options
context:
space:
mode:
authorTravis Howell2009-01-04 03:49:23 +0000
committerTravis Howell2009-01-04 03:49:23 +0000
commitd0fc28bbd1bd5a3399c629e5d25ae3a64fef977c (patch)
tree68d39802db270642507b027fdeb25cfc059315de /engines
parent4670e37a78409bfe9279c5d73c8d581f0d66143e (diff)
downloadscummvm-rg350-d0fc28bbd1bd5a3399c629e5d25ae3a64fef977c.tar.gz
scummvm-rg350-d0fc28bbd1bd5a3399c629e5d25ae3a64fef977c.tar.bz2
scummvm-rg350-d0fc28bbd1bd5a3399c629e5d25ae3a64fef977c.zip
Use cache when converting 16bit colors, for faster conversions.
svn-id: r35714
Diffstat (limited to 'engines')
-rw-r--r--engines/scumm/he/wiz_he.cpp8
-rw-r--r--engines/scumm/palette.cpp13
-rw-r--r--engines/scumm/scumm.cpp5
-rw-r--r--engines/scumm/scumm.h2
4 files changed, 24 insertions, 4 deletions
diff --git a/engines/scumm/he/wiz_he.cpp b/engines/scumm/he/wiz_he.cpp
index fb1eb28765..3f4967efea 100644
--- a/engines/scumm/he/wiz_he.cpp
+++ b/engines/scumm/he/wiz_he.cpp
@@ -574,10 +574,10 @@ void Wiz::copyRaw16BitWizImage(uint8 *dst, const uint8 *src, int dstw, int dsth,
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);
+ uint8 color = _vm->convert16BitColor(col, r, g, b);
if (transColor == -1 || transColor != col) {
- dst[i] = palPtr[col];
+ dst[i] = palPtr[color];
}
}
src += srcw * 2;
@@ -662,7 +662,7 @@ void Wiz::decompress16BitWizImage(uint8 *dst, int dstPitch, const uint8 *src, co
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);
+ col = _vm->convert16BitColor(col, r, g, b);
if (type == kWizXMap) {
*dstPtr = xmapPtr[col * 256 + *dstPtr];
@@ -696,7 +696,7 @@ void Wiz::decompress16BitWizImage(uint8 *dst, int dstPitch, const uint8 *src, co
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);
+ col = _vm->convert16BitColor(col, r, g, b);
if (type == kWizXMap) {
*dstPtr = xmapPtr[col * 256 + *dstPtr];
diff --git a/engines/scumm/palette.cpp b/engines/scumm/palette.cpp
index 4214ab2330..a4ba9b25c4 100644
--- a/engines/scumm/palette.cpp
+++ b/engines/scumm/palette.cpp
@@ -310,6 +310,9 @@ void ScummEngine::setDirtyColors(int min, int max) {
_palDirtyMin = min;
if (_palDirtyMax < max)
_palDirtyMax = max;
+
+ if (_hePaletteCache)
+ memset(_hePaletteCache, -1, 65536);
}
void ScummEngine::initCycl(const byte *ptr) {
@@ -810,6 +813,16 @@ void ScummEngine_v8::desaturatePalette(int hueScale, int satScale, int lightScal
#endif
+int ScummEngine::convert16BitColor(uint16 color, uint8 r, uint8 g, uint8 b) {
+ // HACK: Find the closest matching color, and store in
+ // cache for faster access.
+ if (_hePaletteCache[color] == -1) {
+ _hePaletteCache[color] = remapPaletteColor(r, g, b, -1);
+ }
+
+ return _hePaletteCache[color];
+}
+
int ScummEngine::remapPaletteColor(int r, int g, int b, int threshold) {
byte *pal;
int ar, ag, ab, i;
diff --git a/engines/scumm/scumm.cpp b/engines/scumm/scumm.cpp
index aeb1269865..5fe4031de0 100644
--- a/engines/scumm/scumm.cpp
+++ b/engines/scumm/scumm.cpp
@@ -264,6 +264,7 @@ ScummEngine::ScummEngine(OSystem *syst, const DetectorResult &dr)
_palManipPalette = NULL;
_palManipIntermediatePal = NULL;
memset(gfxUsageBits, 0, sizeof(gfxUsageBits));
+ _hePaletteCache = NULL;
_hePalettes = NULL;
_shadowPalette = NULL;
_shadowPaletteSize = 0;
@@ -805,6 +806,7 @@ ScummEngine_v90he::~ScummEngine_v90he() {
delete _logicHE;
}
if (_game.heversion >= 99) {
+ free(_hePaletteCache);
free(_hePalettes);
}
}
@@ -1521,6 +1523,9 @@ void ScummEngine_v99he::resetScumm() {
ScummEngine_v90he::resetScumm();
+ _hePaletteCache = (int16 *)malloc(65536);
+ memset(_hePaletteCache, -1, 65536);
+
_hePalettes = (uint8 *)malloc((_numPalettes + 1) * 1024);
memset(_hePalettes, 0, (_numPalettes + 1) * 1024);
diff --git a/engines/scumm/scumm.h b/engines/scumm/scumm.h
index e040cb1593..065b941165 100644
--- a/engines/scumm/scumm.h
+++ b/engines/scumm/scumm.h
@@ -1027,6 +1027,7 @@ protected:
virtual void palManipulateInit(int resID, int start, int end, int time);
void palManipulate();
public:
+ int convert16BitColor(uint16 color, uint8 r, uint8 g, uint8 b);
int remapPaletteColor(int r, int g, int b, int threshold); // Used by Actor::remapActorPalette
protected:
void moveMemInPalRes(int start, int end, byte direction);
@@ -1102,6 +1103,7 @@ public:
// HE specific
byte _HEV7ActorPalette[256];
uint8 *_hePalettes;
+ int16 *_hePaletteCache;
protected:
int _shadowPaletteSize;