diff options
author | Filippos Karapetis | 2016-03-16 01:20:42 +0200 |
---|---|---|
committer | Filippos Karapetis | 2016-03-16 01:51:09 +0200 |
commit | 5be798c92f31dade1e59ca7279a022eff605c9ca (patch) | |
tree | 70f474a2e7e2f73db3435e616a71c77c254d8c32 /engines/sci | |
parent | 1f47766b6046a2d1f06982099a3a113c7ff61617 (diff) | |
download | scummvm-rg350-5be798c92f31dade1e59ca7279a022eff605c9ca.tar.gz scummvm-rg350-5be798c92f31dade1e59ca7279a022eff605c9ca.tar.bz2 scummvm-rg350-5be798c92f31dade1e59ca7279a022eff605c9ca.zip |
SCI32: Implement the remapping drawing functions
Diffstat (limited to 'engines/sci')
-rw-r--r-- | engines/sci/graphics/celobj32.cpp | 37 | ||||
-rw-r--r-- | engines/sci/graphics/remap.cpp | 15 | ||||
-rw-r--r-- | engines/sci/graphics/remap.h | 2 |
3 files changed, 42 insertions, 12 deletions
diff --git a/engines/sci/graphics/celobj32.cpp b/engines/sci/graphics/celobj32.cpp index 80ff70f6e2..de5bf02ecb 100644 --- a/engines/sci/graphics/celobj32.cpp +++ b/engines/sci/graphics/celobj32.cpp @@ -334,6 +334,19 @@ struct MAPPER_NoMDNoSkip { } }; +struct MAPPER_Map { + inline void draw(byte *target, const byte pixel, const uint8 skipColor) const { + if (pixel != skipColor) { + if (pixel < g_sci->_gfxRemap32->getStartColor()) { + *target = pixel; + } else { + if (g_sci->_gfxRemap32->remapEnabled(pixel)) + *target = g_sci->_gfxRemap32->remapColor(pixel, *target); + } + } + } +}; + void CelObj::draw(Buffer &target, const ScreenItem &screenItem, const Common::Rect &targetRect) const { const Common::Point &scaledPosition = screenItem._scaledPosition; const Ratio &scaleX = screenItem._ratioX; @@ -639,33 +652,33 @@ void CelObj::scaleDrawUncomp(Buffer &target, const Ratio &scaleX, const Ratio &s } void CelObj::drawHzFlipMap(Buffer &target, const Common::Rect &targetRect, const Common::Point &scaledPosition) const { - debug("drawHzFlipMap"); - dummyFill(target, targetRect); + render<MAPPER_Map, SCALER_NoScale<true, READER_Compressed> >(target, targetRect, scaledPosition); } void CelObj::drawNoFlipMap(Buffer &target, const Common::Rect &targetRect, const Common::Point &scaledPosition) const { - debug("drawNoFlipMap"); - dummyFill(target, targetRect); + render<MAPPER_Map, SCALER_NoScale<false, READER_Compressed> >(target, targetRect, scaledPosition); } void CelObj::drawUncompNoFlipMap(Buffer &target, const Common::Rect &targetRect, const Common::Point &scaledPosition) const { - debug("drawUncompNoFlipMap"); - dummyFill(target, targetRect); + render<MAPPER_Map, SCALER_NoScale<false, READER_Uncompressed> >(target, targetRect, scaledPosition); } void CelObj::drawUncompHzFlipMap(Buffer &target, const Common::Rect &targetRect, const Common::Point &scaledPosition) const { - debug("drawUncompHzFlipMap"); - dummyFill(target, targetRect); + render<MAPPER_Map, SCALER_NoScale<true, READER_Uncompressed> >(target, targetRect, scaledPosition); } void CelObj::scaleDrawMap(Buffer &target, const Ratio &scaleX, const Ratio &scaleY, const Common::Rect &targetRect, const Common::Point &scaledPosition) const { - debug("scaleDrawMap"); - dummyFill(target, targetRect); + if (_drawMirrored) + render<MAPPER_Map, SCALER_Scale<true, READER_Compressed> >(target, targetRect, scaledPosition, scaleX, scaleY); + else + render<MAPPER_Map, SCALER_Scale<false, READER_Compressed> >(target, targetRect, scaledPosition, scaleX, scaleY); } void CelObj::scaleDrawUncompMap(Buffer &target, const Ratio &scaleX, const Ratio &scaleY, const Common::Rect &targetRect, const Common::Point &scaledPosition) const { - debug("scaleDrawUncompMap"); - dummyFill(target, targetRect); + if (_drawMirrored) + render<MAPPER_Map, SCALER_Scale<true, READER_Uncompressed> >(target, targetRect, scaledPosition, scaleX, scaleY); + else + render<MAPPER_Map, SCALER_Scale<false, READER_Uncompressed> >(target, targetRect, scaledPosition, scaleX, scaleY); } void CelObj::drawNoFlipNoMD(Buffer &target, const Common::Rect &targetRect, const Common::Point &scaledPosition) const { diff --git a/engines/sci/graphics/remap.cpp b/engines/sci/graphics/remap.cpp index 9f4b9f78b5..e331eaf971 100644 --- a/engines/sci/graphics/remap.cpp +++ b/engines/sci/graphics/remap.cpp @@ -174,6 +174,21 @@ void GfxRemap32::setNoMatchRange(byte from, byte count) { _noMapCount = count; } +bool GfxRemap32::remapEnabled(byte color) const { + assert(_remapEndColor - color >= 0 && _remapEndColor - color < REMAP_COLOR_COUNT); + const byte index = _remapEndColor - color; + return (_remaps[index].type != kRemappingNone); +} + +byte GfxRemap32::remapColor(byte color, byte target) { + assert(_remapEndColor - color >= 0 && _remapEndColor - color < REMAP_COLOR_COUNT); + const byte index = _remapEndColor - color; + if (_remaps[index].type != kRemappingNone) + return _remaps[index].remap[target]; + else + return target; +} + void GfxRemap32::initColorArrays(byte index) { Palette *curPalette = &_palette->_sysPalette; RemapParams *curRemap = &_remaps[index]; diff --git a/engines/sci/graphics/remap.h b/engines/sci/graphics/remap.h index d2cec5baeb..d012568f7f 100644 --- a/engines/sci/graphics/remap.h +++ b/engines/sci/graphics/remap.h @@ -128,6 +128,8 @@ public: void setRemappingToGray(byte color, byte gray); void setRemappingToPercentGray(byte color, byte gray, byte percent); void setNoMatchRange(byte from, byte count); + bool remapEnabled(byte color) const; + byte remapColor(byte color, byte target); bool remapAllTables(bool palChanged); int getRemapCount() const { return _remapCount; } int getStartColor() const { return _remapEndColor - REMAP_COLOR_COUNT + 1; } |