From 4af9057eaa3e69b6575415359537d91d6bc0cfb9 Mon Sep 17 00:00:00 2001 From: Yotam Barnoy Date: Sat, 23 Oct 2010 19:01:34 +0000 Subject: 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. svn-id: r53741 --- backends/platform/psp/image_viewer.cpp | 80 +++++++++++++++++++++------------- backends/platform/psp/image_viewer.h | 8 +++- backends/platform/psp/osys_psp.cpp | 1 + 3 files changed, 57 insertions(+), 32 deletions(-) (limited to 'backends') diff --git a/backends/platform/psp/image_viewer.cpp b/backends/platform/psp/image_viewer.cpp index 791a5cc0e3..dbcafd3898 100644 --- a/backends/platform/psp/image_viewer.cpp +++ b/backends/platform/psp/image_viewer.cpp @@ -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::setConstantRendererOptions() { } void ImageViewer::unload() { + _init = false; delete _buffer; delete _palette; delete _renderer; _buffer = 0; _palette = 0; _renderer = 0; - _init = false; } void ImageViewer::resetOnEngineDone() { @@ -127,30 +130,45 @@ void ImageViewer::resetOnEngineDone() { 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) { @@ -191,27 +209,29 @@ void ImageViewer::setFullScreenImageParams() { } 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) { diff --git a/backends/platform/psp/image_viewer.h b/backends/platform/psp/image_viewer.h index 0e24ea496d..1946b0ffe2 100644 --- a/backends/platform/psp/image_viewer.h +++ b/backends/platform/psp/image_viewer.h @@ -59,6 +59,7 @@ private: Event _movement; InputHandler *_inputHandler; + DisplayManager *_displayManager; void setFullScreenImageParams(); void loadNextImage(); @@ -69,6 +70,7 @@ private: 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 @@ public: 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 @@ public: // 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 diff --git a/backends/platform/psp/osys_psp.cpp b/backends/platform/psp/osys_psp.cpp index 8b490217a4..40c074ae00 100644 --- a/backends/platform/psp/osys_psp.cpp +++ b/backends/platform/psp/osys_psp.cpp @@ -87,6 +87,7 @@ void OSystem_PSP::initBackend() { // Set pointers for image viewer _imageViewer.setInputHandler(&_inputHandler); + _imageViewer.setDisplayManager(&_displayManager); _savefile = new PSPSaveFileManager; -- cgit v1.2.3