diff options
Diffstat (limited to 'graphics')
-rw-r--r-- | graphics/cursorman.cpp | 80 | ||||
-rw-r--r-- | graphics/cursorman.h | 74 | ||||
-rw-r--r-- | graphics/module.mk | 1 | ||||
-rw-r--r-- | graphics/paletteman.cpp | 119 | ||||
-rw-r--r-- | graphics/paletteman.h | 118 |
5 files changed, 152 insertions, 240 deletions
diff --git a/graphics/cursorman.cpp b/graphics/cursorman.cpp index 53a1bf1abb..06364b860a 100644 --- a/graphics/cursorman.cpp +++ b/graphics/cursorman.cpp @@ -34,6 +34,7 @@ CursorManager::CursorManager() { if (!g_initialized) { g_initialized = true; _cursorStack.clear(); + _cursorPaletteStack.clear(); } } @@ -107,4 +108,83 @@ void CursorManager::replaceCursor(const byte *buf, uint w, uint h, int hotspotX, g_system->setMouseCursor(cur->_data, w, h, hotspotX, hotspotY, keycolor, targetScale); } +void CursorManager::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 CursorManager::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 CursorManager::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 CursorManager::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 diff --git a/graphics/cursorman.h b/graphics/cursorman.h index f86883f1e1..af5021e5d4 100644 --- a/graphics/cursorman.h +++ b/graphics/cursorman.h @@ -74,6 +74,49 @@ public: */ void replaceCursor(const byte *buf, uint w, uint h, int hotspotX, int hotspotY, byte keycolor = 255, int targetScale = 1); + /** + * Enable/Disable the current cursor palette. + * + * @param disable + */ + void disableCursorPalette(bool disable); + + /** + * Push a new cursor palette onto the stack, and set it in the backend. + * The palette entries from 'start' till (start+num-1) will be replaced + * so a full palette updated is accomplished via start=0, num=256. + * + * The palette data is specified in the same interleaved RGBA format as + * used by all backends. + * + * @param colors the new palette data, in interleaved RGB format + * @param start the first palette entry to be updated + * @param num the number of palette entries to be updated + * + * @note If num is zero, the cursor palette is disabled. + */ + void pushCursorPalette(const byte *colors, uint start, uint num); + + /** + * Pop a cursor palette from the stack, and restore the previous one to + * the backend. If there is no previous palette, the cursor palette is + * disabled instead. + */ + void popCursorPalette(); + + /** + * Replace the current cursor palette on the stack. If the stack is + * empty, the palette is pushed instead. It's a slightly more optimized + * way of popping the old palette before pushing the new one. + * + * @param colors the new palette data, in interleaved RGB format + * @param start the first palette entry to be updated + * @param num the number of palette entries to be updated + * + * @note If num is zero, the cursor palette is disabled. + */ + void replaceCursorPalette(const byte *colors, uint start, uint num); + private: friend class Common::Singleton<SingletonBaseType>; CursorManager(); @@ -108,13 +151,40 @@ private: } }; + struct Palette { + byte *_data; + uint _start; + uint _num; + uint _size; + + bool _disabled; + + Palette(const byte *colors, uint start, uint num) { + _start = start; + _num = num; + _size = 4 * num; + + if (num) { + _data = new byte[_size]; + memcpy(_data, colors, _size); + } else { + _data = NULL; + } + + _disabled = false; + } + + ~Palette() { + delete [] _data; + } + }; + Common::Stack<Cursor *> _cursorStack; + Common::Stack<Palette *> _cursorPaletteStack; }; - } // End of namespace Graphics -/** Shortcut for accessing the cursor manager. */ #define CursorMan (::Graphics::CursorManager::instance()) #endif diff --git a/graphics/module.mk b/graphics/module.mk index d14ca763f2..44c118668f 100644 --- a/graphics/module.mk +++ b/graphics/module.mk @@ -13,7 +13,6 @@ MODULE_OBJS := \ imagedec.o \ imageman.o \ mpeg_player.o \ - paletteman.o \ primitives.o \ scaler.o \ scaler/thumbnail.o \ diff --git a/graphics/paletteman.cpp b/graphics/paletteman.cpp deleted file mode 100644 index b3f47bf585..0000000000 --- a/graphics/paletteman.cpp +++ /dev/null @@ -1,119 +0,0 @@ -/* 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 diff --git a/graphics/paletteman.h b/graphics/paletteman.h deleted file mode 100644 index dc3f03dbaa..0000000000 --- a/graphics/paletteman.h +++ /dev/null @@ -1,118 +0,0 @@ -/* 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$ - */ - -#ifndef GRAPHICS_PALETTEMAN_H -#define GRAPHICS_PALETTEMAN_H - -#include "common/stdafx.h" -#include "common/scummsys.h" -#include "common/stack.h" -#include "common/singleton.h" - -namespace Graphics { - -class PaletteManager : public Common::Singleton<PaletteManager> { -public: - /** - * Enable/Disable the current cursor palette. - * - * @param disable - */ - void disableCursorPalette(bool disable); - - /** - * Push a new cursor palette onto the stack, and set it in the backend. - * The palette entries from 'start' till (start+num-1) will be replaced - * so a full palette updated is accomplished via start=0, num=256. - * - * The palette data is specified in the same interleaved RGBA format as - * used by all backends. - * - * @param colors the new palette data, in interleaved RGB format - * @param start the first palette entry to be updated - * @param num the number of palette entries to be updated - * - * @note If num is zero, the cursor palette is disabled. - */ - void pushCursorPalette(const byte *colors, uint start, uint num); - - /** - * Pop a cursor palette from the stack, and restore the previous one to - * the backend. If there is no previous palette, the cursor palette is - * disabled instead. - */ - void popCursorPalette(); - - /** - * Replace the current cursor palette on the stack. If the stack is - * empty, the palette is pushed instead. It's a slightly more optimized - * way of popping the old palette before pushing the new one. - * - * @param colors the new palette data, in interleaved RGB format - * @param start the first palette entry to be updated - * @param num the number of palette entries to be updated - * - * @note If num is zero, the cursor palette is disabled. - */ - void replaceCursorPalette(const byte *colors, uint start, uint num); - -private: - friend class Common::Singleton<SingletonBaseType>; - PaletteManager(); - - struct Palette { - byte *_data; - uint _start; - uint _num; - uint _size; - - bool _disabled; - - Palette(const byte *colors, uint start, uint num) { - _start = start; - _num = num; - _size = 4 * num; - - if (num) { - _data = new byte[_size]; - memcpy(_data, colors, _size); - } else { - _data = NULL; - } - - _disabled = false; - } - - ~Palette() { - delete [] _data; - } - }; - - Common::Stack<Palette *> _cursorPaletteStack; -}; - - -} // End of namespace Graphics - -/** Shortcut for accessing the palette manager. */ -#define PaletteMan (Graphics::PaletteManager::instance()) - -#endif |