aboutsummaryrefslogtreecommitdiff
path: root/engines/groovie
diff options
context:
space:
mode:
authorFilippos Karapetis2014-11-04 11:51:13 +0200
committerFilippos Karapetis2014-11-04 11:51:13 +0200
commit70fe89b92d81bcdbc827c4467e508b3ad3d26051 (patch)
tree6235be8980e5f92faec19813ee712fea5c11dc1f /engines/groovie
parent2d42ab88b714ba720971482b31378f9c985dfab7 (diff)
downloadscummvm-rg350-70fe89b92d81bcdbc827c4467e508b3ad3d26051.tar.gz
scummvm-rg350-70fe89b92d81bcdbc827c4467e508b3ad3d26051.tar.bz2
scummvm-rg350-70fe89b92d81bcdbc827c4467e508b3ad3d26051.zip
GROOVIE: More work on transparency in the puzzle scenes for V2 games
This fixes most of the transparency issues in the puzzle screens. They are still not correct, as the relevant videos play completely, instead of showing a single frame. This also fixes issues with commit 2d42ab8
Diffstat (limited to 'engines/groovie')
-rw-r--r--engines/groovie/roq.cpp23
-rw-r--r--engines/groovie/roq.h2
2 files changed, 15 insertions, 10 deletions
diff --git a/engines/groovie/roq.cpp b/engines/groovie/roq.cpp
index 065621e8e0..34689d8aa2 100644
--- a/engines/groovie/roq.cpp
+++ b/engines/groovie/roq.cpp
@@ -47,6 +47,7 @@ namespace Groovie {
ROQPlayer::ROQPlayer(GroovieEngine *vm) :
VideoPlayer(vm), _codingTypeCount(0),
+ _fg(&_vm->_graphicsMan->_foreground),
_bg(&_vm->_graphicsMan->_background),
_firstFrame(true) {
@@ -119,18 +120,19 @@ uint16 ROQPlayer::loadInternal() {
}
void ROQPlayer::buildShowBuf() {
- uint32 transparent = _alpha ? 0 : _vm->_pixelFormat.RGBToColor(255, 255, 255);
+ if (_alpha)
+ _fg->copyFrom(*_bg);
for (int line = 0; line < _bg->h; line++) {
- uint32 *out = (uint32 *)_bg->getBasePtr(0, line);
+ uint32 *out = _alpha ? (uint32 *)_fg->getBasePtr(0, line) : (uint32 *)_bg->getBasePtr(0, line);
uint32 *in = (uint32 *)_currBuf->getBasePtr(0, line / _scaleY);
for (int x = 0; x < _bg->w; x++) {
- // Copy a pixel
- if (*in != transparent)
- *out++ = *in;
- else
+ // Copy a pixel, checking the alpha channel first
+ if (_alpha && !(*in & 0xFF))
out++;
+ else
+ *out++ = *in;
// Skip to the next pixel
if (!(x % _scaleX))
@@ -167,7 +169,8 @@ bool ROQPlayer::playFrameInternal() {
if (_dirty) {
// Update the screen
- _syst->copyRectToScreen(_bg->getPixels(), _bg->pitch, 0, (_syst->getHeight() - _bg->h) / 2, _bg->w, _bg->h);
+ void *src = (_alpha) ? _fg->getPixels() : _bg->getPixels();
+ _syst->copyRectToScreen(src, _bg->pitch, 0, (_syst->getHeight() - _bg->h) / 2, _bg->w, _bg->h);
_syst->updateScreen();
// Clear the dirty flag
@@ -302,8 +305,10 @@ bool ROQPlayer::processBlockInfo(ROQBlockHeader &blockHeader) {
_vm->_graphicsMan->switchToFullScreen(false);
// Clear the buffers with black
- _currBuf->fillRect(Common::Rect(width, height), _vm->_pixelFormat.RGBToColor(0, 0, 0));
- _prevBuf->fillRect(Common::Rect(width, height), _vm->_pixelFormat.RGBToColor(0, 0, 0));
+ if (!_alpha) {
+ _currBuf->fillRect(Common::Rect(width, height), _vm->_pixelFormat.RGBToColor(0, 0, 0));
+ _prevBuf->fillRect(Common::Rect(width, height), _vm->_pixelFormat.RGBToColor(0, 0, 0));
+ }
return true;
}
diff --git a/engines/groovie/roq.h b/engines/groovie/roq.h
index 7e7d38580e..3a85517f59 100644
--- a/engines/groovie/roq.h
+++ b/engines/groovie/roq.h
@@ -75,7 +75,7 @@ private:
byte _codebook4[256 * 4];
// Buffers
- Graphics::Surface *_bg;
+ Graphics::Surface *_fg, *_bg;
Graphics::Surface *_currBuf, *_prevBuf;
void buildShowBuf();
byte _scaleX, _scaleY;