drawinglayer/source/drawinglayeruno/xprimitive2drenderer.cxx |    3 
 drawinglayer/source/primitive2d/glowprimitive2d.cxx          |    3 
 drawinglayer/source/primitive2d/patternfillprimitive2d.cxx   |    6 
 drawinglayer/source/primitive2d/shadowprimitive2d.cxx        |    3 
 drawinglayer/source/primitive2d/softedgeprimitive2d.cxx      |    3 
 drawinglayer/source/processor2d/d2dpixelprocessor2d.cxx      |    5 
 drawinglayer/source/processor2d/vclmetafileprocessor2d.cxx   |    8 -
 drawinglayer/source/tools/converters.cxx                     |   24 +--
 include/drawinglayer/converters.hxx                          |    8 -
 svgio/qa/cppunit/SvgImportTest.cxx                           |   76 ++++++++---
 svgio/qa/cppunit/data/tdf160782.svg                          |   43 ++++++
 svgio/source/svgreader/svgfeblendnode.cxx                    |   24 +--
 svgio/source/svgreader/svgfecompositenode.cxx                |   24 +--
 13 files changed, 151 insertions(+), 79 deletions(-)

New commits:
commit 1097686ebddd48b78816d87524caadd17b788c23
Author:     Xisco Fauli <xiscofa...@libreoffice.org>
AuthorDate: Mon Apr 22 15:30:05 2024 +0200
Commit:     Xisco Fauli <xiscofa...@libreoffice.org>
CommitDate: Mon Apr 22 17:38:15 2024 +0200

    tdf#160782: convert to bitmapEx from 0,0 to width,height
    
    This is the way it's done everywhere.
    Partially revert 4b6e0f2c88debaedb514c868e061c21e15215b6e
    "tdf#160726, tdf#48062: Simplify how BitmapExs are created"
    
    Change-Id: I15fea0b6855a65da7cb48b24fc00ba303e33dcf8
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/166456
    Tested-by: Jenkins
    Reviewed-by: Xisco Fauli <xiscofa...@libreoffice.org>

diff --git a/drawinglayer/source/drawinglayeruno/xprimitive2drenderer.cxx 
b/drawinglayer/source/drawinglayeruno/xprimitive2drenderer.cxx
index e50e59a1d76d..22a20f095d24 100644
--- a/drawinglayer/source/drawinglayeruno/xprimitive2drenderer.cxx
+++ b/drawinglayer/source/drawinglayeruno/xprimitive2drenderer.cxx
@@ -147,7 +147,8 @@ namespace drawinglayer::unorenderer
                         convertToBitmapEx(
                             std::move(xEmbedSeq),
                             aViewInformation2D,
-                            basegfx::B2DRange(0, 0, nDiscreteWidth, 
nDiscreteHeight),
+                            nDiscreteWidth,
+                            nDiscreteHeight,
                             MaximumQuadraticPixels));
 
                     if(!aBitmapEx.IsEmpty())
diff --git a/drawinglayer/source/primitive2d/glowprimitive2d.cxx 
b/drawinglayer/source/primitive2d/glowprimitive2d.cxx
index 5cec7a46f532..6bf9dea8af83 100644
--- a/drawinglayer/source/primitive2d/glowprimitive2d.cxx
+++ b/drawinglayer/source/primitive2d/glowprimitive2d.cxx
@@ -176,8 +176,7 @@ void GlowPrimitive2D::create2DDecomposition(
     // I have now added a helper that just creates the mask without having
     // to render the content, use it, it's faster
     const AlphaMask aAlpha(::drawinglayer::createAlphaMask(
-        std::move(xEmbedSeq), aViewInformation2D,
-        basegfx::B2DRange(0, 0, nDiscreteClippedWidth, nDiscreteClippedHeight),
+        std::move(xEmbedSeq), aViewInformation2D, nDiscreteClippedWidth, 
nDiscreteClippedHeight,
         nMaximumQuadraticPixels));
 
     if (aAlpha.IsEmpty())
diff --git a/drawinglayer/source/primitive2d/patternfillprimitive2d.cxx 
b/drawinglayer/source/primitive2d/patternfillprimitive2d.cxx
index 8068a386970c..516b0042d960 100644
--- a/drawinglayer/source/primitive2d/patternfillprimitive2d.cxx
+++ b/drawinglayer/source/primitive2d/patternfillprimitive2d.cxx
@@ -136,7 +136,8 @@ namespace drawinglayer::primitive2d
                     convertToBitmapEx(
                         std::move(xEmbedSeq),
                         aViewInformation2D,
-                        basegfx::B2DRange(0, 0, mnDiscreteWidth, 
mnDiscreteHeight),
+                        mnDiscreteWidth,
+                        mnDiscreteHeight,
                         mnDiscreteWidth * mnDiscreteHeight));
 
                 if(!aBitmapEx.IsEmpty())
