File bsc1174924.diff of Package libreoffice

From f16f4c4ea4a331be3da06ae8c5f4d954ac8c678c Mon Sep 17 00:00:00 2001
From: Miklos Vajna <vmiklos@collabora.com>
Date: Fri, 14 Aug 2020 16:15:07 +0200
Subject: [PATCH] bsc1174924.diff

tdf#135094 cairo canvas: fix black slide containing a very small image

Don't paint when the area would be 0, that would not be visible anyway,
and the _cairo_matrix_to_pixman_matrix_offset() call would fail with
CAIRO_INT_STATUS_INVALID_MATRIX in _pixman_image_set_properties(),
failing the render of the whole slide.

Also, warn in case the painting fails, so the next time something
breaks, it's easier to find the problematic place.

[ No testcase, our tests are typically headless and currently
SvpSalGraphics::SupportsCairo() reports false, so this would be tricky
to test. ]

(cherry picked from commit 78036f74fa74ee2552e79064660634e1342692ff)

Change-Id: I7cdb9462ff8155232ea51abf321b365c2219575b
Reviewed-on: https://gerrit.libreoffice.org/c/core/+/100850
Tested-by: Jenkins CollaboraOffice <jenkinscollaboraoffice@gmail.com>
Reviewed-by: Miklos Vajna <vmiklos@collabora.com>
---
 canvas/source/cairo/cairo_canvashelper.cxx | 21 +++++++++++++++++----
 1 file changed, 17 insertions(+), 4 deletions(-)

diff --git a/canvas/source/cairo/cairo_canvashelper.cxx b/canvas/source/cairo/cairo_canvashelper.cxx
index d3c36b47649e..b2ac747ab36c 100644
--- a/canvas/source/cairo/cairo_canvashelper.cxx
+++ b/canvas/source/cairo/cairo_canvashelper.cxx
@@ -1177,10 +1177,23 @@ namespace cairocanvas
             cairo_rectangle( mpCairo.get(), 0, 0, aBitmapSize.Width, aBitmapSize.Height );
             cairo_clip( mpCairo.get() );
 
-            if( bModulateColors )
-                cairo_paint_with_alpha( mpCairo.get(), renderState.DeviceColor[3] );
-            else
-                cairo_paint( mpCairo.get() );
+            int nPixelWidth = std::round(rSize.Width * aMatrix.xx);
+            int nPixelHeight = std::round(rSize.Height * aMatrix.yy);
+            if (nPixelWidth > 0 && nPixelHeight > 0)
+            {
+                // Only render the image if it's at least 1x1 px sized.
+                if (bModulateColors)
+                    cairo_paint_with_alpha(mpCairo.get(), renderState.DeviceColor[3]);
+                else
+                {
+                    cairo_paint(mpCairo.get());
+                    if (cairo_status(mpCairo.get()) != CAIRO_STATUS_SUCCESS)
+                    {
+                        SAL_WARN("canvas.cairo", "cairo_paint() failed: " << cairo_status_to_string(
+                                                     cairo_status(mpCairo.get())));
+                    }
+                }
+            }
             cairo_restore( mpCairo.get() );
         }
         else
-- 
2.26.2

openSUSE Build Service is sponsored by