drawinglayer/source/processor2d/cairopixelprocessor2d.cxx |   40 +++++++++-----
 1 file changed, 27 insertions(+), 13 deletions(-)

New commits:
commit cd93f83bbcba0379bf39f3a4e76b955b7fa368b5
Author:     Armin Le Grand (collabora) <[email protected]>
AuthorDate: Thu Aug 7 21:02:41 2025 +0200
Commit:     Armin Le Grand <[email protected]>
CommitDate: Fri Aug 8 10:42:12 2025 +0200

    tdf#167831 avoid painting bitmap data with zero dimensions
    
    See task, there may be bitmap-filled objects in files that
    have a logical size of (0, 0), despite the bitmap having
    valid data. That leads to problems *inside* cairo paint,
    so I have to test and avoid that.
    
    Change-Id: I18db3b030fb5cdf77caa5afd1bf901095fa1c67b
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/189135
    Tested-by: Jenkins
    Reviewed-by: Armin Le Grand <[email protected]>

diff --git a/drawinglayer/source/processor2d/cairopixelprocessor2d.cxx 
b/drawinglayer/source/processor2d/cairopixelprocessor2d.cxx
index 0eda4ca44e52..91498e124256 100644
--- a/drawinglayer/source/processor2d/cairopixelprocessor2d.cxx
+++ b/drawinglayer/source/processor2d/cairopixelprocessor2d.cxx
@@ -1322,6 +1322,17 @@ void CairoPixelProcessor2D::paintBitmapAlpha(const 
Bitmap& rBitmap,
         return;
     }
 
+    // work with dimensions in discrete target pixels to use evtl. MipMap 
pre-scale
+    const tools::Long nDestWidth((aLocalTransform * basegfx::B2DVector(1.0, 
0.0)).getLength());
+    const tools::Long nDestHeight((aLocalTransform * basegfx::B2DVector(0.0, 
1.0)).getLength());
+
+    // tdf#167831 check for output size, may have zero discrete dimension in X 
and/or Y
+    if (0 == nDestWidth || 0 == nDestHeight)
+    {
+        // it has and is thus invisible
+        return;
+    }
+
     if (maBColorModifierStack.count())
     {
         // need to apply ColorModifier to Bitmap data
@@ -1353,10 +1364,6 @@ void CairoPixelProcessor2D::paintBitmapAlpha(const 
Bitmap& rBitmap,
         return;
     }
 
-    // work with dimensions in discrete target pixels to use evtl. MipMap 
pre-scale
-    const tools::Long nDestWidth((aLocalTransform * basegfx::B2DVector(1.0, 
0.0)).getLength());
-    const tools::Long nDestHeight((aLocalTransform * basegfx::B2DVector(0.0, 
1.0)).getLength());
-
     cairo_surface_t* pTarget(aCairoSurfaceHelper->getCairoSurface(nDestWidth, 
nDestHeight));
     if (nullptr == pTarget)
     {
@@ -2517,6 +2524,22 @@ void 
CairoPixelProcessor2D::processFillGraphicPrimitive2D(
         return;
     }
 
+    // work with dimensions in discrete target pixels to use evtl. MipMap 
pre-scale
+    const basegfx::B2DHomMatrix aLocalTransform(
+        getViewInformation2D().getObjectToViewTransformation()
+        * rFillGraphicPrimitive2D.getTransformation());
+    const tools::Long nDestWidth(
+        (aLocalTransform * basegfx::B2DVector(aFillUnitRange.getWidth(), 
0.0)).getLength());
+    const tools::Long nDestHeight(
+        (aLocalTransform * basegfx::B2DVector(0.0, 
aFillUnitRange.getHeight())).getLength());
+
+    // tdf#167831 check for output size, may have zero discrete dimension in X 
and/or Y
+    if (0 == nDestWidth || 0 == nDestHeight)
+    {
+        // it has and is thus invisible
+        return;
+    }
+
     constexpr DrawModeFlags BITMAP(DrawModeFlags::BlackBitmap | 
DrawModeFlags::WhiteBitmap
                                    | DrawModeFlags::GrayBitmap);
     basegfx::BColor aReplacementColor(0, 0, 0);
@@ -2587,15 +2610,6 @@ void 
CairoPixelProcessor2D::processFillGraphicPrimitive2D(
         return;
     }
 
-    // work with dimensions in discrete target pixels to use evtl. MipMap 
pre-scale
-    const basegfx::B2DHomMatrix aLocalTransform(
-        getViewInformation2D().getObjectToViewTransformation()
-        * rFillGraphicPrimitive2D.getTransformation());
-    const tools::Long nDestWidth(
-        (aLocalTransform * basegfx::B2DVector(aFillUnitRange.getWidth(), 
0.0)).getLength());
-    const tools::Long nDestHeight(
-        (aLocalTransform * basegfx::B2DVector(0.0, 
aFillUnitRange.getHeight())).getLength());
-
     cairo_surface_t* pTarget(aCairoSurfaceHelper->getCairoSurface(nDestWidth, 
nDestHeight));
     if (nullptr == pTarget)
     {

Reply via email to