From 66ae8a2c0e6d01d06a01fa877cf03507c0656f8d Mon Sep 17 00:00:00 2001 From: Mike Kaganski Date: Wed, 15 Jun 2022 18:33:38 +0300 Subject: [PATCH] tdf#134210: Reimplement cropping from srcRect and fillRect This avoids the scaling after the crop, since scaling is performed anyway when applying BitmapMode_STRETCH. This improves resulting bitmap quality. Also consider the "crop to zero" case (when the sum of cropped parts is equal to 100%). In that case, just use an empty graphic as the fill bitmap. This makes the differences between srcRect and fillRect processing explicit, simplifies the code, avoids extra rounding inaccuracies, and takes care of the edge cases that were considered in commit 2859ec288f2c1323ea3123d82cb1684b349ff598 Author Miklos Vajna Date Wed Jun 15 15:52:18 2022 +0200 oox: fix div by zero in lclCalculateCropPercentage() The change in SdImportTest2::testTdf134210 is because we now don't scale the cropped image. The previous value was an interpolated color, while the new value is the actual color of pixel [0, 41] of the original image. Change-Id: I24fa9928cff32bcaa6a7b3e34def14700fddd7ca Reviewed-on: https://gerrit.libreoffice.org/c/core/+/135917 Tested-by: Jenkins Reviewed-by: Mike Kaganski (cherry picked from commit 5772cef244dbee5834efbc693bc714d89ae6301d) Reviewed-on: https://gerrit.libreoffice.org/c/core/+/136038 Reviewed-by: Xisco Fauli (cherry picked from commit c7a21bfed044154cac23328d37b46f34aeda0709) Reviewed-on: https://gerrit.libreoffice.org/c/core/+/136155 --- oox/source/drawingml/fillproperties.cxx | 92 ++++++++++++++------------------ sd/qa/unit/data/pptx/croppedTo0.pptx | Bin 0 -> 32741 bytes sd/qa/unit/import-tests2.cxx | 10 +++- 3 files changed, 48 insertions(+), 54 deletions(-) create mode 100644 sd/qa/unit/data/pptx/croppedTo0.pptx diff --git a/oox/source/drawingml/fillproperties.cxx b/oox/source/drawingml/fillproperties.cxx index be7e86d7d029..773e08287368 100644 --- a/oox/source/drawingml/fillproperties.cxx +++ b/oox/source/drawingml/fillproperties.cxx @@ -88,67 +88,55 @@ Reference< XGraphic > lclRotateGraphic(uno::Reference const & return aReturnGraphic.GetXGraphic(); } -void lclCalculateCropPercentage(uno::Reference const & xGraphic, geometry::IntegerRectangle2D &aFillRect) +using Quotients = std::tuple; +Quotients getQuotients(geometry::IntegerRectangle2D aRelRect, double hDiv, double vDiv) { - ::Graphic aGraphic(xGraphic); - assert (aGraphic.GetType() == GraphicType::Bitmap); - - BitmapEx aBitmapEx(aGraphic.GetBitmapEx()); - - sal_Int32 nScaledWidth = aBitmapEx.GetSizePixel().Width(); - sal_Int32 nScaledHeight = aBitmapEx.GetSizePixel().Height(); - - sal_Int32 nOrigWidth = (nScaledWidth * (100000 - aFillRect.X1 - aFillRect.X2)) / 100000; - if (nOrigWidth == 0) - { - nOrigWidth = 1; - } - sal_Int32 nOrigHeight = (nScaledHeight * (100000 - aFillRect.Y1 - aFillRect.Y2)) / 100000; - if (nOrigHeight == 0) - { - nOrigHeight = 1; - } + return { aRelRect.X1 / hDiv, aRelRect.Y1 / vDiv, aRelRect.X2 / hDiv, aRelRect.Y2 / vDiv }; +} - sal_Int32 nLeftPercentage = nScaledWidth * aFillRect.X1 / nOrigWidth; - sal_Int32 nRightPercentage = nScaledWidth * aFillRect.X2 / nOrigWidth; - sal_Int32 nTopPercentage = nScaledHeight * aFillRect.Y1 / nOrigHeight; - sal_Int32 nBottomPercentage = nScaledHeight * aFillRect.Y2 / nOrigHeight; +// ECMA-376 Part 1 20.1.8.55 srcRect (Source Rectangle) +std::optional 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); + 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); +} - aFillRect.X1 = -nLeftPercentage; - aFillRect.X2 = -nRightPercentage; - aFillRect.Y1 = -nTopPercentage; - aFillRect.Y2 = -nBottomPercentage; +// ECMA-376 Part 1 20.1.8.30 fillRect (Fill Rectangle) +std::optional 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); + // 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); } -// Crops a piece of the bitmap. Takes negative aFillRect values. Negative values means "crop", -// positive values means "grow" bitmap with empty spaces. lclCropGraphic doesn't handle growing. -Reference< XGraphic > lclCropGraphic(uno::Reference const & xGraphic, geometry::IntegerRectangle2D aFillRect) +// Crops a piece of the bitmap. lclCropGraphic doesn't handle growing. +Reference lclCropGraphic(uno::Reference const& xGraphic, + std::optional quotients) { ::Graphic aGraphic(xGraphic); - ::Graphic aReturnGraphic; - assert (aGraphic.GetType() == GraphicType::Bitmap); - BitmapEx aBitmapEx(aGraphic.GetBitmapEx()); - - sal_Int32 nOrigHeight = aBitmapEx.GetSizePixel().Height(); - sal_Int32 nHeight = nOrigHeight; - sal_Int32 nTopCorr = nOrigHeight * -1 * static_cast(aFillRect.Y1) / 100000; - nHeight += nTopCorr; - sal_Int32 nBottomCorr = nOrigHeight * -1 * static_cast(aFillRect.Y2) / 100000; - nHeight += nBottomCorr; + BitmapEx aBitmapEx; + if (quotients) + { + aBitmapEx = aGraphic.GetBitmapEx(); - sal_Int32 nOrigWidth = aBitmapEx.GetSizePixel().Width(); - sal_Int32 nWidth = nOrigWidth; - sal_Int32 nLeftCorr = nOrigWidth * -1 * static_cast(aFillRect.X1) / 100000; - nWidth += nLeftCorr; - sal_Int32 nRightCorr = nOrigWidth * -1 * static_cast(aFillRect.X2) / 100000; - nWidth += nRightCorr; + const Size bmpSize = aBitmapEx.GetSizePixel(); + const auto& [qx1, qy1, qx2, qy2] = *quotients; + const tools::Long l = std::round(bmpSize.Width() * qx1); + const tools::Long t = std::round(bmpSize.Height() * qy1); + const tools::Long r = std::round(bmpSize.Width() * qx2); + const tools::Long b = std::round(bmpSize.Height() * qy2); - aBitmapEx.Scale(Size(nWidth, nHeight)); - aBitmapEx.Crop(tools::Rectangle(Point(nLeftCorr, nTopCorr), Size(nOrigWidth, nOrigHeight))); + aBitmapEx.Crop({ l, t, bmpSize.Width() - r - 1, bmpSize.Height() - b - 1 }); + } - aReturnGraphic = ::Graphic(aBitmapEx); + ::Graphic aReturnGraphic(aBitmapEx); aReturnGraphic.setOriginURL(aGraphic.getOriginURL()); return aReturnGraphic.GetXGraphic(); @@ -799,7 +787,7 @@ void FillProperties::pushToPropMap( ShapePropertyMap& rPropMap, if(bIsCustomShape && bHasCropValues && bNeedCrop) { - xGraphic = lclCropGraphic(xGraphic, aFillRect); + xGraphic = lclCropGraphic(xGraphic, CropQuotientsFromFillRect(aFillRect)); rPropMap.setProperty(ShapeProperty::FillBitmap, xGraphic); } } @@ -913,9 +901,7 @@ void GraphicProperties::pushToPropMap( PropertyMap& rPropMap, const GraphicHelpe if(mbIsCustomShape && bHasCropValues && bNeedCrop) { - geometry::IntegerRectangle2D aCropRect = oClipRect; - lclCalculateCropPercentage(xGraphic, aCropRect); - xGraphic = lclCropGraphic(xGraphic, aCropRect); + xGraphic = lclCropGraphic(xGraphic, CropQuotientsFromSrcRect(oClipRect)); } } } diff --git a/sd/qa/unit/data/pptx/croppedTo0.pptx b/sd/qa/unit/data/pptx/croppedTo0.pptx new file mode 100644 index 0000000000000000000000000000000000000000..fecf53559b1fb6c910f35b3367116a573def1443 GIT binary patch literal 32741 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 } @@ -1991,6 +1993,12 @@ void SdImportTest2::testDefaultTabStop() xDocShRef->DoClose(); } +void SdImportTest2::testCropToZero() +{ + // Must not crash because of division by zero + loadURL(m_directories.getURLFromSrc(u"/sd/qa/unit/data/pptx/croppedTo0.pptx"), PPTX); +} + CPPUNIT_TEST_SUITE_REGISTRATION(SdImportTest2); CPPUNIT_PLUGIN_IMPLEMENT(); -- 2.11.4.GIT