From 1dd2e32fc0c402b4c0f2a097d6ce3b55eb09017f Mon Sep 17 00:00:00 2001 From: Paul Gilbert Date: Mon, 31 Dec 2007 05:58:22 +0000 Subject: Added extra palette handling for EGA palettes svn-id: r30097 --- engines/lure/palette.cpp | 76 ++++++++++++++++++++++++++++++++++++------------ engines/lure/palette.h | 7 +++-- engines/lure/res.cpp | 3 +- engines/lure/screen.cpp | 2 +- 4 files changed, 64 insertions(+), 24 deletions(-) (limited to 'engines/lure') 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); -- cgit v1.2.3