From d85eb8ded68a20de383d84064aacd1a4c81db4e9 Mon Sep 17 00:00:00 2001 From: Martin Kiewitz Date: Sun, 13 Mar 2016 13:12:36 +0100 Subject: SCI32: Fix small inaccuracy in the scaling drawing code Previously sourcePos was always originating from plain 0, 0 which made some pixels not always getting drawn at the right spot when uneven scaling was used (for example 5:12). Seems to fix gabriel knight 1 hires graphic issues --- engines/sci/graphics/celobj32.cpp | 15 +++++++++------ 1 file changed, 9 insertions(+), 6 deletions(-) (limited to 'engines/sci') diff --git a/engines/sci/graphics/celobj32.cpp b/engines/sci/graphics/celobj32.cpp index 389270ec42..acf499308a 100644 --- a/engines/sci/graphics/celobj32.cpp +++ b/engines/sci/graphics/celobj32.cpp @@ -117,8 +117,8 @@ struct SCALER_NoScale { _reader(celObj, FLIP ? celObj._width : maxWidth), _lastIndex(celObj._width - 1) {} - inline void setSource(const int16 x, const int16 y) { - _row = _reader.getRow(y); + inline void setSource(const int16 x, const int16 targetY, const int16 scaledPosY) { + _row = _reader.getRow(targetY - scaledPosY); if (FLIP) { _row += _lastIndex - x; @@ -153,8 +153,11 @@ struct SCALER_Scale { _table(CelObj::_scaler->getScalerTable(scaleX, scaleY)), _lastIndex(maxWidth - 1) {} - inline void setSource(const int16 x, const int16 y) { - _row = _reader.getRow(_table->valuesY[y]); + inline void setSource(const int16 x, const int16 targetY, const int16 scaledPosY) { + // look up both targetY + scaledPosY in here, only subtract afterwards + // otherwise y won't be correct all the time when uneven scaling is used (for example 5:12) + int16 y = _table->valuesY[targetY] - _table->valuesY[scaledPosY]; + _row = _reader.getRow(y); if (FLIP) { _x = _lastIndex - x; } else { @@ -575,7 +578,7 @@ struct RENDERER { inline void draw(Buffer &target, const Common::Rect &targetRect, const Common::Point &scaledPosition) const { const int16 sourceX = targetRect.left - scaledPosition.x; - const int16 sourceY = targetRect.top - scaledPosition.y; + //const int16 sourceY = targetRect.top - scaledPosition.y; byte *targetPixel = (byte *)target.getPixels() + target.screenWidth * targetRect.top + targetRect.left; @@ -583,7 +586,7 @@ struct RENDERER { const int16 targetWidth = targetRect.width(); const int16 targetHeight = targetRect.height(); for (int y = 0; y < targetHeight; ++y) { - _scaler.setSource(sourceX, sourceY + y); + _scaler.setSource(sourceX, targetRect.top + y, scaledPosition.y); for (int x = 0; x < targetWidth; ++x) { _mapper.draw(targetPixel++, _scaler.read(), _skipColor); -- cgit v1.2.3