[Scummvm-cvs-logs] SF.net SVN: scummvm:[47089] scummvm/trunk/engines/sci

m_kiewitz at users.sourceforge.net m_kiewitz at users.sourceforge.net
Wed Jan 6 19:59:40 CET 2010


Revision: 47089
          http://scummvm.svn.sourceforge.net/scummvm/?rev=47089&view=rev
Author:   m_kiewitz
Date:     2010-01-06 18:59:39 +0000 (Wed, 06 Jan 2010)

Log Message:
-----------
SCI: sync displayScreen with framebuffer after successful video playback (fixes background vanishing in mainmenu of gk1demo)

Modified Paths:
--------------
    scummvm/trunk/engines/sci/engine/kgraphics.cpp
    scummvm/trunk/engines/sci/graphics/gui.cpp
    scummvm/trunk/engines/sci/graphics/gui.h
    scummvm/trunk/engines/sci/graphics/screen.cpp
    scummvm/trunk/engines/sci/graphics/screen.h

Modified: scummvm/trunk/engines/sci/engine/kgraphics.cpp
===================================================================
--- scummvm/trunk/engines/sci/engine/kgraphics.cpp	2010-01-06 18:25:43 UTC (rev 47088)
+++ scummvm/trunk/engines/sci/engine/kgraphics.cpp	2010-01-06 18:59:39 UTC (rev 47089)
@@ -995,6 +995,8 @@
 }
 
 reg_t kShowMovie(EngineState *s, int argc, reg_t *argv) {
+	bool playedVideo = false;
+
 	// KQ6 Windows calls this with one argument. It doesn't seem
 	// to have a purpose...
 	if (argc == 1)
@@ -1009,10 +1011,12 @@
 
 		Graphics::AviDecoder *aviDecoder = new Graphics::AviDecoder(g_system->getMixer());
 		Graphics::VideoPlayer *player = new Graphics::VideoPlayer(aviDecoder);
-		if (aviDecoder->loadFile(filename.c_str()))
+		if (aviDecoder->loadFile(filename.c_str())) {
 			player->playVideo();
-		else
+			playedVideo = true;
+		} else {
 			warning("Failed to open movie file %s", filename.c_str());
+		}
 		aviDecoder->closeFile();
 		delete player;
 		delete aviDecoder;
@@ -1024,15 +1028,20 @@
 
 		SeqDecoder *seqDecoder = new SeqDecoder();
 		Graphics::VideoPlayer *player = new Graphics::VideoPlayer(seqDecoder);
-		if (seqDecoder->loadFile(filename.c_str(), delay))
+		if (seqDecoder->loadFile(filename.c_str(), delay)) {
 			player->playVideo();
-		else
+			playedVideo = true;
+		} else {
 			warning("Failed to open movie file %s", filename.c_str());
+		}
 		seqDecoder->closeFile();
 		delete player;
 		delete seqDecoder;
 	}
 
+	if (playedVideo)
+		s->_gui->syncWithFramebuffer();
+
 	return s->r_acc;
 }
 

Modified: scummvm/trunk/engines/sci/graphics/gui.cpp
===================================================================
--- scummvm/trunk/engines/sci/graphics/gui.cpp	2010-01-06 18:25:43 UTC (rev 47088)
+++ scummvm/trunk/engines/sci/graphics/gui.cpp	2010-01-06 18:59:39 UTC (rev 47089)
@@ -821,6 +821,10 @@
 	return _gfx->getView(viewId)->getLoopInfo(loopNo)->celCount;
 }
 
+void SciGui::syncWithFramebuffer() {
+	_screen->syncWithFramebuffer();
+}
+
 reg_t SciGui::portraitLoad(Common::String resourceName) {
 	return NULL_REG;
 }

Modified: scummvm/trunk/engines/sci/graphics/gui.h
===================================================================
--- scummvm/trunk/engines/sci/graphics/gui.h	2010-01-06 18:25:43 UTC (rev 47088)
+++ scummvm/trunk/engines/sci/graphics/gui.h	2010-01-06 18:59:39 UTC (rev 47089)
@@ -145,6 +145,8 @@
 	virtual int16 getLoopCount(GuiResourceId viewId);
 	virtual int16 getCelCount(GuiResourceId viewId, int16 loopNo);
 
+	virtual void syncWithFramebuffer();
+
 	virtual reg_t portraitLoad(Common::String resourceName);
 	virtual void portraitShow(Common::String resourceName, Common::Point position, uint16 resourceNum, uint16 noun, uint16 verb, uint16 cond, uint16 seq);
 	virtual void portraitUnload(uint16 portraitId);

Modified: scummvm/trunk/engines/sci/graphics/screen.cpp
===================================================================
--- scummvm/trunk/engines/sci/graphics/screen.cpp	2010-01-06 18:25:43 UTC (rev 47088)
+++ scummvm/trunk/engines/sci/graphics/screen.cpp	2010-01-06 18:59:39 UTC (rev 47089)
@@ -91,6 +91,13 @@
 	g_system->unlockScreen();
 }
 
+void Screen::syncWithFramebuffer() {
+	Graphics::Surface *screen = g_system->lockScreen();
+
+	memcpy(_displayScreen, screen->pixels, _displayPixels);
+	g_system->unlockScreen();
+}
+
 void Screen::copyRectToScreen(const Common::Rect &rect) {
 	if (!_upscaledHires)  {
 		g_system->copyRectToScreen(_activeScreen + rect.top * _displayWidth + rect.left, _displayWidth, rect.left, rect.top, rect.width(), rect.height());

Modified: scummvm/trunk/engines/sci/graphics/screen.h
===================================================================
--- scummvm/trunk/engines/sci/graphics/screen.h	2010-01-06 18:25:43 UTC (rev 47088)
+++ scummvm/trunk/engines/sci/graphics/screen.h	2010-01-06 18:59:39 UTC (rev 47089)
@@ -55,6 +55,7 @@
 
 	void copyToScreen();
 	void copyFromScreen(byte *buffer);
+	void syncWithFramebuffer();
 	void copyRectToScreen(const Common::Rect &rect);
 	void copyRectToScreen(const Common::Rect &rect, int16 x, int16 y);
 


This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.




More information about the Scummvm-git-logs mailing list