diff options
author | Martin Kiewitz | 2016-03-13 13:12:36 +0100 |
---|---|---|
committer | Martin Kiewitz | 2016-03-13 13:12:36 +0100 |
commit | d85eb8ded68a20de383d84064aacd1a4c81db4e9 (patch) | |
tree | ab788a716de7dcce436eaaa953d5f1ebe15a9e15 /engines/sci | |
parent | f35bdb680d6271042757eb69264b2aa76b19afa7 (diff) | |
download | scummvm-rg350-d85eb8ded68a20de383d84064aacd1a4c81db4e9.tar.gz scummvm-rg350-d85eb8ded68a20de383d84064aacd1a4c81db4e9.tar.bz2 scummvm-rg350-d85eb8ded68a20de383d84064aacd1a4c81db4e9.zip |
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
Diffstat (limited to 'engines/sci')
-rw-r--r-- | engines/sci/graphics/celobj32.cpp | 15 |
1 files changed, 9 insertions, 6 deletions
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); |