aboutsummaryrefslogtreecommitdiff
path: root/backends
diff options
context:
space:
mode:
authorYotam Barnoy2010-10-23 19:01:34 +0000
committerYotam Barnoy2010-10-23 19:01:34 +0000
commit4af9057eaa3e69b6575415359537d91d6bc0cfb9 (patch)
tree8f66d1298aa98798f3155149e4c8fa711e23ccbe /backends
parent09f77eb4642eae4e945f8c10554ce204aff450e0 (diff)
downloadscummvm-rg350-4af9057eaa3e69b6575415359537d91d6bc0cfb9.tar.gz
scummvm-rg350-4af9057eaa3e69b6575415359537d91d6bc0cfb9.tar.bz2
scummvm-rg350-4af9057eaa3e69b6575415359537d91d6bc0cfb9.zip
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
Diffstat (limited to 'backends')
-rw-r--r--backends/platform/psp/image_viewer.cpp80
-rw-r--r--backends/platform/psp/image_viewer.h8
-rw-r--r--backends/platform/psp/osys_psp.cpp1
3 files changed, 57 insertions, 32 deletions
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;