sd/qa/uitest/data/tdf155863.odp         |binary
 sd/qa/uitest/impress_tests/tdf155863.py |   34 ++++++++++++++++++++++++++++++++
 svx/source/svdraw/svdograf.cxx          |   24 ++++++++++------------
 3 files changed, 45 insertions(+), 13 deletions(-)

New commits:
commit a4e12cbfc69cfe668fa30756a3c5843e911e22b1
Author:     Tibor Nagy <[email protected]>
AuthorDate: Fri Jun 16 09:34:29 2023 +0200
Commit:     László Németh <[email protected]>
CommitDate: Tue Jun 20 18:31:41 2023 +0200

    tdf#155863 sd: fix resizing of cropped images to original size
    
    Resizing with the function "Original Size" (e.g. in the context menu) 
resulted distortion in case of cropped images, if the original image
    and its cropping have different aspect ratios. Now zoom the cropped
    image to the original resolution instead of stretching it to the
    same size.
    
    Change-Id: I5e59f8b48dc03844a739c3eb803e3195a12d9c6d
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/153170
    Tested-by: László Németh <[email protected]>
    Reviewed-by: László Németh <[email protected]>

diff --git a/sd/qa/uitest/data/tdf155863.odp b/sd/qa/uitest/data/tdf155863.odp
new file mode 100644
index 000000000000..2ae286c05d31
Binary files /dev/null and b/sd/qa/uitest/data/tdf155863.odp differ
diff --git a/sd/qa/uitest/impress_tests/tdf155863.py 
b/sd/qa/uitest/impress_tests/tdf155863.py
new file mode 100644
index 000000000000..bce8936a3d40
--- /dev/null
+++ b/sd/qa/uitest/impress_tests/tdf155863.py
@@ -0,0 +1,34 @@
+# -*- tab-width: 4; indent-tabs-mode: nil; py-indent-offset: 4 -*-
+#
+# This file is part of the LibreOffice project.
+#
+# This Source Code Form is subject to the terms of the Mozilla Public
+# License, v. 2.0. If a copy of the MPL was not distributed with this
+# file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+
+from uitest.framework import UITestCase
+from libreoffice.uno.propertyvalue import mkPropertyValues
+from uitest.uihelper.common import get_state_as_dict, get_url_for_data_file
+
+class tdf155863(UITestCase):
+    def test_tdf155863(self):
+        # This document contains an image with an original size of 7.99cm x 
5.74cm.
+        # The image has been cropped 0.8cm on the left, 3.59cm on the right, 
0.99cm at the top,
+        # and 0.75cm at the bottom.
+        # Also, it has been resized to a width of 2.1cm and a height of 2.33cm.
+        with self.ui_test.load_file(get_url_for_data_file("tdf155863.odp")) as 
document:
+            xImpressDoc = self.xUITest.getTopFocusWindow()
+            xEditWin = xImpressDoc.getChild("impress_win")
+
+            # select the image on the first slide
+            xEditWin.executeAction("SELECT", 
mkPropertyValues({"OBJECT":"Image"}))
+
+            # click "Original Size"
+            self.xUITest.executeCommand(".uno:OriginalSize")
+
+            # tdf#155863: Without the fix in place, the image will be 
distorted due to the wrong size.
+            self.assertEqual(3597, 
document.DrawPages[0].getByIndex(0).Size.Width)
+            self.assertEqual(3998, 
document.DrawPages[0].getByIndex(0).Size.Height)
+
+# vim: set shiftwidth=4 softtabstop=4 expandtab:
diff --git a/svx/source/svdraw/svdograf.cxx b/svx/source/svdraw/svdograf.cxx
index cdb1b0e8301c..b36daff54745 100644
--- a/svx/source/svdraw/svdograf.cxx
+++ b/svx/source/svdraw/svdograf.cxx
@@ -476,23 +476,21 @@ Size SdrGrafObj::getOriginalSize() const
 {
     Size aSize = GetGrafPrefSize();
 
-    if (aGrafInfo.IsCropped())
-    {
-        const tools::Long 
aCroppedTop(OutputDevice::LogicToLogic(aGrafInfo.GetTopCrop(), 
getSdrModelFromSdrObject().GetScaleUnit(), GetGrafPrefMapMode().GetMapUnit()));
-        const tools::Long 
aCroppedBottom(OutputDevice::LogicToLogic(aGrafInfo.GetBottomCrop(), 
getSdrModelFromSdrObject().GetScaleUnit(), GetGrafPrefMapMode().GetMapUnit()));
-        const tools::Long 
aCroppedLeft(OutputDevice::LogicToLogic(aGrafInfo.GetLeftCrop(), 
getSdrModelFromSdrObject().GetScaleUnit(), GetGrafPrefMapMode().GetMapUnit()));
-        const tools::Long 
aCroppedRight(OutputDevice::LogicToLogic(aGrafInfo.GetRightCrop(), 
getSdrModelFromSdrObject().GetScaleUnit(), GetGrafPrefMapMode().GetMapUnit()));
-        const tools::Long aCroppedWidth(aSize.getWidth() - aCroppedLeft + 
aCroppedRight);
-        const tools::Long aCroppedHeight(aSize.getHeight() - aCroppedTop + 
aCroppedBottom);
-
-        aSize = Size ( aCroppedWidth, aCroppedHeight);
-    }
-
-    if ( GetGrafPrefMapMode().GetMapUnit() == MapUnit::MapPixel )
+    if (GetGrafPrefMapMode().GetMapUnit() == MapUnit::MapPixel)
         aSize = Application::GetDefaultDevice()->PixelToLogic(aSize, 
MapMode(getSdrModelFromSdrObject().GetScaleUnit()));
     else
         aSize = OutputDevice::LogicToLogic(aSize, GetGrafPrefMapMode(), 
MapMode(getSdrModelFromSdrObject().GetScaleUnit()));
 
+    if (aGrafInfo.IsCropped())
+    {
+        const tools::Long aCroppedWidth(aSize.getWidth() - 
aGrafInfo.GetLeftCrop()
+                                        - aGrafInfo.GetRightCrop());
+        const tools::Long aCroppedHeight(aSize.getHeight() - 
aGrafInfo.GetTopCrop()
+                                         - aGrafInfo.GetBottomCrop());
+
+        aSize = Size(aCroppedWidth, aCroppedHeight);
+    }
+
     return aSize;
 }
 

Reply via email to