svgio/Library_svgio.mk                        |    2 
 svgio/inc/svgfeblendnode.hxx                  |   46 ++++++++++++++
 svgio/inc/svgfecompositenode.hxx              |   46 ++++++++++++++
 svgio/inc/svgtoken.hxx                        |    3 
 svgio/qa/cppunit/SvgImportTest.cxx            |   52 ++++++++++++++++
 svgio/qa/cppunit/data/filterFeBlend.svg       |   10 +++
 svgio/qa/cppunit/data/filterFeComposite.svg   |   10 +++
 svgio/source/svgreader/svgdocumenthandler.cxx |   16 +++++
 svgio/source/svgreader/svgfeblendnode.cxx     |   83 ++++++++++++++++++++++++++
 svgio/source/svgreader/svgfecompositenode.cxx |   83 ++++++++++++++++++++++++++
 svgio/source/svgreader/svgtoken.cxx           |    3 
 11 files changed, 354 insertions(+)

New commits:
commit 626047bababf3a84b05103fbed9ecabed33a359f
Author:     Xisco Fauli <xiscofa...@libreoffice.org>
AuthorDate: Wed Mar 13 11:39:26 2024 +0100
Commit:     Xisco Fauli <xiscofa...@libreoffice.org>
CommitDate: Wed Mar 13 19:02:38 2024 +0100

    tdf#48062: Add support for feComposite filter
    
    At the moment, only 'over' operator is supported
    
    Change-Id: If21c9ba39b3cd0b772ea27165cda7ae40fb42d60
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/164765
    Tested-by: Jenkins
    Reviewed-by: Xisco Fauli <xiscofa...@libreoffice.org>

