aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNipun Garg2019-07-12 05:59:47 +0530
committerEugene Sandulenko2019-09-03 17:17:18 +0200
commitabe99e332e776820867dab486a2930139c847493 (patch)
tree9e088e73194db6b9302b8989e41e5a388f8730db
parent8f83631a3b6eb5e86c3b1cd6708d7dfb652bb3c4 (diff)
downloadscummvm-rg350-abe99e332e776820867dab486a2930139c847493.tar.gz
scummvm-rg350-abe99e332e776820867dab486a2930139c847493.tar.bz2
scummvm-rg350-abe99e332e776820867dab486a2930139c847493.zip
HDB: Unstub updateFade()
-rw-r--r--engines/hdb/gfx.cpp94
1 files changed, 92 insertions, 2 deletions
diff --git a/engines/hdb/gfx.cpp b/engines/hdb/gfx.cpp
index 56e8fee21d..be96664a59 100644
--- a/engines/hdb/gfx.cpp
+++ b/engines/hdb/gfx.cpp
@@ -246,8 +246,98 @@ void Gfx::setFade(bool fadeIn, bool black, int steps) {
}
void Gfx::updateFade() {
- _fadeInfo.active = false;
- debug(9, "STUB: Gfx::updateFade incomplete");
+ uint r, g, b;
+ static int waitAFrame = 0;
+
+ if (!_fadeInfo.active && !_fadeInfo.stayFaded)
+ return;
+
+ Graphics::ManagedSurface fadeBuffer1, fadeBuffer2;
+ fadeBuffer1.create(kScreenWidth, kScreenHeight, g_hdb->_format);
+ fadeBuffer2.create(kScreenWidth, kScreenHeight, g_hdb->_format);
+
+ fadeBuffer2.blitFrom(_globalSurface);
+
+ do {
+ // Copy pristine copy of background to modification buffer
+ fadeBuffer1.blitFrom(fadeBuffer2);
+
+ // do the actual alphablending
+
+ uint16 *ptr, value;
+
+ if (!_fadeInfo.isBlack) {
+ // Black Fade
+
+ for (int y = 0; y < kScreenHeight; y++) {
+ ptr = (uint16 *)fadeBuffer1.getBasePtr(0, y);
+ for (int x = 0; x < kScreenWidth; x++) {
+ value = *ptr;
+ if (value) {
+ *ptr = rgbTo565(
+ (getR(value) * _fadeInfo.curStep) >> 8,
+ (getG(value) * _fadeInfo.curStep) >> 8,
+ (getB(value) * _fadeInfo.curStep) >> 8
+ );
+ }
+ ptr++;
+ }
+ }
+ } else {
+ // White Fade
+
+ for (int y = 0; y < kScreenHeight; y++) {
+ ptr = (uint16 *)fadeBuffer1.getBasePtr(0, y);
+ for (int x = 0; x < kScreenWidth; x++) {
+ value = *ptr;
+ r = getR(value);
+ g = getG(value);
+ b = getB(value);
+ r += (255 - r) * (256 - _fadeInfo.curStep) / 256;
+ g += (255 - g) * (256 - _fadeInfo.curStep) / 256;
+ b += (255 - b) * (256 - _fadeInfo.curStep) / 256;
+ *ptr = rgbTo565(r, g, b);
+ ptr++;
+ }
+ }
+ }
+
+ _globalSurface.blitFrom(fadeBuffer1);
+
+ // step the fading values to the next one and
+ // see if we're done yet
+ if (_fadeInfo.isFadeIn) {
+ if (_fadeInfo.active)
+ _fadeInfo.curStep += _fadeInfo.speed;
+
+ if (_fadeInfo.curStep > 255) {
+ _fadeInfo.curStep = 255;
+ _fadeInfo.active = false;
+ _fadeInfo.stayFaded = false;
+ }
+ } else {
+ if (_fadeInfo.active == true)
+ _fadeInfo.curStep -= _fadeInfo.speed;
+
+ if (_fadeInfo.curStep < 1) {
+ _fadeInfo.curStep = 0;
+ _fadeInfo.active = false;
+ _fadeInfo.stayFaded = false;
+ }
+ }
+
+ // make sure we wait one frame at least - some logic in the game
+ // doesn't draw the frame immediately
+ if (!waitAFrame) {
+ waitAFrame++;
+ return;
+ }
+
+ debug(9, "STUB: DirectX Flip");
+
+ } while (_fadeInfo.active);
+
+ waitAFrame = 0; // reset counter
}
void Gfx::turnOnSnow() {