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