diff options
author | Xisco Fauli <xiscofauli@libreoffice.org> | 2024-04-21 20:41:55 +0200 |
---|---|---|
committer | Xisco Fauli <xiscofauli@libreoffice.org> | 2024-04-22 11:53:41 +0200 |
commit | 4b6e0f2c88debaedb514c868e061c21e15215b6e (patch) | |
tree | a1744bdcdeb1bc90437df56c99a9bfcb5a84e219 /svgio | |
parent | 196c22e88138796fb1204610bd5d4ad8b8cd8a85 (diff) |
tdf#160726, tdf#48062: Simplify how BitmapExs are created
In my initial approach, I tranformed the primitive2DContainers
before converting them to BitmapEx. This caused circles like
https://bugs.documentfoundation.org/attachment.cgi?id=193790
not to be displayed.
Simplify how BitmapExs are created by just using the range both
primitive2DContainers have in common. This way, DrawBitmapInRect
can be dropped now
Change-Id: I2401dc87b98e04b9cf9f5ebade2b5622d884fc3a
Reviewed-on: https://gerrit.libreoffice.org/c/core/+/166391
Tested-by: Xisco Fauli <xiscofauli@libreoffice.org>
Reviewed-by: Xisco Fauli <xiscofauli@libreoffice.org>
Diffstat (limited to 'svgio')
-rw-r--r-- | svgio/inc/svgfilternode.hxx | 3 | ||||
-rw-r--r-- | svgio/qa/cppunit/SvgImportTest.cxx | 161 | ||||
-rw-r--r-- | svgio/qa/cppunit/data/arithmetic.svg | 8 | ||||
-rw-r--r-- | svgio/qa/cppunit/data/arithmetic2.svg | 8 | ||||
-rw-r--r-- | svgio/qa/cppunit/data/tdf160726.svg | 43 | ||||
-rw-r--r-- | svgio/source/svgreader/svgfeblendnode.cxx | 72 | ||||
-rw-r--r-- | svgio/source/svgreader/svgfecompositenode.cxx | 67 | ||||
-rw-r--r-- | svgio/source/svgreader/svgfilternode.cxx | 21 |
8 files changed, 310 insertions, 73 deletions
diff --git a/svgio/inc/svgfilternode.hxx b/svgio/inc/svgfilternode.hxx index ec42d3c52df4..7aa522173a87 100644 --- a/svgio/inc/svgfilternode.hxx +++ b/svgio/inc/svgfilternode.hxx @@ -23,7 +23,6 @@ #include "svgnode.hxx" #include "svgstyleattributes.hxx" #include <basegfx/matrix/b2dhommatrix.hxx> -#include <vcl/bitmapex.hxx> typedef std::unordered_map<OUString, drawinglayer::primitive2d::Primitive2DContainer> IdGraphicSourceMapper; @@ -47,8 +46,6 @@ public: drawinglayer::primitive2d::Primitive2DContainer pGraphicSource) const; const drawinglayer::primitive2d::Primitive2DContainer* findGraphicSource(const OUString& rStr) const; - - static BitmapEx convertToBitmapEx(const drawinglayer::primitive2d::Primitive2DContainer* pSeq); }; } // end of namespace svgio::svgreader diff --git a/svgio/qa/cppunit/SvgImportTest.cxx b/svgio/qa/cppunit/SvgImportTest.cxx index e05fe539e1c0..93d43fae85e2 100644 --- a/svgio/qa/cppunit/SvgImportTest.cxx +++ b/svgio/qa/cppunit/SvgImportTest.cxx @@ -1614,16 +1614,167 @@ CPPUNIT_TEST_FIXTURE(Test, testTdf160517) xmlDocUniquePtr pDocument = dumpAndParseSvg(u"/svgio/qa/cppunit/data/tdf160517.svg"); assertXPath(pDocument, - "/primitive2D/transform/bitmap"_ostr, "height"_ostr, "100"); + "/primitive2D/transform/bitmap"_ostr, "height"_ostr, "110"); assertXPath(pDocument, - "/primitive2D/transform/bitmap"_ostr, "width"_ostr, "100"); + "/primitive2D/transform/bitmap"_ostr, "width"_ostr, "110"); assertXPath(pDocument, - "/primitive2D/transform/bitmap/data"_ostr, 100); + "/primitive2D/transform/bitmap/data"_ostr, 110); + + assertXPath(pDocument, + "/primitive2D/transform/bitmap"_ostr, "xy11"_ostr, "110"); + assertXPath(pDocument, + "/primitive2D/transform/bitmap"_ostr, "xy12"_ostr, "0"); + assertXPath(pDocument, + "/primitive2D//transform/bitmap"_ostr, "xy13"_ostr, "10"); + 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"); + assertXPath(pDocument, + "/primitive2D//transform/bitmap"_ostr, "xy31"_ostr, "0"); + assertXPath(pDocument, + "/primitive2D//transform/bitmap"_ostr, "xy32"_ostr, "0"); + assertXPath(pDocument, + "/primitive2D//transform/bitmap"_ostr, "xy33"_ostr, "1"); // Check the color of a pixel in the middle - const OUString sDataRow = getXPath(pDocument, "/primitive2D/transform/bitmap/data[50]"_ostr, "row"_ostr); + const OUString sDataRow = getXPath(pDocument, "/primitive2D/transform/bitmap/data[55]"_ostr, "row"_ostr); std::vector<OUString> aPixels = comphelper::string::split(sDataRow, ','); - CPPUNIT_ASSERT_EQUAL(OUString("008100"), aPixels[50]); + CPPUNIT_ASSERT_EQUAL(OUString("008100"), aPixels[55]); +} + +CPPUNIT_TEST_FIXTURE(Test, testArithmeticComposite) +{ + xmlDocUniquePtr pDocument = dumpAndParseSvg(u"/svgio/qa/cppunit/data/arithmetic.svg"); + + assertXPath(pDocument, + "/primitive2D/transform/transform/bitmap"_ostr, "height"_ostr, "150"); + assertXPath(pDocument, + "/primitive2D/transform/transform/bitmap"_ostr, "width"_ostr, "150"); + assertXPath(pDocument, + "/primitive2D/transform/transform/bitmap/data"_ostr, 150); + + assertXPath(pDocument, + "/primitive2D/transform/transform/bitmap"_ostr, "xy11"_ostr, "150"); + assertXPath(pDocument, + "/primitive2D/transform/transform/bitmap"_ostr, "xy12"_ostr, "0"); + assertXPath(pDocument, + "/primitive2D/transform/transform/bitmap"_ostr, "xy13"_ostr, "50"); + 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"); + 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[25]"_ostr, "row"_ostr); + std::vector<OUString> aPixels = comphelper::string::split(sDataRow, ','); + CPPUNIT_ASSERT_EQUAL(OUString("ff8000"), aPixels[25]); + + sDataRow = getXPath(pDocument, "/primitive2D/transform/transform/bitmap/data[75]"_ostr, "row"_ostr); + aPixels = comphelper::string::split(sDataRow, ','); + CPPUNIT_ASSERT_EQUAL(OUString("ff8000"), aPixels[75]); + + 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_TEST_FIXTURE(Test, testArithmeticComposite2) +{ + xmlDocUniquePtr pDocument = dumpAndParseSvg(u"/svgio/qa/cppunit/data/arithmetic2.svg"); + + assertXPath(pDocument, + "/primitive2D/transform/transform/bitmap"_ostr, "height"_ostr, "150"); + assertXPath(pDocument, + "/primitive2D/transform/transform/bitmap"_ostr, "width"_ostr, "150"); + assertXPath(pDocument, + "/primitive2D/transform/transform/bitmap/data"_ostr, 150); + + assertXPath(pDocument, + "/primitive2D/transform/transform/bitmap"_ostr, "xy11"_ostr, "150"); + assertXPath(pDocument, + "/primitive2D/transform/transform/bitmap"_ostr, "xy12"_ostr, "0"); + assertXPath(pDocument, + "/primitive2D/transform/transform/bitmap"_ostr, "xy13"_ostr, "20"); + 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"); + 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[25]"_ostr, "row"_ostr); + std::vector<OUString> aPixels = comphelper::string::split(sDataRow, ','); + CPPUNIT_ASSERT_EQUAL(OUString("ff0000"), aPixels[25]); + + sDataRow = getXPath(pDocument, "/primitive2D/transform/transform/bitmap/data[75]"_ostr, "row"_ostr); + aPixels = comphelper::string::split(sDataRow, ','); + CPPUNIT_ASSERT_EQUAL(OUString("ff8000"), aPixels[75]); + + sDataRow = getXPath(pDocument, "/primitive2D/transform/transform/bitmap/data[125]"_ostr, "row"_ostr); + aPixels = comphelper::string::split(sDataRow, ','); + CPPUNIT_ASSERT_EQUAL(OUString("008000"), aPixels[125]); +} + +CPPUNIT_TEST_FIXTURE(Test, testTdf160726) +{ + xmlDocUniquePtr pDocument = dumpAndParseSvg(u"/svgio/qa/cppunit/data/tdf160726.svg"); + + assertXPath(pDocument, + "/primitive2D/transform/transform/bitmap"_ostr, "height"_ostr, "250"); + assertXPath(pDocument, + "/primitive2D/transform/transform/bitmap"_ostr, "width"_ostr, "250"); + assertXPath(pDocument, + "/primitive2D/transform/transform/bitmap/data"_ostr, 250); + + assertXPath(pDocument, + "/primitive2D/transform/transform/bitmap"_ostr, "xy11"_ostr, "250"); + 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, "250"); + 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, testTdf149880) diff --git a/svgio/qa/cppunit/data/arithmetic.svg b/svgio/qa/cppunit/data/arithmetic.svg new file mode 100644 index 000000000000..cc22eedbe10e --- /dev/null +++ b/svgio/qa/cppunit/data/arithmetic.svg @@ -0,0 +1,8 @@ +<svg width="100" height="140" viewBox="0 0 200 280" xmlns="http://www.w3.org/2000/svg"> + <filter id="filter" filterUnits="userSpaceOnUse" x="0" y="0" width="100%" height="100%"> + <feFlood x="50" y="50" width="100" height="100" flood-color="red" flood-opacity="1" result="img1"></feFlood> + <feFlood x="50" y="50" width="100" height="100" flood-color="green" flood-opacity="1" result="img2"></feFlood> + <feComposite in="img1" in2="img2" operator="arithmetic" k1="0" k2="1" k3="1" k4="0"></feComposite> + </filter> + <use style="filter: url(#filter)"></use> +</svg> diff --git a/svgio/qa/cppunit/data/arithmetic2.svg b/svgio/qa/cppunit/data/arithmetic2.svg new file mode 100644 index 000000000000..ba58e309398b --- /dev/null +++ b/svgio/qa/cppunit/data/arithmetic2.svg @@ -0,0 +1,8 @@ +<svg width="100" height="140" viewBox="0 0 200 280" xmlns="http://www.w3.org/2000/svg"> + <filter id="filter" filterUnits="userSpaceOnUse" x="0" y="0" width="100%" height="100%"> + <feFlood x="20" y="20" width="100" height="100" flood-color="red" flood-opacity="1" result="img1"></feFlood> + <feFlood x="50" y="50" width="100" height="100" flood-color="green" flood-opacity="1" result="img2"></feFlood> + <feComposite in="img1" in2="img2" operator="arithmetic" k1="0" k2="1" k3="1" k4="0"></feComposite> + </filter> + <use style="filter: url(#filter)"></use> +</svg> diff --git a/svgio/qa/cppunit/data/tdf160726.svg b/svgio/qa/cppunit/data/tdf160726.svg new file mode 100644 index 000000000000..7a9ac339984c --- /dev/null +++ b/svgio/qa/cppunit/data/tdf160726.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;filter:url(#filter2103)" /> + </g> +</svg> diff --git a/svgio/source/svgreader/svgfeblendnode.cxx b/svgio/source/svgreader/svgfeblendnode.cxx index e1440185ff23..eace3a53f63e 100644 --- a/svgio/source/svgreader/svgfeblendnode.cxx +++ b/svgio/source/svgreader/svgfeblendnode.cxx @@ -87,48 +87,74 @@ void SvgFeBlendNode::parseAttribute(SVGToken aSVGToken, const OUString& aContent void SvgFeBlendNode::apply(drawinglayer::primitive2d::Primitive2DContainer& rTarget, const SvgFilterNode* pParent) const { + const drawinglayer::primitive2d::Primitive2DContainer* pSource + = pParent->findGraphicSource(maIn); + const drawinglayer::primitive2d::Primitive2DContainer* pSource2 + = pParent->findGraphicSource(maIn2); + if (maMode == Mode::Normal) { - if (const drawinglayer::primitive2d::Primitive2DContainer* rSource2 - = pParent->findGraphicSource(maIn2)) + // Process maIn2 first + if (pSource2) { - rTarget = *rSource2; + rTarget = *pSource2; } - if (const drawinglayer::primitive2d::Primitive2DContainer* rSource - = pParent->findGraphicSource(maIn)) + if (pSource) { - rTarget.append(*rSource); + rTarget.append(*pSource); } } else if (maMode == Mode::Screen) { basegfx::B2DRange aRange, aRange2; - BitmapEx aBmpEx, aBmpEx2; - - if (const drawinglayer::primitive2d::Primitive2DContainer* pSource - = pParent->findGraphicSource(maIn)) + const drawinglayer::geometry::ViewInformation2D aViewInformation2D; + if (pSource) { - const drawinglayer::geometry::ViewInformation2D aViewInformation2D; aRange = pSource->getB2DRange(aViewInformation2D); - aBmpEx = convertToBitmapEx(pSource); } - if (const drawinglayer::primitive2d::Primitive2DContainer* pSource2 - = pParent->findGraphicSource(maIn2)) + if (pSource2) { - const drawinglayer::geometry::ViewInformation2D aViewInformation2D; aRange2 = pSource2->getB2DRange(aViewInformation2D); - aBmpEx2 = convertToBitmapEx(pSource2); } - basegfx::B2DRectangle aBaseRect(std::min(aRange.getMinX(), aRange2.getMinX()), - std::min(aRange.getMinY(), aRange2.getMinY()), - std::max(aRange.getMaxX(), aRange2.getMaxX()), - std::max(aRange.getMaxY(), aRange2.getMaxY())); + 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); - aBmpEx = vcl::bitmap::DrawBitmapInRect(aBmpEx, aRange, aBaseRect); - aBmpEx2 = vcl::bitmap::DrawBitmapInRect(aBmpEx2, aRange2, aBaseRect); + BitmapEx aBmpEx, aBmpEx2; + + if (pSource) + { + drawinglayer::primitive2d::Primitive2DContainer aSource(*pSource); + aBmpEx = drawinglayer::convertToBitmapEx( + std::move(aSource), aViewInformation2D, aBaseRange, + aBaseRange.getWidth() * aBaseRange.getHeight()); + } + else + { + aBmpEx = drawinglayer::convertToBitmapEx( + std::move(rTarget), aViewInformation2D, aBaseRange, + aBaseRange.getWidth() * aBaseRange.getHeight()); + } + + if (pSource2) + { + drawinglayer::primitive2d::Primitive2DContainer aSource(*pSource2); + aBmpEx2 = drawinglayer::convertToBitmapEx( + std::move(aSource), aViewInformation2D, aBaseRange, + aBaseRange.getWidth() * aBaseRange.getHeight()); + } + else + { + aBmpEx2 = drawinglayer::convertToBitmapEx( + std::move(rTarget), aViewInformation2D, aBaseRange, + aBaseRange.getWidth() * aBaseRange.getHeight()); + } BitmapScreenBlendFilter aScreenBlendFilter(aBmpEx, aBmpEx2); BitmapEx aResBmpEx = aScreenBlendFilter.execute(); @@ -136,7 +162,7 @@ void SvgFeBlendNode::apply(drawinglayer::primitive2d::Primitive2DContainer& rTar const drawinglayer::primitive2d::Primitive2DReference xRef( new drawinglayer::primitive2d::BitmapPrimitive2D( aResBmpEx, basegfx::utils::createScaleTranslateB2DHomMatrix( - aBaseRect.getRange(), aBaseRect.getMinimum()))); + aBaseRange.getRange(), aBaseRange.getMinimum()))); rTarget = drawinglayer::primitive2d::Primitive2DContainer{ xRef }; } diff --git a/svgio/source/svgreader/svgfecompositenode.cxx b/svgio/source/svgreader/svgfecompositenode.cxx index 3eba9f300062..91364363ca22 100644 --- a/svgio/source/svgreader/svgfecompositenode.cxx +++ b/svgio/source/svgreader/svgfecompositenode.cxx @@ -148,13 +148,17 @@ void SvgFeCompositeNode::parseAttribute(SVGToken aSVGToken, const OUString& aCon void SvgFeCompositeNode::apply(drawinglayer::primitive2d::Primitive2DContainer& rTarget, const SvgFilterNode* pParent) const { + const drawinglayer::primitive2d::Primitive2DContainer* pSource + = pParent->findGraphicSource(maIn); + const drawinglayer::primitive2d::Primitive2DContainer* pSource2 + = pParent->findGraphicSource(maIn2); + if (maOperator != Operator::Arithmetic) { basegfx::B2DPolyPolygon aPolyPolygon, aPolyPolygon2; // Process maIn2 first - if (const drawinglayer::primitive2d::Primitive2DContainer* pSource2 - = pParent->findGraphicSource(maIn2)) + if (pSource2) { rTarget.append(*pSource2); drawinglayer::processor2d::ContourExtractor2D aExtractor( @@ -164,8 +168,7 @@ void SvgFeCompositeNode::apply(drawinglayer::primitive2d::Primitive2DContainer& aPolyPolygon2 = basegfx::utils::mergeToSinglePolyPolygon(rResult); } - if (const drawinglayer::primitive2d::Primitive2DContainer* pSource - = pParent->findGraphicSource(maIn)) + if (pSource) { rTarget.append(*pSource); drawinglayer::processor2d::ContourExtractor2D aExtractor( @@ -209,31 +212,53 @@ void SvgFeCompositeNode::apply(drawinglayer::primitive2d::Primitive2DContainer& else { basegfx::B2DRange aRange, aRange2; - BitmapEx aBmpEx, aBmpEx2; - - if (const drawinglayer::primitive2d::Primitive2DContainer* pSource - = pParent->findGraphicSource(maIn)) + const drawinglayer::geometry::ViewInformation2D aViewInformation2D; + if (pSource) { - const drawinglayer::geometry::ViewInformation2D aViewInformation2D; aRange = pSource->getB2DRange(aViewInformation2D); - aBmpEx = convertToBitmapEx(pSource); } - if (const drawinglayer::primitive2d::Primitive2DContainer* pSource2 - = pParent->findGraphicSource(maIn2)) + if (pSource2) { - const drawinglayer::geometry::ViewInformation2D aViewInformation2D; aRange2 = pSource2->getB2DRange(aViewInformation2D); - aBmpEx2 = convertToBitmapEx(pSource2); } - basegfx::B2DRectangle aBaseRect(std::min(aRange.getMinX(), aRange2.getMinX()), - std::min(aRange.getMinY(), aRange2.getMinY()), - std::max(aRange.getMaxX(), aRange2.getMaxX()), - std::max(aRange.getMaxY(), aRange2.getMaxY())); + 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); - aBmpEx = vcl::bitmap::DrawBitmapInRect(aBmpEx, aRange, aBaseRect); - aBmpEx2 = vcl::bitmap::DrawBitmapInRect(aBmpEx2, aRange2, aBaseRect); + BitmapEx aBmpEx, aBmpEx2; + + if (pSource) + { + drawinglayer::primitive2d::Primitive2DContainer aSource(*pSource); + aBmpEx = drawinglayer::convertToBitmapEx( + std::move(aSource), aViewInformation2D, aBaseRange, + aBaseRange.getWidth() * aBaseRange.getHeight()); + } + else + { + aBmpEx = drawinglayer::convertToBitmapEx( + std::move(rTarget), aViewInformation2D, aBaseRange, + aBaseRange.getWidth() * aBaseRange.getHeight()); + } + + if (pSource2) + { + drawinglayer::primitive2d::Primitive2DContainer aSource(*pSource2); + aBmpEx2 = drawinglayer::convertToBitmapEx( + std::move(aSource), aViewInformation2D, aBaseRange, + aBaseRange.getWidth() * aBaseRange.getHeight()); + } + else + { + aBmpEx2 = drawinglayer::convertToBitmapEx( + std::move(rTarget), aViewInformation2D, aBaseRange, + aBaseRange.getWidth() * aBaseRange.getHeight()); + } BitmapArithmeticBlendFilter aArithmeticFilter(aBmpEx, aBmpEx2); BitmapEx aResBmpEx = aArithmeticFilter.execute(maK1.getNumber(), maK2.getNumber(), @@ -242,7 +267,7 @@ void SvgFeCompositeNode::apply(drawinglayer::primitive2d::Primitive2DContainer& const drawinglayer::primitive2d::Primitive2DReference xRef( new drawinglayer::primitive2d::BitmapPrimitive2D( aResBmpEx, basegfx::utils::createScaleTranslateB2DHomMatrix( - aBaseRect.getRange(), aBaseRect.getMinimum()))); + aBaseRange.getRange(), aBaseRange.getMinimum()))); rTarget = drawinglayer::primitive2d::Primitive2DContainer{ xRef }; } } diff --git a/svgio/source/svgreader/svgfilternode.cxx b/svgio/source/svgreader/svgfilternode.cxx index 4b97563478e1..5b2f7e867523 100644 --- a/svgio/source/svgreader/svgfilternode.cxx +++ b/svgio/source/svgreader/svgfilternode.cxx @@ -25,10 +25,6 @@ #include <svgfegaussianblurnode.hxx> #include <svgfeoffsetnode.hxx> -#include <basegfx/matrix/b2dhommatrixtools.hxx> -#include <drawinglayer/primitive2d/transformprimitive2d.hxx> -#include <drawinglayer/converters.hxx> - namespace svgio::svgreader { SvgFilterNode::SvgFilterNode(SVGToken aType, SvgDocument& rDocument, SvgNode* pParent) @@ -95,23 +91,6 @@ SvgFilterNode::findGraphicSource(const OUString& rStr) const } } -BitmapEx -SvgFilterNode::convertToBitmapEx(const drawinglayer::primitive2d::Primitive2DContainer* pSeq) -{ - drawinglayer::primitive2d::Primitive2DContainer aSequence(*pSeq); - - const drawinglayer::geometry::ViewInformation2D aViewInformation2D; - basegfx::B2DRange aRange = aSequence.getB2DRange(aViewInformation2D); - basegfx::B2DHomMatrix aEmbedding( - basegfx::utils::createTranslateB2DHomMatrix(-aRange.getMinX(), -aRange.getMinY())); - aEmbedding.scale(aRange.getWidth(), aRange.getHeight()); - const drawinglayer::primitive2d::Primitive2DReference xEmbedRef( - new drawinglayer::primitive2d::TransformPrimitive2D(aEmbedding, std::move(aSequence))); - drawinglayer::primitive2d::Primitive2DContainer xEmbedSeq{ xEmbedRef }; - return drawinglayer::convertToBitmapEx(std::move(xEmbedSeq), aViewInformation2D, - aRange.getWidth(), aRange.getHeight(), 500000); -} - } // end of namespace svgio::svgreader /* vim:set shiftwidth=4 softtabstop=4 expandtab: */ |