diff options
author | Mike Kaganski <mike.kaganski@collabora.com> | 2022-06-27 15:29:25 +0300 |
---|---|---|
committer | Andras Timar <andras.timar@collabora.com> | 2022-07-02 16:04:21 +0200 |
commit | c32605e54a4525c5ad80e273f17e657e9e601b13 (patch) | |
tree | fe9669b0d9f809b445b70bc821f322dd53b2e7f5 /oox/source | |
parent | 5194c946d80426d2cfe8ce9fb093c50722793c4b (diff) |
Integer division could cancel small values of wrong sign
... as seen at some documents where the values are like -1. There
the checks in pushToPropMap may pass (the division result would be 0),
but the original small negative values would fail the asserts that
were introduced in commit 5772cef244dbee5834efbc693bc714d89ae6301d
Author Mike Kaganski <mike.kaganski@collabora.com>
Date Wed Jun 15 18:33:38 2022 +0300
tdf#134210: Reimplement cropping from srcRect and fillRect
Change-Id: I114588862b5cfd2b2e4491424430cc139bdbaae9
Reviewed-on: https://gerrit.libreoffice.org/c/core/+/136492
Tested-by: Jenkins
Reviewed-by: Caolán McNamara <caolanm@redhat.com>
(cherry picked from commit 2d9f3c066a065d6aa98f1e594dcf8a091fec2bde)
Reviewed-on: https://gerrit.libreoffice.org/c/core/+/136471
Reviewed-by: Xisco Fauli <xiscofauli@libreoffice.org>
Signed-off-by: Xisco Fauli <xiscofauli@libreoffice.org>
Reviewed-on: https://gerrit.libreoffice.org/c/core/+/136556
Diffstat (limited to 'oox/source')
-rw-r--r-- | oox/source/drawingml/fillproperties.cxx | 12 |
1 files changed, 8 insertions, 4 deletions
diff --git a/oox/source/drawingml/fillproperties.cxx b/oox/source/drawingml/fillproperties.cxx index ecf717d99f4a..a678524035b9 100644 --- a/oox/source/drawingml/fillproperties.cxx +++ b/oox/source/drawingml/fillproperties.cxx @@ -97,8 +97,10 @@ Quotients getQuotients(geometry::IntegerRectangle2D aRelRect, double hDiv, doubl // ECMA-376 Part 1 20.1.8.55 srcRect (Source Rectangle) std::optional<Quotients> CropQuotientsFromSrcRect(geometry::IntegerRectangle2D aSrcRect) { - // Currently the following precondition is guaranteed in GraphicProperties::pushToPropMap - assert(aSrcRect.X1 >= 0 && aSrcRect.X2 >= 0 && aSrcRect.Y1 >= 0 && aSrcRect.Y2 >= 0); + aSrcRect.X1 = std::max(aSrcRect.X1, sal_Int32(0)); + aSrcRect.X2 = std::max(aSrcRect.X2, sal_Int32(0)); + aSrcRect.Y1 = std::max(aSrcRect.Y1, sal_Int32(0)); + aSrcRect.Y2 = std::max(aSrcRect.Y2, sal_Int32(0)); if (aSrcRect.X1 + aSrcRect.X2 >= 100'000 || aSrcRect.Y1 + aSrcRect.Y2 >= 100'000) return {}; // Cropped everything return getQuotients(aSrcRect, 100'000.0, 100'000.0); @@ -107,8 +109,10 @@ std::optional<Quotients> CropQuotientsFromSrcRect(geometry::IntegerRectangle2D a // ECMA-376 Part 1 20.1.8.30 fillRect (Fill Rectangle) std::optional<Quotients> CropQuotientsFromFillRect(geometry::IntegerRectangle2D aFillRect) { - // Currently the following precondition is guaranteed in FillProperties::pushToPropMap - assert(aFillRect.X1 <= 0 && aFillRect.X2 <= 0 && aFillRect.Y1 <= 0 && aFillRect.Y2 <= 0); + aFillRect.X1 = std::min(aFillRect.X1, sal_Int32(0)); + aFillRect.X2 = std::min(aFillRect.X2, sal_Int32(0)); + aFillRect.Y1 = std::min(aFillRect.Y1, sal_Int32(0)); + aFillRect.Y2 = std::min(aFillRect.Y2, sal_Int32(0)); // Negative divisor and negative relative offset give positive value wanted in lclCropGraphic return getQuotients(aFillRect, -100'000.0 + aFillRect.X1 + aFillRect.X2, -100'000.0 + aFillRect.Y1 + aFillRect.Y2); |