@@ -196,7 +197,8 @@ namespace drawinglayer::primitive2d
             return convertToBitmapEx(
                         std::move(xEmbedSeq),
                         aViewInformation2D,
-                        basegfx::B2DRange(0, 0, nWidth, nHeight),
+                        nWidth,
+                        nHeight,
                         nWidth * nHeight);
         }
 
diff --git a/drawinglayer/source/primitive2d/shadowprimitive2d.cxx 
b/drawinglayer/source/primitive2d/shadowprimitive2d.cxx
index c32f37bd9e8e..5de34c5440b6 100644
--- a/drawinglayer/source/primitive2d/shadowprimitive2d.cxx
+++ b/drawinglayer/source/primitive2d/shadowprimitive2d.cxx
@@ -217,8 +217,7 @@ void ShadowPrimitive2D::create2DDecomposition(
     // I have now added a helper that just creates the mask without having
     // to render the content, use it, it's faster
     const AlphaMask aAlpha(::drawinglayer::createAlphaMask(
-        std::move(xEmbedSeq), aViewInformation2D,
-        basegfx::B2DRange(0, 0, nDiscreteClippedWidth, nDiscreteClippedHeight),
+        std::move(xEmbedSeq), aViewInformation2D, nDiscreteClippedWidth, 
nDiscreteClippedHeight,
         nMaximumQuadraticPixels));
 
     // if we have no shadow, we are done
diff --git a/drawinglayer/source/primitive2d/softedgeprimitive2d.cxx 
b/drawinglayer/source/primitive2d/softedgeprimitive2d.cxx
index fb0124284643..e6f92f312f59 100644
--- a/drawinglayer/source/primitive2d/softedgeprimitive2d.cxx
+++ b/drawinglayer/source/primitive2d/softedgeprimitive2d.cxx
@@ -174,8 +174,7 @@ void SoftEdgePrimitive2D::create2DDecomposition(
         // Otherwise, blurring of edges will fail in cases like running in a
         // slideshow or exporting to PDF.
         const BitmapEx aBitmapEx(::drawinglayer::convertToBitmapEx(
-            std::move(xEmbedSeq), aViewInformation2D,
-            basegfx::B2DRange(0, 0, nDiscreteClippedWidth, 
nDiscreteClippedHeight),
+            std::move(xEmbedSeq), aViewInformation2D, nDiscreteClippedWidth, 
nDiscreteClippedHeight,
             nMaximumQuadraticPixels, true));
 
         if (aBitmapEx.IsEmpty())
diff --git a/drawinglayer/source/processor2d/d2dpixelprocessor2d.cxx 
b/drawinglayer/source/processor2d/d2dpixelprocessor2d.cxx
index 5347378cc43f..6bfc95878332 100644
--- a/drawinglayer/source/processor2d/d2dpixelprocessor2d.cxx
+++ b/drawinglayer/source/processor2d/d2dpixelprocessor2d.cxx
@@ -1060,9 +1060,8 @@ sal::systools::COMReference<ID2D1Bitmap> 
D2DPixelProcessor2D::implCreateAlpha_B2
 
     // use new mode to create AlphaChannel (not just AlphaMask) for 
transparency channel
     const AlphaMask aAlpha(::drawinglayer::createAlphaMask(
-        std::move(xEmbedSeq), aEmptyViewInformation2D,
-        basegfx::B2DRange(0, 0, nDiscreteClippedWidth, nDiscreteClippedHeight),
-        nMaximumQuadraticPixels, true));
+        std::move(xEmbedSeq), aEmptyViewInformation2D, nDiscreteClippedWidth,
+        nDiscreteClippedHeight, nMaximumQuadraticPixels, true));
     sal::systools::COMReference<ID2D1Bitmap> pRetval;
 
     if (aAlpha.IsEmpty())
