diff options
author | Colin Snover | 2016-03-02 00:00:28 -0600 |
---|---|---|
committer | Colin Snover | 2016-03-02 00:01:13 -0600 |
commit | 97d5e9218519049bf7d4403682129173ef5d44e3 (patch) | |
tree | 01af7d57bcdca60cb4305724e45713e726bede4c /engines/sci/graphics/helpers.h | |
parent | e5b30fb9afa3a42e08525980257868a73660937d (diff) | |
download | scummvm-rg350-97d5e9218519049bf7d4403682129173ef5d44e3.tar.gz scummvm-rg350-97d5e9218519049bf7d4403682129173ef5d44e3.tar.bz2 scummvm-rg350-97d5e9218519049bf7d4403682129173ef5d44e3.zip |
SCI32: Review rect rounding in Plane and ScreenItem
These changes should cause ScummVM to be more accurate in edge
case rounding.
Diffstat (limited to 'engines/sci/graphics/helpers.h')
-rw-r--r-- | engines/sci/graphics/helpers.h | 19 |
1 files changed, 6 insertions, 13 deletions
diff --git a/engines/sci/graphics/helpers.h b/engines/sci/graphics/helpers.h index 1d16b49798..19dddd74b8 100644 --- a/engines/sci/graphics/helpers.h +++ b/engines/sci/graphics/helpers.h @@ -154,13 +154,13 @@ inline void mulinc(Common::Rect &rect, const Common::Rational &ratioX, const Com * Multiplies a number by a rational number, rounding up to * the nearest whole number. */ -inline int mulru(const int value, const Common::Rational &ratio) { - int num = value * ratio.getNumerator(); +inline int mulru(const int value, const Common::Rational &ratio, const int extra = 0) { + int num = (value + extra) * ratio.getNumerator(); int result = num / ratio.getDenominator(); if (num > ratio.getDenominator() && num % ratio.getDenominator()) { ++result; } - return result; + return result - extra; } /** @@ -177,19 +177,12 @@ inline void mulru(Common::Point &point, const Common::Rational &ratioX, const Co * Multiplies a point by two rational numbers for X and Y, * rounding up to the nearest whole number. Modifies the * rect directly. - * - * @note In SCI engine, the bottom-right corner of rects - * received an additional one pixel during the - * multiplication in order to round up to include the - * bottom-right corner. Since ScummVM rects do not include - * the bottom-right corner, doing this ends up making rects - * a pixel too wide/tall depending upon the remainder. */ -inline void mulru(Common::Rect &rect, const Common::Rational &ratioX, const Common::Rational &ratioY) { +inline void mulru(Common::Rect &rect, const Common::Rational &ratioX, const Common::Rational &ratioY, const int extra) { rect.left = mulru(rect.left, ratioX); rect.top = mulru(rect.top, ratioY); - rect.right = mulru(rect.right, ratioX); - rect.bottom = mulru(rect.bottom, ratioY); + rect.right = mulru(rect.right - 1, ratioX, extra) + 1; + rect.bottom = mulru(rect.bottom - 1, ratioY, extra) + 1; } struct Buffer : public Graphics::Surface { |