From 031b9b8ced1007545099e0e6285ea4bbe1d3e97f Mon Sep 17 00:00:00 2001 From: Martin Kiewitz Date: Sun, 26 Apr 2015 15:50:12 +0200 Subject: SCI: restore: clear screen when restoring primarily to clear kPortrait graphics in kq6 when restoring during portrait animation --- engines/sci/engine/savegame.cpp | 7 ++++++- engines/sci/graphics/screen.cpp | 12 ++++++++++++ engines/sci/graphics/screen.h | 1 + 3 files changed, 19 insertions(+), 1 deletion(-) diff --git a/engines/sci/engine/savegame.cpp b/engines/sci/engine/savegame.cpp index e0c2833572..3d934410c3 100644 --- a/engines/sci/engine/savegame.cpp +++ b/engines/sci/engine/savegame.cpp @@ -41,6 +41,7 @@ #include "sci/graphics/helpers.h" #include "sci/graphics/palette.h" #include "sci/graphics/ports.h" +#include "sci/graphics/screen.h" #include "sci/parser/vocabulary.h" #include "sci/sound/audio.h" #include "sci/sound/music.h" @@ -923,11 +924,15 @@ void gamestate_restore(EngineState *s, Common::SeekableReadStream *fh) { // We don't need the thumbnail here, so just read it and discard it Graphics::skipThumbnail(*fh); - // reset ports as one of the first things we do, because that may free() some hunk memory + // reset ports is one of the first things we do, because that may free() some hunk memory // and we don't want to do that after we read in the saved game hunk memory if (ser.isLoading()) { + // reset ports if (g_sci->_gfxPorts) g_sci->_gfxPorts->reset(); + // clear screen + if (g_sci->_gfxScreen) + g_sci->_gfxScreen->clear(); } s->reset(true); diff --git a/engines/sci/graphics/screen.cpp b/engines/sci/graphics/screen.cpp index 5a3b30f7ef..dfcb5dbc14 100644 --- a/engines/sci/graphics/screen.cpp +++ b/engines/sci/graphics/screen.cpp @@ -251,6 +251,18 @@ GfxScreen::~GfxScreen() { free(_displayScreen); } +// should not used regulary, only meant for restore game +void GfxScreen::clear() { + // reset all screen data + memset(_visualScreen, 0, _pixels); + memset(_priorityScreen, 0, _pixels); + memset(_controlScreen, 0, _pixels); + memset(_displayScreen, 0, _displayPixels); + memset(&_ditheredPicColors, 0, sizeof(_ditheredPicColors)); + _fontIsUpscaled = false; + copyToScreen(); +} + void GfxScreen::copyToScreen() { g_system->copyRectToScreen(_activeScreen, _displayWidth, 0, 0, _displayWidth, _displayHeight); } diff --git a/engines/sci/graphics/screen.h b/engines/sci/graphics/screen.h index 766e32614a..587d2ef3bc 100644 --- a/engines/sci/graphics/screen.h +++ b/engines/sci/graphics/screen.h @@ -76,6 +76,7 @@ public: byte getColorWhite() { return _colorWhite; } byte getColorDefaultVectorData() { return _colorDefaultVectorData; } + void clear(); void copyToScreen(); void copyFromScreen(byte *buffer); void kernelSyncWithFramebuffer(); -- cgit v1.2.3