diff --git a/drawinglayer/source/processor2d/vclmetafileprocessor2d.cxx 
b/drawinglayer/source/processor2d/vclmetafileprocessor2d.cxx
index e3c7703aeaa3..d93d98fef51a 100644
--- a/drawinglayer/source/processor2d/vclmetafileprocessor2d.cxx
+++ b/drawinglayer/source/processor2d/vclmetafileprocessor2d.cxx
@@ -2524,11 +2524,9 @@ void 
VclMetafileProcessor2D::processTransparencePrimitive2D(
     // limitation to paint the content
     const auto aViewInformation2D(geometry::createViewInformation2D({}));
     const sal_uInt32 nMaximumQuadraticPixels(500000);
-    const BitmapEx aBitmapEx(
-        convertToBitmapEx(std::move(xEmbedSeq), aViewInformation2D,
-                          basegfx::B2DRange(0, 0, 
basegfx::fround(aDiscreteRange.getWidth()),
-                                            
basegfx::fround(aDiscreteRange.getHeight())),
-                          nMaximumQuadraticPixels));
+    const BitmapEx aBitmapEx(convertToBitmapEx(
+        std::move(xEmbedSeq), aViewInformation2D, 
basegfx::fround(aDiscreteRange.getWidth()),
+        basegfx::fround(aDiscreteRange.getHeight()), nMaximumQuadraticPixels));
 
     // add to target metafile (will create MetaFloatTransparentAction)
     
mpOutputDevice->DrawBitmapEx(Point(basegfx::fround<tools::Long>(aLogicRange.getMinX()),
diff --git a/drawinglayer/source/tools/converters.cxx 
b/drawinglayer/source/tools/converters.cxx
index a040a7cd3ac1..cf339f8aaa20 100644
--- a/drawinglayer/source/tools/converters.cxx
+++ b/drawinglayer/source/tools/converters.cxx
@@ -73,7 +73,7 @@ bool 
implPrepareConversion(drawinglayer::primitive2d::Primitive2DContainer& rSeq
 
 AlphaMask implcreateAlphaMask(drawinglayer::primitive2d::Primitive2DContainer& 
rSequence,
                               const drawinglayer::geometry::ViewInformation2D& 
rViewInformation2D,
-                              const Size& rSizePixel, const Point& rPoint, 
bool bUseLuminance)
+                              const Size& rSizePixel, bool bUseLuminance)
 {
     ScopedVclPtrInstance<VirtualDevice> pContent;
 
@@ -122,11 +122,12 @@ AlphaMask 
implcreateAlphaMask(drawinglayer::primitive2d::Primitive2DContainer& r
 
     // get alpha channel from vdev
     pContent->EnableMapMode(false);
+    const Point aEmptyPoint;
 
     // Convert from transparency->alpha.
     // FIXME in theory I should be able to directly construct alpha by using 
black as background
     // and white as foreground, but that doesn't work for some reason.
-    Bitmap aContentBitmap = pContent->GetBitmap(rPoint, rSizePixel);
+    Bitmap aContentBitmap = pContent->GetBitmap(aEmptyPoint, rSizePixel);
     aContentBitmap.Invert();
 
     return AlphaMask(aContentBitmap);
@@ -137,39 +138,34 @@ namespace drawinglayer
 {
 AlphaMask createAlphaMask(drawinglayer::primitive2d::Primitive2DContainer&& 
rSeq,
                           const geometry::ViewInformation2D& 
rViewInformation2D,
-                           const basegfx::B2DRange& rTargetRange,
+                          sal_uInt32 nDiscreteWidth, sal_uInt32 
nDiscreteHeight,
                           sal_uInt32 nMaxSquarePixels, bool bUseLuminance)
 {
     drawinglayer::primitive2d::Primitive2DContainer aSequence(std::move(rSeq));
-    sal_uInt32 nDiscreteWidth = rTargetRange.getWidth();
-    sal_uInt32 nDiscreteHeight = rTargetRange.getHeight();
 
     if (!implPrepareConversion(aSequence, nDiscreteWidth, nDiscreteHeight, 
nMaxSquarePixels))
     {
         return AlphaMask();
     }
 
-    const Point aPoint(rTargetRange.getMinX(), rTargetRange.getMinY());
     const Size aSizePixel(nDiscreteWidth, nDiscreteHeight);
 
-    return implcreateAlphaMask(aSequence, rViewInformation2D, aSizePixel, 
aPoint, bUseLuminance);
+    return implcreateAlphaMask(aSequence, rViewInformation2D, aSizePixel, 
bUseLuminance);
 }
 
 BitmapEx convertToBitmapEx(drawinglayer::primitive2d::Primitive2DContainer&& 
rSeq,
                            const geometry::ViewInformation2D& 
rViewInformation2D,
-                           const basegfx::B2DRange& rTargetRange,
+                           sal_uInt32 nDiscreteWidth, sal_uInt32 
nDiscreteHeight,
                            sal_uInt32 nMaxSquarePixels, bool 
bForceAlphaMaskCreation)
 {
     drawinglayer::primitive2d::Primitive2DContainer aSequence(std::move(rSeq));
-    sal_uInt32 nDiscreteWidth = rTargetRange.getWidth();
-    sal_uInt32 nDiscreteHeight = rTargetRange.getHeight();
 
     if (!implPrepareConversion(aSequence, nDiscreteWidth, nDiscreteHeight, 
nMaxSquarePixels))
     {
         return BitmapEx();
     }
 
-    const Point aPoint(rTargetRange.getMinX(), rTargetRange.getMinY());
+    const Point aEmptyPoint;
     const Size aSizePixel(nDiscreteWidth, nDiscreteHeight);
 
     // Create target VirtualDevice. Go back to using a simple RGB
@@ -228,7 +224,7 @@ BitmapEx 
convertToBitmapEx(drawinglayer::primitive2d::Primitive2DContainer&& rSe
     pContentProcessor->process(aSequence);
 
     // create final BitmapEx result (content)
-    Bitmap aRetval(pContent->GetBitmap(aPoint, aSizePixel));
+    Bitmap aRetval(pContent->GetBitmap(aEmptyPoint, aSizePixel));
 
 #ifdef DBG_UTIL
     static bool bDoSaveForVisualControl(false); // loplugin:constvars:ignore
@@ -249,7 +245,7 @@ BitmapEx 
convertToBitmapEx(drawinglayer::primitive2d::Primitive2DContainer&& rSe
     // Create the AlphaMask using a method that does this always correct (also 
used
     // now in GlowPrimitive2D and ShadowPrimitive2D which both only need the
     // AlphaMask to do their job, so speeding that up, too).
-    AlphaMask aAlpha(implcreateAlphaMask(aSequence, rViewInformation2D, 
aSizePixel, aPoint, false));
+    AlphaMask aAlpha(implcreateAlphaMask(aSequence, rViewInformation2D, 
aSizePixel, false));
 
 #ifdef DBG_UTIL
     if (bDoSaveForVisualControl)
@@ -360,7 +356,7 @@ BitmapEx 
convertPrimitive2DContainerToBitmapEx(primitive2d::Primitive2DContainer
         primitive2d::Primitive2DContainer xEmbedSeq{ xEmbedRef };
 
         BitmapEx aBitmapEx(convertToBitmapEx(std::move(xEmbedSeq), 
aViewInformation2D,
-                                             basegfx::B2DRange(0, 0, 
nDiscreteWidth, nDiscreteHeight),
+                                             nDiscreteWidth, nDiscreteHeight,
                                              nMaximumQuadraticPixels));
 
         if (aBitmapEx.IsEmpty())
diff --git a/include/drawinglayer/converters.hxx 
b/include/drawinglayer/converters.hxx
index 4e4d621f5d6a..d090b1e0a921 100644
--- a/include/drawinglayer/converters.hxx
+++ b/include/drawinglayer/converters.hxx
@@ -33,15 +33,15 @@ namespace drawinglayer
 //           for any content (e.g. gradients)
 AlphaMask DRAWINGLAYER_DLLPUBLIC createAlphaMask(
     drawinglayer::primitive2d::Primitive2DContainer&& rSeq,
-    const geometry::ViewInformation2D& rViewInformation2D, const 
basegfx::B2DRange& rTargetRange,
-    sal_uInt32 nMaxSquarePixels, bool bUseLuminance = false);
+    const geometry::ViewInformation2D& rViewInformation2D, sal_uInt32 
nDiscreteWidth,
+    sal_uInt32 nDiscreteHeight, sal_uInt32 nMaxSquarePixels, bool 
bUseLuminance = false);
 
 // Helper for convertPrimitive2DContainerToBitmapEx below, but can be also used
 // directly
 BitmapEx DRAWINGLAYER_DLLPUBLIC convertToBitmapEx(
     drawinglayer::primitive2d::Primitive2DContainer&& rSeq,
-    const geometry::ViewInformation2D& rViewInformation2D, const 
basegfx::B2DRange& rTargetRange,
-    sal_uInt32 nMaxSquarePixels, bool bForceAlphaMaskCreation = false);
+    const geometry::ViewInformation2D& rViewInformation2D, sal_uInt32 
nDiscreteWidth,
+    sal_uInt32 nDiscreteHeight, sal_uInt32 nMaxSquarePixels, bool 
bForceAlphaMaskCreation = false);
 
 // helper to convert any Primitive2DSequence to a good quality BitmapEx,
 // using default parameters
diff --git a/svgio/qa/cppunit/SvgImportTest.cxx 
b/svgio/qa/cppunit/SvgImportTest.cxx
index abf7f58c848b..31eb63c6075b 100644
--- a/svgio/qa/cppunit/SvgImportTest.cxx
+++ b/svgio/qa/cppunit/SvgImportTest.cxx
@@ -1625,13 +1625,13 @@ CPPUNIT_TEST_FIXTURE(Test, testTdf160517)
     assertXPath(pDocument,
             "/primitive2D/transform/bitmap"_ostr, "xy12"_ostr, "0");
     assertXPath(pDocument,
-            "/primitive2D//transform/bitmap"_ostr, "xy13"_ostr, "10");
+            "/primitive2D//transform/bitmap"_ostr, "xy13"_ostr, "0");
     assertXPath(pDocument,
             "/primitive2D//transform/bitmap"_ostr, "xy21"_ostr, "0");
     assertXPath(pDocument,
             "/primitive2D//transform/bitmap"_ostr, "xy22"_ostr, "110");
     assertXPath(pDocument,
-            "/primitive2D//transform/bitmap"_ostr, "xy23"_ostr, "10");
+            "/primitive2D//transform/bitmap"_ostr, "xy23"_ostr, "0");
     assertXPath(pDocument,
             "/primitive2D//transform/bitmap"_ostr, "xy31"_ostr, "0");
     assertXPath(pDocument,
@@ -1661,13 +1661,13 @@ CPPUNIT_TEST_FIXTURE(Test, testArithmeticComposite)
     assertXPath(pDocument,
             "/primitive2D/transform/transform/bitmap"_ostr, "xy12"_ostr, "0");
     assertXPath(pDocument,
-            "/primitive2D/transform/transform/bitmap"_ostr, "xy13"_ostr, "50");
+            "/primitive2D/transform/transform/bitmap"_ostr, "xy13"_ostr, "0");
     assertXPath(pDocument,
             "/primitive2D/transform/transform/bitmap"_ostr, "xy21"_ostr, "0");
     assertXPath(pDocument,
             "/primitive2D/transform/transform/bitmap"_ostr, "xy22"_ostr, 
"150");
     assertXPath(pDocument,
-            "/primitive2D/transform/transform/bitmap"_ostr, "xy23"_ostr, "50");
+            "/primitive2D/transform/transform/bitmap"_ostr, "xy23"_ostr, "0");
     assertXPath(pDocument,
             "/primitive2D/transform/transform/bitmap"_ostr, "xy31"_ostr, "0");
     assertXPath(pDocument,
@@ -1678,7 +1678,7 @@ CPPUNIT_TEST_FIXTURE(Test, testArithmeticComposite)
     // Check the colors in the diagonal
     OUString sDataRow = getXPath(pDocument, 
"/primitive2D/transform/transform/bitmap/data[25]"_ostr, "row"_ostr);
     std::vector<OUString> aPixels = comphelper::string::split(sDataRow, ',');
-    CPPUNIT_ASSERT_EQUAL(OUString("ff8000"), aPixels[25]);
+    CPPUNIT_ASSERT_EQUAL(OUString("000000"), aPixels[25]);
 
     sDataRow = getXPath(pDocument, 
"/primitive2D/transform/transform/bitmap/data[75]"_ostr, "row"_ostr);
     aPixels = comphelper::string::split(sDataRow, ',');
@@ -1686,7 +1686,7 @@ CPPUNIT_TEST_FIXTURE(Test, testArithmeticComposite)
 
     sDataRow = getXPath(pDocument, 
"/primitive2D/transform/transform/bitmap/data[125]"_ostr, "row"_ostr);
     aPixels = comphelper::string::split(sDataRow, ',');
-    CPPUNIT_ASSERT_EQUAL(OUString("000000"), aPixels[125]);
+    CPPUNIT_ASSERT_EQUAL(OUString("ff8000"), aPixels[125]);
 }
 
 CPPUNIT_TEST_FIXTURE(Test, testArithmeticComposite2)
@@ -1705,13 +1705,13 @@ CPPUNIT_TEST_FIXTURE(Test, testArithmeticComposite2)
     assertXPath(pDocument,
             "/primitive2D/transform/transform/bitmap"_ostr, "xy12"_ostr, "0");
     assertXPath(pDocument,
-            "/primitive2D/transform/transform/bitmap"_ostr, "xy13"_ostr, "20");
+            "/primitive2D/transform/transform/bitmap"_ostr, "xy13"_ostr, "0");
     assertXPath(pDocument,
             "/primitive2D/transform/transform/bitmap"_ostr, "xy21"_ostr, "0");
     assertXPath(pDocument,
             "/primitive2D/transform/transform/bitmap"_ostr, "xy22"_ostr, 
"150");
     assertXPath(pDocument,
-            "/primitive2D/transform/transform/bitmap"_ostr, "xy23"_ostr, "20");
+            "/primitive2D/transform/transform/bitmap"_ostr, "xy23"_ostr, "0");
     assertXPath(pDocument,
             "/primitive2D/transform/transform/bitmap"_ostr, "xy31"_ostr, "0");
     assertXPath(pDocument,
@@ -1777,6 +1777,50 @@ CPPUNIT_TEST_FIXTURE(Test, testTdf160726)
     CPPUNIT_ASSERT_EQUAL(OUString("ffff00"), aPixels[200]);
 }
 
+CPPUNIT_TEST_FIXTURE(Test, testTdf160782)
+{
+    xmlDocUniquePtr pDocument = 
dumpAndParseSvg(u"/svgio/qa/cppunit/data/tdf160782.svg");
+
+    assertXPath(pDocument,
+            "/primitive2D/transform/transform/bitmap"_ostr, "height"_ostr, 
"255");
+    assertXPath(pDocument,
+            "/primitive2D/transform/transform/bitmap"_ostr, "width"_ostr, 
"255");
+    assertXPath(pDocument,
+            "/primitive2D/transform/transform/bitmap/data"_ostr, 255);
+
+    assertXPath(pDocument,
+            "/primitive2D/transform/transform/bitmap"_ostr, "xy11"_ostr, 
"255");
+    assertXPath(pDocument,
+            "/primitive2D/transform/transform/bitmap"_ostr, "xy12"_ostr, "0");
+    assertXPath(pDocument,
+            "/primitive2D/transform/transform/bitmap"_ostr, "xy13"_ostr, "0");
+    assertXPath(pDocument,
+            "/primitive2D/transform/transform/bitmap"_ostr, "xy21"_ostr, "0");
+    assertXPath(pDocument,
+            "/primitive2D/transform/transform/bitmap"_ostr, "xy22"_ostr, 
"255");
+    assertXPath(pDocument,
+            "/primitive2D/transform/transform/bitmap"_ostr, "xy23"_ostr, "0");
+    assertXPath(pDocument,
+            "/primitive2D/transform/transform/bitmap"_ostr, "xy31"_ostr, "0");
+    assertXPath(pDocument,
+            "/primitive2D/transform/transform/bitmap"_ostr, "xy32"_ostr, "0");
+    assertXPath(pDocument,
+            "/primitive2D/transform/transform/bitmap"_ostr, "xy33"_ostr, "1");
+
+    // Check the colors in the diagonal
+    OUString sDataRow = getXPath(pDocument, 
"/primitive2D/transform/transform/bitmap/data[50]"_ostr, "row"_ostr);
+    std::vector<OUString> aPixels = comphelper::string::split(sDataRow, ',');
+    CPPUNIT_ASSERT_EQUAL(OUString("ff0000"), aPixels[50]);
+
+    sDataRow = getXPath(pDocument, 
"/primitive2D/transform/transform/bitmap/data[125]"_ostr, "row"_ostr);
+    aPixels = comphelper::string::split(sDataRow, ',');
+    CPPUNIT_ASSERT_EQUAL(OUString("ffff00"), aPixels[125]);
+
+    sDataRow = getXPath(pDocument, 
"/primitive2D/transform/transform/bitmap/data[200]"_ostr, "row"_ostr);
+    aPixels = comphelper::string::split(sDataRow, ',');
+    CPPUNIT_ASSERT_EQUAL(OUString("ffff00"), aPixels[200]);
+}
+
 CPPUNIT_TEST_FIXTURE(Test, testScreenBlend)
 {
     xmlDocUniquePtr pDocument = 
dumpAndParseSvg(u"/svgio/qa/cppunit/data/screenBlend.svg");
@@ -1793,13 +1837,13 @@ CPPUNIT_TEST_FIXTURE(Test, testScreenBlend)
     assertXPath(pDocument,
             "/primitive2D/transform/transform/bitmap"_ostr, "xy12"_ostr, "0");
     assertXPath(pDocument,
-            "/primitive2D/transform/transform/bitmap"_ostr, "xy13"_ostr, "20");
+            "/primitive2D/transform/transform/bitmap"_ostr, "xy13"_ostr, "0");
     assertXPath(pDocument,
             "/primitive2D/transform/transform/bitmap"_ostr, "xy21"_ostr, "0");
     assertXPath(pDocument,
             "/primitive2D/transform/transform/bitmap"_ostr, "xy22"_ostr, 
"150");
     assertXPath(pDocument,
-            "/primitive2D/transform/transform/bitmap"_ostr, "xy23"_ostr, "20");
+            "/primitive2D/transform/transform/bitmap"_ostr, "xy23"_ostr, "0");
     assertXPath(pDocument,
             "/primitive2D/transform/transform/bitmap"_ostr, "xy31"_ostr, "0");
     assertXPath(pDocument,
@@ -1837,13 +1881,13 @@ CPPUNIT_TEST_FIXTURE(Test, testMultiplyBlend)
     assertXPath(pDocument,
             "/primitive2D/transform/transform/bitmap"_ostr, "xy12"_ostr, "0");
     assertXPath(pDocument,
-            "/primitive2D/transform/transform/bitmap"_ostr, "xy13"_ostr, "20");
+            "/primitive2D/transform/transform/bitmap"_ostr, "xy13"_ostr, "0");
     assertXPath(pDocument,
             "/primitive2D/transform/transform/bitmap"_ostr, "xy21"_ostr, "0");
     assertXPath(pDocument,
             "/primitive2D/transform/transform/bitmap"_ostr, "xy22"_ostr, 
"150");
     assertXPath(pDocument,
-            "/primitive2D/transform/transform/bitmap"_ostr, "xy23"_ostr, "20");
+            "/primitive2D/transform/transform/bitmap"_ostr, "xy23"_ostr, "0");
     assertXPath(pDocument,
             "/primitive2D/transform/transform/bitmap"_ostr, "xy31"_ostr, "0");
     assertXPath(pDocument,
@@ -1881,13 +1925,13 @@ CPPUNIT_TEST_FIXTURE(Test, testDarkenBlend)
     assertXPath(pDocument,
             "/primitive2D/transform/transform/bitmap"_ostr, "xy12"_ostr, "0");
     assertXPath(pDocument,
-            "/primitive2D/transform/transform/bitmap"_ostr, "xy13"_ostr, "20");
+            "/primitive2D/transform/transform/bitmap"_ostr, "xy13"_ostr, "0");
     assertXPath(pDocument,
             "/primitive2D/transform/transform/bitmap"_ostr, "xy21"_ostr, "0");
     assertXPath(pDocument,
             "/primitive2D/transform/transform/bitmap"_ostr, "xy22"_ostr, 
"150");
     assertXPath(pDocument,
-            "/primitive2D/transform/transform/bitmap"_ostr, "xy23"_ostr, "20");
+            "/primitive2D/transform/transform/bitmap"_ostr, "xy23"_ostr, "0");
     assertXPath(pDocument,
             "/primitive2D/transform/transform/bitmap"_ostr, "xy31"_ostr, "0");
     assertXPath(pDocument,
@@ -1925,13 +1969,13 @@ CPPUNIT_TEST_FIXTURE(Test, testLightenBlend)
     assertXPath(pDocument,
             "/primitive2D/transform/transform/bitmap"_ostr, "xy12"_ostr, "0");
     assertXPath(pDocument,
-            "/primitive2D/transform/transform/bitmap"_ostr, "xy13"_ostr, "20");
+            "/primitive2D/transform/transform/bitmap"_ostr, "xy13"_ostr, "0");
     assertXPath(pDocument,
             "/primitive2D/transform/transform/bitmap"_ostr, "xy21"_ostr, "0");
     assertXPath(pDocument,
             "/primitive2D/transform/transform/bitmap"_ostr, "xy22"_ostr, 
"150");
     assertXPath(pDocument,
-            "/primitive2D/transform/transform/bitmap"_ostr, "xy23"_ostr, "20");
+            "/primitive2D/transform/transform/bitmap"_ostr, "xy23"_ostr, "0");
     assertXPath(pDocument,
             "/primitive2D/transform/transform/bitmap"_ostr, "xy31"_ostr, "0");
     assertXPath(pDocument,
diff --git a/svgio/qa/cppunit/data/tdf160782.svg 
b/svgio/qa/cppunit/data/tdf160782.svg
new file mode 100644
index 000000000000..1464e69120ae
--- /dev/null
+++ b/svgio/qa/cppunit/data/tdf160782.svg
@@ -0,0 +1,43 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<svg
+   xmlns:svg="http://www.w3.org/2000/svg";
+   xmlns="http://www.w3.org/2000/svg";
+   width="500"
+   height="500"
+   viewBox="0 0 500 500"
+   version="1.1">
+  <defs
+     id="defs2">
+    <filter
+       height="2"
+       width="2"
+       id="filter2103">
+      <feOffset
+         result="result1"
+         id="feOffset2097"
+         dy="50"
+         dx="50" />
+      <feColorMatrix
+         result="result2"
+         values="1 0 0 0 0 1 0 0 0 0 0 0 1 0 0 0 0 0 1 0 "
+         id="feColorMatrix2099" />
+      <feComposite
+         operator="arithmetic"
+         in="result2"
+         id="feComposite2101"
+         in2="SourceGraphic"
+         k1="0"
+         k2="1"
+         k3="1"
+         k4="0"/>
+    </filter>
+  </defs>
+  <g>
+    <circle
+       r="100"
+       cy="100"
+       cx="100"
+       id="circle2113"
+       
style="fill:#ff0000;stroke:#000000;stroke-width:10.754;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;filter:url(#filter2103)"
 />
+  </g>
+</svg>
diff --git a/svgio/source/svgreader/svgfeblendnode.cxx 
b/svgio/source/svgreader/svgfeblendnode.cxx
index af6406ebf58b..a5109aa24fe6 100644
--- a/svgio/source/svgreader/svgfeblendnode.cxx
+++ b/svgio/source/svgreader/svgfeblendnode.cxx
@@ -134,12 +134,8 @@ void 
SvgFeBlendNode::apply(drawinglayer::primitive2d::Primitive2DContainer& rTar
             aRange2 = pSource2->getB2DRange(aViewInformation2D);
         }
 
-        const sal_Int32 nX1 = std::min(aRange.getMinX(), aRange2.getMinX());
-        const sal_Int32 nY1 = std::min(aRange.getMinY(), aRange2.getMinY());
-        const sal_Int32 nX2 = std::max(aRange.getMaxX(), aRange2.getMaxX());
-        const sal_Int32 nY2 = std::max(aRange.getMaxY(), aRange2.getMaxY());
-
-        const basegfx::B2DRange aBaseRange(nX1, nY1, nX1 + nX2, nY1 + nY2);
+        const basegfx::B2DRange aBaseRange(0, 0, std::max(aRange.getMaxX(), 
aRange2.getMaxX()),
+                                           std::max(aRange.getMaxY(), 
aRange2.getMaxY()));
 
         BitmapEx aBmpEx, aBmpEx2;
 
@@ -147,28 +143,28 @@ void 
SvgFeBlendNode::apply(drawinglayer::primitive2d::Primitive2DContainer& rTar
         {
             drawinglayer::primitive2d::Primitive2DContainer aSource(*pSource);
             aBmpEx = drawinglayer::convertToBitmapEx(
-                std::move(aSource), aViewInformation2D, aBaseRange,
-                aBaseRange.getWidth() * aBaseRange.getHeight());
+                std::move(aSource), aViewInformation2D, aBaseRange.getWidth(),
+                aBaseRange.getHeight(), aBaseRange.getWidth() * 
aBaseRange.getHeight());
         }
         else
         {
             aBmpEx = drawinglayer::convertToBitmapEx(
-                std::move(rTarget), aViewInformation2D, aBaseRange,
-                aBaseRange.getWidth() * aBaseRange.getHeight());
+                std::move(rTarget), aViewInformation2D, aBaseRange.getWidth(),
+                aBaseRange.getHeight(), aBaseRange.getWidth() * 
aBaseRange.getHeight());
         }
 
         if (pSource2)
         {
             drawinglayer::primitive2d::Primitive2DContainer aSource(*pSource2);
             aBmpEx2 = drawinglayer::convertToBitmapEx(
-                std::move(aSource), aViewInformation2D, aBaseRange,
-                aBaseRange.getWidth() * aBaseRange.getHeight());
+                std::move(aSource), aViewInformation2D, aBaseRange.getWidth(),
+                aBaseRange.getHeight(), aBaseRange.getWidth() * 
aBaseRange.getHeight());
         }
         else
         {
             aBmpEx2 = drawinglayer::convertToBitmapEx(
-                std::move(rTarget), aViewInformation2D, aBaseRange,
-                aBaseRange.getWidth() * aBaseRange.getHeight());
+                std::move(rTarget), aViewInformation2D, aBaseRange.getWidth(),
+                aBaseRange.getHeight(), aBaseRange.getWidth() * 
aBaseRange.getHeight());
         }
 
         BitmapEx aResBmpEx;
