summaryrefslogtreecommitdiff
path: root/svgio
diff options
context:
space:
mode:
authorXisco Fauli <xiscofauli@libreoffice.org>2024-04-21 20:41:55 +0200
committerXisco Fauli <xiscofauli@libreoffice.org>2024-04-22 11:53:41 +0200
commit4b6e0f2c88debaedb514c868e061c21e15215b6e (patch)
treea1744bdcdeb1bc90437df56c99a9bfcb5a84e219 /svgio
parent196c22e88138796fb1204610bd5d4ad8b8cd8a85 (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.hxx3
-rw-r--r--svgio/qa/cppunit/SvgImportTest.cxx161
-rw-r--r--svgio/qa/cppunit/data/arithmetic.svg8
-rw-r--r--svgio/qa/cppunit/data/arithmetic2.svg8
-rw-r--r--svgio/qa/cppunit/data/tdf160726.svg43
-rw-r--r--svgio/source/svgreader/svgfeblendnode.cxx72
-rw-r--r--svgio/source/svgreader/svgfecompositenode.cxx67
-rw-r--r--svgio/source/svgreader/svgfilternode.cxx21
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: */