From 2eabfd5f287686b7f5186af71cc199b99cf06bdd Mon Sep 17 00:00:00 2001 From: Sven Hesse Date: Mon, 1 May 2006 12:43:50 +0000 Subject: - More differences in Draw_v2::spriteOperation() - GOB2 handles _frontSurface/_backSurface a bit differently, this fixes (most of) the drawing glitches in the intro - Added using a fallback when the user's game version doesn't have the requested language - off_2E51B et al. stubs, I think it has something to do with the menu svn-id: r22254 --- engines/gob/video_v2.cpp | 81 ++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 81 insertions(+) (limited to 'engines/gob/video_v2.cpp') diff --git a/engines/gob/video_v2.cpp b/engines/gob/video_v2.cpp index 0d0a7be9e1..d6f311ed62 100644 --- a/engines/gob/video_v2.cpp +++ b/engines/gob/video_v2.cpp @@ -25,13 +25,24 @@ #include "common/endian.h" #include "gob/gob.h" +#include "gob/global.h" #include "gob/video.h" +#include "gob/draw.h" namespace Gob { Video_v2::Video_v2(GobEngine *vm) : Video_v1(vm) { } +//XXX: Use this function to update the screen for now. +// This should be moved to a better location later on. +void Video_v2::waitRetrace(int16) { + if (_vm->_draw->_frontSurface) { + g_system->copyRectToScreen(_vm->_draw->_frontSurface->vidPtr, 320, 0, 0, 320, 200); + g_system->updateScreen(); + } +} + void Video_v2::drawLetter(int16 item, int16 x, int16 y, FontDesc *fontDesc, int16 color1, int16 color2, int16 transp, SurfaceDesc *dest) { int16 videoMode; @@ -71,4 +82,74 @@ void Video_v2::drawLetter(int16 item, int16 x, int16 y, FontDesc *fontDesc, int1 dest->vidMode = videoMode; } +Video::SurfaceDesc *Video_v2::initSurfDesc(int16 vidMode, int16 width, int16 height, int16 flags) { + int8 flagsAnd2; + byte *vidMem = 0; + int32 sprSize; + int16 someFlags = 1; + SurfaceDesc *descPtr; + + if (flags != PRIMARY_SURFACE) + _vm->_global->_sprAllocated++; + + if (flags & RETURN_PRIMARY) + return _vm->_draw->_frontSurface; + + if (vidMode != 0x13) + error("Video::initSurfDesc: Only VGA 0x13 mode is supported!"); + + if ((flags & PRIMARY_SURFACE) == 0) + vidMode += 0x80; + + if (flags & 2) + flagsAnd2 = 1; + else + flagsAnd2 = 0; + + width = (width + 7) & 0xFFF8; + + if (flags & PRIMARY_SURFACE) { + _vm->_global->_primaryWidth = width; + _vm->_global->_mouseMaxCol = width; + _vm->_global->_primaryHeight = height; + _vm->_global->_mouseMaxRow = height; + sprSize = 0; + } else { + vidMem = 0; + sprSize = Video::getRectSize(width, height, flagsAnd2, vidMode); + someFlags = 4; + if (flagsAnd2) + someFlags += 0x80; + } + if (flags & PRIMARY_SURFACE) { + descPtr = _vm->_draw->_frontSurface; + assert(descPtr); + if (descPtr->vidPtr != 0) + delete[] descPtr->vidPtr; + vidMem = new byte[320 * 200]; + } else { + if (flags & DISABLE_SPR_ALLOC) { + descPtr = new SurfaceDesc; + // this case causes vidPtr to be set to invalid memory + assert(false); + } else { + descPtr = new SurfaceDesc; + descPtr->vidPtr = new byte[sprSize]; + vidMem = descPtr->vidPtr; + } + } + if (descPtr == 0) + return 0; + + descPtr->width = width; + descPtr->height = height; + descPtr->flag = someFlags; + descPtr->vidMode = vidMode; + descPtr->vidPtr = vidMem; + + descPtr->reserved1 = 0; + descPtr->reserved2 = 0; + return descPtr; +} + } // End of namespace Gob -- cgit v1.2.3