diff options
Diffstat (limited to 'engines/sci/graphics')
-rw-r--r-- | engines/sci/graphics/celobj32.cpp | 20 | ||||
-rw-r--r-- | engines/sci/graphics/frameout.cpp | 9 |
2 files changed, 26 insertions, 3 deletions
diff --git a/engines/sci/graphics/celobj32.cpp b/engines/sci/graphics/celobj32.cpp index fe0fbf7cc4..8540b636fc 100644 --- a/engines/sci/graphics/celobj32.cpp +++ b/engines/sci/graphics/celobj32.cpp @@ -176,6 +176,10 @@ struct SCALER_Scale { // so just always make the reader decompress an entire // line of source data when scaling _reader(celObj, celObj._width) { +#ifndef NDEBUG + assert(_minX <= _maxX); +#endif + // In order for scaling ratios to apply equally across objects that // start at different positions on the screen (like the cels of a // picture), the pixels that are read from the source bitmap must all @@ -773,6 +777,14 @@ void CelObj::drawUncompHzFlipNoMDNoSkip(Buffer &target, const Common::Rect &targ } void CelObj::scaleDrawNoMD(Buffer &target, const Ratio &scaleX, const Ratio &scaleY, const Common::Rect &targetRect, const Common::Point &scaledPosition) const { + // In SSCI the checks are > because their rects are BR-inclusive; + // our checks are >= because our rects are BR-exclusive + if (g_sci->_features->hasEmptyScaleDrawHack() && + (targetRect.left >= targetRect.right || + targetRect.top >= targetRect.bottom)) { + return; + } + if (_drawMirrored) render<MAPPER_NoMD, SCALER_Scale<true, READER_Compressed> >(target, targetRect, scaledPosition, scaleX, scaleY); else @@ -780,6 +792,14 @@ void CelObj::scaleDrawNoMD(Buffer &target, const Ratio &scaleX, const Ratio &sca } void CelObj::scaleDrawUncompNoMD(Buffer &target, const Ratio &scaleX, const Ratio &scaleY, const Common::Rect &targetRect, const Common::Point &scaledPosition) const { + // In SSCI the checks are > because their rects are BR-inclusive; + // our checks are >= because our rects are BR-exclusive + if (g_sci->_features->hasEmptyScaleDrawHack() && + (targetRect.left >= targetRect.right || + targetRect.top >= targetRect.bottom)) { + return; + } + if (_drawMirrored) { render<MAPPER_NoMD, SCALER_Scale<true, READER_Uncompressed> >(target, targetRect, scaledPosition, scaleX, scaleY); } else { diff --git a/engines/sci/graphics/frameout.cpp b/engines/sci/graphics/frameout.cpp index 749403093f..464b28a2ba 100644 --- a/engines/sci/graphics/frameout.cpp +++ b/engines/sci/graphics/frameout.cpp @@ -1168,10 +1168,13 @@ void GfxFrameout::showBits() { byte *sourceBuffer = (byte *)_currentBuffer.getPixels() + rounded.top * _currentBuffer.screenWidth + rounded.left; - // TODO: Sometimes transition screen items generate zero-dimension - // show rectangles. Is this a bug? + // Sometimes screen items (especially from SCI2.1early transitions, like + // in the asteroids minigame in PQ4) generate zero-dimension show + // rectangles. In SSCI, zero-dimension rectangles are OK (they just + // result in no copy), but OSystem::copyRectToScreen will assert on + // them, so we need to check for zero-dimensions rectangles and ignore + // them explicitly if (rounded.width() == 0 || rounded.height() == 0) { - warning("Zero-dimension show rectangle ignored"); continue; } |