aboutsummaryrefslogtreecommitdiff
path: root/queen/display.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'queen/display.cpp')
-rw-r--r--queen/display.cpp611
1 files changed, 611 insertions, 0 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