diff --git a/svgio/source/svgreader/svgfecompositenode.cxx 
b/svgio/source/svgreader/svgfecompositenode.cxx
index 91364363ca22..0dea908847f6 100644
--- a/svgio/source/svgreader/svgfecompositenode.cxx
+++ b/svgio/source/svgreader/svgfecompositenode.cxx
@@ -223,12 +223,8 @@ void 
SvgFeCompositeNode::apply(drawinglayer::primitive2d::Primitive2DContainer&
             aRange2 = pSource2->getB2DRange(aViewInformation2D);
         }
 
-        const sal_uInt32 nX1 = std::min(aRange.getMinX(), aRange2.getMinX());
-        const sal_uInt32 nY1 = std::min(aRange.getMinY(), aRange2.getMinY());
-        const sal_uInt32 nX2 = std::max(aRange.getMaxX(), aRange2.getMaxX());
-        const sal_uInt32 nY2 = std::max(aRange.getMaxY(), aRange2.getMaxY());
-
-        const basegfx::B2DRange aBaseRange(nX1, nY1, nX1 + nX2, nY1 + nY2);
+        const basegfx::B2DRange aBaseRange(0, 0, std::max(aRange.getMaxX(), 
aRange2.getMaxX()),
+                                           std::max(aRange.getMaxY(), 
aRange2.getMaxY()));
 
         BitmapEx aBmpEx, aBmpEx2;
 
