aboutsummaryrefslogtreecommitdiff
path: root/engines/lure/palette.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'engines/lure/palette.cpp')
-rw-r--r--engines/lure/palette.cpp142
1 files changed, 142 insertions, 0 deletions
diff --git a/engines/lure/palette.cpp b/engines/lure/palette.cpp
new file mode 100644
index 0000000000..e4d8db0a41
--- /dev/null
+++ b/engines/lure/palette.cpp
@@ -0,0 +1,142 @@
+/* ScummVM - Scumm Interpreter
+ * Copyright (C) 2005-2006 The ScummVM project
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
+ * $URL$
+ * $Id$
+ *
+ */
+
+#include "lure/palette.h"
+#include "common/util.h"
+
+namespace Lure {
+
+// Constructor
+// Defaults the palette to a full 256 entry palette
+
+Palette::Palette() {
+ _numEntries = GAME_COLOURS;
+ _palette = Memory::allocate(_numEntries * 4);
+ _palette->empty();
+}
+
+// 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 = Memory::allocate(_numEntries * 4);
+
+ if (data1) {
+ if (paletteSource == RGB64)
+ convertPalette(data1, _numEntries);
+ else
+ _palette->copyFrom(data1, 0, 0, _numEntries * 4);
+ } else {
+ // No data provided, set a null palette
+ _palette->empty();
+ }
+}
+
+// Constructor
+// Makes a copy of a passed palette object
+
+Palette::Palette(Palette &src) {
+ _numEntries = src.numEntries();
+ _palette = Memory::duplicate(src._palette);
+}
+
+// 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);
+
+ _numEntries = srcData->size() / 3;
+ _palette = Memory::allocate(_numEntries * 4);
+ convertPalette(srcData->data(), _numEntries);
+ delete srcData;
+}
+
+void Palette::convertPalette(const byte *palette1, uint16 numEntries1) {
+ byte *pDest = _palette->data();
+ const byte *pSrc = palette1;
+
+ while (numEntries1-- > 0) {
+ *pDest++ = (pSrc[0] << 2) + (pSrc[0] >> 4);
+ *pDest++ = (pSrc[1] << 2) + (pSrc[1] >> 4);
+ *pDest++ = (pSrc[2] << 2) + (pSrc[2] >> 4);
+ *pDest++ = 0;
+ pSrc += 3;
+ }
+}
+
+void Palette::setEntry(uint8 index, uint32 value) {
+ if (index >= numEntries()) error("Invalid palette index: %d", index);
+ uint32 *entry = (uint32 *) (data() + index * 4);
+ *entry = value;
+}
+
+uint32 Palette::getEntry(uint8 index) {
+ if (index >= numEntries()) error("Invalid palette index: %d", index);
+ uint32 *entry = (uint32 *) (data() + index * 4);
+ return *entry;
+}
+
+void Palette::copyFrom(Palette *src) {
+ _palette->copyFrom(src->palette());
+}
+
+/*--------------------------------------------------------------------------*/
+
+PaletteCollection::PaletteCollection(uint16 resourceId) {
+ Disk &d = Disk::getReference();
+ MemoryBlock *resource = d.getEntry(resourceId);
+ uint32 palSize;
+ uint8 *data = resource->data();
+
+ if (resource->size() % (SUB_PALETTE_SIZE * 3) != 0)
+ error("Resource #%d is not a valid palette set", resourceId);
+
+ palSize = SUB_PALETTE_SIZE * 3;
+ _numPalettes = resource->size() / palSize;
+
+ _palettes = (Palette **) Memory::alloc(_numPalettes * sizeof(Palette *));
+ for (uint8 paletteCtr = 0; paletteCtr < _numPalettes; ++paletteCtr, data += palSize)
+ _palettes[paletteCtr] = new Palette(SUB_PALETTE_SIZE, data, RGB64);
+
+ delete resource;
+}
+
+PaletteCollection::~PaletteCollection() {
+ for (int paletteCtr = 0; paletteCtr < _numPalettes; ++paletteCtr)
+ delete _palettes[paletteCtr];
+ free(_palettes);
+}
+
+
+Palette &PaletteCollection::getPalette(uint8 paletteNum) {
+ if (paletteNum >= _numPalettes)
+ error("Invalid palette index specified");
+ return *_palettes[paletteNum];
+}
+
+} // end of namespace Lure