diff options
| -rw-r--r-- | engines/sci/graphics/palette.cpp | 61 | ||||
| -rw-r--r-- | engines/sci/graphics/palette.h | 10 | 
2 files changed, 71 insertions, 0 deletions
| diff --git a/engines/sci/graphics/palette.cpp b/engines/sci/graphics/palette.cpp index 616ee841c1..b27b5f35a7 100644 --- a/engines/sci/graphics/palette.cpp +++ b/engines/sci/graphics/palette.cpp @@ -69,11 +69,19 @@ GfxPalette::GfxPalette(ResourceManager *resMan, GfxScreen *screen, bool useMergi  	_useMerging = useMerging;  	palVaryInit(); +	 +#ifdef ENABLE_SCI32 +	_clutTable = 0; +#endif  }  GfxPalette::~GfxPalette() {  	if (_palVaryResourceId != -1)  		palVaryRemoveTimer(); + +#ifdef ENABLE_SCI32 +	unloadClut(); +#endif  }  bool GfxPalette::isMerging() { @@ -787,4 +795,57 @@ void GfxPalette::palVaryProcess(int signal, bool setPalette) {  	}  } +#ifdef ENABLE_SCI32 + +bool GfxPalette::loadClut(uint16 clutId) { +	// loadClut() will load a color lookup table from a clu file and set +	// the palette found in the file. This is to be used with Phantasmagoria 2. + +	unloadClut(); + +	Common::String filename = Common::String::format("%d.clu", clutId); +	Common::File clut; + +	if (!clut.open(filename) || clut.size() != 0x10000 + 236 * 3) +		return false; + +	// Read in the lookup table +	// It maps each RGB565 color to a palette index +	_clutTable = new byte[0x10000]; +	clut.read(_clutTable, 0x10000); + +	Palette pal; +	memset(&pal, 0, sizeof(Palette)); + +	// Setup 1:1 mapping +	for (int i = 0; i < 256; i++) +		pal.mapping[i] = i; + +	// Now load in the palette +	for (int i = 1; i <= 236; i++) { +		pal.colors[i].used = 1; +		pal.colors[i].r = clut.readByte(); +		pal.colors[i].g = clut.readByte(); +		pal.colors[i].b = clut.readByte(); +	} + +	set(&pal, true); +	setOnScreen(); +	return true; +} + +byte GfxPalette::matchClutColor(uint16 color) { +	// Match a color in RGB565 format to a palette index based on the loaded CLUT +	assert(_clutTable); +	return _clutTable[color]; +} + +void GfxPalette::unloadClut() { +	// This will only unload the actual table, but not reset any palette +	delete[] _clutTable; +	_clutTable = 0; +} +  +#endif +  } // End of namespace Sci diff --git a/engines/sci/graphics/palette.h b/engines/sci/graphics/palette.h index 879bbcfd9c..84334a4a61 100644 --- a/engines/sci/graphics/palette.h +++ b/engines/sci/graphics/palette.h @@ -88,6 +88,12 @@ public:  	virtual void saveLoadWithSerializer(Common::Serializer &s);  	void palVarySaveLoadPalette(Common::Serializer &s, Palette *palette); +#ifdef ENABLE_SCI32 +	bool loadClut(uint16 clutId); +	byte matchClutColor(uint16 color); +	void unloadClut(); +#endif +  private:  	void palVaryInit();  	void palVaryInstallTimer(); @@ -113,6 +119,10 @@ private:  	uint16 _palVaryTicks;  	int _palVaryPaused;  	int _palVarySignal; +	 +#ifdef ENABLE_SCI32 +	byte *_clutTable; +#endif  };  } // End of namespace Sci | 
