canvas/source/cairo/cairo_canvashelper.cxx |    9 +++++++--
 1 file changed, 7 insertions(+), 2 deletions(-)

New commits:
commit 8dd85649df19a2570d79336809f0c03ce2339729
Author:     Miklos Vajna <vmik...@collabora.com>
AuthorDate: Tue Nov 15 08:27:57 2022 +0100
Commit:     Michael Stahl <michael.st...@allotropia.de>
CommitDate: Thu Nov 17 11:33:38 2022 +0100

    tdf#145416 canvas: fix rotated, not zero-sized bitmap, which is not rendered
    
    The presentation had a rotated bitmap, which is not zero size, but we
    still decided to just not render it. The bug is specific to the "cairo
    canvas", which is the default on Linux, but not elsewhere.
    
    The trouble is that CanvasHelper::implDrawBitmapSurface() accessed the
    transform matrix directly, assuming that the (0,0) and (1,1) members
    represent scaling as-is. This is only true in case there are no other
    transforms in the matrix (rotation, sharing).
    
    Fix the problem by getting the scale info via
    cairo_matrix_transform_distance(), which correctly determines if the
    scaling is 0 or not.
    
    This went wrong in commit 78036f74fa74ee2552e79064660634e1342692ff
    (tdf#135094 cairo canvas: fix black slide containing a very small image,
    2020-08-14).  No testcase, our tests are typically headless and
    currently SvpSalGraphics::SupportsCairo() reports false, so this would
    be tricky to test.
    
    Change-Id: I0af18e89a3fbc76805053ba2f2f8ce509716f678
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/142722
    Reviewed-by: Miklos Vajna <vmik...@collabora.com>
    Tested-by: Jenkins
    (cherry picked from commit 94df17d2fcdb72bc529097d77b174d934a25cc24)
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/142684
    Reviewed-by: Michael Stahl <michael.st...@allotropia.de>

diff --git a/canvas/source/cairo/cairo_canvashelper.cxx 
b/canvas/source/cairo/cairo_canvashelper.cxx
index e9aafabe7e63..8f46c5b856c2 100644
--- a/canvas/source/cairo/cairo_canvashelper.cxx
+++ b/canvas/source/cairo/cairo_canvashelper.cxx
@@ -1175,8 +1175,13 @@ constexpr OUStringLiteral 
PARAMETRICPOLYPOLYGON_IMPLEMENTATION_NAME = u"Canvas::
             cairo_rectangle( mpCairo.get(), 0, 0, aBitmapSize.Width, 
aBitmapSize.Height );
             cairo_clip( mpCairo.get() );
 
-            int nPixelWidth = std::round(rSize.Width * aMatrix.xx);
-            int nPixelHeight = std::round(rSize.Height * aMatrix.yy);
+            // Use cairo_matrix_transform_distance() to determine the scaling, 
as that works even if
+            // the matrix also has rotation.
+            double fPixelWidth = rSize.Width;
+            double fPixelHeight = rSize.Height;
+            cairo_matrix_transform_distance(&aMatrix, &fPixelWidth, 
&fPixelHeight);
+            int nPixelWidth = std::round(fPixelWidth);
+            int nPixelHeight = std::round(fPixelHeight);
             if (std::abs(nPixelWidth) > 0 && std::abs(nPixelHeight) > 0)
             {
                 // Only render the image if it's at least 1x1 px sized.

Reply via email to