diff options
Diffstat (limited to 'engines/sci/graphics/remap.h')
| -rw-r--r-- | engines/sci/graphics/remap.h | 107 | 
1 files changed, 97 insertions, 10 deletions
diff --git a/engines/sci/graphics/remap.h b/engines/sci/graphics/remap.h index 98177f6d19..d012568f7f 100644 --- a/engines/sci/graphics/remap.h +++ b/engines/sci/graphics/remap.h @@ -24,36 +24,42 @@  #define SCI_GRAPHICS_REMAP_H  #include "common/array.h" -#include "common/serializer.h" +#include "sci/graphics/helpers.h"  namespace Sci {  class GfxScreen; +enum ColorRemappingType { +	kRemappingNone = 0, +	kRemappingByRange = 1, +	kRemappingByPercent = 2, +	kRemappingToGray = 3, +	kRemappingToPercentGray = 4 +}; + +#define REMAP_COLOR_COUNT 9 +#define NON_REMAPPED_COLOR_COUNT 236 +  /** - * This class handles color remapping for the QFG4 demo. + * Remap class, handles color remapping   */  class GfxRemap { -private: -	enum ColorRemappingType { -		kRemapNone = 0, -		kRemapByRange = 1, -		kRemapByPercent = 2 -	}; -  public:  	GfxRemap(GfxPalette *_palette); +	~GfxRemap();  	void resetRemapping();  	void setRemappingPercent(byte color, byte percent);  	void setRemappingRange(byte color, byte from, byte to, byte base);  	bool isRemapped(byte color) const { -		return _remapOn && (_remappingType[color] != kRemapNone); +		return _remapOn && (_remappingType[color] != kRemappingNone);  	}  	byte remapColor(byte remappedColor, byte screenColor);  	void updateRemapping();  private: +	GfxScreen *_screen;  	GfxPalette *_palette;  	bool _remapOn; @@ -62,6 +68,87 @@ private:  	byte _remappingByRange[256];  	uint16 _remappingPercentToSet;  }; + +#ifdef ENABLE_SCI32 + +struct RemapParams { +	byte from; +	byte to; +	byte base; +	byte gray; +	byte oldGray; +	byte percent; +	byte oldPercent; +	ColorRemappingType type; +	Color curColor[256]; +	Color targetColor[256]; +	byte distance[256]; +	byte remap[256]; +	bool colorChanged[256]; + +	RemapParams() { +		from = to = base = gray = oldGray = percent = oldPercent = 0; +		type = kRemappingNone; + +		// curColor and targetColor are initialized in GfxRemap32::initColorArrays +		memset(curColor, 0, 256 * sizeof(Color)); +		memset(targetColor, 0, 256 * sizeof(Color)); +		memset(distance, 0, 256); +		for (int i = 0; i < NON_REMAPPED_COLOR_COUNT; i++) +			remap[i] = i; +		Common::fill(colorChanged, colorChanged + ARRAYSIZE(colorChanged), true); +	} + +	RemapParams(byte from_, byte to_, byte base_, byte gray_, byte percent_, ColorRemappingType type_) { +		from = from_; +		to = to_; +		base = base_; +		gray = oldGray = gray_; +		percent = oldPercent = percent_; +		type = type_; + +		// curColor and targetColor are initialized in GfxRemap32::initColorArrays +		memset(curColor, 0, 256 * sizeof(Color)); +		memset(targetColor, 0, 256 * sizeof(Color)); +		memset(distance, 0, 256); +		for (int i = 0; i < NON_REMAPPED_COLOR_COUNT; i++) +			remap[i] = i; +		Common::fill(colorChanged, colorChanged + ARRAYSIZE(colorChanged), true); +	} +}; + +class GfxRemap32 { +public: +	GfxRemap32(GfxPalette32 *palette); +	~GfxRemap32() {} + +	void remapOff(byte color); +	void setRemappingRange(byte color, byte from, byte to, byte base); +	void setRemappingPercent(byte color, byte percent); +	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; } +	int getEndColor() const { return _remapEndColor; } +private: +	GfxPalette32 *_palette; +	RemapParams _remaps[REMAP_COLOR_COUNT]; +	bool _update; +	byte _noMapStart, _noMapCount; +	bool _targetChanged[NON_REMAPPED_COLOR_COUNT]; +	byte _remapEndColor; +	int _remapCount; + +	void initColorArrays(byte index); +	bool applyRemap(byte index); +	bool updateRemap(byte index, bool palChanged); +}; +#endif +  } // End of namespace Sci  #endif  | 
