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) {
