[Scummvm-cvs-logs] SF.net SVN: scummvm:[53741] scummvm/trunk/backends/platform/psp

bluddy at users.sourceforge.net bluddy at users.sourceforge.net
Sat Oct 23 21:01:34 CEST 2010


Revision: 53741
          http://scummvm.svn.sourceforge.net/scummvm/?rev=53741&view=rev
Author:   bluddy
Date:     2010-10-23 19:01:34 +0000 (Sat, 23 Oct 2010)

Log Message:
-----------
PSP: Fix up imageViewer to pause game

The only real way to pause the game is to take over the event loop, which is a little sad... Also fixed a possible crash when loading an image that was to big, by only rendering when we have _init set.

Modified Paths:
--------------
    scummvm/trunk/backends/platform/psp/image_viewer.cpp
    scummvm/trunk/backends/platform/psp/image_viewer.h
    scummvm/trunk/backends/platform/psp/osys_psp.cpp

Modified: scummvm/trunk/backends/platform/psp/image_viewer.cpp
===================================================================
--- scummvm/trunk/backends/platform/psp/image_viewer.cpp	2010-10-23 16:01:40 UTC (rev 53740)
+++ scummvm/trunk/backends/platform/psp/image_viewer.cpp	2010-10-23 19:01:34 UTC (rev 53741)
@@ -27,13 +27,16 @@
 #include "common/str.h"
 #include "common/stream.h"
 #include "common/archive.h"
+#include "common/events.h"
 #include "common/ptr.h"
 #include "gui/message.h"
 #include "engines/engine.h"
 #include "backends/platform/psp/input.h"
+#include "backends/platform/psp/display_manager.h"
 #include "backends/platform/psp/display_client.h"
 #include "backends/platform/psp/image_viewer.h" 
 #include "backends/platform/psp/png_loader.h" 
+#include "backends/platform/psp/thread.h"
 
 static const char *imageName = "psp_image";
 #define PSP_SCREEN_HEIGHT 272
