diff options
author | Sven Hesse | 2006-05-01 12:43:50 +0000 |
---|---|---|
committer | Sven Hesse | 2006-05-01 12:43:50 +0000 |
commit | 2eabfd5f287686b7f5186af71cc199b99cf06bdd (patch) | |
tree | 28a5fe8ae89282646f7441b4eec77d964e41c81a /engines/gob/video_v2.cpp | |
parent | 7b7d29067508ad8a6c8115dec10e98ae2092b5a5 (diff) | |
download | scummvm-rg350-2eabfd5f287686b7f5186af71cc199b99cf06bdd.tar.gz scummvm-rg350-2eabfd5f287686b7f5186af71cc199b99cf06bdd.tar.bz2 scummvm-rg350-2eabfd5f287686b7f5186af71cc199b99cf06bdd.zip |
- 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
Diffstat (limited to 'engines/gob/video_v2.cpp')
-rw-r--r-- | engines/gob/video_v2.cpp | 81 |
1 files changed, 81 insertions, 0 deletions
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 |