From 8b3efba40f637a8f5e972ba793a6e59895356355 Mon Sep 17 00:00:00 2001 From: Martin Kiewitz Date: Tue, 24 Dec 2013 10:39:42 +0100 Subject: [PATCH] SCI: change floodfill fix for sq4 behaviour wasn't changed in SCI1, instead it seems that SSCI draws overlays to separate memory and then copies them over. Previous commit caused regression in qfg1vga (funny room) --- engines/sci/graphics/picture.cpp | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/engines/sci/graphics/picture.cpp b/engines/sci/graphics/picture.cpp index d78b48884d6d..651eac75ea25 100644 --- a/engines/sci/graphics/picture.cpp +++ b/engines/sci/graphics/picture.cpp @@ -919,7 +919,7 @@ void GfxPicture::vectorFloodFill(int16 x, int16 y, byte color, byte priority, by } // This logic was taken directly from sierra sci, floodfill will get aborted on various occations - if (isEGA) { + if (!_addToFlag) { if (screenMask & GFX_SCREEN_MASK_VISUAL) { if ((color == _screen->getColorWhite()) || (searchColor != _screen->getColorWhite())) return; @@ -931,7 +931,9 @@ void GfxPicture::vectorFloodFill(int16 x, int16 y, byte color, byte priority, by return; } } else { - // VGA logic (SCI1 early w/o QfG2) + // When adding a picture onto another picture, don't abort in case current pixel was already drawn previously + // It seems Sierra SCI unpacks such pictures separately and then copies them over + // We draw directly to the screen. // fixes Space Quest 4 orange ship lifting off (bug #6446) if (screenMask & GFX_SCREEN_MASK_VISUAL) { if (color == _screen->getColorWhite()) @@ -982,6 +984,12 @@ void GfxPicture::vectorFloodFill(int16 x, int16 y, byte color, byte priority, by _screen->putPixel(--w, p.y, screenMask, color, priority, control); while (e < r && (matchedMask = _screen->isFillMatch(e + 1, p.y, matchMask, searchColor, searchPriority, searchControl, isEGA))) _screen->putPixel(++e, p.y, screenMask, color, priority, control); +#if 0 + // debug code for floodfill + _screen->copyToScreen(); + g_system->updateScreen(); + g_system->delayMillis(100); +#endif // checking lines above and below for possible flood targets a_set = b_set = 0; while (w <= e) {