@@ -236,28 +232,28 @@ void 
SvgFeCompositeNode::apply(drawinglayer::primitive2d::Primitive2DContainer&
         {
             drawinglayer::primitive2d::Primitive2DContainer aSource(*pSource);
             aBmpEx = drawinglayer::convertToBitmapEx(
-                std::move(aSource), aViewInformation2D, aBaseRange,
-                aBaseRange.getWidth() * aBaseRange.getHeight());
+                std::move(aSource), aViewInformation2D, aBaseRange.getWidth(),
+                aBaseRange.getHeight(), aBaseRange.getWidth() * 
aBaseRange.getHeight());
         }
         else
         {
             aBmpEx = drawinglayer::convertToBitmapEx(
-                std::move(rTarget), aViewInformation2D, aBaseRange,
-                aBaseRange.getWidth() * aBaseRange.getHeight());
+                std::move(rTarget), aViewInformation2D, aBaseRange.getWidth(),
+                aBaseRange.getHeight(), aBaseRange.getWidth() * 
aBaseRange.getHeight());
         }
 
         if (pSource2)
         {
             drawinglayer::primitive2d::Primitive2DContainer aSource(*pSource2);
             aBmpEx2 = drawinglayer::convertToBitmapEx(
-                std::move(aSource), aViewInformation2D, aBaseRange,
-                aBaseRange.getWidth() * aBaseRange.getHeight());
+                std::move(aSource), aViewInformation2D, aBaseRange.getWidth(),
+                aBaseRange.getHeight(), aBaseRange.getWidth() * 
aBaseRange.getHeight());
         }
         else
         {
             aBmpEx2 = drawinglayer::convertToBitmapEx(
-                std::move(rTarget), aViewInformation2D, aBaseRange,
-                aBaseRange.getWidth() * aBaseRange.getHeight());
+                std::move(rTarget), aViewInformation2D, aBaseRange.getWidth(),
+                aBaseRange.getHeight(), aBaseRange.getWidth() * 
aBaseRange.getHeight());
         }
 
         BitmapArithmeticBlendFilter aArithmeticFilter(aBmpEx, aBmpEx2);

Reply via email to