aboutsummaryrefslogtreecommitdiff
path: root/engines/mohawk/riven_graphics.cpp
diff options
context:
space:
mode:
authorBastien Bouclet2016-08-27 06:39:12 +0200
committerEugene Sandulenko2017-07-03 08:50:10 +0200
commite9b67081c36653bfae0d842a261f313fc9f32231 (patch)
tree5f95f4e4f80511c411d4ec0f20de2e76512c8381 /engines/mohawk/riven_graphics.cpp
parent8fcebc12c6f653dbfbd06af50a03074a33ac8810 (diff)
downloadscummvm-rg350-e9b67081c36653bfae0d842a261f313fc9f32231.tar.gz
scummvm-rg350-e9b67081c36653bfae0d842a261f313fc9f32231.tar.bz2
scummvm-rg350-e9b67081c36653bfae0d842a261f313fc9f32231.zip
MOHAWK: Introduce the effects intermediary screen
Diffstat (limited to 'engines/mohawk/riven_graphics.cpp')
-rw-r--r--engines/mohawk/riven_graphics.cpp17
1 files changed, 13 insertions, 4 deletions
diff --git a/engines/mohawk/riven_graphics.cpp b/engines/mohawk/riven_graphics.cpp
index 6931afbf09..b5fce9ce9e 100644
--- a/engines/mohawk/riven_graphics.cpp
+++ b/engines/mohawk/riven_graphics.cpp
@@ -47,6 +47,9 @@ RivenGraphics::RivenGraphics(MohawkEngine_Riven* vm) : GraphicsManager(), _vm(vm
_mainScreen = new Graphics::Surface();
_mainScreen->create(608, 392, _pixelFormat);
+ _effectScreen = new Graphics::Surface();
+ _effectScreen->create(608, 392, _pixelFormat);
+
_screenUpdateNesting = 0;
_screenUpdateRunning = false;
_scheduledTransition = -1; // no transition
@@ -60,6 +63,8 @@ RivenGraphics::RivenGraphics(MohawkEngine_Riven* vm) : GraphicsManager(), _vm(vm
}
RivenGraphics::~RivenGraphics() {
+ _effectScreen->free();
+ delete _effectScreen;
_mainScreen->free();
delete _mainScreen;
delete _bitmapDecoder;
@@ -90,10 +95,13 @@ void RivenGraphics::copyImageToScreen(uint16 image, uint32 left, uint32 top, uin
void RivenGraphics::updateScreen(Common::Rect updateRect) {
if (_dirtyScreen) {
// Copy to screen if there's no transition. Otherwise transition. ;)
- if (_scheduledTransition < 0)
- _vm->_system->copyRectToScreen(_mainScreen->getBasePtr(updateRect.left, updateRect.top), _mainScreen->pitch, updateRect.left, updateRect.top, updateRect.width(), updateRect.height());
- else
+ if (_scheduledTransition < 0) {
+ // mainScreen -> effectScreen -> systemScreen
+ _effectScreen->copyRectToSurface(*_mainScreen, updateRect.left, updateRect.top, updateRect);
+ _vm->_system->copyRectToScreen(_effectScreen->getBasePtr(updateRect.left, updateRect.top), _effectScreen->pitch, updateRect.left, updateRect.top, updateRect.width(), updateRect.height());
+ } else {
runScheduledTransition();
+ }
// Finally, update the screen.
_vm->_system->updateScreen();
@@ -230,7 +238,8 @@ void RivenGraphics::runScheduledTransition() {
}
// For now, just copy the image to screen without doing any transition.
- _vm->_system->copyRectToScreen(_mainScreen->getPixels(), _mainScreen->pitch, 0, 0, _mainScreen->w, _mainScreen->h);
+ _effectScreen->copyRectToSurface(*_mainScreen, 0, 0, Common::Rect(_mainScreen->w, _mainScreen->h));
+ _vm->_system->copyRectToScreen(_effectScreen->getBasePtr(0, 0), _effectScreen->pitch, 0, 0, _effectScreen->w, _effectScreen->h);
_vm->_system->updateScreen();
_scheduledTransition = -1; // Clear scheduled transition