aboutsummaryrefslogtreecommitdiff
path: root/queen
diff options
context:
space:
mode:
authorGregory Montoir2003-10-16 13:54:48 +0000
committerGregory Montoir2003-10-16 13:54:48 +0000
commit8833f8c4908d8be3a92288bc592cf9ddfd1f568d (patch)
treec6b97768a34f6652430a591a7b9bbc3e8893773d /queen
parentbf6be16cbdcddb4c180631c8a099e193085b75b0 (diff)
downloadscummvm-rg350-8833f8c4908d8be3a92288bc592cf9ddfd1f568d.tar.gz
scummvm-rg350-8833f8c4908d8be3a92288bc592cf9ddfd1f568d.tar.bz2
scummvm-rg350-8833f8c4908d8be3a92288bc592cf9ddfd1f568d.zip
new Display class, cleanup Graphics
svn-id: r10827
Diffstat (limited to 'queen')
-rw-r--r--queen/display.cpp611
-rw-r--r--queen/display.h128
-rw-r--r--queen/graphics.cpp555
-rw-r--r--queen/graphics.h75
-rw-r--r--queen/logic.cpp34
-rw-r--r--queen/logic.h4
-rw-r--r--queen/module.mk1
-rw-r--r--queen/queen.cpp10
-rw-r--r--queen/queen.h2
9 files changed, 808 insertions, 612 deletions
diff --git a/queen/display.cpp b/queen/display.cpp
new file mode 100644
index 0000000000..ac12bb005c
--- /dev/null
+++ b/queen/display.cpp
@@ -0,0 +1,611 @@
+/* ScummVM - Scumm Interpreter
+ * Copyright (C) 2003 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+ *
+ * $Header$
+ *
+ */
+
+#include "queen/display.h"
+#include "queen/defs.h"
+#include "queen/resource.h"
+
+
+namespace Queen {
+
+
+
+void TextRenderer::init() {
+
+ // calculate font justification sizes
+ uint16 i, y, x;
+
+ for (i = 0; i < 256; ++i) {
+ charWidth[i] = 0;
+ for (y = 0; y < 8; ++y) {
+ uint8 c = FONT[i * 8 + y];
+ for (x = 0; x < 8; ++x) {
+ if ((c & (0x80 >> x)) && (x > charWidth[i])) {
+ charWidth[i] = x;
+ }
+ }
+ }
+ charWidth[i] += 2;
+ }
+ charWidth[' '] = 4;
+ --charWidth['^'];
+}
+
+
+void TextRenderer::drawString(uint8 *dstBuf, uint16 dstPitch, uint16 x, uint16 y, uint8 color, const char *text, bool outlined) {
+
+ while (*text && x < dstPitch) {
+ const uint8 *pchr = FONT + (*text) * 8;
+
+ // FIXME: handle 0x96 character in french version (replace with 0xFB)
+
+ if (outlined) {
+ drawChar(dstBuf, dstPitch, x - 1, y - 1, INK_OUTLINED_TEXT, pchr);
+ drawChar(dstBuf, dstPitch, x , y - 1, INK_OUTLINED_TEXT, pchr);
+ drawChar(dstBuf, dstPitch, x + 1, y - 1, INK_OUTLINED_TEXT, pchr);
+ drawChar(dstBuf, dstPitch, x + 1, y , INK_OUTLINED_TEXT, pchr);
+ drawChar(dstBuf, dstPitch, x + 1, y + 1, INK_OUTLINED_TEXT, pchr);
+ drawChar(dstBuf, dstPitch, x , y + 1, INK_OUTLINED_TEXT, pchr);
+ drawChar(dstBuf, dstPitch, x - 1, y + 1, INK_OUTLINED_TEXT, pchr);
+ drawChar(dstBuf, dstPitch, x - 1, y , INK_OUTLINED_TEXT, pchr);
+ }
+ drawChar(dstBuf, dstPitch, x, y, color, pchr);
+
+ x += charWidth[ (int)*text ];
+ ++text;
+ }
+}
+
+
+void TextRenderer::drawChar(uint8 *dstBuf, uint16 dstPitch, uint16 x, uint16 y, uint8 color, const uint8 *chr) {
+
+ dstBuf += dstPitch * y + x;
+ uint16 j, i;
+ for (j = 0; j < 8; ++j) {
+ uint8 *p = dstBuf;
+ uint8 c = *chr++;
+ if (c != 0) {
+ for (i = 0; i < 8; ++i) {
+ if(c & 0x80) {
+ *p = color;
+ }
+ ++p;
+ c <<= 1;
+ }
+ }
+ dstBuf += dstPitch;
+ }
+}
+
+
+
+Display::Display(OSystem *system)
+ : _system(system) {
+
+ _dynalum.prevColMask = 0xFF;
+ _textRenderer.init();
+
+ _buffers[RB_BACKDROP] = new uint8[BACKDROP_W * BACKDROP_H];
+ _buffers[RB_PANEL] = new uint8[PANEL_W * PANEL_H];
+ _buffers[RB_SCREEN] = new uint8[SCREEN_W * SCREEN_H];
+ memset(_buffers[RB_BACKDROP], 0, BACKDROP_W * BACKDROP_H);
+ memset(_buffers[RB_PANEL], 0, PANEL_W * PANEL_H);
+ memset(_buffers[RB_SCREEN], 0, SCREEN_W * SCREEN_H);
+ _bufPitch[RB_BACKDROP] = BACKDROP_W;
+ _bufPitch[RB_PANEL] = PANEL_W;
+ _bufPitch[RB_SCREEN] = SCREEN_W;
+
+ _pals.room = new uint8[ 256 * 3 ];
+ _pals.screen = new uint8[ 256 * 4 ];
+ memset(_pals.room, 0, 256 * 3);
+ memset(_pals.screen, 0, 256 * 4);
+ _pals.dirtyMin = 0;
+ _pals.dirtyMax = 255;
+
+ _horizontalScroll = 0;
+}
+
+
+Display::~Display() {
+
+ delete[] _buffers[RB_BACKDROP];
+ delete[] _buffers[RB_PANEL];
+ delete[] _buffers[RB_SCREEN];
+
+ delete[] _pals.room;
+ delete[] _pals.screen;
+}
+
+
+void Display::dynalumInit(Resource *resource, const char *roomName, uint16 roomNum) {
+
+ debug(9, "Display::dynalumInit(%s, %d)", roomName, roomNum);
+ memset(_dynalum.msk, 0, sizeof(_dynalum.msk));
+ memset(_dynalum.lum, 0, sizeof(_dynalum.lum));
+ // FIXME: are these tests really needed ?
+ if (roomNum < 90 || ((roomNum > 94) && (roomNum < 114))) {
+ char filename[20];
+ sprintf(filename, "%s.msk", roomName);
+ resource->loadFile(filename, 0, (uint8*)_dynalum.msk);
+ sprintf(filename, "%s.lum", roomName);
+ resource->loadFile(filename, 0, (uint8*)_dynalum.lum);
+ }
+}
+
+
+void Display::dynalumUpdate(int x, int y) {
+
+ if (x >= _bdWidth) {
+ x = _bdWidth;
+ }
+ if (y >= ROOM_ZONE_HEIGHT - 1) {
+ y = ROOM_ZONE_HEIGHT - 1;
+ }
+ uint8 colMask = _dynalum.msk[(y / 4) * 160 + (x / 4)];
+ debug(9, "Graphics::dynalumUpdate(%d, %d) - colMask = %d", x, y, colMask);
+
+ if (colMask != _dynalum.prevColMask) {
+ uint8 i;
+ for (i = 144; i < 160; ++i) {
+ uint8 j;
+ for (j = 0; j < 3; ++j) {
+ int16 c = (int16)(_pals.room[i * 3 + j] + _dynalum.lum[colMask * 3 + j] * 4);
+ if (c < 0) {
+ c = 0;
+ }
+ else if (c > 255) {
+ c = 255;
+ }
+ _pals.screen[i * 4 + j] = (uint8)c;
+ }
+ }
+ _pals.dirtyMin = MIN(_pals.dirtyMin, 144);
+ _pals.dirtyMax = MAX(_pals.dirtyMax, 160);
+ _dynalum.prevColMask = colMask;
+ }
+}
+
+
+void Display::palSetRoom(const uint8 *pal, int start, int end) {
+
+ int i;
+ pal += start * 3;
+ for (i = start; i < end; ++i, pal += 3) {
+ _pals.screen[i << 2 | 0] = _pals.room[i * 3 + 0] = *(pal + 0);
+ _pals.screen[i << 2 | 1] = _pals.room[i * 3 + 1] = *(pal + 1);
+ _pals.screen[i << 2 | 2] = _pals.room[i * 3 + 2] = *(pal + 2);
+ _pals.screen[i << 2 | 3] = 0;
+ }
+ _pals.dirtyMin = MIN(_pals.dirtyMin, start);
+ _pals.dirtyMax = MAX(_pals.dirtyMax, end);
+}
+
+
+void Display::palFadeIn(uint8 start, uint8 end, uint16 roomNum) {
+ warning("Display::palFadeIn() unimplemented");
+}
+
+
+void Display::palFadeOut(uint8 start, uint8 end, uint16 roomNum) {
+ warning("Display::palFadeOut() unimplemented");
+}
+
+
+void Display::palFadePanel() {
+ warning("Display::palFadePanel() unimplemented");
+}
+
+
+void Display::palCustomColors(uint16 roomNum) {
+ warning("Display::palCustomColors() unimplemented");
+}
+
+
+void Display::palCustomScroll(uint16 roomNum) {
+ warning("Display::palCustomScroll() unimplemented");
+}
+
+
+void Display::screenMode(int comPanel, bool inCutaway) {
+
+ if (comPanel == 2 && inCutaway) {
+ if (_bdHeight == GAME_SCREEN_HEIGHT) {
+ _fullscreen = true;
+ _panel = false;
+ }
+ else {
+ _fullscreen = false;
+ _panel = true;
+ }
+ }
+ else {
+ _fullscreen = 0;
+ _panel = (comPanel == 1);
+ }
+}
+
+
+void Display::prepareUpdate() {
+
+ if (_panel) {
+ // draw the panel
+ memcpy(_buffers[RB_SCREEN] + _bufPitch[RB_SCREEN] * ROOM_ZONE_HEIGHT,
+ _buffers[RB_PANEL], PANEL_W * PANEL_H);
+ }
+ else if (!_fullscreen) {
+ // clear the panel
+ memset(_buffers[RB_SCREEN] + _bufPitch[RB_SCREEN] * ROOM_ZONE_HEIGHT,
+ 0, PANEL_W * PANEL_H);
+ }
+
+ // draw the backdrop bitmap
+ int i;
+ int n = _fullscreen ? 200 : 150;
+ uint8 *dst = _buffers[RB_SCREEN];
+ uint8 *src = _buffers[RB_BACKDROP] + _horizontalScroll;
+ for (i = 0; i < n; ++i) {
+ memcpy(dst, src, _bufPitch[RB_SCREEN]);
+ dst += _bufPitch[RB_SCREEN];
+ src += _bufPitch[RB_BACKDROP];
+ }
+}
+
+
+void Display::update(bool dynalum, int dynaX, int dynaY) {
+
+ if (dynalum) {
+ dynalumUpdate(dynaX, dynaY);
+ }
+
+ if (_pals.dirtyMin != 144 || _pals.dirtyMax != 145) {
+ const uint8 *p = _pals.screen + 4 * _pals.dirtyMin;
+ _system->set_palette(p, _pals.dirtyMin, _pals.dirtyMax);
+ _pals.dirtyMin = 144;
+ _pals.dirtyMax = 145;
+ }
+ _system->copy_rect(_buffers[RB_SCREEN], _bufPitch[RB_SCREEN], 0, 0, SCREEN_W, SCREEN_H);
+ _system->update_screen();
+}
+
+
+void Display::blit(RenderingBuffer dst, uint16 dstX, uint16 dstY, const uint8 *srcBuf, uint16 srcW, uint16 srcH, uint16 srcPitch, bool xflip, bool masked) {
+
+ uint16 dstPitch = _bufPitch[dst];
+ uint8 *dstBuf = _buffers[dst] + dstPitch * dstY + dstX;
+
+ if (!masked) { // Unmasked always unflipped
+ while (srcH--) {
+ memcpy(dstBuf, srcBuf, srcW);
+ srcBuf += srcPitch;
+ dstBuf += dstPitch;
+ }
+ }
+ else if (!xflip) { // Masked bitmap unflipped
+ while (srcH--) {
+ int i;
+ for(i = 0; i < srcW; ++i) {
+ uint8 b = *(srcBuf + i);
+ if(b != 0) {
+ *(dstBuf + i) = b;
+ }
+ }
+ srcBuf += srcPitch;
+ dstBuf += dstPitch;
+ }
+ }
+ else { // Masked bitmap flipped
+ while (srcH--) {
+ int i;
+ for(i = 0; i < srcW; ++i) {
+ uint8 b = *(srcBuf + i);
+ if(b != 0) {
+ *(dstBuf - i) = b;
+ }
+ }
+ srcBuf += srcPitch;
+ dstBuf += dstPitch;
+ }
+ }
+}
+
+
+void Display::fill(RenderingBuffer dst, uint16 x, uint16 y, uint16 w, uint16 h, uint8 color) {
+
+ assert(w <= _bufPitch[dst]);
+ uint16 dstPitch = _bufPitch[dst];
+ uint8 *dstBuf = _buffers[dst] + dstPitch * y + x;
+ while (h--) {
+ memset(dstBuf, color, w);
+ dstBuf += dstPitch;
+ }
+}
+
+
+void Display::pcxRead(uint8 *dst, uint16 dstPitch, const uint8 *src, uint16 w, uint16 h) {
+
+ while (h--) {
+ uint8 *p = dst;
+ while (p < dst + w ) {
+ uint8 col = *src++;
+ if ((col & 0xC0) == 0xC0) {
+ uint8 len = col & 0x3F;
+ memset(p, *src++, len);
+ p += len;
+ }
+ else {
+ *p++ = col;
+ }
+ }
+ dst += dstPitch;
+ }
+}
+
+
+void Display::pcxReadBackdrop(const uint8 *pcxBuf, uint32 size, bool useFullPal) {
+
+ _bdWidth = READ_LE_UINT16(pcxBuf + 12);
+ _bdHeight = READ_LE_UINT16(pcxBuf + 14);
+ pcxRead(_buffers[RB_BACKDROP], _bufPitch[RB_BACKDROP], pcxBuf + 128, _bdWidth, _bdHeight);
+ palSetRoom(pcxBuf + size - 768, 0, useFullPal ? 256 : 144);
+}
+
+
+void Display::pcxReadPanel(const uint8 *pcxBuf, uint32 size) {
+
+ uint8 *dst = _buffers[RB_PANEL] + PANEL_W * 10;
+ pcxRead(dst, PANEL_W, pcxBuf + 128, PANEL_W, PANEL_H - 10);
+ palSetRoom(pcxBuf + size - 768, 144, 256);
+}
+
+
+void Display::textDraw(uint16 x, uint16 y, uint8 color, const char *text, bool outlined) {
+
+ _textRenderer.drawString(_buffers[RB_SCREEN], _bufPitch[RB_SCREEN], x, y, color, text, outlined);
+}
+
+
+uint16 Display::textWidth(const char *text) const {
+
+ uint16 len = 0;
+ while (*text) {
+ len += _textRenderer.charWidth[ (int)*text ];
+ ++text;
+ }
+ return len;
+}
+
+
+void Display::horizontalScroll(uint16 scroll) {
+
+ _horizontalScroll = scroll;
+}
+
+
+const uint8 TextRenderer::FONT[] = {
+ 0xF8, 0xB0, 0xB0, 0x80, 0xB0, 0xB0, 0xC0, 0x00, 0xF8, 0xB0,
+ 0xB0, 0x80, 0xB0, 0xB0, 0xC0, 0x00, 0xF8, 0xB0, 0xB0, 0x80,
+ 0xB0, 0xB0, 0xC0, 0x00, 0xF8, 0xB0, 0xB0, 0x80, 0xB0, 0xB0,
+ 0xC0, 0x00, 0xF8, 0xB0, 0xB0, 0x80, 0xB0, 0xB0, 0xC0, 0x00,
+ 0xF8, 0xB0, 0xB0, 0x80, 0xB0, 0xB0, 0xC0, 0x00, 0xF8, 0xB0,
+ 0xB0, 0x80, 0xB0, 0xB0, 0xC0, 0x00, 0xF8, 0xB0, 0xB0, 0x80,
+ 0xB0, 0xB0, 0xC0, 0x00, 0xF8, 0xB0, 0xB0, 0x80, 0xB0, 0xB0,
+ 0xC0, 0x00, 0xF8, 0xB0, 0xB0, 0x80, 0xB0, 0xB0, 0xC0, 0x00,
+ 0xF8, 0xB0, 0xB0, 0x80, 0xB0, 0xB0, 0xC0, 0x00, 0xF8, 0xB0,
+ 0xB0, 0x80, 0xB0, 0xB0, 0xC0, 0x00, 0xF8, 0xB0, 0xB0, 0x80,
+ 0xB0, 0xB0, 0xC0, 0x00, 0xF8, 0xB0, 0xB0, 0x80, 0xB0, 0xB0,
+ 0xC0, 0x00, 0xF8, 0xB0, 0xB0, 0x80, 0xB0, 0xB0, 0xC0, 0x00,
+ 0xF8, 0xB0, 0xB0, 0x80, 0xB0, 0xB0, 0xC0, 0x00, 0xF8, 0xB0,
+ 0xB0, 0x80, 0xB0, 0xB0, 0xC0, 0x00, 0xF8, 0xB0, 0xB0, 0x80,
+ 0xB0, 0xB0, 0xC0, 0x00, 0xF8, 0xB0, 0xB0, 0x80, 0xB0, 0xB0,
+ 0xC0, 0x00, 0xF8, 0xB0, 0xB0, 0x80, 0xB0, 0xB0, 0xC0, 0x00,
+ 0xF8, 0xB0, 0xB0, 0x80, 0xB0, 0xB0, 0xC0, 0x00, 0xF8, 0xB0,
+ 0xB0, 0x80, 0xB0, 0xB0, 0xC0, 0x00, 0xF8, 0xB0, 0xB0, 0x80,
+ 0xB0, 0xB0, 0xC0, 0x00, 0xF8, 0xB0, 0xB0, 0x80, 0xB0, 0xB0,
+ 0xC0, 0x00, 0xF8, 0xB0, 0xB0, 0x80, 0xB0, 0xB0, 0xC0, 0x00,
+ 0xF8, 0xB0, 0xB0, 0x80, 0xB0, 0xB0, 0xC0, 0x00, 0xF8, 0xB0,
+ 0xB0, 0x80, 0xB0, 0xB0, 0xC0, 0x00, 0xF8, 0xB0, 0xB0, 0x80,
+ 0xB0, 0xB0, 0xC0, 0x00, 0xF8, 0xB0, 0xB0, 0x80, 0xB0, 0xB0,
+ 0xC0, 0x00, 0xF8, 0xB0, 0xB0, 0x80, 0xB0, 0xB0, 0xC0, 0x00,
+ 0xF8, 0xB0, 0xB0, 0x80, 0xB0, 0xB0, 0xC0, 0x00, 0xF8, 0xB0,
+ 0xB0, 0x80, 0xB0, 0xB0, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0xC0, 0xC0, 0xC0, 0xC0, 0x00, 0xC0,
+ 0xC0, 0x00, 0xD8, 0xD8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x6C, 0x6C, 0xFE, 0x6C, 0xFE, 0x6C, 0x6C, 0x00, 0x30, 0x7C,
+ 0xC0, 0x78, 0x0C, 0xF8, 0x30, 0x00, 0x00, 0xC6, 0xCC, 0x18,
+ 0x30, 0x66, 0xC6, 0x00, 0x38, 0x6C, 0x68, 0x36, 0xDC, 0xCC,
+ 0x76, 0x00, 0x60, 0x60, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x30, 0x60, 0xC0, 0xC0, 0xC0, 0x60, 0x30, 0x00, 0xC0, 0x60,
+ 0x30, 0x30, 0x30, 0x60, 0xC0, 0x00, 0x00, 0x6C, 0x38, 0xFE,
+ 0x38, 0x6C, 0x00, 0x00, 0x00, 0x30, 0x30, 0xFC, 0x30, 0x30,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0x60, 0xC0,
+ 0x00, 0x00, 0x00, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0xC0, 0xC0, 0x00, 0x03, 0x06, 0x0C, 0x18,
+ 0x30, 0x60, 0xC0, 0x00, 0x78, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC,
+ 0x78, 0x00, 0x30, 0x70, 0xF0, 0x30, 0x30, 0x30, 0x30, 0x00,
+ 0x78, 0xCC, 0x0C, 0x78, 0xC0, 0xC0, 0xFC, 0x00, 0x78, 0xCC,
+ 0x0C, 0x38, 0x0C, 0xCC, 0x78, 0x00, 0x1C, 0x3C, 0x6C, 0xCC,
+ 0xFC, 0x0C, 0x0C, 0x00, 0xFC, 0xC0, 0xF8, 0x0C, 0x0C, 0xCC,
+ 0x78, 0x00, 0x78, 0xCC, 0xC0, 0xF8, 0xCC, 0xCC, 0x78, 0x00,
+ 0xFC, 0xCC, 0x0C, 0x18, 0x30, 0x30, 0x30, 0x00, 0x78, 0xCC,
+ 0xCC, 0x78, 0xCC, 0xCC, 0x78, 0x00, 0x78, 0xCC, 0xCC, 0x7C,
+ 0x0C, 0xCC, 0x78, 0x00, 0x00, 0xC0, 0xC0, 0x00, 0x00, 0xC0,
+ 0xC0, 0x00, 0x00, 0x60, 0x60, 0x00, 0x00, 0x60, 0x60, 0xC0,
+ 0x18, 0x30, 0x60, 0xC0, 0x60, 0x30, 0x18, 0x00, 0x00, 0x00,
+ 0xFC, 0x00, 0xFC, 0x00, 0x00, 0x00, 0xC0, 0x60, 0x30, 0x18,
+ 0x30, 0x60, 0xC0, 0x00, 0x78, 0xCC, 0x0C, 0x18, 0x30, 0x00,
+ 0x30, 0x00, 0x6C, 0xFE, 0xFE, 0xFE, 0x7C, 0x38, 0x10, 0x00,
+ 0x38, 0x7C, 0xC6, 0xC6, 0xFE, 0xC6, 0xC6, 0x00, 0xF8, 0xCC,
+ 0xCC, 0xF8, 0xCC, 0xCC, 0xF8, 0x00, 0x78, 0xCC, 0xC0, 0xC0,
+ 0xC0, 0xCC, 0x78, 0x00, 0xF8, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC,
+ 0xF8, 0x00, 0xFC, 0xC0, 0xC0, 0xF0, 0xC0, 0xC0, 0xFC, 0x00,
+ 0xFC, 0xC0, 0xC0, 0xF0, 0xC0, 0xC0, 0xC0, 0x00, 0x78, 0xCC,
+ 0xC0, 0xDC, 0xCC, 0xCC, 0x7C, 0x00, 0xCC, 0xCC, 0xCC, 0xFC,
+ 0xCC, 0xCC, 0xCC, 0x00, 0xF0, 0x60, 0x60, 0x60, 0x60, 0x60,
+ 0xF0, 0x00, 0x0C, 0x0C, 0x0C, 0x0C, 0xCC, 0xCC, 0x78, 0x00,
+ 0xC6, 0xCC, 0xD8, 0xF8, 0xD8, 0xCC, 0xC6, 0x00, 0xC0, 0xC0,
+ 0xC0, 0xC0, 0xC0, 0xC0, 0xFC, 0x00, 0x82, 0xC6, 0xEE, 0xFE,
+ 0xD6, 0xC6, 0xC6, 0x00, 0xC6, 0xE6, 0xF6, 0xDE, 0xCE, 0xC6,
+ 0xC6, 0x00, 0x78, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0x78, 0x00,
+ 0xF8, 0xCC, 0xCC, 0xF8, 0xC0, 0xC0, 0xC0, 0x00, 0x78, 0xCC,
+ 0xCC, 0xCC, 0xCC, 0xDC, 0x78, 0x0C, 0xF8, 0xCC, 0xCC, 0xF8,
+ 0xD8, 0xCC, 0xCC, 0x00, 0x78, 0xCC, 0xC0, 0x78, 0x0C, 0xCC,
+ 0x78, 0x00, 0xFC, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x00,
+ 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0x7C, 0x00, 0xC6, 0xC6,
+ 0x6C, 0x6C, 0x38, 0x38, 0x10, 0x00, 0xC6, 0xC6, 0xC6, 0xD6,
+ 0xFE, 0xEE, 0xC6, 0x00, 0xC6, 0x6C, 0x38, 0x10, 0x38, 0x6C,
+ 0xC6, 0x00, 0xCC, 0xCC, 0xCC, 0x78, 0x30, 0x30, 0x30, 0x00,
+ 0xFC, 0x0C, 0x18, 0x30, 0x60, 0xC0, 0xFC, 0x00, 0xF0, 0xC0,
+ 0xC0, 0xC0, 0xC0, 0xC0, 0xF0, 0x00, 0xC0, 0x60, 0x30, 0x18,
+ 0x0C, 0x06, 0x03, 0x00, 0xF0, 0x30, 0x30, 0x30, 0x30, 0x30,
+ 0xF0, 0x00, 0xE8, 0x4D, 0x4A, 0x48, 0x00, 0x00, 0x00, 0x00,
+ 0x80, 0x80, 0x80, 0x80, 0x00, 0x00, 0x00, 0x00, 0xC0, 0xC0,
+ 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x78, 0x0C,
+ 0x7C, 0xCC, 0x7C, 0x00, 0xC0, 0xC0, 0xF8, 0xCC, 0xCC, 0xCC,
+ 0xF8, 0x00, 0x00, 0x00, 0x78, 0xCC, 0xC0, 0xCC, 0x78, 0x00,
+ 0x0C, 0x0C, 0x7C, 0xCC, 0xCC, 0xCC, 0x7C, 0x00, 0x00, 0x00,
+ 0x78, 0xCC, 0xFC, 0xC0, 0x78, 0x00, 0x38, 0x6C, 0x60, 0xF8,
+ 0x60, 0x60, 0x60, 0x00, 0x00, 0x00, 0x7C, 0xCC, 0xCC, 0x7C,
+ 0x0C, 0x78, 0xC0, 0xC0, 0xF8, 0xCC, 0xCC, 0xCC, 0xCC, 0x00,
+ 0xC0, 0x00, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0x00, 0x0C, 0x00,
+ 0x0C, 0x0C, 0x0C, 0x0C, 0xCC, 0x78, 0xC0, 0xC0, 0xCC, 0xD8,
+ 0xF0, 0xD8, 0xCC, 0x00, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0,
+ 0xC0, 0x00, 0x00, 0x00, 0xCC, 0xEE, 0xD6, 0xC6, 0xC6, 0x00,
+ 0x00, 0x00, 0xF8, 0xCC, 0xCC, 0xCC, 0xCC, 0x00, 0x00, 0x00,
+ 0x78, 0xCC, 0xCC, 0xCC, 0x78, 0x00, 0x00, 0x00, 0xF8, 0xCC,
+ 0xCC, 0xF8, 0xC0, 0xC0, 0x00, 0x00, 0x7C, 0xCC, 0xCC, 0x7C,
+ 0x0C, 0x0C, 0x00, 0x00, 0xF8, 0xCC, 0xC0, 0xC0, 0xC0, 0x00,
+ 0x00, 0x00, 0x7C, 0xC0, 0x78, 0x0C, 0x78, 0x00, 0x30, 0x30,
+ 0xFC, 0x30, 0x30, 0x30, 0x30, 0x00, 0x00, 0x00, 0xCC, 0xCC,
+ 0xCC, 0xCC, 0x7C, 0x00, 0x00, 0x00, 0xCC, 0xCC, 0xCC, 0x78,
+ 0x30, 0x00, 0x00, 0x00, 0xC6, 0xD6, 0xD6, 0x6C, 0x6C, 0x00,
+ 0x00, 0x00, 0xCC, 0x78, 0x30, 0x78, 0xCC, 0x00, 0x00, 0x00,
+ 0xCC, 0xCC, 0xCC, 0x78, 0x30, 0xE0, 0x00, 0x00, 0xFC, 0x18,
+ 0x30, 0x60, 0xFC, 0x00, 0x38, 0x60, 0x60, 0xC0, 0x60, 0x60,
+ 0x38, 0x00, 0xC0, 0xC0, 0xC0, 0x00, 0xC0, 0xC0, 0xC0, 0x00,
+ 0xE0, 0x30, 0x30, 0x18, 0x30, 0x30, 0xE0, 0x00, 0x38, 0x44,
+ 0xBA, 0xAA, 0xBA, 0x44, 0x38, 0x00, 0x00, 0x98, 0x30, 0x60,
+ 0xC8, 0x98, 0x30, 0x00, 0x1E, 0x30, 0x60, 0x60, 0x30, 0x1E,
+ 0x0C, 0x18, 0x00, 0x66, 0x00, 0x66, 0x66, 0x66, 0x3E, 0x00,
+ 0x0C, 0x18, 0x3C, 0x66, 0x7E, 0x60, 0x3C, 0x00, 0x18, 0x66,
+ 0x3C, 0x06, 0x3E, 0x66, 0x3E, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x30, 0x18, 0x3C, 0x06, 0x3E, 0x66,
+ 0x3E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x1E, 0x30, 0x60, 0x60, 0x30, 0x1E, 0x0C, 0x18, 0x18, 0x66,
+ 0x3C, 0x66, 0x7E, 0x60, 0x3C, 0x00, 0x66, 0x00, 0x3C, 0x66,
+ 0x7E, 0x60, 0x3C, 0x00, 0x30, 0x18, 0x3C, 0x66, 0x7E, 0x60,
+ 0x3C, 0x00, 0x00, 0x66, 0x00, 0x18, 0x18, 0x18, 0x18, 0x00,
+ 0x18, 0x66, 0x00, 0x18, 0x18, 0x18, 0x18, 0x00, 0x30, 0x18,
+ 0x00, 0x18, 0x18, 0x18, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x18, 0x30, 0xFC, 0xC0, 0xF0, 0xC0, 0xFC, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x66, 0x00, 0x3C,
+ 0x66, 0x66, 0x3C, 0x00, 0x00, 0x66, 0x00, 0x3C, 0x66, 0x66,
+ 0x3C, 0x00, 0x30, 0x18, 0x00, 0x3C, 0x66, 0x66, 0x3C, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x18,
+ 0x00, 0x66, 0x66, 0x66, 0x3E, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x18, 0x30, 0x78, 0x0C, 0x7C, 0xCC, 0x7C, 0x00, 0x0C, 0x18,
+ 0x00, 0x18, 0x18, 0x18, 0x18, 0x00, 0x18, 0x30, 0x00, 0x78,
+ 0xCC, 0xCC, 0x78, 0x00, 0x18, 0x30, 0x00, 0xCC, 0xCC, 0xCC,
+ 0x7C, 0x00, 0x71, 0x8E, 0x00, 0x7C, 0x66, 0x66, 0x66, 0x00,
+ 0x71, 0xCE, 0xE6, 0xF6, 0xDE, 0xCE, 0xC6, 0x00, 0x18, 0x18,
+ 0x18, 0x00, 0x18, 0x18, 0x18, 0x00, 0x3C, 0x60, 0x3C, 0x66,
+ 0x3C, 0x06, 0x3C, 0x00, 0x18, 0x00, 0x18, 0x0C, 0x06, 0x66,
+ 0x3C, 0x00, 0x3F, 0x40, 0x4E, 0x58, 0x4E, 0x40, 0x3F, 0x00,
+ 0x1C, 0xA4, 0xC4, 0xBC, 0x80, 0xFE, 0x00, 0x00, 0x00, 0x33,
+ 0x66, 0xCC, 0x66, 0x33, 0x00, 0x00, 0x3E, 0x06, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0xC0, 0xC0, 0x00, 0xC0, 0xC0, 0xC0,
+ 0xC0, 0x00, 0x81, 0xB9, 0xA5, 0xB9, 0xA5, 0x81, 0x7E, 0x00,
+ 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x78, 0xCC,
+ 0x78, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x30, 0xFC, 0x30,
+ 0x30, 0x00, 0xFC, 0x00, 0xF0, 0x18, 0x30, 0x60, 0xF8, 0x00,
+ 0x00, 0x00, 0xF0, 0x18, 0x30, 0x18, 0xF0, 0x00, 0x00, 0x00,
+ 0x30, 0x60, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0xCC, 0xCC, 0xCC, 0xCC, 0xFE, 0xC0, 0x3E, 0x7A, 0x7A, 0x3A,
+ 0x0A, 0x0A, 0x0A, 0x00, 0x00, 0x00, 0x18, 0x18, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x60,
+ 0x60, 0xE0, 0x60, 0x60, 0x60, 0x00, 0x00, 0x00, 0x38, 0x44,
+ 0x44, 0x38, 0x00, 0x7C, 0x00, 0x00, 0x00, 0xCC, 0x66, 0x33,
+ 0x66, 0xCC, 0x00, 0x00, 0x40, 0xC6, 0x4C, 0x58, 0x32, 0x66,
+ 0xCF, 0x02, 0x40, 0xC6, 0x4C, 0x58, 0x3E, 0x62, 0xC4, 0x0E,
+ 0xC0, 0x23, 0x66, 0x2C, 0xD9, 0x33, 0x67, 0x01, 0x18, 0x00,
+ 0x18, 0x30, 0x60, 0x66, 0x3C, 0x00, 0x60, 0x30, 0x7C, 0xC6,
+ 0xFE, 0xC6, 0xC6, 0x00, 0x0C, 0x18, 0x7C, 0xC6, 0xFE, 0xC6,
+ 0xC6, 0x00, 0x38, 0xC6, 0x7C, 0xC6, 0xFE, 0xC6, 0xC6, 0x00,
+ 0x71, 0x8E, 0x7C, 0xC6, 0xFE, 0xC6, 0xC6, 0x00, 0x6C, 0x00,
+ 0x7C, 0xC6, 0xFE, 0xC6, 0xC6, 0x00, 0x38, 0x44, 0x7C, 0xC6,
+ 0xFE, 0xC6, 0xC6, 0x00, 0x1F, 0x3C, 0x3C, 0x6F, 0x7C, 0xCC,
+ 0xCF, 0x00, 0x1E, 0x30, 0x60, 0x60, 0x30, 0x1E, 0x0C, 0x18,
+ 0x60, 0x30, 0xFC, 0xC0, 0xF0, 0xC0, 0xFC, 0x00, 0x18, 0x30,
+ 0xFC, 0xC0, 0xF0, 0xC0, 0xFC, 0x00, 0x30, 0xCC, 0xFC, 0xC0,
+ 0xF0, 0xC0, 0xFC, 0x00, 0xCC, 0x00, 0xFC, 0xC0, 0xF0, 0xC0,
+ 0xFC, 0x00, 0x60, 0x30, 0x78, 0x30, 0x30, 0x30, 0x78, 0x00,
+ 0x18, 0x30, 0x78, 0x30, 0x30, 0x30, 0x78, 0x00, 0x30, 0xCC,
+ 0x78, 0x30, 0x30, 0x30, 0x78, 0x00, 0xCC, 0x00, 0x78, 0x30,
+ 0x30, 0x30, 0x78, 0x00, 0x78, 0x6C, 0x66, 0xF6, 0x66, 0x6C,
+ 0x78, 0x00, 0x71, 0xCE, 0xE6, 0xF6, 0xDE, 0xCE, 0xC6, 0x00,
+ 0x30, 0x18, 0x3C, 0x66, 0x66, 0x66, 0x3C, 0x00, 0x0C, 0x18,
+ 0x3C, 0x66, 0x66, 0x66, 0x3C, 0x00, 0x18, 0x66, 0x3C, 0x66,
+ 0x66, 0x66, 0x3C, 0x00, 0x71, 0x8E, 0x3C, 0x66, 0x66, 0x66,
+ 0x3C, 0x00, 0xC3, 0x3C, 0x66, 0x66, 0x66, 0x66, 0x3C, 0x00,
+ 0x00, 0xC6, 0x6C, 0x38, 0x6C, 0xC6, 0x00, 0x00, 0x3F, 0x66,
+ 0x6E, 0x7E, 0x76, 0x66, 0xFC, 0x00, 0x30, 0x18, 0x66, 0x66,
+ 0x66, 0x66, 0x3E, 0x00, 0x0C, 0x18, 0x66, 0x66, 0x66, 0x66,
+ 0x3E, 0x00, 0x18, 0x24, 0x66, 0x66, 0x66, 0x66, 0x3E, 0x00,
+ 0x66, 0x00, 0x66, 0x66, 0x66, 0x66, 0x3E, 0x00, 0x06, 0x08,
+ 0xC3, 0x66, 0x3C, 0x18, 0x18, 0x00, 0x60, 0x60, 0x7E, 0x63,
+ 0x7E, 0x60, 0x60, 0x00, 0x3C, 0x66, 0x66, 0x6C, 0x66, 0x66,
+ 0x6C, 0x60, 0x30, 0x18, 0x3C, 0x06, 0x3E, 0x66, 0x3E, 0x00,
+ 0x0C, 0x18, 0x3C, 0x06, 0x3E, 0x66, 0x3E, 0x00, 0x18, 0x66,
+ 0x3C, 0x06, 0x3E, 0x66, 0x3E, 0x00, 0x71, 0x8E, 0x3C, 0x06,
+ 0x3E, 0x66, 0x3E, 0x00, 0x66, 0x00, 0x3C, 0x06, 0x3E, 0x66,
+ 0x3E, 0x00, 0x18, 0x24, 0x3C, 0x06, 0x3E, 0x66, 0x3E, 0x00,
+ 0x00, 0x00, 0x7E, 0x1B, 0x7F, 0xD8, 0x77, 0x00, 0x00, 0x00,
+ 0x3C, 0x60, 0x60, 0x60, 0x3C, 0x18, 0x30, 0x18, 0x3C, 0x66,
+ 0x7E, 0x60, 0x3C, 0x00, 0x0C, 0x18, 0x3C, 0x66, 0x7E, 0x60,
+ 0x3C, 0x00, 0x18, 0x66, 0x3C, 0x66, 0x7E, 0x60, 0x3C, 0x00,
+ 0x66, 0x00, 0x3C, 0x66, 0x7E, 0x60, 0x3C, 0x00, 0x30, 0x18,
+ 0x00, 0x18, 0x18, 0x18, 0x18, 0x00, 0x0C, 0x18, 0x00, 0x18,
+ 0x18, 0x18, 0x18, 0x00, 0x18, 0x66, 0x00, 0x18, 0x18, 0x18,
+ 0x18, 0x00, 0x00, 0x66, 0x00, 0x18, 0x18, 0x18, 0x18, 0x00,
+ 0x60, 0xFC, 0x18, 0x3C, 0x66, 0x66, 0x3C, 0x00, 0x71, 0x8E,
+ 0x00, 0x7C, 0x66, 0x66, 0x66, 0x00, 0x30, 0x18, 0x00, 0x3C,
+ 0x66, 0x66, 0x3C, 0x00, 0x0C, 0x18, 0x00, 0x3C, 0x66, 0x66,
+ 0x3C, 0x00, 0x18, 0x66, 0x00, 0x3C, 0x66, 0x66, 0x3C, 0x00,
+ 0x71, 0x8E, 0x00, 0x3C, 0x66, 0x66, 0x3C, 0x00, 0x00, 0x66,
+ 0x00, 0x3C, 0x66, 0x66, 0x3C, 0x00, 0x00, 0x18, 0x00, 0x7E,
+ 0x00, 0x18, 0x00, 0x00, 0x00, 0x02, 0x7C, 0xCE, 0xD6, 0xE6,
+ 0x7C, 0x80, 0x30, 0x18, 0x00, 0x66, 0x66, 0x66, 0x3E, 0x00,
+ 0x0C, 0x18, 0x00, 0x66, 0x66, 0x66, 0x3E, 0x00, 0x18, 0x66,
+ 0x00, 0x66, 0x66, 0x66, 0x3E, 0x00, 0x00, 0x66, 0x00, 0x66,
+ 0x66, 0x66, 0x3E, 0x00, 0x0C, 0x18, 0x00, 0x66, 0x66, 0x3C,
+ 0x18, 0x30, 0x60, 0x60, 0x7C, 0x66, 0x66, 0x7C, 0x60, 0x60,
+ 0x00, 0x66, 0x00, 0x66, 0x66, 0x3C, 0x18, 0x30, 0xFF
+};
+
+
+} // End of namespace Queen
diff --git a/queen/display.h b/queen/display.h
new file mode 100644
index 0000000000..0d04709308
--- /dev/null
+++ b/queen/display.h
@@ -0,0 +1,128 @@
+/* ScummVM - Scumm Interpreter
+ * Copyright (C) 2003 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+ *
+ * $Header$
+ *
+ */
+
+#ifndef QUEENDISPLAY_H
+#define QUEENDISPLAY_H
+
+#include "queen/queen.h"
+#include "queen/defs.h"
+#include "queen/structs.h"
+
+namespace Queen {
+
+
+enum RenderingBuffer {
+ RB_BACKDROP = 0,
+ RB_PANEL = 1,
+ RB_SCREEN = 2
+};
+
+
+struct Dynalum {
+ uint8 msk[50 * 160];
+ int8 lum[8 * 3];
+ uint8 prevColMask;
+};
+
+
+struct TextRenderer {
+ void init();
+ void drawString(uint8 *dstBuf, uint16 dstPitch, uint16 x, uint16 y, uint8 color, const char *text, bool outlined = true);
+ void drawChar(uint8 *dstBuf, uint16 dstPitch, uint16 x, uint16 y, uint8 color, const uint8 *chr);
+
+ uint8 charWidth[256];
+ static const uint8 FONT[];
+};
+
+
+class Display {
+public:
+
+ Display(OSystem *system);
+ ~Display();
+
+ void dynalumInit(Resource *resource, const char *roomName, uint16 roomNum);
+ void dynalumUpdate(int x, int y);
+
+ void palSetRoom(const uint8 *pal, int start, int end);
+ void palFadeIn(uint8 start, uint8 end, uint16 roomNum);
+ void palFadeOut(uint8 start, uint8 end, uint16 roomNum);
+ void palFadePanel();
+ void palCustomColors(uint16 roomNum); // check_colors
+ void palCustomScroll(uint16 roomNum); // check_pal_scroll
+
+ void screenMode(int comPanel, bool inCutaway);
+
+ void prepareUpdate();
+ void update(bool dynalum, int dynaX, int dynaY);
+
+ void blit(RenderingBuffer dstBuf, uint16 dstX, uint16 dstY, const uint8 *srcBuf, uint16 srcW, uint16 srcH, uint16 srcPitch, bool xflip, bool masked);
+ void fill(RenderingBuffer dstBuf, uint16 x, uint16 y, uint16 w, uint16 h, uint8 color);
+
+ void pcxRead(uint8 *dst, uint16 dstPitch, const uint8 *src, uint16 w, uint16 h);
+ void pcxReadBackdrop(const uint8 *pcxBuf, uint32 size, bool useFullPal);
+ void pcxReadPanel(const uint8 *pcxBuf, uint32 size);
+
+ void textDraw(uint16 x, uint16 y, uint8 color, const char *text, bool outlined = true);
+ uint16 textWidth(const char *text) const;
+
+ void horizontalScroll(uint16 scroll);
+
+ bool fullscreen() const { return _fullscreen; }
+
+
+private:
+
+ enum BufferDimension {
+ BACKDROP_W = 640,
+ BACKDROP_H = 200,
+ SCREEN_W = 320,
+ SCREEN_H = 200,
+ PANEL_W = 320,
+ PANEL_H = 50
+ };
+
+ TextRenderer _textRenderer;
+
+ struct {
+ uint8 *screen;
+ uint8 *room;
+ int dirtyMin, dirtyMax;
+ } _pals;
+
+ uint8 *_buffers[3];
+ uint16 _bufPitch[3];
+
+ bool _fullscreen;
+ bool _panel;
+
+ uint16 _horizontalScroll;
+ uint16 _bdWidth, _bdHeight;
+
+ Dynalum _dynalum;
+ OSystem *_system;
+
+};
+
+
+} // End of namespace Queen
+
+#endif
diff --git a/queen/graphics.cpp b/queen/graphics.cpp
index 68920c64b7..dcf34426df 100644
--- a/queen/graphics.cpp
+++ b/queen/graphics.cpp
@@ -21,253 +21,14 @@
#include "stdafx.h"
#include "queen/graphics.h"
-#include "queen/resource.h"
+#include "queen/display.h"
namespace Queen {
-const uint8 Graphics::FONT[] = {
- 0xF8, 0xB0, 0xB0, 0x80, 0xB0, 0xB0, 0xC0, 0x00, 0xF8, 0xB0,
- 0xB0, 0x80, 0xB0, 0xB0, 0xC0, 0x00, 0xF8, 0xB0, 0xB0, 0x80,
- 0xB0, 0xB0, 0xC0, 0x00, 0xF8, 0xB0, 0xB0, 0x80, 0xB0, 0xB0,
- 0xC0, 0x00, 0xF8, 0xB0, 0xB0, 0x80, 0xB0, 0xB0, 0xC0, 0x00,
- 0xF8, 0xB0, 0xB0, 0x80, 0xB0, 0xB0, 0xC0, 0x00, 0xF8, 0xB0,
- 0xB0, 0x80, 0xB0, 0xB0, 0xC0, 0x00, 0xF8, 0xB0, 0xB0, 0x80,
- 0xB0, 0xB0, 0xC0, 0x00, 0xF8, 0xB0, 0xB0, 0x80, 0xB0, 0xB0,
- 0xC0, 0x00, 0xF8, 0xB0, 0xB0, 0x80, 0xB0, 0xB0, 0xC0, 0x00,
- 0xF8, 0xB0, 0xB0, 0x80, 0xB0, 0xB0, 0xC0, 0x00, 0xF8, 0xB0,
- 0xB0, 0x80, 0xB0, 0xB0, 0xC0, 0x00, 0xF8, 0xB0, 0xB0, 0x80,
- 0xB0, 0xB0, 0xC0, 0x00, 0xF8, 0xB0, 0xB0, 0x80, 0xB0, 0xB0,
- 0xC0, 0x00, 0xF8, 0xB0, 0xB0, 0x80, 0xB0, 0xB0, 0xC0, 0x00,
- 0xF8, 0xB0, 0xB0, 0x80, 0xB0, 0xB0, 0xC0, 0x00, 0xF8, 0xB0,
- 0xB0, 0x80, 0xB0, 0xB0, 0xC0, 0x00, 0xF8, 0xB0, 0xB0, 0x80,
- 0xB0, 0xB0, 0xC0, 0x00, 0xF8, 0xB0, 0xB0, 0x80, 0xB0, 0xB0,
- 0xC0, 0x00, 0xF8, 0xB0, 0xB0, 0x80, 0xB0, 0xB0, 0xC0, 0x00,
- 0xF8, 0xB0, 0xB0, 0x80, 0xB0, 0xB0, 0xC0, 0x00, 0xF8, 0xB0,
- 0xB0, 0x80, 0xB0, 0xB0, 0xC0, 0x00, 0xF8, 0xB0, 0xB0, 0x80,
- 0xB0, 0xB0, 0xC0, 0x00, 0xF8, 0xB0, 0xB0, 0x80, 0xB0, 0xB0,
- 0xC0, 0x00, 0xF8, 0xB0, 0xB0, 0x80, 0xB0, 0xB0, 0xC0, 0x00,
- 0xF8, 0xB0, 0xB0, 0x80, 0xB0, 0xB0, 0xC0, 0x00, 0xF8, 0xB0,
- 0xB0, 0x80, 0xB0, 0xB0, 0xC0, 0x00, 0xF8, 0xB0, 0xB0, 0x80,
- 0xB0, 0xB0, 0xC0, 0x00, 0xF8, 0xB0, 0xB0, 0x80, 0xB0, 0xB0,
- 0xC0, 0x00, 0xF8, 0xB0, 0xB0, 0x80, 0xB0, 0xB0, 0xC0, 0x00,
- 0xF8, 0xB0, 0xB0, 0x80, 0xB0, 0xB0, 0xC0, 0x00, 0xF8, 0xB0,
- 0xB0, 0x80, 0xB0, 0xB0, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0xC0, 0xC0, 0xC0, 0xC0, 0x00, 0xC0,
- 0xC0, 0x00, 0xD8, 0xD8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x6C, 0x6C, 0xFE, 0x6C, 0xFE, 0x6C, 0x6C, 0x00, 0x30, 0x7C,
- 0xC0, 0x78, 0x0C, 0xF8, 0x30, 0x00, 0x00, 0xC6, 0xCC, 0x18,
- 0x30, 0x66, 0xC6, 0x00, 0x38, 0x6C, 0x68, 0x36, 0xDC, 0xCC,
- 0x76, 0x00, 0x60, 0x60, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x30, 0x60, 0xC0, 0xC0, 0xC0, 0x60, 0x30, 0x00, 0xC0, 0x60,
- 0x30, 0x30, 0x30, 0x60, 0xC0, 0x00, 0x00, 0x6C, 0x38, 0xFE,
- 0x38, 0x6C, 0x00, 0x00, 0x00, 0x30, 0x30, 0xFC, 0x30, 0x30,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0x60, 0xC0,
- 0x00, 0x00, 0x00, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0xC0, 0xC0, 0x00, 0x03, 0x06, 0x0C, 0x18,
- 0x30, 0x60, 0xC0, 0x00, 0x78, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC,
- 0x78, 0x00, 0x30, 0x70, 0xF0, 0x30, 0x30, 0x30, 0x30, 0x00,
- 0x78, 0xCC, 0x0C, 0x78, 0xC0, 0xC0, 0xFC, 0x00, 0x78, 0xCC,
- 0x0C, 0x38, 0x0C, 0xCC, 0x78, 0x00, 0x1C, 0x3C, 0x6C, 0xCC,
- 0xFC, 0x0C, 0x0C, 0x00, 0xFC, 0xC0, 0xF8, 0x0C, 0x0C, 0xCC,
- 0x78, 0x00, 0x78, 0xCC, 0xC0, 0xF8, 0xCC, 0xCC, 0x78, 0x00,
- 0xFC, 0xCC, 0x0C, 0x18, 0x30, 0x30, 0x30, 0x00, 0x78, 0xCC,
- 0xCC, 0x78, 0xCC, 0xCC, 0x78, 0x00, 0x78, 0xCC, 0xCC, 0x7C,
- 0x0C, 0xCC, 0x78, 0x00, 0x00, 0xC0, 0xC0, 0x00, 0x00, 0xC0,
- 0xC0, 0x00, 0x00, 0x60, 0x60, 0x00, 0x00, 0x60, 0x60, 0xC0,
- 0x18, 0x30, 0x60, 0xC0, 0x60, 0x30, 0x18, 0x00, 0x00, 0x00,
- 0xFC, 0x00, 0xFC, 0x00, 0x00, 0x00, 0xC0, 0x60, 0x30, 0x18,
- 0x30, 0x60, 0xC0, 0x00, 0x78, 0xCC, 0x0C, 0x18, 0x30, 0x00,
- 0x30, 0x00, 0x6C, 0xFE, 0xFE, 0xFE, 0x7C, 0x38, 0x10, 0x00,
- 0x38, 0x7C, 0xC6, 0xC6, 0xFE, 0xC6, 0xC6, 0x00, 0xF8, 0xCC,
- 0xCC, 0xF8, 0xCC, 0xCC, 0xF8, 0x00, 0x78, 0xCC, 0xC0, 0xC0,
- 0xC0, 0xCC, 0x78, 0x00, 0xF8, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC,
- 0xF8, 0x00, 0xFC, 0xC0, 0xC0, 0xF0, 0xC0, 0xC0, 0xFC, 0x00,
- 0xFC, 0xC0, 0xC0, 0xF0, 0xC0, 0xC0, 0xC0, 0x00, 0x78, 0xCC,
- 0xC0, 0xDC, 0xCC, 0xCC, 0x7C, 0x00, 0xCC, 0xCC, 0xCC, 0xFC,
- 0xCC, 0xCC, 0xCC, 0x00, 0xF0, 0x60, 0x60, 0x60, 0x60, 0x60,
- 0xF0, 0x00, 0x0C, 0x0C, 0x0C, 0x0C, 0xCC, 0xCC, 0x78, 0x00,
- 0xC6, 0xCC, 0xD8, 0xF8, 0xD8, 0xCC, 0xC6, 0x00, 0xC0, 0xC0,
- 0xC0, 0xC0, 0xC0, 0xC0, 0xFC, 0x00, 0x82, 0xC6, 0xEE, 0xFE,
- 0xD6, 0xC6, 0xC6, 0x00, 0xC6, 0xE6, 0xF6, 0xDE, 0xCE, 0xC6,
- 0xC6, 0x00, 0x78, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0x78, 0x00,
- 0xF8, 0xCC, 0xCC, 0xF8, 0xC0, 0xC0, 0xC0, 0x00, 0x78, 0xCC,
- 0xCC, 0xCC, 0xCC, 0xDC, 0x78, 0x0C, 0xF8, 0xCC, 0xCC, 0xF8,
- 0xD8, 0xCC, 0xCC, 0x00, 0x78, 0xCC, 0xC0, 0x78, 0x0C, 0xCC,
- 0x78, 0x00, 0xFC, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x00,
- 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0x7C, 0x00, 0xC6, 0xC6,
- 0x6C, 0x6C, 0x38, 0x38, 0x10, 0x00, 0xC6, 0xC6, 0xC6, 0xD6,
- 0xFE, 0xEE, 0xC6, 0x00, 0xC6, 0x6C, 0x38, 0x10, 0x38, 0x6C,
- 0xC6, 0x00, 0xCC, 0xCC, 0xCC, 0x78, 0x30, 0x30, 0x30, 0x00,
- 0xFC, 0x0C, 0x18, 0x30, 0x60, 0xC0, 0xFC, 0x00, 0xF0, 0xC0,
- 0xC0, 0xC0, 0xC0, 0xC0, 0xF0, 0x00, 0xC0, 0x60, 0x30, 0x18,
- 0x0C, 0x06, 0x03, 0x00, 0xF0, 0x30, 0x30, 0x30, 0x30, 0x30,
- 0xF0, 0x00, 0xE8, 0x4D, 0x4A, 0x48, 0x00, 0x00, 0x00, 0x00,
- 0x80, 0x80, 0x80, 0x80, 0x00, 0x00, 0x00, 0x00, 0xC0, 0xC0,
- 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x78, 0x0C,
- 0x7C, 0xCC, 0x7C, 0x00, 0xC0, 0xC0, 0xF8, 0xCC, 0xCC, 0xCC,
- 0xF8, 0x00, 0x00, 0x00, 0x78, 0xCC, 0xC0, 0xCC, 0x78, 0x00,
- 0x0C, 0x0C, 0x7C, 0xCC, 0xCC, 0xCC, 0x7C, 0x00, 0x00, 0x00,
- 0x78, 0xCC, 0xFC, 0xC0, 0x78, 0x00, 0x38, 0x6C, 0x60, 0xF8,
- 0x60, 0x60, 0x60, 0x00, 0x00, 0x00, 0x7C, 0xCC, 0xCC, 0x7C,
- 0x0C, 0x78, 0xC0, 0xC0, 0xF8, 0xCC, 0xCC, 0xCC, 0xCC, 0x00,
- 0xC0, 0x00, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0x00, 0x0C, 0x00,
- 0x0C, 0x0C, 0x0C, 0x0C, 0xCC, 0x78, 0xC0, 0xC0, 0xCC, 0xD8,
- 0xF0, 0xD8, 0xCC, 0x00, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0,
- 0xC0, 0x00, 0x00, 0x00, 0xCC, 0xEE, 0xD6, 0xC6, 0xC6, 0x00,
- 0x00, 0x00, 0xF8, 0xCC, 0xCC, 0xCC, 0xCC, 0x00, 0x00, 0x00,
- 0x78, 0xCC, 0xCC, 0xCC, 0x78, 0x00, 0x00, 0x00, 0xF8, 0xCC,
- 0xCC, 0xF8, 0xC0, 0xC0, 0x00, 0x00, 0x7C, 0xCC, 0xCC, 0x7C,
- 0x0C, 0x0C, 0x00, 0x00, 0xF8, 0xCC, 0xC0, 0xC0, 0xC0, 0x00,
- 0x00, 0x00, 0x7C, 0xC0, 0x78, 0x0C, 0x78, 0x00, 0x30, 0x30,
- 0xFC, 0x30, 0x30, 0x30, 0x30, 0x00, 0x00, 0x00, 0xCC, 0xCC,
- 0xCC, 0xCC, 0x7C, 0x00, 0x00, 0x00, 0xCC, 0xCC, 0xCC, 0x78,
- 0x30, 0x00, 0x00, 0x00, 0xC6, 0xD6, 0xD6, 0x6C, 0x6C, 0x00,
- 0x00, 0x00, 0xCC, 0x78, 0x30, 0x78, 0xCC, 0x00, 0x00, 0x00,
- 0xCC, 0xCC, 0xCC, 0x78, 0x30, 0xE0, 0x00, 0x00, 0xFC, 0x18,
- 0x30, 0x60, 0xFC, 0x00, 0x38, 0x60, 0x60, 0xC0, 0x60, 0x60,
- 0x38, 0x00, 0xC0, 0xC0, 0xC0, 0x00, 0xC0, 0xC0, 0xC0, 0x00,
- 0xE0, 0x30, 0x30, 0x18, 0x30, 0x30, 0xE0, 0x00, 0x38, 0x44,
- 0xBA, 0xAA, 0xBA, 0x44, 0x38, 0x00, 0x00, 0x98, 0x30, 0x60,
- 0xC8, 0x98, 0x30, 0x00, 0x1E, 0x30, 0x60, 0x60, 0x30, 0x1E,
- 0x0C, 0x18, 0x00, 0x66, 0x00, 0x66, 0x66, 0x66, 0x3E, 0x00,
- 0x0C, 0x18, 0x3C, 0x66, 0x7E, 0x60, 0x3C, 0x00, 0x18, 0x66,
- 0x3C, 0x06, 0x3E, 0x66, 0x3E, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x30, 0x18, 0x3C, 0x06, 0x3E, 0x66,
- 0x3E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x1E, 0x30, 0x60, 0x60, 0x30, 0x1E, 0x0C, 0x18, 0x18, 0x66,
- 0x3C, 0x66, 0x7E, 0x60, 0x3C, 0x00, 0x66, 0x00, 0x3C, 0x66,
- 0x7E, 0x60, 0x3C, 0x00, 0x30, 0x18, 0x3C, 0x66, 0x7E, 0x60,
- 0x3C, 0x00, 0x00, 0x66, 0x00, 0x18, 0x18, 0x18, 0x18, 0x00,
- 0x18, 0x66, 0x00, 0x18, 0x18, 0x18, 0x18, 0x00, 0x30, 0x18,
- 0x00, 0x18, 0x18, 0x18, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x18, 0x30, 0xFC, 0xC0, 0xF0, 0xC0, 0xFC, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x66, 0x00, 0x3C,
- 0x66, 0x66, 0x3C, 0x00, 0x00, 0x66, 0x00, 0x3C, 0x66, 0x66,
- 0x3C, 0x00, 0x30, 0x18, 0x00, 0x3C, 0x66, 0x66, 0x3C, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x18,
- 0x00, 0x66, 0x66, 0x66, 0x3E, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x18, 0x30, 0x78, 0x0C, 0x7C, 0xCC, 0x7C, 0x00, 0x0C, 0x18,
- 0x00, 0x18, 0x18, 0x18, 0x18, 0x00, 0x18, 0x30, 0x00, 0x78,
- 0xCC, 0xCC, 0x78, 0x00, 0x18, 0x30, 0x00, 0xCC, 0xCC, 0xCC,
- 0x7C, 0x00, 0x71, 0x8E, 0x00, 0x7C, 0x66, 0x66, 0x66, 0x00,
- 0x71, 0xCE, 0xE6, 0xF6, 0xDE, 0xCE, 0xC6, 0x00, 0x18, 0x18,
- 0x18, 0x00, 0x18, 0x18, 0x18, 0x00, 0x3C, 0x60, 0x3C, 0x66,
- 0x3C, 0x06, 0x3C, 0x00, 0x18, 0x00, 0x18, 0x0C, 0x06, 0x66,
- 0x3C, 0x00, 0x3F, 0x40, 0x4E, 0x58, 0x4E, 0x40, 0x3F, 0x00,
- 0x1C, 0xA4, 0xC4, 0xBC, 0x80, 0xFE, 0x00, 0x00, 0x00, 0x33,
- 0x66, 0xCC, 0x66, 0x33, 0x00, 0x00, 0x3E, 0x06, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0xC0, 0xC0, 0x00, 0xC0, 0xC0, 0xC0,
- 0xC0, 0x00, 0x81, 0xB9, 0xA5, 0xB9, 0xA5, 0x81, 0x7E, 0x00,
- 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x78, 0xCC,
- 0x78, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x30, 0xFC, 0x30,
- 0x30, 0x00, 0xFC, 0x00, 0xF0, 0x18, 0x30, 0x60, 0xF8, 0x00,
- 0x00, 0x00, 0xF0, 0x18, 0x30, 0x18, 0xF0, 0x00, 0x00, 0x00,
- 0x30, 0x60, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0xCC, 0xCC, 0xCC, 0xCC, 0xFE, 0xC0, 0x3E, 0x7A, 0x7A, 0x3A,
- 0x0A, 0x0A, 0x0A, 0x00, 0x00, 0x00, 0x18, 0x18, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x60,
- 0x60, 0xE0, 0x60, 0x60, 0x60, 0x00, 0x00, 0x00, 0x38, 0x44,
- 0x44, 0x38, 0x00, 0x7C, 0x00, 0x00, 0x00, 0xCC, 0x66, 0x33,
- 0x66, 0xCC, 0x00, 0x00, 0x40, 0xC6, 0x4C, 0x58, 0x32, 0x66,
- 0xCF, 0x02, 0x40, 0xC6, 0x4C, 0x58, 0x3E, 0x62, 0xC4, 0x0E,
- 0xC0, 0x23, 0x66, 0x2C, 0xD9, 0x33, 0x67, 0x01, 0x18, 0x00,
- 0x18, 0x30, 0x60, 0x66, 0x3C, 0x00, 0x60, 0x30, 0x7C, 0xC6,
- 0xFE, 0xC6, 0xC6, 0x00, 0x0C, 0x18, 0x7C, 0xC6, 0xFE, 0xC6,
- 0xC6, 0x00, 0x38, 0xC6, 0x7C, 0xC6, 0xFE, 0xC6, 0xC6, 0x00,
- 0x71, 0x8E, 0x7C, 0xC6, 0xFE, 0xC6, 0xC6, 0x00, 0x6C, 0x00,
- 0x7C, 0xC6, 0xFE, 0xC6, 0xC6, 0x00, 0x38, 0x44, 0x7C, 0xC6,
- 0xFE, 0xC6, 0xC6, 0x00, 0x1F, 0x3C, 0x3C, 0x6F, 0x7C, 0xCC,
- 0xCF, 0x00, 0x1E, 0x30, 0x60, 0x60, 0x30, 0x1E, 0x0C, 0x18,
- 0x60, 0x30, 0xFC, 0xC0, 0xF0, 0xC0, 0xFC, 0x00, 0x18, 0x30,
- 0xFC, 0xC0, 0xF0, 0xC0, 0xFC, 0x00, 0x30, 0xCC, 0xFC, 0xC0,
- 0xF0, 0xC0, 0xFC, 0x00, 0xCC, 0x00, 0xFC, 0xC0, 0xF0, 0xC0,
- 0xFC, 0x00, 0x60, 0x30, 0x78, 0x30, 0x30, 0x30, 0x78, 0x00,
- 0x18, 0x30, 0x78, 0x30, 0x30, 0x30, 0x78, 0x00, 0x30, 0xCC,
- 0x78, 0x30, 0x30, 0x30, 0x78, 0x00, 0xCC, 0x00, 0x78, 0x30,
- 0x30, 0x30, 0x78, 0x00, 0x78, 0x6C, 0x66, 0xF6, 0x66, 0x6C,
- 0x78, 0x00, 0x71, 0xCE, 0xE6, 0xF6, 0xDE, 0xCE, 0xC6, 0x00,
- 0x30, 0x18, 0x3C, 0x66, 0x66, 0x66, 0x3C, 0x00, 0x0C, 0x18,
- 0x3C, 0x66, 0x66, 0x66, 0x3C, 0x00, 0x18, 0x66, 0x3C, 0x66,
- 0x66, 0x66, 0x3C, 0x00, 0x71, 0x8E, 0x3C, 0x66, 0x66, 0x66,
- 0x3C, 0x00, 0xC3, 0x3C, 0x66, 0x66, 0x66, 0x66, 0x3C, 0x00,
- 0x00, 0xC6, 0x6C, 0x38, 0x6C, 0xC6, 0x00, 0x00, 0x3F, 0x66,
- 0x6E, 0x7E, 0x76, 0x66, 0xFC, 0x00, 0x30, 0x18, 0x66, 0x66,
- 0x66, 0x66, 0x3E, 0x00, 0x0C, 0x18, 0x66, 0x66, 0x66, 0x66,
- 0x3E, 0x00, 0x18, 0x24, 0x66, 0x66, 0x66, 0x66, 0x3E, 0x00,
- 0x66, 0x00, 0x66, 0x66, 0x66, 0x66, 0x3E, 0x00, 0x06, 0x08,
- 0xC3, 0x66, 0x3C, 0x18, 0x18, 0x00, 0x60, 0x60, 0x7E, 0x63,
- 0x7E, 0x60, 0x60, 0x00, 0x3C, 0x66, 0x66, 0x6C, 0x66, 0x66,
- 0x6C, 0x60, 0x30, 0x18, 0x3C, 0x06, 0x3E, 0x66, 0x3E, 0x00,
- 0x0C, 0x18, 0x3C, 0x06, 0x3E, 0x66, 0x3E, 0x00, 0x18, 0x66,
- 0x3C, 0x06, 0x3E, 0x66, 0x3E, 0x00, 0x71, 0x8E, 0x3C, 0x06,
- 0x3E, 0x66, 0x3E, 0x00, 0x66, 0x00, 0x3C, 0x06, 0x3E, 0x66,
- 0x3E, 0x00, 0x18, 0x24, 0x3C, 0x06, 0x3E, 0x66, 0x3E, 0x00,
- 0x00, 0x00, 0x7E, 0x1B, 0x7F, 0xD8, 0x77, 0x00, 0x00, 0x00,
- 0x3C, 0x60, 0x60, 0x60, 0x3C, 0x18, 0x30, 0x18, 0x3C, 0x66,
- 0x7E, 0x60, 0x3C, 0x00, 0x0C, 0x18, 0x3C, 0x66, 0x7E, 0x60,
- 0x3C, 0x00, 0x18, 0x66, 0x3C, 0x66, 0x7E, 0x60, 0x3C, 0x00,
- 0x66, 0x00, 0x3C, 0x66, 0x7E, 0x60, 0x3C, 0x00, 0x30, 0x18,
- 0x00, 0x18, 0x18, 0x18, 0x18, 0x00, 0x0C, 0x18, 0x00, 0x18,
- 0x18, 0x18, 0x18, 0x00, 0x18, 0x66, 0x00, 0x18, 0x18, 0x18,
- 0x18, 0x00, 0x00, 0x66, 0x00, 0x18, 0x18, 0x18, 0x18, 0x00,
- 0x60, 0xFC, 0x18, 0x3C, 0x66, 0x66, 0x3C, 0x00, 0x71, 0x8E,
- 0x00, 0x7C, 0x66, 0x66, 0x66, 0x00, 0x30, 0x18, 0x00, 0x3C,
- 0x66, 0x66, 0x3C, 0x00, 0x0C, 0x18, 0x00, 0x3C, 0x66, 0x66,
- 0x3C, 0x00, 0x18, 0x66, 0x00, 0x3C, 0x66, 0x66, 0x3C, 0x00,
- 0x71, 0x8E, 0x00, 0x3C, 0x66, 0x66, 0x3C, 0x00, 0x00, 0x66,
- 0x00, 0x3C, 0x66, 0x66, 0x3C, 0x00, 0x00, 0x18, 0x00, 0x7E,
- 0x00, 0x18, 0x00, 0x00, 0x00, 0x02, 0x7C, 0xCE, 0xD6, 0xE6,
- 0x7C, 0x80, 0x30, 0x18, 0x00, 0x66, 0x66, 0x66, 0x3E, 0x00,
- 0x0C, 0x18, 0x00, 0x66, 0x66, 0x66, 0x3E, 0x00, 0x18, 0x66,
- 0x00, 0x66, 0x66, 0x66, 0x3E, 0x00, 0x00, 0x66, 0x00, 0x66,
- 0x66, 0x66, 0x3E, 0x00, 0x0C, 0x18, 0x00, 0x66, 0x66, 0x3C,
- 0x18, 0x30, 0x60, 0x60, 0x7C, 0x66, 0x66, 0x7C, 0x60, 0x60,
- 0x00, 0x66, 0x00, 0x66, 0x66, 0x3C, 0x18, 0x30, 0xFF
-};
-
-
-const uint8 Graphics::FONT_SIZES[] = {
- 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06,
- 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06,
- 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06,
- 0x06, 0x06, 0x04, 0x03, 0x06, 0x08, 0x07, 0x08, 0x08, 0x04,
- 0x05, 0x05, 0x08, 0x07, 0x04, 0x07, 0x03, 0x09, 0x07, 0x05,
- 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x03, 0x04,
- 0x06, 0x07, 0x06, 0x07, 0x08, 0x08, 0x07, 0x07, 0x07, 0x07,
- 0x07, 0x07, 0x07, 0x05, 0x07, 0x08, 0x07, 0x08, 0x08, 0x07,
- 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x08, 0x08, 0x08, 0x07,
- 0x07, 0x05, 0x09, 0x05, 0x08, 0x02, 0x04, 0x07, 0x07, 0x07,
- 0x07, 0x07, 0x07, 0x07, 0x07, 0x03, 0x07, 0x07, 0x03, 0x08,
- 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x08,
- 0x07, 0x07, 0x07, 0x06, 0x03, 0x06, 0x08, 0x06, 0x08, 0x08,
- 0x08, 0x08, 0x02, 0x08, 0x02, 0x08, 0x08, 0x08, 0x08, 0x08,
- 0x08, 0x06, 0x02, 0x02, 0x07, 0x02, 0x02, 0x08, 0x08, 0x08,
- 0x02, 0x08, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02,
- 0x07, 0x07, 0x07, 0x07, 0x09, 0x09, 0x06, 0x08, 0x08, 0x09,
- 0x08, 0x09, 0x08, 0x03, 0x09, 0x07, 0x07, 0x07, 0x06, 0x06,
- 0x05, 0x08, 0x08, 0x06, 0x05, 0x04, 0x07, 0x09, 0x09, 0x08,
- 0x09, 0x08, 0x08, 0x08, 0x08, 0x09, 0x08, 0x08, 0x09, 0x08,
- 0x07, 0x07, 0x07, 0x07, 0x06, 0x06, 0x07, 0x07, 0x08, 0x09,
- 0x08, 0x08, 0x08, 0x09, 0x09, 0x08, 0x09, 0x08, 0x08, 0x08,
- 0x08, 0x09, 0x09, 0x08, 0x08, 0x08, 0x08, 0x09, 0x08, 0x08,
- 0x09, 0x07, 0x08, 0x08, 0x08, 0x08, 0x06, 0x07, 0x08, 0x08,
- 0x08, 0x09, 0x08, 0x08, 0x08, 0x09, 0x08, 0x08, 0x08, 0x08,
- 0x08, 0x08, 0x08, 0x08, 0x08, 0x08
-};
-
-
-Graphics::Graphics(Resource *resource)
- : _cameraBob(0), _resource(resource) {
+Graphics::Graphics(Display *display, Resource *resource)
+ : _cameraBob(0), _display(display), _resource(resource) {
memset(_frames, 0, sizeof(_frames));
memset(_banks, 0, sizeof(_banks));
@@ -275,13 +36,6 @@ Graphics::Graphics(Resource *resource)
memset(_sortedBobs, 0, sizeof(_sortedBobs));
_sortedBobsCount = 0;
_shrinkBuffer.data = new uint8[ BOB_SHRINK_BUF_SIZE ];
- _backdrop = new uint8[ BACKDROP_W * BACKDROP_H ];
- _panel = new uint8[ PANEL_W * PANEL_H ];
- _screen = new uint8[ SCREEN_W * SCREEN_H ];
- _fullscreen = true;
- _horizontalScroll = 0;
- _paletteRoom = new uint8[ 256 * 3 ];
- _paletteScreen = new uint8[ 256 * 4 ];
}
@@ -292,11 +46,6 @@ Graphics::~Graphics() {
}
frameEraseAll(true);
delete[] _shrinkBuffer.data;
- delete[] _backdrop;
- delete[] _panel;
- delete[] _screen;
- delete[] _paletteRoom;
- delete[] _paletteScreen;
}
@@ -588,12 +337,12 @@ void Graphics::bobDraw(uint32 bobnum, uint16 x, uint16 y, uint16 scale, bool xfl
src += w * y_skip;
if (!xflip) {
src += x_skip;
- displayBlit(_screen, x, y, SCREEN_W, src, w_new, h_new, w, xflip, true);
+ _display->blit(RB_SCREEN, x, y, src, w_new, h_new, w, xflip, true);
}
else {
src += w - w_new - x_skip;
x += w_new - 1;
- displayBlit(_screen, x, y, SCREEN_W, src, w_new, h_new, w, xflip, true);
+ _display->blit(RB_SCREEN, x, y, src, w_new, h_new, w, xflip, true);
}
}
@@ -603,11 +352,11 @@ void Graphics::bobDraw(uint32 bobnum, uint16 x, uint16 y, uint16 scale, bool xfl
void Graphics::bobDrawInventoryItem(uint32 bobnum, uint16 x, uint16 y) {
if (bobnum == 0) {
// clear panel area
- memset(_panel + y * 32 + x, INK_BG_PANEL, 32 * 32);
+ _display->fill(RB_PANEL, x, y, 32, 32, INK_BG_PANEL);
}
else {
BobFrame *pbf = &_frames[bobnum];
- displayBlit(_panel, x, y, 320, pbf->data, pbf->width, pbf->height, pbf->width, false, false);
+ _display->blit(RB_PANEL, x, y, pbf->data, pbf->width, pbf->height, pbf->width, false, false);
}
}
@@ -615,7 +364,7 @@ void Graphics::bobDrawInventoryItem(uint32 bobnum, uint16 x, uint16 y) {
void Graphics::bobPaste(uint32 bobnum, uint16 x, uint16 y) {
BobFrame *pbf = &_frames[bobnum];
- displayBlit(_backdrop, x, y, 640, pbf->data, pbf->width, pbf->height, pbf->width, false, true);
+ _display->blit(RB_BACKDROP, x, y, pbf->data, pbf->width, pbf->height, pbf->width, false, true);
frameErase(bobnum);
}
@@ -678,7 +427,7 @@ void Graphics::bobClear(uint32 bobnum) {
pbs->box.x1 = 0;
pbs->box.y1 = 0;
pbs->box.x2 = GAME_SCREEN_WIDTH - 1;
- if (_fullscreen || bobnum == 16) { // FIXME: does bob number 16 really used ?
+ if (_display->fullscreen() || bobnum == 16) { // FIXME: does bob number 16 really used ?
pbs->box.y2 = GAME_SCREEN_HEIGHT - 1;
}
else {
@@ -801,7 +550,7 @@ void Graphics::textDrawAll() {
for (y = GAME_SCREEN_HEIGHT - 1; y > 0; --y) {
const TextSlot *pts = &_texts[y];
if (!pts->text.isEmpty()) {
- displayText(pts, y);
+ _display->textDraw(pts->x, y, pts->color, pts->text.c_str(), pts->outlined);
}
}
}
@@ -818,12 +567,7 @@ void Graphics::textClear(uint16 y1, uint16 y2) {
uint16 Graphics::textWidth(const char* text) const {
- uint16 len = 0;
- while (*text) {
- len += FONT_SIZES[ (int)*text ];
- ++text;
- }
- return len;
+ return _display->textWidth(text);
}
@@ -850,118 +594,47 @@ void Graphics::frameEraseAll(bool joe) {
}
-void Graphics::backdropLoad(const char* name, uint16 room) {
+void Graphics::loadBackdrop(const char* name, uint16 room) {
// init Dynalum
char roomPrefix[20];
strcpy(roomPrefix, name);
roomPrefix[ strlen(roomPrefix) - 4 ] = '\0';
- dynalumInit(roomPrefix, room);
+ _display->dynalumInit(_resource, roomPrefix, room);
uint8 *pcxbuf = _resource->loadFile(name);
if (pcxbuf == NULL) {
error("Unable to load backdrop : '%s'", name);
}
-
uint32 size = _resource->fileSize(name);
- setRoomPal(pcxbuf + size - 768, 0, (room <= 144) ? 144 : 256);
-
- _backdropWidth = READ_LE_UINT16(pcxbuf + 12);
- _backdropHeight = READ_LE_UINT16(pcxbuf + 14);
+ _display->pcxReadBackdrop(pcxbuf, size, room > 114);
+ delete[] pcxbuf;
if (room >= 90) {
_cameraBob = 0;
}
-
- readPCX(pcxbuf + 128, _backdrop, BACKDROP_W, _backdropWidth, _backdropHeight);
- delete[] pcxbuf;
-}
-
-
-void Graphics::backdropDraw() {
-
- int n = 3;
- if (_fullscreen) {
- n = 4;
- }
- uint8 *dst = _screen;
- uint8 *src = _backdrop + _horizontalScroll;
- while (n--) {
- int i;
- for (i = 0; i < 50; ++i) {
- memcpy(dst, src, SCREEN_W);
- dst += SCREEN_W;
- src += BACKDROP_W;
- }
- }
}
-void Graphics::panelLoad() {
+void Graphics::loadPanel() {
uint8 *pcxbuf = _resource->loadFile("panel.pcx");
if (pcxbuf == NULL) {
error("Unable to open panel file");
}
uint32 size = _resource->fileSize("panel.pcx");
- setRoomPal(pcxbuf + size - 768, 144, 256);
- readPCX(pcxbuf + 128, _panel + PANEL_W * 10, PANEL_W, PANEL_W, PANEL_H - 10);
+ _display->pcxReadPanel(pcxbuf, size);
delete[] pcxbuf;
}
-void Graphics::panelDraw() {
- memcpy(_screen + SCREEN_W * ROOM_ZONE_HEIGHT, _panel, PANEL_W * PANEL_H);
-}
-
-
-void Graphics::panelClear() {
- memset(_screen + SCREEN_W * ROOM_ZONE_HEIGHT, 0, PANEL_W * PANEL_H);
-}
-
-
-void Graphics::readPCX(const uint8 *src, uint8 *dst, uint16 dstPitch, uint16 w, uint16 h) {
-
- while (h--) {
- uint8 *p = dst;
- while (p < dst + w ) {
- uint8 col = *src++;
- if ((col & 0xC0) == 0xC0) {
- uint8 len = col & 0x3F;
- memset(p, *src++, len);
- p += len;
- }
- else {
- *p++ = col;
- }
- }
- dst += dstPitch;
- }
-}
-
-
-void Graphics::boxDraw(const Box &b, uint8 color) {
-
- int x, y;
-
- for (y = b.y1; y <= b.y2; ++y) {
- *(_backdrop + y * 640 + b.x1) = color;
- *(_backdrop + y * 640 + b.x2) = color;
- }
- for (x = b.x1; x <= b.x2; ++x) {
- *(_backdrop + b.y1 * 640 + x) = color;
- *(_backdrop + b.y2 * 640 + x) = color;
- }
-}
-
-
void Graphics::useJournal() { // GameSettings* pgs
int i;
bobClearAll();
- backdropLoad("journal.pcx", 160);
-// _display->fadeout(0,255);
+ loadBackdrop("journal.pcx", 160);
+ _display->palFadeOut(0, 255, 160);
// load and unpack journal frames
frameEraseAll(false);
@@ -979,7 +652,7 @@ void Graphics::useJournal() { // GameSettings* pgs
// TODO: setup zones
journalBobPreDraw();
-// _display->fadein(0, 255);
+ _display->palFadeIn(0, 255, 160);
}
@@ -1014,192 +687,14 @@ void Graphics::journalBobPreDraw() { // GameSettings* pgs
void Graphics::update() {
- // FIXME: incomplete !
+ // FIXME: temporary code, move to Logic::update()
bobSortAll();
- if (_panelFlag) {
- panelDraw();
- }
- else if (!_fullscreen) {
- panelClear();
- }
- backdropDraw();
+ _display->prepareUpdate();
bobDrawAll();
textDrawAll();
- if (_bobs[0].active) {
- dynalumUpdate(_bobs[0].x, _bobs[0].y);
- }
- displayScreen();
- g_system->delay_msecs(100); // TEMP: move to Logic::update()
-}
-
-
-void Graphics::displayText(const TextSlot *pts, uint16 y) {
-
- uint16 x = pts->x;
- const uint8 *str = (const uint8*)pts->text.c_str();
- while (*str && x < GAME_SCREEN_WIDTH) {
- const uint8 *pchr = FONT + (*str) * 8;
-// if (_resource->_gameVersion->versionString[1] == 'F' && *str == 150) {
-// chr = 251;
-// }
- if (pts->outlined) {
- displayChar(x - 1, y - 1, INK_OUTLINED_TEXT, pchr);
- displayChar(x , y - 1, INK_OUTLINED_TEXT, pchr);
- displayChar(x + 1, y - 1, INK_OUTLINED_TEXT, pchr);
- displayChar(x + 1, y , INK_OUTLINED_TEXT, pchr);
- displayChar(x + 1, y + 1, INK_OUTLINED_TEXT, pchr);
- displayChar(x , y + 1, INK_OUTLINED_TEXT, pchr);
- displayChar(x - 1, y + 1, INK_OUTLINED_TEXT, pchr);
- displayChar(x - 1, y , INK_OUTLINED_TEXT, pchr);
- }
- displayChar(x, y, pts->color, pchr);
-
- x += FONT_SIZES[ *str ];
- ++str;
- }
-}
-
-
-void Graphics::displayChar(uint16 x, uint16 y, uint8 color, const uint8 *chr) {
-
- int i, j;
- uint8 *dst = _screen + y * SCREEN_W + x;
- for (j = 0; j < 8; ++j) {
- uint8* p = dst;
- uint8 c = *chr++;
- if (c != 0) {
- for (i = 0; i < 8; ++i) {
- if(c & 0x80) {
- *p = color;
- }
- ++p;
- c <<= 1;
- }
- }
- dst += SCREEN_W;
- }
-}
-
-
-void Graphics::displayBlit(uint8 *dst_buf, uint16 dst_x, uint16 dst_y, uint16 dst_pitch, const uint8 *src_buf, uint16 src_w, uint16 src_h, uint16 src_pitch, bool xflip, bool masked) {
-
- dst_buf += dst_y * dst_pitch + dst_x;
- if (!masked) { // Unmasked always unflipped
- while (src_h--) {
- memcpy(dst_buf, src_buf, src_w);
- src_buf += src_pitch;
- dst_buf += dst_pitch;
- }
- }
- else if (!xflip) { // Masked bitmap unflipped
- while (src_h--) {
- int i;
- for(i = 0; i < src_w; ++i) {
- uint8 b = *(src_buf + i);
- if(b != 0) {
- *(dst_buf + i) = b;
- }
- }
- src_buf += src_pitch;
- dst_buf += dst_pitch;
- }
- }
- else { // Masked bitmap flipped
- while (src_h--) {
- int i;
- for(i = 0; i < src_w; ++i) {
- uint8 b = *(src_buf + i);
- if(b != 0) {
- *(dst_buf - i) = b;
- }
- }
- src_buf += src_pitch;
- dst_buf += dst_pitch;
- }
- }
-}
-
-
-void Graphics::displayScreen() {
- // FIXME: temporary code ; cleanup/move to Display class.
- g_system->set_palette(_paletteScreen, 0, 256);
- g_system->copy_rect(_screen, SCREEN_W, 0, 0, SCREEN_W, SCREEN_H);
- g_system->update_screen();
-}
-
-
-void Graphics::setScreenMode(int comPanel, bool inCutaway) {
- if (comPanel == 2 && inCutaway) {
- if (_backdropHeight == GAME_SCREEN_HEIGHT) {
- _fullscreen = true;
- _panelFlag = false;
- }
- else {
- _fullscreen = false;
- _panelFlag = true;
- }
- }
- else {
- _fullscreen = 0;
- _panelFlag = (comPanel == 1);
- }
-}
-
-
-void Graphics::setRoomPal(const uint8 *pal, int start, int end) {
- int i;
- pal += start * 3;
- for (i = start; i < end; ++i, pal += 3) {
- _paletteScreen[i << 2 | 0] = _paletteRoom[i * 3 + 0] = *(pal + 0);
- _paletteScreen[i << 2 | 1] = _paletteRoom[i * 3 + 1] = *(pal + 1);
- _paletteScreen[i << 2 | 2] = _paletteRoom[i * 3 + 2] = *(pal + 2);
- _paletteScreen[i << 2 | 3] = 0;
- }
-}
-
-
-void Graphics::dynalumInit(const char* roomPrefix, uint16 room) {
- // io.c l.2063-2089
- memset(_dynalum.msk, 0, sizeof(_dynalum.msk));
- memset(_dynalum.lum, 0, sizeof(_dynalum.lum));
- if (room < 90 || ((room > 94) && (room < 114))) {
- char filename[80];
- sprintf(filename, "%s.msk", roomPrefix);
- _resource->loadFile(filename, 0, (uint8*)_dynalum.msk);
- sprintf(filename, "%s.lum", roomPrefix);
- _resource->loadFile(filename, 0, (uint8*)_dynalum.lum);
- }
-}
-
-
-void Graphics::dynalumUpdate(uint16 x, uint16 y) {
-
- if (x >= _backdropWidth) {
- x = _backdropWidth;
- }
- if (y >= ROOM_ZONE_HEIGHT - 1) {
- y = ROOM_ZONE_HEIGHT - 1;
- }
- uint16 colMask = _dynalum.msk[(y / 4) * 160 + (x / 4)];
- debug(9, "Graphics::dynalumUpdate(%d, %d) - colMask = %d", x, y, colMask);
- if (colMask != _dynalum.oldColMask) {
- uint8 i;
- for (i = 0; i < 16; ++i) {
- uint8 j;
- for (j = 0; j < 3; ++j) {
- int16 c = (int16)(_paletteRoom[(144 + i) * 3 + j] + _dynalum.lum[colMask * 3 + j] * 4);
- if (c < 0) {
- c = 0;
- }
- else if (c > 255) {
- c = 255;
- }
- _paletteScreen[(144 + i) * 4 + j] = (uint8)c;
- }
- }
- _dynalum.oldColMask = colMask;
- // TODO: handle dirty colors (lopal, hipal)
- }
+ g_system->delay_msecs(100);
+ _display->palCustomScroll(0); //_currentRoom
+ _display->update(_bobs[0].active, _bobs[0].x, _bobs[0].y);
}
diff --git a/queen/graphics.h b/queen/graphics.h
index 91c909deb5..332897154e 100644
--- a/queen/graphics.h
+++ b/queen/graphics.h
@@ -101,20 +101,20 @@ struct TextSlot {
};
-struct Dynalum {
- uint8 msk[50 * 160]; // mask
- int8 lum[8 * 3]; // rgb
- int8 oldColMask;
- Dynalum(): oldColMask(-1) {}
-};
+//struct Dynalum {
+// uint8 msk[50 * 160]; // mask
+// int8 lum[8 * 3]; // rgb
+// int8 oldColMask;
+// Dynalum(): oldColMask(-1) {}
+//};
-//class Display;
+class Display;
class Graphics {
public:
- Graphics(Resource *resource);
+ Graphics(Display *display, Resource *resource);
~Graphics();
void bankLoad(const char *bankname, uint32 bankslot); // loadbank()
@@ -145,42 +145,19 @@ public:
void frameErase(uint32 fslot);
void frameEraseAll(bool joe); // freeframes, freeallframes
- void backdropLoad(const char *name, uint16 room); // loadbackdrop
- void backdropDraw();
-
- void panelLoad(); // loadpanel
- void panelDraw();
- void panelClear();
-
- void boxDraw(const Box &b, uint8 color);
+ void loadBackdrop(const char *name, uint16 room);
+ void loadPanel();
void useJournal();
void journalBobSetup(uint32 bobnum, uint16 x, uint16 y, uint16 frame);
void journalBobPreDraw();
void update();
-
- void displayText(const TextSlot *pts, uint16 y); // FIXME: move to Display class
- void displayChar(uint16 x, uint16 y, uint8 color, const uint8 *chr); // FIXME: move to Display class
- static void displayBlit(uint8 *dst_buf, uint16 dst_x, uint16 dst_y, uint16 dst_pitch, const uint8 *src_buf, uint16 src_w, uint16 src_h, uint16 src_pitch, bool xflip, bool masked); // FIXME: move to Display class
- void displayScreen();
-
- void setScreenMode(int comPanel, bool inCutaway);
- void setRoomPal(const uint8 *pal, int start, int end);
-
- void dynalumInit(const char* roomPrefix, uint16 room);
- void dynalumUpdate(uint16 x, uint16 y); // dynalum()
private:
enum {
- BACKDROP_W = 640,
- BACKDROP_H = 200,
- SCREEN_W = 320,
- SCREEN_H = 200,
- PANEL_W = 320,
- PANEL_H = 50,
BOB_SHRINK_BUF_SIZE = 60000
};
@@ -211,38 +188,8 @@ private:
uint16 _cameraBob; // cambob
- //! current room dimensions
- uint16 _backdropWidth, _backdropHeight; // BDxres, BDyres
-
- //! current room bitmap
- uint8 *_backdrop;
-
- uint8 *_screen;
-
- bool _fullscreen;
-
- bool _panelFlag;
-
- uint16 _horizontalScroll;
-
- uint8 *_paletteRoom; // palette
- uint8 *_paletteScreen; // tpal
-
- //! panel storage area
- uint8 *_panel;
-
+ Display *_display;
Resource *_resource;
-// Display *_display;
-
- Dynalum _dynalum;
-
- //! font used to render the text
- static const uint8 FONT[]; // FIXME: move to Display class
-
- //! font justification values
- static const uint8 FONT_SIZES[]; // FIXME: move to Display class
-
- void readPCX(const uint8 *src, uint8 *dst, uint16 dstPitch, uint16 w, uint16 h);
};
diff --git a/queen/logic.cpp b/queen/logic.cpp
index a339ca5688..7706dfb9e4 100644
--- a/queen/logic.cpp
+++ b/queen/logic.cpp
@@ -21,14 +21,15 @@
#include "queen/logic.h"
#include "queen/defs.h"
+#include "queen/display.h"
#include "queen/graphics.h"
#include "queen/walk.h"
#include "common/str.h"
namespace Queen {
-Logic::Logic(Resource *resource, Graphics *graphics)
- : _resource(resource), _graphics(graphics), _talkSpeed(DEFAULT_TALK_SPEED) {
+Logic::Logic(Resource *resource, Graphics *graphics, Display *display)
+ : _resource(resource), _graphics(graphics), _display(display), _talkSpeed(DEFAULT_TALK_SPEED) {
_jas = _resource->loadFile("QUEEN.JAS", 20);
_joe.x = _joe.y = 0;
_walk = new Walk(this, _graphics);
@@ -39,14 +40,11 @@ Logic::Logic(Resource *resource, Graphics *graphics)
Logic::~Logic() {
delete[] _jas;
delete _walk;
- //free(_graphicData);
}
void Logic::initialise() {
int16 i, j;
uint8 *ptr = _jas;
-
- //_display->loadFont();
_numRooms = READ_BE_UINT16(ptr); ptr += 2;
_numNames = READ_BE_UINT16(ptr); ptr += 2;
@@ -293,7 +291,7 @@ void Logic::initialise() {
else
_speechToggle = true;
- _graphics->panelLoad();
+ _graphics->loadPanel();
_graphics->bobSetupControl();
joeSetup();
zoneSetupPanel();
@@ -680,7 +678,6 @@ void Logic::zoneSetup() {
uint16 maxAreaRoom = _areaMax[_currentRoom];
for (zoneNum = 1; zoneNum <= maxAreaRoom; ++zoneNum) {
zoneSet(ZONE_ROOM, maxObjRoom + zoneNum, _area[_currentRoom][zoneNum].box);
- _graphics->boxDraw(_area[_currentRoom][zoneNum].box, 18);
}
}
@@ -716,7 +713,14 @@ void Logic::roomErase() {
_graphics->bankErase(12);
// TODO: TALKHEAD=0;
- // TODO: _display->fadeOut();
+
+ if (_currentRoom >= 114) {
+ _display->palFadeOut(0, 255, _currentRoom);
+ }
+ else {
+ _display->palFadeOut(0, 223, _currentRoom);
+ }
+
// TODO: credits system
// invalidates all persons animations
@@ -1110,16 +1114,15 @@ void Logic::roomSetup(const char* room, int comPanel, bool inCutaway) {
// loads background image
Common::String bdFile(room);
bdFile += ".PCX";
- _graphics->backdropLoad(bdFile.c_str(), _currentRoom);
+ _graphics->loadBackdrop(bdFile.c_str(), _currentRoom);
// setup graphics to enter fullscreen/panel mode
- _graphics->setScreenMode(comPanel, inCutaway);
+ _display->screenMode(comPanel, inCutaway);
// reset sprites table (bounding box...)
_graphics->bobClearAll();
- // setup any hard-coded palette effect
- // TODO: graphics->check_colors(_currentRoom);
+ _display->palCustomColors(_currentRoom);
// load/setup objects associated to this room
Common::String bkFile(room);
@@ -1145,7 +1148,12 @@ void Logic::roomDisplay(const char* room, RoomDisplayMode mode, uint16 scale, in
}
if (mode != RDM_NOFADE_JOE) {
_graphics->update();
- // TODO: _display->fadeIn();
+ if (_currentRoom >= 114) {
+ _display->palFadeIn(0, 255, _currentRoom);
+ }
+ else {
+ _display->palFadeOut(0, 223, _currentRoom);
+ }
}
if (pod != NULL) {
_walk->joeMove(0, pod->x, pod->y, inCutaway);
diff --git a/queen/logic.h b/queen/logic.h
index de2647074a..d1f28a328c 100644
--- a/queen/logic.h
+++ b/queen/logic.h
@@ -46,12 +46,13 @@ struct ZoneSlot {
class Graphics;
class Resource;
+class Display;
class Walk;
class Logic {
public:
- Logic(Resource *resource, Graphics *graphics);
+ Logic(Resource *resource, Graphics *graphics, Display *display);
~Logic();
uint16 currentRoom();
@@ -227,6 +228,7 @@ protected:
Resource *_resource;
Graphics *_graphics;
+ Display *_display;
Walk *_walk;
int _talkSpeed; // TALKSPD
diff --git a/queen/module.mk b/queen/module.mk
index b1e5235429..27fb037772 100644
--- a/queen/module.mk
+++ b/queen/module.mk
@@ -2,6 +2,7 @@ MODULE := queen
MODULE_OBJS = \
queen/cutaway.o \
+ queen/display.o \
queen/graphics.o \
queen/logic.o \
queen/queen.o \
diff --git a/queen/queen.cpp b/queen/queen.cpp
index ce85ade2db..a4e91c9c0e 100644
--- a/queen/queen.cpp
+++ b/queen/queen.cpp
@@ -25,6 +25,7 @@
#include "common/file.h"
#include "base/gameDetector.h"
#include "base/plugins.h"
+#include "queen/display.h"
#include "queen/graphics.h"
extern uint16 _debugLevel;
@@ -74,10 +75,10 @@ QueenEngine::QueenEngine(GameDetector *detector, OSystem *syst)
}
QueenEngine::~QueenEngine() {
+ delete _resource;
+ delete _display;
delete _graphics;
delete _logic;
- delete _resource;
- //delete _queenDisplay;
}
void QueenEngine::errorString(const char *buf1, char *buf2) {
@@ -98,8 +99,9 @@ void QueenEngine::go() {
void QueenEngine::initialise(void) {
_resource = new Resource(_gameDataPath);
- _graphics = new Graphics(_resource);
- _logic = new Logic(_resource, _graphics);
+ _display = new Display(_system);
+ _graphics = new Graphics(_display, _resource);
+ _logic = new Logic(_resource, _graphics, _display);
//_sound = new Sound(_mixer, _detector->_sfx_volume);
}
diff --git a/queen/queen.h b/queen/queen.h
index d300939671..dee60b953b 100644
--- a/queen/queen.h
+++ b/queen/queen.h
@@ -34,6 +34,7 @@ namespace Queen {
class Graphics;
class Logic;
+class Display;
class QueenEngine : public Engine {
void errorString(const char *buf_input, char *buf_output);
@@ -53,6 +54,7 @@ protected:
Graphics *_graphics;
Resource *_resource;
Logic *_logic;
+ Display *_display;
GameDetector *_detector; // necessary for music