aboutsummaryrefslogtreecommitdiff
path: root/engines/gob/video_v2.cpp
diff options
context:
space:
mode:
authorSven Hesse2006-05-01 12:43:50 +0000
committerSven Hesse2006-05-01 12:43:50 +0000
commit2eabfd5f287686b7f5186af71cc199b99cf06bdd (patch)
tree28a5fe8ae89282646f7441b4eec77d964e41c81a /engines/gob/video_v2.cpp
parent7b7d29067508ad8a6c8115dec10e98ae2092b5a5 (diff)
downloadscummvm-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.cpp81
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