@@ -112,13 +115,13 @@
 }
 
 void ImageViewer::unload() {
+	_init = false;
 	delete _buffer;
 	delete _palette;
 	delete _renderer;
 	_buffer = 0;
 	_palette = 0;
 	_renderer = 0;
-	_init = false;
 }
 
 void ImageViewer::resetOnEngineDone() {
@@ -127,32 +130,47 @@
 
 void ImageViewer::setVisible(bool visible) {
 	DEBUG_ENTER_FUNC();
+	
 	if (_visible == visible)
 		return;
-
-	if (!g_engine)			// we can only run the image viewer when there's an engine
-		return;				// otherwise we won't know where to open the image
 			
 	// from here on, we're making the loader visible
-	if (visible && load(_imageNum ? _imageNum : 1))	{ // load the 1st image or the current
-		g_engine->pauseEngine(true);	
+	if (visible && g_engine) {	// we can only run the image viewer when there's an engine
+		g_engine->pauseEngine(true);
+		
+		load(_imageNum ? _imageNum : 1); 	// load the 1st image or the current
+	}
+
+	if (visible && _init) {	// we managed to load
 		_visible = true;
-		setDirty();
 		setViewerButtons(true);
 		
 		GUI::TimedMessageDialog dialog("Image Viewer", 1000);
 		dialog.runModal();
-	} else {	// all other cases
+		
+		runLoop();	// only listen to viewer events
+	} else {	// we were asked to make invisible or failed to load
 		_visible = false;
-		setDirty();
 		unload();
 		setViewerButtons(false);
 		
-		if (g_engine->isPaused())
+		if (g_engine && g_engine->isPaused())
 			g_engine->pauseEngine(false);
 	}
+	setDirty();
 }
 
+// This is the only way we can truly pause the games
+// Sad but true.
+void ImageViewer::runLoop() {
+	while (_visible) {
+		Common::Event event;
+		PspThread::delayMillis(30);
+		_inputHandler->getAllInputs(event);
+		_displayManager->renderAll();
+	}
+}
+
 void ImageViewer::setViewerButtons(bool active) {
 	_inputHandler->setImageViewerMode(active);
 }	
@@ -191,27 +209,29 @@
 }
 
 void ImageViewer::render() {
-	assert(_buffer);
-	assert(_renderer);
+	if (_init) {
+		assert(_buffer);
+		assert(_renderer);
 
-	// move the image slightly. Note that we count on the renderer's timing
-	switch (_movement) {
-	case EVENT_MOVE_LEFT:
-		moveImageX(-2);
-		break;
-	case EVENT_MOVE_UP:
-		moveImageY(-2);
-		break;
-	case EVENT_MOVE_RIGHT:
-		moveImageX(2);
-		break;
-	case EVENT_MOVE_DOWN:
-		moveImageY(2);
-		break;
-	default:
-		break;
-	}
-	_renderer->render();
+		// move the image slightly. Note that we count on the renderer's timing
+		switch (_movement) {
+		case EVENT_MOVE_LEFT:
+			moveImageX(-2);
+			break;
+		case EVENT_MOVE_UP:
+			moveImageY(-2);
+			break;
+		case EVENT_MOVE_RIGHT:
+			moveImageX(2);
+			break;
+		case EVENT_MOVE_DOWN:
+			moveImageY(2);
+			break;
+		default:
+			break;
+		}
+		_renderer->render();
+	}	
 }
 
 void ImageViewer::modifyZoom(bool up) {

Modified: scummvm/trunk/backends/platform/psp/image_viewer.h
===================================================================
--- scummvm/trunk/backends/platform/psp/image_viewer.h	2010-10-23 16:01:40 UTC (rev 53740)
+++ scummvm/trunk/backends/platform/psp/image_viewer.h	2010-10-23 19:01:34 UTC (rev 53741)
@@ -59,6 +59,7 @@
 	Event _movement;
 	
 	InputHandler *_inputHandler;
+	DisplayManager *_displayManager;
 	
 	void setFullScreenImageParams();
 	void loadNextImage();
@@ -69,6 +70,7 @@
 	void moveImageY(int val);
 	bool load(int imageNum);
 	void unload();	
+	void runLoop(); // to get total pausing we have to do our own loop
 	
 	void setZoom(float value);
 	void setOffsetParams();
@@ -80,14 +82,15 @@
 	ImageViewer() : _buffer(0), _palette(0), _visible(false), 
 					_dirty(false), _init(false), _imageNum(0), 
 					_zoomFactor(0.0f), _visibleHeight(0.0f), _visibleWidth(0.0f), 
-					_centerX(0.0f), _centerY(0.0f), _movement(EVENT_MOVE_STOP) {}
+					_centerX(0.0f), _centerY(0.0f), _movement(EVENT_MOVE_STOP),
+					_inputHandler(0), _displayManager(0) {}
 	~ImageViewer() { unload(); }	// deallocate images
 	bool load();
 	void render();
 	bool isVisible() { return _visible; }
 	bool isDirty() { return _dirty; }
 	void setDirty() { _dirty = true; }
-	void setClean() { if (_movement == EVENT_MOVE_STOP) // otherwise we want to keep rendering
+	void setClean() { if (!_visible) // otherwise we want to keep rendering
 							_dirty = false; 
 	}	
 	void resetOnEngineDone();
@@ -96,6 +99,7 @@
 	
 	// pointer setters
 	void setInputHandler(InputHandler *inputHandler) { _inputHandler = inputHandler; }	
+	void setDisplayManager(DisplayManager *displayManager) { _displayManager = displayManager; }
 };
 
 #endif /* PSP_IMAGE_VIEWER_H */ 
\ No newline at end of file

Modified: scummvm/trunk/backends/platform/psp/osys_psp.cpp
===================================================================
--- scummvm/trunk/backends/platform/psp/osys_psp.cpp	2010-10-23 16:01:40 UTC (rev 53740)
+++ scummvm/trunk/backends/platform/psp/osys_psp.cpp	2010-10-23 19:01:34 UTC (rev 53741)
@@ -87,6 +87,7 @@
 	
 	// Set pointers for image viewer
 	_imageViewer.setInputHandler(&_inputHandler);
+	_imageViewer.setDisplayManager(&_displayManager);
 
 	_savefile = new PSPSaveFileManager;
 


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