[Scummvm-cvs-logs] SF.net SVN: scummvm: [30097] scummvm/trunk/engines/lure

dreammaster at users.sourceforge.net dreammaster at users.sourceforge.net
Mon Dec 31 06:58:22 CET 2007


Revision: 30097
          http://scummvm.svn.sourceforge.net/scummvm/?rev=30097&view=rev
Author:   dreammaster
Date:     2007-12-30 21:58:22 -0800 (Sun, 30 Dec 2007)

Log Message:
-----------
Added extra palette handling for EGA palettes

Modified Paths:
--------------
    scummvm/trunk/engines/lure/palette.cpp
    scummvm/trunk/engines/lure/palette.h
    scummvm/trunk/engines/lure/res.cpp
    scummvm/trunk/engines/lure/screen.cpp

Modified: scummvm/trunk/engines/lure/palette.cpp
===================================================================
--- scummvm/trunk/engines/lure/palette.cpp	2007-12-31 05:57:11 UTC (rev 30096)
+++ scummvm/trunk/engines/lure/palette.cpp	2007-12-31 05:58:22 UTC (rev 30097)
@@ -23,6 +23,7 @@
  *
  */
 
+#include "lure/lure.h"
 #include "lure/palette.h"
 #include "common/util.h"
 
@@ -40,15 +41,19 @@
 // Consructor
 // Sets up a palette with the given number of entries and a copy of the passed data
 
