aboutsummaryrefslogtreecommitdiff
path: root/engines/lure/screen.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'engines/lure/screen.cpp')
-rw-r--r--engines/lure/screen.cpp152
1 files changed, 152 insertions, 0 deletions
diff --git a/engines/lure/screen.cpp b/engines/lure/screen.cpp
new file mode 100644
index 0000000000..ad84c9e838
--- /dev/null
+++ b/engines/lure/screen.cpp
@@ -0,0 +1,152 @@
+/* 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/screen.h"
+#include "lure/luredefs.h"
+#include "lure/memory.h"
+#include "lure/disk.h"
+#include "lure/decode.h"
+
+namespace Lure {
+
+static Screen *int_disk = NULL;
+
+Screen &Screen::getReference() {
+ return *int_disk;
+}
+
+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)) {
+ int_disk = this;
+ _screen->empty();
+ _system.setPalette(_palette->data(), 0, GAME_COLOURS);
+}
+
+Screen::~Screen() {
+ delete _screen;
+ delete _palette;
+}
+
+// setPaletteEmpty
+// Defaults the palette to an empty set
+
+void Screen::setPaletteEmpty() {
+ delete _palette;
+ _palette = new Palette();
+
+ _system.setPalette(_palette->data(), 0, GAME_COLOURS);
+ _system.updateScreen();
+}
+
+// setPalette
+// Sets the current palette to the passed palette
+
+void Screen::setPalette(Palette *p) {
+ _palette->copyFrom(p);
+ _system.setPalette(_palette->data(), 0, GAME_COLOURS);
+ _system.updateScreen();
+}
+
+// paletteFadeIn
+// Fades in the palette. For proper operation, the palette should have been
+// previously set to empty
+
+void Screen::paletteFadeIn(Palette *p) {
+ bool changed;
+ byte *const pDest = p->data();
+ byte *const pTemp = _palette->data();
+
+ do {
+ changed = false;
+
+ for (int palCtr = 0; palCtr < p->numEntries() * 4; ++palCtr)
+ {
+ if (palCtr % PALETTE_FADE_INC_SIZE == (PALETTE_FADE_INC_SIZE - 1)) continue;
+ bool isDifferent = pTemp[palCtr] < pDest[palCtr];
+ if (isDifferent) {
+ if (pDest[palCtr] - pTemp[palCtr] < PALETTE_FADE_INC_SIZE)
+ pTemp[palCtr] = pDest[palCtr];
+ else pTemp[palCtr] += PALETTE_FADE_INC_SIZE;
+ changed = true;
+ }
+ }
+
+ if (changed) {
+ _system.setPalette(_palette->data(), 0, GAME_COLOURS);
+ _system.updateScreen();
+ _system.delayMillis(20);
+ }
+ } while (changed);
+}
+
+// paletteFadeOut
+// Fades the screen to black by gradually decreasing the palette colours
+
+void Screen::paletteFadeOut() {
+ bool changed;
+
+ do {
+ byte *pTemp = _palette->data();
+ changed = false;
+
+ for (uint32 palCtr = 0; palCtr < _palette->palette()->size(); ++palCtr, ++pTemp) {
+ if (palCtr % PALETTE_FADE_INC_SIZE == (PALETTE_FADE_INC_SIZE - 1))
+ continue;
+ bool isDifferent = *pTemp > 0;
+ if (isDifferent) {
+ if (*pTemp < PALETTE_FADE_INC_SIZE) *pTemp = 0;
+ else *pTemp -= PALETTE_FADE_INC_SIZE;
+ changed = true;
+ }
+ }
+
+ if (changed) {
+ _system.setPalette(_palette->data(), 0, GAME_COLOURS);
+ _system.updateScreen();
+ _system.delayMillis(20);
+ }
+ } while (changed);
+}
+
+void Screen::resetPalette() {
+ Palette p(GAME_PALETTE_RESOURCE_ID);
+ setPalette(&p);
+}
+
+void Screen::empty() {
+ _screen->empty();
+ update();
+}
+
+void Screen::update() {
+ _system.copyRectToScreen(screen_raw(), FULL_SCREEN_WIDTH, 0, 0, FULL_SCREEN_WIDTH, FULL_SCREEN_HEIGHT);
+ _system.updateScreen();
+}
+
+void Screen::updateArea(uint16 x, uint16 y, uint16 w, uint16 h) {
+ _system.copyRectToScreen(screen_raw(), FULL_SCREEN_WIDTH, x, y, w, h);
+ _system.updateScreen();
+}
+
+} // end of namespace Lure