aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--engines/lure/palette.cpp76
-rw-r--r--engines/lure/palette.h7
-rw-r--r--engines/lure/res.cpp3
-rw-r--r--engines/lure/screen.cpp2
4 files changed, 64 insertions, 24 deletions
diff --git a/engines/lure/palette.cpp b/engines/lure/palette.cpp
index 7191acd133..59c8ad045b 100644
--- a/engines/lure/palette.cpp
+++ b/engines/lure/palette.cpp
@@ -23,6 +23,7 @@
*
*/
+#include "lure/lure.h"
#include "lure/palette.h"
#include "common/util.h"
@@ -40,15 +41,19 @@ Palette::Palette() {
// 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 @@ Palette::Palette(Palette &src) {
// Constructor
// Loads a palette from a resource
-Palette::Palette(uint16 resourceId) {
- Disk &d = Disk::getReference();
-
- MemoryBlock *srcData = d.getEntry(resourceId);
- if (((srcData->size() % 3) != 0) || ((srcData->size() / 3) > GAME_COLOURS))
- error("Specified resource %d is not a palette", resourceId);
+Palette::Palette(uint16 resourceId, PaletteSource paletteSource) {
+ Disk &disk = Disk::getReference();
+ bool isEGA = LureEngine::getReference().isEGA();
+ MemoryBlock *srcData = disk.getEntry(resourceId);
+
+ if (paletteSource == DEFAULT)
+ paletteSource = isEGA ? EGA : RGB64;
+
+ 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");
+ }
- _numEntries = srcData->size() / 3;
- _palette = Memory::allocate(_numEntries * 4);
- convertPalette(srcData->data(), _numEntries);
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::convertPalette(const byte *palette1, uint16 numEntries1) {
}
}
+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 @@ PaletteCollection::~PaletteCollection() {
free(_palettes);
}
-
Palette &PaletteCollection::getPalette(uint8 paletteNum) {
if (paletteNum >= _numPalettes)
error("Invalid palette index specified");
diff --git a/engines/lure/palette.h b/engines/lure/palette.h
index fedb3b9570..e4bed28437 100644
--- a/engines/lure/palette.h
+++ b/engines/lure/palette.h
@@ -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; }
diff --git a/engines/lure/res.cpp b/engines/lure/res.cpp
index b405651d42..64ddbf1a4e 100644
--- a/engines/lure/res.cpp
+++ b/engines/lure/res.cpp
@@ -105,6 +105,7 @@ void Resources::reset() {
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 @@ void Resources::reloadData() {
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);
diff --git a/engines/lure/screen.cpp b/engines/lure/screen.cpp
index 00e4dca73c..7847b55cf1 100644
--- a/engines/lure/screen.cpp
+++ b/engines/lure/screen.cpp
@@ -41,7 +41,7 @@ Screen &Screen::getReference() {
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);