scummvm/graphics/paletteman.cpp
Torbjörn Andersson df4f95f805 Let the [cursor] palette manager handle disableCursorPalette() too, to avoid
cursor glitch in at least some HE games which first set a cursor palette, and
then disable it. (The disabled palette would be re-enabled after dismissing the
GUI.)

svn-id: r23081
2006-06-13 09:48:46 +00:00

120 lines
2.9 KiB
C++

/* ScummVM - Scumm Interpreter
* Copyright (C) 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 "graphics/paletteman.h"
#include "common/system.h"
#include "common/stack.h"
DECLARE_SINGLETON(Graphics::PaletteManager);
namespace Graphics {
static bool g_initialized = false;
PaletteManager::PaletteManager() {
if (!g_initialized) {
g_initialized = true;
_cursorPaletteStack.clear();
}
}
void PaletteManager::disableCursorPalette(bool disable) {
if (!g_system->hasFeature(OSystem::kFeatureCursorHasPalette))
return;
if (_cursorPaletteStack.empty())
return;
Palette *pal = _cursorPaletteStack.top();
pal->_disabled = disable;
g_system->disableCursorPalette(true);
}
void PaletteManager::pushCursorPalette(const byte *colors, uint start, uint num) {
if (!g_system->hasFeature(OSystem::kFeatureCursorHasPalette))
return;
Palette *pal = new Palette(colors, start, num);
_cursorPaletteStack.push(pal);
if (num)
g_system->setCursorPalette(colors, start, num);
else
g_system->disableCursorPalette(true);
}
void PaletteManager::popCursorPalette() {
if (!g_system->hasFeature(OSystem::kFeatureCursorHasPalette))
return;
if (_cursorPaletteStack.empty())
return;
Palette *pal = _cursorPaletteStack.pop();
delete pal;
if (_cursorPaletteStack.empty()) {
g_system->disableCursorPalette(true);
return;
}
pal = _cursorPaletteStack.top();
if (pal->_num && !pal->_disabled)
g_system->setCursorPalette(pal->_data, pal->_start, pal->_num);
else
g_system->disableCursorPalette(true);
}
void PaletteManager::replaceCursorPalette(const byte *colors, uint start, uint num) {
if (!g_system->hasFeature(OSystem::kFeatureCursorHasPalette))
return;
if (_cursorPaletteStack.empty()) {
pushCursorPalette(colors, start, num);
return;
}
Palette *pal = _cursorPaletteStack.top();
uint size = 4 * num;
if (pal->_size < size) {
// Could not re-use the old buffer. Create a new one.
delete[] pal->_data;
pal->_data = new byte[size];
pal->_size = size;
}
pal->_start = start;
pal->_num = num;
if (num) {
memcpy(pal->_data, colors, 4 * num);
g_system->setCursorPalette(pal->_data, pal->_start, pal->_num);
} else {
g_system->disableCursorPalette(true);
}
}
} // End of namespace Graphics