diff options
Diffstat (limited to 'engines/sci/gfx/palette.cpp')
-rw-r--r-- | engines/sci/gfx/palette.cpp | 330 |
1 files changed, 0 insertions, 330 deletions
diff --git a/engines/sci/gfx/palette.cpp b/engines/sci/gfx/palette.cpp deleted file mode 100644 index 62e70e2a6d..0000000000 --- a/engines/sci/gfx/palette.cpp +++ /dev/null @@ -1,330 +0,0 @@ -/* ScummVM - Graphic Adventure Engine - * - * ScummVM is the legal property of its developers, whose names - * are too numerous to list here. Please refer to the COPYRIGHT - * file distributed with this source distribution. - * - * 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 "sci/sci.h" // for INCLUDE_OLDGFX -#ifdef INCLUDE_OLDGFX - -#include "sci/gfx/palette.h" -#include "sci/gfx/gfx_system.h" - -// #define DEBUG_MERGE - -namespace Sci { - -Palette::Palette(uint s) { - _size = s; - _colors = new PaletteEntry[s]; - _parent = 0; - _dirty = true; - _refcount = 1; - _revision = 0; -} - -Palette::Palette(const PaletteEntry *colors, uint s) { - _size = s; - _colors = new PaletteEntry[s]; - _parent = 0; - _dirty = true; - _refcount = 1; - _revision = 0; - - for (uint i = 0; i < _size; ++i) { - _colors[i].r = colors[i].r; - _colors[i].g = colors[i].g; - _colors[i].b = colors[i].b; - _colors[i].refcount = 0; - _colors[i]._parentIndex = -1; - } -} - -Palette::~Palette() { - if (_parent) - unmerge(); - - delete[] _colors; - _colors = 0; -} - -Palette *Palette::getref() { - _refcount++; - return this; -} - -void Palette::free() { - assert(_refcount > 0); - _refcount--; - - if (_refcount == 0) - delete this; -} - -void Palette::resize(uint s) { - if (s == _size) - return; - - assert(!_parent); - assert(_refcount == 1); - assert(s >= _size); - - PaletteEntry *n = new PaletteEntry[s]; - for (uint i = 0; i < _size; ++i) - n[i] = _colors[i]; - - delete[] _colors; - _colors = n; - _size = s; -} - -void Palette::unmerge() { - assert(_parent); -#ifdef DEBUG_MERGE - fprintf(stderr, "Unmerge %s from %s (%d colors)\n", name.c_str(), _parent->name.c_str(), _size); -#endif - if (_parent->_revision != _revision) { -#ifdef DEBUG_MERGE - fprintf(stderr, "NOP (revision mismatch)\n"); -#endif - return; - } - - int count = 0; - for (uint i = 0; i < _size; ++i) { - if (_colors[i].refcount == PaletteEntry::FREE) { - assert(_colors[i]._parentIndex == 0); - } - - int pi = _colors[i]._parentIndex; - assert(pi >= 0); - assert(pi < (int)_parent->_size); - assert(_parent->_colors[pi].refcount != 0); - assert(_parent->_colors[pi].refcount != PaletteEntry::FREE); - if (_parent->_colors[pi].refcount != PaletteEntry::LOCKED) - _parent->_colors[pi].refcount--; - if (_parent->_colors[pi].refcount == 0) { - _parent->_colors[pi].refcount = PaletteEntry::FREE; - count++; - } - _colors[i]._parentIndex = -1; - } -#ifdef DEBUG_MERGE - fprintf(stderr, "Unmerge free %d colors\n", count); -#endif - - _parent = 0; -} - -void Palette::setColor(uint index, byte r, byte g, byte b, int parentIndex) { - assert(index < _size); - assert(!_parent); - -// FIXME: We may want to have this assert. This will require changing the -// way loops sharing a single view's palette works. -// assert(_refcount == 1); - - PaletteEntry& entry = _colors[index]; - - assert(entry.refcount == PaletteEntry::FREE || entry.refcount == 0); - entry.refcount = 0; - entry.r = r; - entry.g = g; - entry.b = b; - entry._parentIndex = parentIndex; - - _dirty = true; -} - -void Palette::makeSystemColor(uint index, const PaletteEntry &color) { - assert(index < _size); - PaletteEntry& entry = _colors[index]; - entry.r = color.r; - entry.g = color.g; - entry.b = color.b; - entry.refcount = PaletteEntry::LOCKED; -} - -uint Palette::findNearbyColor(byte r, byte g, byte b, bool lock) { - int bestdelta = 1 + ((0x100 * 0x100) * 3); - int bestcolor = -1; - int firstfree = -1; - - assert(_size != 0); - - for (uint i = 0; i < _size; ++i) { - PaletteEntry& entry = _colors[i]; - - if (entry.refcount != PaletteEntry::FREE) { - int dr = abs(entry.r - r); - int dg = abs(entry.g - g); - int db = abs(entry.b - b); - - if (dr == 0 && dg == 0 && db == 0) { - // Exact match - //exact = true; - if (lock && entry.refcount != PaletteEntry::LOCKED) - entry.refcount++; - return i; - } - - int delta = (dr * dr) + (dg * dg) + (db * db); - if (delta < bestdelta) { - bestdelta = delta; - bestcolor = i; - } - } else { - if (firstfree == -1) - firstfree = i; - } - } - - if (firstfree != -1) { - // TODO: mark palette as dirty - setColor(firstfree, r, g, b); - //exact = true; - if (lock) - _colors[firstfree].refcount++; - return firstfree; - } - - //exact = false; - if (lock && _colors[bestcolor].refcount != PaletteEntry::LOCKED) { -#if 0 - _colors[bestcolor].r = r; - _colors[bestcolor].g = g; - _colors[bestcolor].b = b; - _dirty = true; -#endif - _colors[bestcolor].refcount++; - } - return bestcolor; -} - -bool Palette::mergeInto(Palette *parent) { - assert(!_parent || _parent == parent); - assert(parent != this); -#ifdef DEBUG_MERGE - fprintf(stderr, "Merge: %s into %s (%d colors)\n", name.c_str(), parent->name.c_str(), _size); -#endif - - if (_parent == parent && parent->_revision == _revision) { -#ifdef DEBUG_MERGE - fprintf(stderr, "NOP\n"); -#endif - return false; - } - _parent = parent; - _revision = parent->_revision; - -#ifdef DEBUG_MERGE - bool *used = new bool[_parent->size()]; - for (uint i = 0; i < _parent->size(); ++i) - used[i] = false; - int count = 0; - uint used_min = 1000; - uint used_max = 0; -#endif - - for (uint i = 0; i < _size; ++i) { - PaletteEntry& entry = _colors[i]; - if (entry.refcount == PaletteEntry::FREE) { - // Force all unused colours to index 0 - entry._parentIndex = 0; - if (_parent->_colors[0].refcount != PaletteEntry::LOCKED) - _parent->_colors[0].refcount++; - if (_colors[i].r || _colors[i].g || _colors[i].b) - warning("Non-black unused colour in pic: index %d, %02X %02X %02X", i, _colors[i].r, _colors[i].g, _colors[i].b); - continue; - } - - uint pi = _parent->findNearbyColor(entry.r, entry.g, entry.b); -#ifdef DEBUG_MERGE - if (!used[pi]) count++; - used[pi] = true; - if (pi > used_max) used_max = pi; - if (pi < used_min) used_min = pi; -#endif - entry._parentIndex = pi; - if (_parent->_colors[pi].refcount != PaletteEntry::LOCKED) - _parent->_colors[pi].refcount++; - } -#ifdef DEBUG_MERGE - fprintf(stderr, "Merge used %d colours in [%d..%d]\n", count, used_min, used_max); - delete[] used; -#endif - return true; -} - -void Palette::forceInto(Palette *parent) { - assert(!_parent || _parent == parent); - assert(parent != this); -#ifdef DEBUG_MERGE - fprintf(stderr, "Merge: force %s into %s (%d colors)\n", name.c_str(), parent->name.c_str(), _size); -#endif - - _parent = parent; - parent->_revision++; - _revision = parent->_revision; - - for (unsigned int i = 0; i < _size; ++i) { - // FIXME: PaletteEntry::LOCKED doesn't work well with forceInto... - if (_colors[i].refcount != PaletteEntry::FREE) { - _parent->_colors[i] = _colors[i]; - _parent->_colors[i]._parentIndex = -1; - _colors[i]._parentIndex = i; - if (_parent->_colors[i].refcount != PaletteEntry::LOCKED) - _parent->_colors[i].refcount = 1; - } else { - _parent->_colors[i].refcount = 0; - // Force all unused colours to index 0 - _colors[i]._parentIndex = 0; - if (_parent->_colors[0].refcount != PaletteEntry::LOCKED) { - if (i == 0) - _parent->_colors[0].refcount = 1; - else - _parent->_colors[0].refcount++; - } - if (_colors[i].r || _colors[i].g || _colors[i].b) - warning("Non-black unused colour in pic: index %d, %02X %02X %02X", i, _colors[i].r, _colors[i].g, _colors[i].b); - } - } - _parent->_dirty = true; -} - -Palette *Palette::copy() { - assert(!_parent); - Palette* p = new Palette(_size); - p->name = "copy of " + name; - - for (uint i = 0; i < _size; ++i) { - p->_colors[i] = _colors[i]; - if (p->_colors[i].refcount >= 0) - p->_colors[i].refcount = 0; - } - return p; -} - - -} // End of namespace Sci - -#endif |