diff options
-rw-r--r-- | engines/gob/draw_v2.cpp | 1 | ||||
-rw-r--r-- | engines/gob/gob.cpp | 1 | ||||
-rw-r--r-- | engines/gob/inter.h | 2 | ||||
-rw-r--r-- | engines/gob/inter_v1.cpp | 1 | ||||
-rw-r--r-- | engines/gob/inter_v6.cpp | 10 | ||||
-rw-r--r-- | engines/gob/video.cpp | 34 | ||||
-rw-r--r-- | engines/gob/video.h | 9 | ||||
-rw-r--r-- | engines/gob/video_v6.cpp | 87 |
8 files changed, 135 insertions, 10 deletions
diff --git a/engines/gob/draw_v2.cpp b/engines/gob/draw_v2.cpp index f14821d4cd..f5f3848f9a 100644 --- a/engines/gob/draw_v2.cpp +++ b/engines/gob/draw_v2.cpp @@ -756,7 +756,6 @@ void Draw_v2::spriteOperation(int16 operation) { case DRAW_LOADSPRITE: id = _spriteLeft; - warning("Loadsprite %d to %d", id, _destSurface); if ((id >= 30000) || (_vm->_game->_lomHandle >= 0)) { dataBuf = 0; diff --git a/engines/gob/gob.cpp b/engines/gob/gob.cpp index 81d4ae19ae..c79fab95cf 100644 --- a/engines/gob/gob.cpp +++ b/engines/gob/gob.cpp @@ -184,6 +184,7 @@ Common::Error GobEngine::init() { } _video->setSize(is640()); + _video->init(); // On some systems it's not safe to run CD audio games from the CD. if (isCD()) diff --git a/engines/gob/inter.h b/engines/gob/inter.h index bdab8b84f9..66feddcab3 100644 --- a/engines/gob/inter.h +++ b/engines/gob/inter.h @@ -614,6 +614,8 @@ protected: const OpcodeGoblinEntryV6 *_opcodesGoblinV6; static const int _goblinFuncLookUp[][2]; + bool _gotFirstPalette; + virtual void setupOpcodes(); virtual void executeDrawOpcode(byte i); virtual bool executeFuncOpcode(byte i, byte j, OpFuncParams ¶ms); diff --git a/engines/gob/inter_v1.cpp b/engines/gob/inter_v1.cpp index 777653c822..3b371806ed 100644 --- a/engines/gob/inter_v1.cpp +++ b/engines/gob/inter_v1.cpp @@ -1858,6 +1858,7 @@ bool Inter_v1::o1_loadSpriteContent(OpFuncParams ¶ms) { _vm->_draw->_transparency = load16(); _vm->_draw->_destSpriteX = 0; _vm->_draw->_destSpriteY = 0; + _vm->_draw->spriteOperation(DRAW_LOADSPRITE); return false; } diff --git a/engines/gob/inter_v6.cpp b/engines/gob/inter_v6.cpp index cb9e1ba8ab..ad4512e216 100644 --- a/engines/gob/inter_v6.cpp +++ b/engines/gob/inter_v6.cpp @@ -43,6 +43,8 @@ const int Inter_v6::_goblinFuncLookUp[][2] = { }; Inter_v6::Inter_v6(GobEngine *vm) : Inter_v5(vm) { + _gotFirstPalette = false; + setupOpcodes(); } @@ -783,8 +785,12 @@ bool Inter_v6::o6_evaluateStore(OpFuncParams ¶ms) { bool Inter_v6::o6_palLoad(OpFuncParams ¶ms) { o1_palLoad(params); - _vm->_video->_palLUT->setPalette((const byte *) _vm->_global->_pPaletteDesc->vgaPal, - PaletteLUT::kPaletteRGB, 6); + + if (_gotFirstPalette) + _vm->_video->_palLUT->setPalette((const byte *) _vm->_global->_pPaletteDesc->vgaPal, + PaletteLUT::kPaletteRGB, 6); + + _gotFirstPalette = true; return false; } diff --git a/engines/gob/video.cpp b/engines/gob/video.cpp index 4298be6872..43fcb11bd5 100644 --- a/engines/gob/video.cpp +++ b/engines/gob/video.cpp @@ -25,6 +25,8 @@ #include "common/endian.h" #include "graphics/cursorman.h" +#include "graphics/fontman.h" +#include "graphics/surface.h" #include "gob/gob.h" #include "gob/video.h" @@ -533,4 +535,36 @@ void Video::dirtyRectsApply(int left, int top, int width, int height, int x, int } } +void Video::initOSD() { + const byte palOSD[] = { + 0, 0, 0, 0, + 0, 0, 171, 0, + 0, 171, 0, 0, + 0, 171, 171, 0, + 171, 0, 0, 0 + }; + + g_system->setPalette(palOSD, 0, 5); +} + +void Video::drawOSDText(const char *text) { + const Graphics::Font &font(*FontMan.getFontByUsage(Graphics::FontManager::kOSDFont)); + uint32 color = 0x2; + Graphics::Surface surf; + + surf.w = g_system->getWidth(); + surf.h = font.getFontHeight(); + surf.pitch = surf.w; + surf.bytesPerPixel = 1; + surf.pixels = calloc(surf.w, surf.h); + + font.drawString(&surf, text, 0, 0, surf.w, color, Graphics::kTextAlignCenter); + + int y = g_system->getHeight() / 2 - font.getFontHeight() / 2; + g_system->copyRectToScreen((byte *)surf.pixels, surf.pitch, 0, y, surf.w, surf.h); + g_system->updateScreen(); + + free(surf.pixels); +} + } // End of namespace Gob diff --git a/engines/gob/video.h b/engines/gob/video.h index d519094cd2..5fb87fc5da 100644 --- a/engines/gob/video.h +++ b/engines/gob/video.h @@ -174,6 +174,8 @@ public: int16 srcHeight, int16 x, int16 y, int16 transp, SurfaceDesc *destDesc) = 0; + virtual void init() { } + Video(class GobEngine *vm); virtual ~Video() {} @@ -189,6 +191,9 @@ protected: GobEngine *_vm; char initDriver(int16 vidMode); + + void initOSD(); + void drawOSDText(const char *text); }; class Video_v1 : public Video { @@ -214,10 +219,14 @@ public: virtual char spriteUncompressor(byte *sprBuf, int16 srcWidth, int16 srcHeight, int16 x, int16 y, int16 transp, SurfaceDesc *destDesc); + virtual void init(); + Video_v6(GobEngine *vm); virtual ~Video_v6() {} private: + static const byte _ditherPalette[768]; + void drawPacked(const byte *sprBuf, int16 x, int16 y, SurfaceDesc *surfDesc); void drawYUVData(const byte *srcData, SurfaceDesc *destDesc, int16 width, int16 height, int16 x, int16 y); diff --git a/engines/gob/video_v6.cpp b/engines/gob/video_v6.cpp index 27bc88ad1f..72c460688a 100644 --- a/engines/gob/video_v6.cpp +++ b/engines/gob/video_v6.cpp @@ -34,6 +34,19 @@ namespace Gob { Video_v6::Video_v6(GobEngine *vm) : Video_v2(vm) { } +void Video_v6::init() { + _palLUT->setPalette(_ditherPalette, PaletteLUT::kPaletteYUV, 8); + + initOSD(); + + char text[30]; + for (int i = 0; i < 64; i++) { + sprintf(text, "Building palette table: %02d/63", i); + drawOSDText(text); + _palLUT->buildNext(); + } +} + char Video_v6::spriteUncompressor(byte *sprBuf, int16 srcWidth, int16 srcHeight, int16 x, int16 y, int16 transp, SurfaceDesc *destDesc) { if (!destDesc) @@ -58,8 +71,6 @@ void Video_v6::drawPacked(const byte *sprBuf, int16 x, int16 y, SurfaceDesc *sur int16 height = READ_LE_UINT16(data + 2); data += 4; - warning("drawPacked: %d, %d, %d, %d", x, y, width, height); - const byte *srcData = data; byte *uncBuf = 0; @@ -90,8 +101,6 @@ void Video_v6::drawYUVData(const byte *srcData, SurfaceDesc *destDesc, if (dataHeight & 0xF) dataHeight = (dataHeight & 0xFFF0) + 16; - warning("drawYUVData: %d, %d, %d, %d, %d, %d", x, y, width, height, dataWidth, dataHeight); - const byte *dataY = srcData; const byte *dataU = dataY + (dataWidth * dataHeight); const byte *dataV = dataU + ((dataWidth * dataHeight) >> 4); @@ -118,9 +127,6 @@ void Video_v6::drawYUV(SurfaceDesc *destDesc, int16 x, int16 y, int16 dataWidth, int16 dataHeight, int16 width, int16 height, const byte *dataY, const byte *dataU, const byte *dataV) { - warning("drawYUV: %dx%d->%d+%d (%dx%d) (%dx%d)", width, height, x, y, dataWidth, dataHeight, - destDesc->getWidth(), destDesc->getHeight()); - byte *vidMem = destDesc->getVidMem() + y * destDesc->getWidth() + x; if ((x + width - 1) >= destDesc->getWidth()) @@ -149,4 +155,71 @@ void Video_v6::drawYUV(SurfaceDesc *destDesc, int16 x, int16 y, } } +const byte Video_v6::_ditherPalette[768] = { + 0x00,0x80,0x80,0x26,0x6B,0xC0,0x4B,0x56,0x4B,0x71,0x41,0x8B, + 0x0E,0xC0,0x76,0x34,0xAB,0xB6,0x59,0x96,0x41,0xBE,0x81,0x81, + 0xCF,0x77,0x75,0xC1,0x9B,0x6C,0x7F,0x81,0x81,0x7F,0x81,0x81, + 0x0A,0x8C,0x8A,0x0A,0xB0,0x79,0x0E,0x9D,0x76,0x0E,0x79,0x76, + 0x10,0x77,0x75,0x09,0x7B,0x8B,0x16,0x74,0xA6,0x16,0x74,0xA6, + 0x12,0x91,0x93,0x13,0xB5,0x72,0x1B,0x9E,0x6D,0x1A,0x7A,0x6D, + 0x1C,0x71,0x6C,0x1B,0x72,0x8C,0x1B,0x71,0xAE,0x1B,0x71,0xAE, + 0x21,0x93,0x93,0x21,0xB8,0x6F,0x27,0xA3,0x64,0x27,0x7F,0x65, + 0x29,0x69,0x68,0x28,0x69,0x8E,0x23,0x6F,0xB7,0x2A,0x69,0xB2, + 0x36,0x94,0x92,0x35,0xB9,0x6E,0x35,0xA6,0x5D,0x34,0x80,0x5D, + 0x39,0x61,0x6B,0x3A,0x60,0x8F,0x34,0x6E,0xB9,0x39,0x60,0xB5, + 0x46,0x93,0x95,0x48,0xB6,0x6F,0x45,0xA6,0x5C,0x47,0x80,0x5C, + 0x4B,0x56,0x6D,0x4B,0x56,0x91,0x47,0x6F,0xB7,0x4A,0x57,0xB5, + 0x5A,0x94,0x92,0x59,0xB9,0x6E,0x59,0xA6,0x5D,0x59,0x82,0x5D, + 0x5B,0x4D,0x6D,0x5A,0x4E,0x92,0x5B,0x6F,0xB7,0x5C,0x4D,0xB6, + 0x6D,0x94,0x93,0x6D,0xB8,0x6F,0x6D,0xA5,0x5D,0x6C,0x7F,0x5E, + 0x6C,0x4A,0x70,0x6D,0x4A,0x94,0x6C,0x6E,0xB9,0x6C,0x4A,0xBA, + 0x7E,0x94,0x93,0x80,0xB6,0x6F,0x7D,0xA6,0x5D,0x7F,0x81,0x5B, + 0x7F,0x4A,0x6F,0x7F,0x4A,0x92,0x7E,0x6F,0xB7,0x7E,0x4B,0xB7, + 0x92,0x94,0x93,0x90,0xB8,0x6F,0x91,0xA5,0x5C,0x90,0x81,0x5D, + 0x91,0x4B,0x6D,0x91,0x4C,0x93,0x93,0x6F,0xB7,0x92,0x4B,0xB7, + 0xA5,0x91,0x93,0xA2,0xB2,0x6F,0xA5,0xA6,0x5D,0xA4,0x80,0x5D, + 0xA3,0x4A,0x6F,0xA4,0x49,0x93,0xA4,0x6F,0xB9,0xA3,0x4B,0xB9, + 0xB6,0x94,0x93,0xB4,0xA9,0x71,0xB6,0xA5,0x5C,0xB8,0x80,0x5C, + 0xB7,0x4B,0x6F,0xB6,0x4C,0x93,0xB5,0x70,0xB3,0xB5,0x4C,0xB3, + 0xC9,0x93,0x92,0xC3,0xA0,0x72,0xC7,0x9E,0x5E,0xC9,0x82,0x5D, + 0xCA,0x4B,0x6E,0xCA,0x4B,0x93,0xC2,0x73,0xA9,0xC2,0x4F,0xA9, + 0xDD,0x92,0x93,0xD4,0x97,0x74,0xD9,0x94,0x60,0xDD,0x80,0x5E, + 0xDB,0x4B,0x6F,0xDD,0x4A,0x93,0xCE,0x76,0xA1,0xCE,0x52,0xA1, + 0xE8,0x8B,0x8E,0xE6,0x8C,0x76,0xE7,0x8C,0x61,0xE6,0x86,0x62, + 0xE3,0x51,0x78,0xEA,0x4D,0x8D,0xDC,0x79,0x97,0xDC,0x55,0x97, + 0xFA,0x81,0x81,0xF8,0x82,0x83,0xF4,0x85,0x77,0xF2,0x79,0x79, + 0xF4,0x65,0x86,0xF8,0x75,0x83,0xEF,0x87,0x89,0xF0,0x67,0x89, + 0xEE,0x81,0x81,0xE8,0x8B,0x85,0xED,0x88,0x71,0xEA,0x71,0x73, + 0xEE,0x5D,0x81,0xEA,0x71,0x8D,0xE4,0x87,0x91,0xE4,0x63,0x91, + 0xDB,0x81,0x81,0xD7,0x95,0x83,0xDB,0x93,0x6F,0xDB,0x6F,0x6F, + 0xDC,0x5C,0x80,0xDD,0x6E,0x93,0xD7,0x83,0x9B,0xD6,0x5F,0x9B, + 0xCA,0x81,0x81,0xC8,0x9D,0x82,0xC8,0x94,0x6E,0xCA,0x6F,0x6E, + 0xC9,0x5D,0x81,0xCA,0x6F,0x93,0xC9,0x82,0xA5,0xC8,0x5E,0xA5, + 0xB6,0x81,0x81,0xB6,0xA5,0x80,0xB7,0x93,0x6F,0xB7,0x6F,0x6F, + 0xB6,0x5D,0x81,0xB6,0x70,0x93,0xB8,0x80,0xA5,0xB7,0x5C,0xA5, + 0xA3,0x81,0x81,0xA4,0xA7,0x81,0xA3,0x92,0x6F,0xA3,0x6E,0x6F, + 0xA5,0x5C,0x7F,0xA5,0x6D,0x93,0xA4,0x80,0xA5,0xA4,0x5C,0xA5, + 0x92,0x81,0x81,0x93,0xA5,0x81,0x90,0x94,0x6F,0x92,0x6F,0x6D, + 0x92,0x5D,0x81,0x92,0x70,0x93,0x91,0x82,0xA7,0x91,0x5E,0xA7, + 0x7F,0x81,0x81,0x7F,0xA5,0x81,0x80,0x92,0x70,0x7F,0x6E,0x6F, + 0x7F,0x5D,0x81,0x7D,0x70,0x93,0x80,0x80,0xA5,0x80,0x5C,0xA5, + 0x6B,0x81,0x81,0x6C,0xA7,0x80,0x6D,0x94,0x6F,0x6C,0x6E,0x6F, + 0x6D,0x5B,0x80,0x6D,0x6E,0x93,0x6C,0x81,0xA5,0x6C,0x5D,0xA5, + 0x5A,0x81,0x81,0x5A,0xA5,0x81,0x59,0x95,0x6E,0x5A,0x6F,0x6E, + 0x5B,0x5D,0x81,0x59,0x70,0x93,0x5A,0x81,0xA7,0x5A,0x5D,0xA7, + 0x47,0x81,0x81,0x47,0xA5,0x80,0x47,0x92,0x6F,0x47,0x6E,0x6F, + 0x46,0x5D,0x81,0x46,0x6F,0x95,0x49,0x81,0xA5,0x48,0x5D,0xA5, + 0x32,0x81,0x81,0x33,0xA7,0x81,0x35,0x95,0x6E,0x34,0x6F,0x6F, + 0x36,0x62,0x7E,0x35,0x6E,0x93,0x34,0x80,0xA5,0x36,0x62,0xA4, + 0x23,0x81,0x81,0x23,0xA5,0x80,0x20,0x94,0x6F,0x22,0x6F,0x6D, + 0x26,0x6B,0x7E,0x21,0x6F,0x93,0x22,0x82,0xA7,0x25,0x6C,0xA4, + 0x0E,0x81,0x81,0x0F,0xA5,0x81,0x13,0x91,0x73,0x15,0x75,0x71, + 0x14,0x75,0x7D,0x11,0x77,0x93,0x15,0x7D,0xA1,0x16,0x74,0xA1, + 0x00,0x80,0x80,0x07,0xA0,0x7B,0x05,0x8F,0x7D,0x09,0x7B,0x7A, + 0x07,0x7D,0x7B,0x07,0x7C,0x8C,0x0E,0x78,0x98,0x0E,0x78,0x98, + 0x7F,0x81,0x81,0x80,0x83,0x81,0xF7,0x7C,0x84,0x9E,0x83,0x80, + 0x7F,0x81,0x81,0x4B,0x56,0xFE,0x93,0x2D,0x17,0xDE,0x03,0x95, + 0x1C,0xFE,0x6C,0x67,0xD4,0xEA,0xAF,0xAB,0x03,0xFA,0x81,0x81 +}; + } // End of namespace Gob |