diff options
Diffstat (limited to 'engines')
| -rw-r--r-- | engines/sci/engine/kgraphics.cpp | 7 | ||||
| -rw-r--r-- | engines/sci/engine/kgraphics32.cpp | 21 | ||||
| -rw-r--r-- | engines/sci/graphics/palette.cpp | 23 | ||||
| -rw-r--r-- | engines/sci/graphics/palette.h | 9 | ||||
| -rw-r--r-- | engines/sci/graphics/view.cpp | 10 |
5 files changed, 53 insertions, 17 deletions
diff --git a/engines/sci/engine/kgraphics.cpp b/engines/sci/engine/kgraphics.cpp index 2ce44db772..bd78c56416 100644 --- a/engines/sci/engine/kgraphics.cpp +++ b/engines/sci/engine/kgraphics.cpp @@ -1221,17 +1221,18 @@ reg_t kShow(EngineState *s, int argc, reg_t *argv) { return s->r_acc; } -// Early variant of the SCI32 remapcolors kernel function, used in the demo of QFG4 +// Early variant of the SCI32 kRemapColors kernel function, used in the demo of QFG4 reg_t kRemapColors(EngineState *s, int argc, reg_t *argv) { uint16 operation = argv[0].toUint16(); switch (operation) { case 0: { // remap by percent uint16 percent = argv[1].toUint16(); - warning("RemapColors(RemapByPercent) %d", percent); + g_sci->_gfxPalette->toggleRemap(true); + g_sci->_gfxPalette->setRemappingPercent(percent); } break; - case 1: { // unknown + case 1: { // set remapping base //int16 unk1 = argv[1].toSint16(); //int16 unk2 = argv[2].toSint16(); //int16 unk3 = argv[3].toSint16(); diff --git a/engines/sci/engine/kgraphics32.cpp b/engines/sci/engine/kgraphics32.cpp index 245c265ba6..1b7b628e7d 100644 --- a/engines/sci/engine/kgraphics32.cpp +++ b/engines/sci/engine/kgraphics32.cpp @@ -742,8 +742,11 @@ reg_t kRemapColors32(EngineState *s, int argc, reg_t *argv) { if (base != 0) // 0 is the default behavior when changing rooms in GK1, thus silencing the warning warning("kRemapColors: Set remapping to base %d", base); } + // TODO: Don't turn remapping off always + g_sci->_gfxPalette->toggleRemap(false); + g_sci->_gfxPalette->setRemappingPercent(0); break; - case 1: { // unknown + case 1: { // set remapping base //int16 unk1 = argv[1].toSint16(); //int16 unk2 = argv[2].toSint16(); //int16 unk3 = argv[3].toSint16(); @@ -753,21 +756,15 @@ reg_t kRemapColors32(EngineState *s, int argc, reg_t *argv) { } break; case 2: { // remap by percent - // This adjusts the alpha value of a specific color, and it operates on - // an RGBA palette. Since we're operating on an RGB palette, we just - // modify the color intensity instead - // TODO: From what I understand, palette remapping should be placed - // separately, so that it can be reset by case 0 above. Thus, we - // should adjust the functionality of the Palette class accordingly. - int16 color = argv[1].toSint16(); + // TODO: Use the color index. The -10 offset is wrong. + /*int16 color = argv[1].toSint16(); if (color >= 10) - color -= 10; + color -= 10;*/ uint16 percent = argv[2].toUint16(); // 0 - 100 if (argc >= 4) warning("RemapByPercent called with 4 parameters, unknown parameter is %d", argv[3].toUint16()); - warning("kRemapColors: RemapByPercent color %d by %d percent", color, percent); - // TODO: It's not correct to set intensity here - //g_sci->_gfxPalette->kernelSetIntensity(color, 255, percent, false); + g_sci->_gfxPalette->toggleRemap(true); + g_sci->_gfxPalette->setRemappingPercent(percent); } break; case 3: { // remap to gray diff --git a/engines/sci/graphics/palette.cpp b/engines/sci/graphics/palette.cpp index ea154c5037..f16d607a29 100644 --- a/engines/sci/graphics/palette.cpp +++ b/engines/sci/graphics/palette.cpp @@ -100,6 +100,9 @@ GfxPalette::GfxPalette(ResourceManager *resMan, GfxScreen *screen) default: error("GfxPalette: Unknown view type"); } + + _remapOn = false; + _remappingPercent = 0; } GfxPalette::~GfxPalette() { @@ -329,6 +332,26 @@ void GfxPalette::set(Palette *newPalette, bool force, bool forceRealMerge) { } } +bool GfxPalette::isRemapColor(byte color) { + // TODO: Expand this for SCI32 (more than one remap color can be set). + // Now, it is assumed that colors 253 and 254 are the remap colors. + return _remapOn && (color == 253 || color == 254); +} + +byte GfxPalette::remapColor(byte color) { + assert(_remapOn); + + // TODO: Change this to use a table instead, like the original. + if (_remappingPercent) { + byte r = _sysPalette.colors[color].r * _remappingPercent / 100; + byte g = _sysPalette.colors[color].g * _remappingPercent / 100; + byte b = _sysPalette.colors[color].b * _remappingPercent / 100; + return kernelFindColor(r, g, b); + } else { + return color; + } +} + bool GfxPalette::insert(Palette *newPalette, Palette *destPalette) { bool paletteChanged = false; diff --git a/engines/sci/graphics/palette.h b/engines/sci/graphics/palette.h index a9ea1c32de..5b9ae9e016 100644 --- a/engines/sci/graphics/palette.h +++ b/engines/sci/graphics/palette.h @@ -53,6 +53,11 @@ public: void getSys(Palette *pal); uint16 getTotalColorCount() const { return _totalScreenColors; } + void toggleRemap(bool remap) { _remapOn = remap; } + void setRemappingPercent(uint16 percent) { _remappingPercent = percent; } + bool isRemapColor(byte color); + byte remapColor(byte color); + void setOnScreen(); void copySysPaletteToScreen(); @@ -123,6 +128,10 @@ private: int _palVarySignal; uint16 _totalScreenColors; + bool _remapOn; + uint16 _remappingBaseR, _remappingBaseG, _remappingBaseB; + uint16 _remappingPercent; + void loadMacIconBarPalette(); byte *_macClut; diff --git a/engines/sci/graphics/view.cpp b/engines/sci/graphics/view.cpp index 4e5c4da8b2..ae135d141c 100644 --- a/engines/sci/graphics/view.cpp +++ b/engines/sci/graphics/view.cpp @@ -741,8 +741,14 @@ void GfxView::draw(const Common::Rect &rect, const Common::Rect &clipRect, const const int x2 = clipRectTranslated.left + x; const int y2 = clipRectTranslated.top + y; if (!upscaledHires) { - if (priority >= _screen->getPriority(x2, y2)) - _screen->putPixel(x2, y2, drawMask, palette->mapping[color], priority, 0); + if (priority >= _screen->getPriority(x2, y2)) { + if (!_palette->isRemapColor(palette->mapping[color])) { + _screen->putPixel(x2, y2, drawMask, palette->mapping[color], priority, 0); + } else { + byte remappedColor = _palette->remapColor(_screen->getVisual(x2, y2)); + _screen->putPixel(x2, y2, drawMask, remappedColor, priority, 0); + } + } } else { // UpscaledHires means view is hires and is supposed to // get drawn onto lowres screen. |