-Palette::Palette(uint8 numEntries1, const byte *data1, PaletteSource paletteSource) {
-	_numEntries = numEntries1;
+Palette::Palette(uint8 srcNumEntries, const byte *srcData, PaletteSource paletteSource) {
+	_numEntries = srcNumEntries;
 	_palette = Memory::allocate(_numEntries * 4);
 
-	if (data1) {
+	if (srcData) {
 		if (paletteSource == RGB64) 
-			convertPalette(data1, _numEntries);
-		else
-			_palette->copyFrom(data1, 0, 0, _numEntries * 4);
+			convertRgb64Palette(srcData, _numEntries);
+		else if (paletteSource == EGA) {
+			assert((srcNumEntries == 16) || (srcNumEntries == 17));
+			convertEGAPalette(srcData);
+		} else
+			_palette->copyFrom(srcData, 0, 0, _numEntries * 4);
+
 	} else {
 		// No data provided, set a null palette
 		_palette->empty();
@@ -66,24 +71,46 @@
 // Constructor
 // Loads a palette from a resource
 
-Palette::Palette(uint16 resourceId) {
-	Disk &d = Disk::getReference();
+Palette::Palette(uint16 resourceId, PaletteSource paletteSource) {
+	Disk &disk = Disk::getReference();
+	bool isEGA = LureEngine::getReference().isEGA();
+	MemoryBlock *srcData = disk.getEntry(resourceId); 
 
-	MemoryBlock *srcData = d.getEntry(resourceId); 
-	if (((srcData->size() % 3) != 0) || ((srcData->size() / 3) > GAME_COLOURS))
-		error("Specified resource %d is not a palette", resourceId);
+	if (paletteSource == DEFAULT)
+		paletteSource = isEGA ? EGA : RGB64;
 
-	_numEntries = srcData->size() / 3;
-	_palette = Memory::allocate(_numEntries * 4);
-	convertPalette(srcData->data(), _numEntries);
+	switch (paletteSource) {
+	case EGA:
+		// Handle EGA palette
+		if ((srcData->size() != 16) && (srcData->size() != 17))
+			error("Specified resource %d is not a palette", resourceId);
+		
+		_numEntries = 16;
+		_palette = Memory::allocate(_numEntries * 4);
+		convertEGAPalette(srcData->data());
+		break;
+
+	case RGB64:
+		if (((srcData->size() % 3) != 0) || ((srcData->size() / 3) > GAME_COLOURS))
+			error("Specified resource %d is not a palette", resourceId);
+
+		_numEntries = srcData->size() / 3;
+		_palette = Memory::allocate(_numEntries * 4);
+		convertRgb64Palette(srcData->data(), _numEntries);
+		break;
+
+	default:
+		error("Invalid palette type specified for palette resource");
+	}
+
 	delete srcData;
 }
 
-void Palette::convertPalette(const byte *palette1, uint16 numEntries1) {
+void Palette::convertRgb64Palette(const byte *srcPalette, uint16 srcNumEntries) {
 	byte *pDest = _palette->data();
-	const byte *pSrc = palette1;
+	const byte *pSrc = srcPalette;
 
-	while (numEntries1-- > 0) {
+	while (srcNumEntries-- > 0) {
 		*pDest++ = (pSrc[0] << 2) + (pSrc[0] >> 4);
 		*pDest++ = (pSrc[1] << 2) + (pSrc[1] >> 4);
 		*pDest++ = (pSrc[2] << 2) + (pSrc[2] >> 4);
@@ -92,6 +119,18 @@
 	}
 }
 
+void Palette::convertEGAPalette(const byte *srcPalette) {
+	byte *pDest = _palette->data();
+	const byte *pSrc = srcPalette;
+
+	for (int index = 0; index < 16; ++index, ++pSrc) {
+		*pDest++ = (((*pSrc >> 5) & 1) | ((*pSrc >> 1) & 2)) * 0x55;
+		*pDest++ = (((*pSrc >> 4) & 1) | (*pSrc & 2)) * 0x55;
+		*pDest++ = (((*pSrc >> 3) & 1) | ((*pSrc << 1) & 2)) * 0x55;
+		*pDest++ = 0;
+	}
+}
+
 void Palette::setEntry(uint8 index, uint32 value) {
 	if (index >= numEntries()) error("Invalid palette index: %d", index);
 	uint32 *entry = (uint32 *) (data() + index * 4);
@@ -135,7 +174,6 @@
 	free(_palettes);
 }
 
-
 Palette &PaletteCollection::getPalette(uint8 paletteNum) {
 	if (paletteNum >= _numPalettes)
 		error("Invalid palette index specified");

Modified: scummvm/trunk/engines/lure/palette.h
===================================================================
--- scummvm/trunk/engines/lure/palette.h	2007-12-31 05:57:11 UTC (rev 30096)
+++ scummvm/trunk/engines/lure/palette.h	2007-12-31 05:58:22 UTC (rev 30097)
@@ -32,19 +32,20 @@
 
 namespace Lure {
 
-enum PaletteSource {RGB, RGB64};
+enum PaletteSource {DEFAULT, RGB, RGB64, EGA};
 
 class Palette {
 private:
 	MemoryBlock *_palette;
 	uint16 _numEntries;
 
-	void convertPalette(const byte *palette, uint16 numEntries);
+	void convertRgb64Palette(const byte *srcPalette, uint16 srcNumEntries);
+	void convertEGAPalette(const byte *srcPalette);
 public:
 	Palette();
 	Palette(uint8 numEntries, const byte *data, PaletteSource paletteSource);
 	Palette(Palette &src);
-	Palette(uint16 resourceId);
+	Palette(uint16 resourceId, PaletteSource paletteSource = DEFAULT);
 
 	uint8 *data() { return _palette->data(); }
 	MemoryBlock *palette() { return _palette; }

Modified: scummvm/trunk/engines/lure/res.cpp
===================================================================
--- scummvm/trunk/engines/lure/res.cpp	2007-12-31 05:57:11 UTC (rev 30096)
+++ scummvm/trunk/engines/lure/res.cpp	2007-12-31 05:58:22 UTC (rev 30097)
@@ -105,6 +105,7 @@
 
 void Resources::reloadData() {
 	Disk &d = Disk::getReference();
+	bool isEGA = LureEngine::getReference().isEGA();
 	MemoryBlock *mb, *paths;
 	uint16 *offset, offsetVal;
 	uint16 recordId, startOffset;
@@ -112,7 +113,7 @@
 	uint16 *v;
 
 	// Get the palette subset data
-	_paletteSubset = new Palette(ALT_PALETTE_RESOURCE_ID);
+	_paletteSubset = isEGA ? NULL : new Palette(ALT_PALETTE_RESOURCE_ID);
 
 	// Load room data 
 	mb = d.getEntry(ROOM_DATA_RESOURCE_ID);

Modified: scummvm/trunk/engines/lure/screen.cpp
===================================================================
--- scummvm/trunk/engines/lure/screen.cpp	2007-12-31 05:57:11 UTC (rev 30096)
+++ scummvm/trunk/engines/lure/screen.cpp	2007-12-31 05:58:22 UTC (rev 30097)
@@ -41,7 +41,7 @@
 Screen::Screen(OSystem &system): _system(system), 
 		_screen(new Surface(FULL_SCREEN_WIDTH, FULL_SCREEN_HEIGHT)), 
 		_disk(Disk::getReference()),
-		_palette(new Palette(GAME_PALETTE_RESOURCE_ID)) {
+		_palette(new Palette(GAME_PALETTE_RESOURCE_ID, RGB64)) {
 	int_disk = this;
 	_screen->empty();
 	_system.setPalette(_palette->data(), 0, GAME_COLOURS);


This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.




More information about the Scummvm-git-logs mailing list