diff --git a/svgio/Library_svgio.mk b/svgio/Library_svgio.mk
index e1b0e55a7a9e..7bc518c71b93 100644
--- a/svgio/Library_svgio.mk
+++ b/svgio/Library_svgio.mk
@@ -62,6 +62,7 @@ $(eval $(call gb_Library_add_exception_objects,svgio,\
     svgio/source/svgreader/svganode \
     svgio/source/svgreader/svgfeblendnode \
     svgio/source/svgreader/svgfecolormatrixnode \
+    svgio/source/svgreader/svgfecompositenode \
     svgio/source/svgreader/svgfedropshadownode \
     svgio/source/svgreader/svgfefloodnode \
     svgio/source/svgreader/svgfeimagenode \
diff --git a/svgio/inc/svgfecompositenode.hxx b/svgio/inc/svgfecompositenode.hxx
new file mode 100644
index 000000000000..44cef845c07f
--- /dev/null
+++ b/svgio/inc/svgfecompositenode.hxx
@@ -0,0 +1,46 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*
+ * This file is part of the LibreOffice project.
+ *
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ *
+ * This file incorporates work covered by the following license notice:
+ *
+ *   Licensed to the Apache Software Foundation (ASF) under one or more
+ *   contributor license agreements. See the NOTICE file distributed
+ *   with this work for additional information regarding copyright
+ *   ownership. The ASF licenses this file to you under the Apache
+ *   License, Version 2.0 (the "License"); you may not use this file
+ *   except in compliance with the License. You may obtain a copy of
+ *   the License at http://www.apache.org/licenses/LICENSE-2.0 .
+ */
+
+#pragma once
+
+#include "svgfilternode.hxx"
+#include "svgstyleattributes.hxx"
+
+namespace svgio::svgreader
+{
+class SvgFeCompositeNode : public SvgFilterNode
+{
+private:
+    OUString maIn;
+    OUString maIn2;
+    OUString maResult;
+
+public:
+    SvgFeCompositeNode(SvgDocument& rDocument, SvgNode* pParent);
+    virtual ~SvgFeCompositeNode() override;
+
+    virtual void parseAttribute(SVGToken aSVGToken, const OUString& aContent) 
override;
+
+    void apply(drawinglayer::primitive2d::Primitive2DContainer& rTarget,
+               const SvgFilterNode* pParent) const override;
+};
+
+} // end of namespace svgio::svgreader
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/svgio/inc/svgtoken.hxx b/svgio/inc/svgtoken.hxx
index 5bc79f6f1b19..aa2d2a74e6c3 100644
--- a/svgio/inc/svgtoken.hxx
+++ b/svgio/inc/svgtoken.hxx
@@ -84,6 +84,7 @@ namespace svgio::svgreader
             ClipPathProperty,
             FeBlend,
             FeColorMatrix,
+            FeComposite,
             FeDropShadow,
             FeFlood,
             FeImage,
diff --git a/svgio/qa/cppunit/SvgImportTest.cxx 
b/svgio/qa/cppunit/SvgImportTest.cxx
index 05bf498d358f..1d875e2b74a7 100644
--- a/svgio/qa/cppunit/SvgImportTest.cxx
+++ b/svgio/qa/cppunit/SvgImportTest.cxx
@@ -225,6 +225,32 @@ CPPUNIT_TEST_FIXTURE(Test, testFeColorMatrix)
     assertXPath(pDocument, 
"/primitive2D/transform/mask/modifiedColor[4]"_ostr, "modifier"_ostr, 
"luminance_to_alpha");
 }
 
+CPPUNIT_TEST_FIXTURE(Test, testFilterFeComposite)
+{
+    Primitive2DSequence aSequence = 
parseSvg(u"/svgio/qa/cppunit/data/filterFeComposite.svg");
+    CPPUNIT_ASSERT_EQUAL(1, static_cast<int>(aSequence.getLength()));
+
+    drawinglayer::Primitive2dXmlDump dumper;
+    xmlDocUniquePtr pDocument = dumper.dumpAndParse(aSequence);
+
+    CPPUNIT_ASSERT (pDocument);
+
+    assertXPath(pDocument, 
"/primitive2D/transform/transform/polypolygoncolor[1]"_ostr, "color"_ostr, 
"#ff0000");
+    assertXPath(pDocument, 
"/primitive2D/transform/transform/polypolygoncolor[1]/polypolygon"_ostr, 
"height"_ostr, "100");
+    assertXPath(pDocument, 
"/primitive2D/transform/transform/polypolygoncolor[1]/polypolygon"_ostr, 
"width"_ostr, "100");
+    assertXPath(pDocument, 
"/primitive2D/transform/transform/polypolygoncolor[1]/polypolygon"_ostr, 
"minx"_ostr, "70");
+    assertXPath(pDocument, 
"/primitive2D/transform/transform/polypolygoncolor[1]/polypolygon"_ostr, 
"miny"_ostr, "70");
+    assertXPath(pDocument, 
"/primitive2D/transform/transform/polypolygoncolor[1]/polypolygon"_ostr, 
"maxx"_ostr, "170");
+    assertXPath(pDocument, 
"/primitive2D/transform/transform/polypolygoncolor[1]/polypolygon"_ostr, 
"maxy"_ostr, "170");
+    assertXPath(pDocument, 
"/primitive2D/transform/transform/polypolygoncolor[2]"_ostr, "color"_ostr, 
"#6ab150");
+    assertXPath(pDocument, 
"/primitive2D/transform/transform/polypolygoncolor[2]/polypolygon"_ostr, 
"height"_ostr, "100");
+    assertXPath(pDocument, 
"/primitive2D/transform/transform/polypolygoncolor[2]/polypolygon"_ostr, 
"width"_ostr, "100");
+    assertXPath(pDocument, 
"/primitive2D/transform/transform/polypolygoncolor[2]/polypolygon"_ostr, 
"minx"_ostr, "30");
+    assertXPath(pDocument, 
"/primitive2D/transform/transform/polypolygoncolor[2]/polypolygon"_ostr, 
"miny"_ostr, "30");
+    assertXPath(pDocument, 
"/primitive2D/transform/transform/polypolygoncolor[2]/polypolygon"_ostr, 
"maxx"_ostr, "130");
+    assertXPath(pDocument, 
"/primitive2D/transform/transform/polypolygoncolor[2]/polypolygon"_ostr, 
"maxy"_ostr, "130");
+}
+
 CPPUNIT_TEST_FIXTURE(Test, testFilterFeGaussianBlur)
 {
     Primitive2DSequence aSequenceTdf132246 = 
parseSvg(u"/svgio/qa/cppunit/data/filterFeGaussianBlur.svg");
diff --git a/svgio/qa/cppunit/data/filterFeComposite.svg 
b/svgio/qa/cppunit/data/filterFeComposite.svg
new file mode 100644
index 000000000000..0662eaa6f547
--- /dev/null
+++ b/svgio/qa/cppunit/data/filterFeComposite.svg
@@ -0,0 +1,10 @@
+<svg width="100" height="120" viewBox="0 0 200 240" 
xmlns="http://www.w3.org/2000/svg";>
+  <defs>
+  <filter id="filter" filterUnits="userSpaceOnUse" x="0" y="0" width="100%" 
height="100%">
+    <feFlood x="30" y="30" width="100" height="100" flood-color="#6ab150" 
flood-opacity="1" result="img1"></feFlood>
+    <feFlood x="70" y="70" width="100" height="100" flood-color="#ff0000" 
flood-opacity="1" result="img2"></feFlood>
+    <feComposite in="img1" in2="img2" operator="over"></feComposite>
+  </filter>
+  </defs>
+  <use style="filter: url(#filter)"></use>
+</svg>
diff --git a/svgio/source/svgreader/svgdocumenthandler.cxx 
b/svgio/source/svgreader/svgdocumenthandler.cxx
index fcce21936e68..6e31aaf8fdf0 100644
--- a/svgio/source/svgreader/svgdocumenthandler.cxx
+++ b/svgio/source/svgreader/svgdocumenthandler.cxx
@@ -43,6 +43,7 @@
 #include <svgclippathnode.hxx>
 #include <svgfeblendnode.hxx>
 #include <svgfecolormatrixnode.hxx>
+#include <svgfecompositenode.hxx>
 #include <svgfedropshadownode.hxx>
 #include <svgfefloodnode.hxx>
 #include <svgfeimagenode.hxx>
@@ -392,6 +393,13 @@ namespace
                     mpTarget->parseAttributes(xAttribs);
                     break;
                 }
+                case SVGToken::FeComposite:
+                {
+                    /// new node for feComposite
+                    mpTarget = new SvgFeCompositeNode(maDocument, mpTarget);
+                    mpTarget->parseAttributes(xAttribs);
+                    break;
+                }
                 case SVGToken::FeDropShadow:
                 {
                     /// new node for feDropShadow
diff --git a/svgio/source/svgreader/svgfecompositenode.cxx 
b/svgio/source/svgreader/svgfecompositenode.cxx
new file mode 100644
index 000000000000..b3418fca8709
--- /dev/null
+++ b/svgio/source/svgreader/svgfecompositenode.cxx
@@ -0,0 +1,83 @@
+/*
+ * This file is part of the LibreOffice project.
+ *
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ *
+ * This file incorporates work covered by the following license notice:
+ *
+ *   Licensed to the Apache Software Foundation (ASF) under one or more
+ *   contributor license agreements. See the NOTICE file distributed
+ *   with this work for additional information regarding copyright
+ *   ownership. The ASF licenses this file to you under the Apache
+ *   License, Version 2.0 (the "License"); you may not use this file
+ *   except in compliance with the License. You may obtain a copy of
+ *   the License at http://www.apache.org/licenses/LICENSE-2.0 .
+ */
+
+#include <svgfecompositenode.hxx>
+#include <o3tl/string_view.hxx>
+
+namespace svgio::svgreader
+{
+SvgFeCompositeNode::SvgFeCompositeNode(SvgDocument& rDocument, SvgNode* 
pParent)
+    : SvgFilterNode(SVGToken::FeComposite, rDocument, pParent)
+{
+}
+
+SvgFeCompositeNode::~SvgFeCompositeNode() {}
+
+void SvgFeCompositeNode::parseAttribute(SVGToken aSVGToken, const OUString& 
aContent)
+{
+    // parse own
+    switch (aSVGToken)
+    {
+        case SVGToken::Style:
+        {
+            readLocalCssStyle(aContent);
+            break;
+        }
+        case SVGToken::In:
+        {
+            maIn = aContent.trim();
+            break;
+        }
+        case SVGToken::In2:
+        {
+            maIn2 = aContent.trim();
+            break;
+        }
+        case SVGToken::Result:
+        {
+            maResult = aContent.trim();
+            break;
+        }
+        default:
+        {
+            break;
+        }
+    }
+}
+
+void 
SvgFeCompositeNode::apply(drawinglayer::primitive2d::Primitive2DContainer& 
rTarget,
+                               const SvgFilterNode* pParent) const
+{
+    if (const drawinglayer::primitive2d::Primitive2DContainer* rSource2
+        = pParent->findGraphicSource(maIn2))
+    {
+        rTarget = *rSource2;
+    }
+
+    if (const drawinglayer::primitive2d::Primitive2DContainer* rSource
+        = pParent->findGraphicSource(maIn))
+    {
+        rTarget.append(*rSource);
+    }
+
+    pParent->addGraphicSourceToMapper(maResult, rTarget);
+}
+
+} // end of namespace svgio::svgreader
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/svgio/source/svgreader/svgtoken.cxx 
b/svgio/source/svgreader/svgtoken.cxx
index f2cee5b723b2..04b3f9fa3ec6 100644
--- a/svgio/source/svgreader/svgtoken.cxx
+++ b/svgio/source/svgreader/svgtoken.cxx
@@ -82,6 +82,7 @@ constexpr auto aSVGTokenMap = 
frozen::make_unordered_map<std::u16string_view, SV
     { u"clip-path", SVGToken::ClipPathProperty },
     { u"feBlend", SVGToken::FeBlend },
     { u"feColorMatrix", SVGToken::FeColorMatrix },
+    { u"feComposite", SVGToken::FeComposite },
     { u"feDropShadow", SVGToken::FeDropShadow },
     { u"feFlood", SVGToken::FeFlood },
     { u"feImage", SVGToken::FeImage },
commit af8a899840f61f784e08d1b2d209cc161fbdf7e4
Author:     Xisco Fauli <xiscofa...@libreoffice.org>
AuthorDate: Wed Mar 13 10:16:31 2024 +0100
Commit:     Xisco Fauli <xiscofa...@libreoffice.org>
CommitDate: Wed Mar 13 19:02:31 2024 +0100

    tdf#159660: Add support for feBlend filter
    
    At the moment, only the 'normal' mode is supported
    
    Change-Id: I31d1536e03e938ce0f7304a37eb6c1071ecfcf4d
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/164763
    Tested-by: Jenkins
    Reviewed-by: Xisco Fauli <xiscofa...@libreoffice.org>

diff --git a/svgio/Library_svgio.mk b/svgio/Library_svgio.mk
index f1e43ced6ac1..e1b0e55a7a9e 100644
--- a/svgio/Library_svgio.mk
+++ b/svgio/Library_svgio.mk
@@ -60,6 +60,7 @@ $(eval $(call gb_Library_add_exception_objects,svgio,\
     svgio/source/svgreader/svgellipsenode \
     svgio/source/svgreader/svggnode \
     svgio/source/svgreader/svganode \
+    svgio/source/svgreader/svgfeblendnode \
     svgio/source/svgreader/svgfecolormatrixnode \
     svgio/source/svgreader/svgfedropshadownode \
     svgio/source/svgreader/svgfefloodnode \
diff --git a/svgio/inc/svgfeblendnode.hxx b/svgio/inc/svgfeblendnode.hxx
new file mode 100644
index 000000000000..8ff46adf15ff
--- /dev/null
+++ b/svgio/inc/svgfeblendnode.hxx
@@ -0,0 +1,46 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*
+ * This file is part of the LibreOffice project.
+ *
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ *
+ * This file incorporates work covered by the following license notice:
+ *
+ *   Licensed to the Apache Software Foundation (ASF) under one or more
+ *   contributor license agreements. See the NOTICE file distributed
+ *   with this work for additional information regarding copyright
+ *   ownership. The ASF licenses this file to you under the Apache
+ *   License, Version 2.0 (the "License"); you may not use this file
+ *   except in compliance with the License. You may obtain a copy of
+ *   the License at http://www.apache.org/licenses/LICENSE-2.0 .
+ */
+
+#pragma once
+
+#include "svgfilternode.hxx"
+#include "svgstyleattributes.hxx"
+
+namespace svgio::svgreader
+{
+class SvgFeBlendNode : public SvgFilterNode
+{
+private:
+    OUString maIn;
+    OUString maIn2;
+    OUString maResult;
+
+public:
+    SvgFeBlendNode(SvgDocument& rDocument, SvgNode* pParent);
+    virtual ~SvgFeBlendNode() override;
+
+    virtual void parseAttribute(SVGToken aSVGToken, const OUString& aContent) 
override;
+
+    void apply(drawinglayer::primitive2d::Primitive2DContainer& rTarget,
+               const SvgFilterNode* pParent) const override;
+};
+
+} // end of namespace svgio::svgreader
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/svgio/inc/svgtoken.hxx b/svgio/inc/svgtoken.hxx
index 7dc616db149e..5bc79f6f1b19 100644
--- a/svgio/inc/svgtoken.hxx
+++ b/svgio/inc/svgtoken.hxx
@@ -42,6 +42,7 @@ namespace svgio::svgreader
             Version,
             Id,
             In,
+            In2,
             Result,
             Rx,
             Ry,
@@ -81,6 +82,7 @@ namespace svgio::svgreader
             Color,
             ClipPathNode,
             ClipPathProperty,
+            FeBlend,
             FeColorMatrix,
             FeDropShadow,
             FeFlood,
diff --git a/svgio/qa/cppunit/SvgImportTest.cxx 
b/svgio/qa/cppunit/SvgImportTest.cxx
index 62e8993c7aa8..05bf498d358f 100644
--- a/svgio/qa/cppunit/SvgImportTest.cxx
+++ b/svgio/qa/cppunit/SvgImportTest.cxx
@@ -183,6 +183,32 @@ CPPUNIT_TEST_FIXTURE(Test, testTdf155819)
     assertXPath(pDocument, "/primitive2D/transform/transform"_ostr, 4);
 }
 
+CPPUNIT_TEST_FIXTURE(Test, testFilterFeBlend)
+{
+    Primitive2DSequence aSequence = 
parseSvg(u"/svgio/qa/cppunit/data/filterFeBlend.svg");
+    CPPUNIT_ASSERT_EQUAL(1, static_cast<int>(aSequence.getLength()));
+
+    drawinglayer::Primitive2dXmlDump dumper;
+    xmlDocUniquePtr pDocument = dumper.dumpAndParse(aSequence);
+
+    CPPUNIT_ASSERT (pDocument);
+
+    assertXPath(pDocument, 
"/primitive2D/transform/transform/polypolygoncolor[1]"_ostr, "color"_ostr, 
"#8a2be2");
+    assertXPath(pDocument, 
"/primitive2D/transform/transform/polypolygoncolor[1]/polypolygon"_ostr, 
"height"_ostr, "100");
+    assertXPath(pDocument, 
"/primitive2D/transform/transform/polypolygoncolor[1]/polypolygon"_ostr, 
"width"_ostr, "100");
+    assertXPath(pDocument, 
"/primitive2D/transform/transform/polypolygoncolor[1]/polypolygon"_ostr, 
"minx"_ostr, "70");
+    assertXPath(pDocument, 
"/primitive2D/transform/transform/polypolygoncolor[1]/polypolygon"_ostr, 
"miny"_ostr, "70");
+    assertXPath(pDocument, 
"/primitive2D/transform/transform/polypolygoncolor[1]/polypolygon"_ostr, 
"maxx"_ostr, "170");
+    assertXPath(pDocument, 
"/primitive2D/transform/transform/polypolygoncolor[1]/polypolygon"_ostr, 
"maxy"_ostr, "170");
+    assertXPath(pDocument, 
"/primitive2D/transform/transform/polypolygoncolor[2]"_ostr, "color"_ostr, 
"#ffd700");
+    assertXPath(pDocument, 
"/primitive2D/transform/transform/polypolygoncolor[2]/polypolygon"_ostr, 
"height"_ostr, "100");
+    assertXPath(pDocument, 
"/primitive2D/transform/transform/polypolygoncolor[2]/polypolygon"_ostr, 
"width"_ostr, "100");
+    assertXPath(pDocument, 
"/primitive2D/transform/transform/polypolygoncolor[2]/polypolygon"_ostr, 
"minx"_ostr, "30");
+    assertXPath(pDocument, 
"/primitive2D/transform/transform/polypolygoncolor[2]/polypolygon"_ostr, 
"miny"_ostr, "30");
+    assertXPath(pDocument, 
"/primitive2D/transform/transform/polypolygoncolor[2]/polypolygon"_ostr, 
"maxx"_ostr, "130");
+    assertXPath(pDocument, 
"/primitive2D/transform/transform/polypolygoncolor[2]/polypolygon"_ostr, 
"maxy"_ostr, "130");
+}
+
 CPPUNIT_TEST_FIXTURE(Test, testFeColorMatrix)
 {
     Primitive2DSequence aSequence = 
parseSvg(u"/svgio/qa/cppunit/data/filterFeColorMatrix.svg");
diff --git a/svgio/qa/cppunit/data/filterFeBlend.svg 
b/svgio/qa/cppunit/data/filterFeBlend.svg
new file mode 100644
index 000000000000..339653b6a150
--- /dev/null
+++ b/svgio/qa/cppunit/data/filterFeBlend.svg
@@ -0,0 +1,10 @@
+<svg width="100" height="120" viewBox="0 0 200 240"  
xmlns="http://www.w3.org/2000/svg";>
+  <defs>
+  <filter id="mode_normal" filterUnits="userSpaceOnUse" x="0" y="0" 
width="110%" height="110%">
+    <feFlood x="30" y="30" width="100" height="100" flood-color="#FFD700" 
flood-opacity="1" result="img1"></feFlood>
+    <feFlood x="70" y="70" width="100" height="100" flood-color="#8A2BE2" 
flood-opacity="1" result="img2"></feFlood>
+    <feBlend mode="normal" in="img1" in2="img2"></feBlend>
+  </filter>
+  </defs>
+  <use style="filter: url(#mode_normal);"></use>
+</svg>
diff --git a/svgio/source/svgreader/svgdocumenthandler.cxx 
b/svgio/source/svgreader/svgdocumenthandler.cxx
index e45dcad857a9..fcce21936e68 100644
--- a/svgio/source/svgreader/svgdocumenthandler.cxx
+++ b/svgio/source/svgreader/svgdocumenthandler.cxx
@@ -41,6 +41,7 @@
 #include <svgstylenode.hxx>
 #include <svgimagenode.hxx>
 #include <svgclippathnode.hxx>
+#include <svgfeblendnode.hxx>
 #include <svgfecolormatrixnode.hxx>
 #include <svgfedropshadownode.hxx>
 #include <svgfefloodnode.hxx>
@@ -377,6 +378,13 @@ namespace
                     mpTarget->parseAttributes(xAttribs);
                     break;
                 }
+                case SVGToken::FeBlend:
+                {
+                    /// new node for feBlend
+                    mpTarget = new SvgFeBlendNode(maDocument, mpTarget);
+                    mpTarget->parseAttributes(xAttribs);
+                    break;
+                }
                 case SVGToken::FeColorMatrix:
                 {
                     /// new node for feColorMatrix
diff --git a/svgio/source/svgreader/svgfeblendnode.cxx 
b/svgio/source/svgreader/svgfeblendnode.cxx
new file mode 100644
index 000000000000..6adc0e8e139e
--- /dev/null
+++ b/svgio/source/svgreader/svgfeblendnode.cxx
@@ -0,0 +1,83 @@
+/*
+ * This file is part of the LibreOffice project.
+ *
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ *
+ * This file incorporates work covered by the following license notice:
+ *
+ *   Licensed to the Apache Software Foundation (ASF) under one or more
+ *   contributor license agreements. See the NOTICE file distributed
+ *   with this work for additional information regarding copyright
+ *   ownership. The ASF licenses this file to you under the Apache
+ *   License, Version 2.0 (the "License"); you may not use this file
+ *   except in compliance with the License. You may obtain a copy of
+ *   the License at http://www.apache.org/licenses/LICENSE-2.0 .
+ */
+
+#include <svgfeblendnode.hxx>
+#include <o3tl/string_view.hxx>
+
+namespace svgio::svgreader
+{
+SvgFeBlendNode::SvgFeBlendNode(SvgDocument& rDocument, SvgNode* pParent)
+    : SvgFilterNode(SVGToken::FeBlend, rDocument, pParent)
+{
+}
+
+SvgFeBlendNode::~SvgFeBlendNode() {}
+
+void SvgFeBlendNode::parseAttribute(SVGToken aSVGToken, const OUString& 
aContent)
+{
+    // parse own
+    switch (aSVGToken)
+    {
+        case SVGToken::Style:
+        {
+            readLocalCssStyle(aContent);
+            break;
+        }
+        case SVGToken::In:
+        {
+            maIn = aContent.trim();
+            break;
+        }
+        case SVGToken::In2:
+        {
+            maIn2 = aContent.trim();
+            break;
+        }
+        case SVGToken::Result:
+        {
+            maResult = aContent.trim();
+            break;
+        }
+        default:
+        {
+            break;
+        }
+    }
+}
+
+void SvgFeBlendNode::apply(drawinglayer::primitive2d::Primitive2DContainer& 
rTarget,
+                           const SvgFilterNode* pParent) const
+{
+    if (const drawinglayer::primitive2d::Primitive2DContainer* rSource2
+        = pParent->findGraphicSource(maIn2))
+    {
+        rTarget = *rSource2;
+    }
+
+    if (const drawinglayer::primitive2d::Primitive2DContainer* rSource
+        = pParent->findGraphicSource(maIn))
+    {
+        rTarget.append(*rSource);
+    }
+
+    pParent->addGraphicSourceToMapper(maResult, rTarget);
+}
+
+} // end of namespace svgio::svgreader
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/svgio/source/svgreader/svgtoken.cxx 
b/svgio/source/svgreader/svgtoken.cxx
index 3a1f2eb3e251..f2cee5b723b2 100644
--- a/svgio/source/svgreader/svgtoken.cxx
+++ b/svgio/source/svgreader/svgtoken.cxx
@@ -41,6 +41,7 @@ constexpr auto aSVGTokenMap = 
frozen::make_unordered_map<std::u16string_view, SV
     { u"version", SVGToken::Version },
     { u"id", SVGToken::Id },
     { u"in", SVGToken::In },
+    { u"in2", SVGToken::In2 },
     { u"result", SVGToken::Result },
     { u"rx", SVGToken::Rx },
     { u"ry", SVGToken::Ry },
@@ -79,6 +80,7 @@ constexpr auto aSVGTokenMap = 
frozen::make_unordered_map<std::u16string_view, SV
     { u"color", SVGToken::Color },
     { u"clipPath", SVGToken::ClipPathNode },
     { u"clip-path", SVGToken::ClipPathProperty },
+    { u"feBlend", SVGToken::FeBlend },
     { u"feColorMatrix", SVGToken::FeColorMatrix },
     { u"feDropShadow", SVGToken::FeDropShadow },
     { u"feFlood", SVGToken::FeFlood },

Reply via email to