Add cyx's patch for bug #1035739 - SCUMM/SMUSH: Ugly palette change when video finishes

svn-id: r23216
This commit is contained in:
Travis Howell 2006-06-21 10:28:09 +00:00
parent 4b2aa54304
commit 286de879fd
5 changed files with 31 additions and 12 deletions

View file

@ -3028,6 +3028,16 @@ void Gdi::unkDecode11(byte *dst, int dstPitch, const byte *src, int height) cons
#pragma mark -
void ScummEngine::fadeIn(int effect) {
if (_disableFadeInEffect) {
// fadeIn() calls can be disabled in TheDig after a SMUSH movie
// has been played. Like the original interpreter, we introduce
// an extra flag to handle this.
_disableFadeInEffect = false;
_doEffect = false;
_screenEffectFlag = true;
return;
}
updatePalette();
switch (effect) {
@ -3079,7 +3089,11 @@ void ScummEngine::fadeOut(int effect) {
if (!(_game.features & GF_NEW_CAMERA))
camera._last.x = camera._cur.x;
if (_screenEffectFlag && effect != 0) {
// TheDig can disable fadeIn(), and may call fadeOut() several times
// successively. Disabling the _screenEffectFlag check forces the screen
// to get cleared. This fixes glitches, at least, in the first cutscenes
// when bypassed of FT and TheDig.
if ((_game.version == 7 || _screenEffectFlag) && effect != 0) {
// Fill screen 0 with black
memset(vs->getPixels(0, 0), 0, vs->pitch * vs->h);
@ -3178,9 +3192,9 @@ void ScummEngine::transitionEffect(int a) {
for (i = 0; i < 16; i++)
tab_2[i] += delta[i];
// Draw the current state to the screen and wait half a sec so the user
// can watch the effect taking place.
waitForTimer(30);
// Draw the current state to the screen and wait a few secs so the
// user can watch the effect taking place.
waitForTimer(VAR_FADE_DELAY != 0xFF ? VAR(VAR_FADE_DELAY) * 10 : 30);
}
}

View file

@ -2535,6 +2535,10 @@ void ScummEngine_v6::o6_kernelSetFunctions() {
else
sp->play((char *)getStringAddressVar(VAR_VIDEONAME));
delete sp;
if (_game.id == GID_DIG) {
_disableFadeInEffect = true;
}
} else if (_game.id == GID_FT) {
const int insaneVarNum = ((_game.features & GF_DEMO) && (_game.platform == Common::kPlatformPC))
? 232 : 233;

View file

@ -364,6 +364,7 @@ ScummEngine::ScummEngine(OSystem *syst, const DetectorResult &dr)
_bgNeedsRedraw = false;
_screenEffectFlag = false;
_completeScreenRedraw = false;
_disableFadeInEffect = false;
memset(&_cursor, 0, sizeof(_cursor));
memset(_grabbedCursor, 0, sizeof(_grabbedCursor));
_currentCursor = 0;
@ -1549,8 +1550,6 @@ int ScummEngine::go() {
while (!_quit) {
updatePalette();
diff -= _system->getMillis();
waitForTimer(delta * 15 + diff);
diff = _system->getMillis();
@ -1595,6 +1594,10 @@ int ScummEngine::scummLoop(int delta) {
// that it will be in a different state each time you run the program.
_rnd.getRandomNumber(2);
if (_game.version <= 6) {
updatePalette();
}
#ifndef DISABLE_HE
if (_game.heversion >= 90) {
((ScummEngine_v90he *)this)->_moviePlay->handleNextFrame();
@ -1755,6 +1758,9 @@ load_game:
handleMouseOver(oldEgo != VAR(VAR_EGO));
// Render everything to the screen.
if (_game.version >= 7) {
updatePalette();
}
drawDirtyScreenParts();
// FIXME / TODO: Try to move the following to scummLoop_handleSound or

View file

@ -976,6 +976,7 @@ protected:
//ender: fullscreen
bool _fullRedraw, _bgNeedsRedraw;
bool _screenEffectFlag, _completeScreenRedraw;
bool _disableFadeInEffect;
struct {
int hotspotX, hotspotY, width, height;

View file

@ -345,17 +345,11 @@ void SmushPlayer::release() {
_vm->_fullRedraw = true;
// WORKAROUND bug #1035739: This is hack to workaround some ugly palette
// issues, see the mentioned bug report for details.
_vm->_doEffect = false;
// HACK HACK HACK: This is an *evil* trick, beware! See above for
// some explanation.
_vm->virtscr[0].pitch = _origPitch;
_vm->gdi._numStrips = _origNumStrips;
_initDone = false;
}