svgio/inc/svgfecolormatrixnode.hxx               |    5 +
 svgio/inc/svgfedropshadownode.hxx                |    5 +
 svgio/inc/svgfefloodnode.hxx                     |    5 +
 svgio/inc/svgfegaussianblurnode.hxx              |    5 +
 svgio/inc/svgfeimagenode.hxx                     |    5 +
 svgio/inc/svgfeoffsetnode.hxx                    |    5 +
 svgio/inc/svgfilternode.hxx                      |   19 +++--
 svgio/source/svgreader/svgfecolormatrixnode.cxx  |   24 ++++++-
 svgio/source/svgreader/svgfedropshadownode.cxx   |   24 ++++++-
 svgio/source/svgreader/svgfefloodnode.cxx        |   24 ++++++-
 svgio/source/svgreader/svgfegaussianblurnode.cxx |   24 ++++++-
 svgio/source/svgreader/svgfeimagenode.cxx        |   24 ++++++-
 svgio/source/svgreader/svgfeoffsetnode.cxx       |   24 ++++++-
 svgio/source/svgreader/svgfilternode.cxx         |   76 ++++++++---------------
 svgio/source/svgreader/svgstyleattributes.cxx    |    2 
 15 files changed, 185 insertions(+), 86 deletions(-)

New commits:
commit b22039cff8380b158307e75762bd3e4ca045d77b
Author:     Xisco Fauli <xiscofa...@libreoffice.org>
AuthorDate: Tue Mar 12 17:19:45 2024 +0100
Commit:     Xisco Fauli <xiscofa...@libreoffice.org>
CommitDate: Tue Mar 12 22:39:20 2024 +0100

    related: tdf#159947: only parse in/result if the element supports them
    
    There are some filters ( e.g. feMerge ) that do not support
    in or result attributes
    
    Change-Id: I4072dc481557557733e55cc5fcbd80cb11a7ddb5
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/164718
    Tested-by: Jenkins
    Reviewed-by: Xisco Fauli <xiscofa...@libreoffice.org>

diff --git a/svgio/inc/svgfecolormatrixnode.hxx 
b/svgio/inc/svgfecolormatrixnode.hxx
index e2c74a03748f..4e0ad7d2aa3c 100644
--- a/svgio/inc/svgfecolormatrixnode.hxx
+++ b/svgio/inc/svgfecolormatrixnode.hxx
@@ -36,6 +36,8 @@ enum class ColorType
 class SvgFeColorMatrixNode final : public SvgFilterNode
 {
 private:
+    OUString maIn;
+    OUString maResult;
     ColorType maType;
     OUString maValuesContent;
 
@@ -45,7 +47,8 @@ public:
 
     virtual void parseAttribute(SVGToken aSVGToken, const OUString& aContent) 
override;
 
-    void apply(drawinglayer::primitive2d::Primitive2DContainer& rTarget) const 
override;
+    void apply(drawinglayer::primitive2d::Primitive2DContainer& rTarget,
+               const SvgFilterNode* pParent) const override;
 };
 
 } // end of namespace svgio::svgreader
diff --git a/svgio/inc/svgfedropshadownode.hxx 
b/svgio/inc/svgfedropshadownode.hxx
index 04b3190f1dea..c68cdf655567 100644
--- a/svgio/inc/svgfedropshadownode.hxx
+++ b/svgio/inc/svgfedropshadownode.hxx
@@ -27,6 +27,8 @@ namespace svgio::svgreader
 class SvgFeDropShadowNode final : public SvgFilterNode
 {
 private:
+    OUString maIn;
+    OUString maResult;
     SvgNumber maDx;
     SvgNumber maDy;
     SvgNumber maStdDeviation;
@@ -39,7 +41,8 @@ public:
 
     virtual void parseAttribute(SVGToken aSVGToken, const OUString& aContent) 
override;
 
-    void apply(drawinglayer::primitive2d::Primitive2DContainer& rTarget) const 
override;
+    void apply(drawinglayer::primitive2d::Primitive2DContainer& rTarget,
+               const SvgFilterNode* pParent) const override;
 };
 
 } // end of namespace svgio::svgreader
diff --git a/svgio/inc/svgfefloodnode.hxx b/svgio/inc/svgfefloodnode.hxx
index e74794b97237..8aba2c3b0340 100644
--- a/svgio/inc/svgfefloodnode.hxx
+++ b/svgio/inc/svgfefloodnode.hxx
@@ -27,6 +27,8 @@ namespace svgio::svgreader
 class SvgFeFloodNode final : public SvgFilterNode
 {
 private:
+    OUString maIn;
+    OUString maResult;
     SvgNumber maX;
     SvgNumber maY;
     SvgNumber maWidth;
@@ -40,7 +42,8 @@ public:
 
     virtual void parseAttribute(SVGToken aSVGToken, const OUString& aContent) 
override;
 
-    void apply(drawinglayer::primitive2d::Primitive2DContainer& rTarget) const 
override;
+    void apply(drawinglayer::primitive2d::Primitive2DContainer& rTarget,
+               const SvgFilterNode* pParent) const override;
 };
 
 } // end of namespace svgio::svgreader
diff --git a/svgio/inc/svgfegaussianblurnode.hxx 
b/svgio/inc/svgfegaussianblurnode.hxx
index 14732a968e2d..10e6a16b1ce3 100644
--- a/svgio/inc/svgfegaussianblurnode.hxx
+++ b/svgio/inc/svgfegaussianblurnode.hxx
@@ -28,6 +28,8 @@ namespace svgio::svgreader
 class SvgFeGaussianBlurNode final : public SvgFilterNode
 {
 private:
+    OUString maIn;
+    OUString maResult;
     SvgNumber maStdDeviation;
 
 public:
@@ -36,7 +38,8 @@ public:
 
     virtual void parseAttribute(SVGToken aSVGToken, const OUString& aContent) 
override;
 
-    void apply(drawinglayer::primitive2d::Primitive2DContainer& rTarget) const 
override;
+    void apply(drawinglayer::primitive2d::Primitive2DContainer& rTarget,
+               const SvgFilterNode* pParent) const override;
 };
 
 } // end of namespace svgio::svgreader
diff --git a/svgio/inc/svgfeimagenode.hxx b/svgio/inc/svgfeimagenode.hxx
index 0b05173494d0..ab303fdc92fe 100644
--- a/svgio/inc/svgfeimagenode.hxx
+++ b/svgio/inc/svgfeimagenode.hxx
@@ -27,6 +27,8 @@ namespace svgio::svgreader
 class SvgFeImageNode final : public SvgFilterNode
 {
 private:
+    OUString maIn;
+    OUString maResult;
     OUString maUrl; // external link
     OUString maData; // base64 data
 
@@ -36,7 +38,8 @@ public:
 
     virtual void parseAttribute(SVGToken aSVGToken, const OUString& aContent) 
override;
 
-    void apply(drawinglayer::primitive2d::Primitive2DContainer& rTarget) const 
override;
+    void apply(drawinglayer::primitive2d::Primitive2DContainer& rTarget,
+               const SvgFilterNode* pParent) const override;
 };
 
 } // end of namespace svgio::svgreader
diff --git a/svgio/inc/svgfeoffsetnode.hxx b/svgio/inc/svgfeoffsetnode.hxx
index b56971dfd741..a52eea252e60 100644
--- a/svgio/inc/svgfeoffsetnode.hxx
+++ b/svgio/inc/svgfeoffsetnode.hxx
@@ -27,6 +27,8 @@ namespace svgio::svgreader
 class SvgFeOffsetNode final : public SvgFilterNode
 {
 private:
+    OUString maIn;
+    OUString maResult;
     SvgNumber maDx;
     SvgNumber maDy;
 
@@ -36,7 +38,8 @@ public:
 
     virtual void parseAttribute(SVGToken aSVGToken, const OUString& aContent) 
override;
 
-    void apply(drawinglayer::primitive2d::Primitive2DContainer& rTarget) const 
override;
+    void apply(drawinglayer::primitive2d::Primitive2DContainer& rTarget,
+               const SvgFilterNode* pParent) const override;
 };
 
 } // end of namespace svgio::svgreader
diff --git a/svgio/inc/svgfilternode.hxx b/svgio/inc/svgfilternode.hxx
index c3aa068bd3eb..4f5d4c2f532f 100644
--- a/svgio/inc/svgfilternode.hxx
+++ b/svgio/inc/svgfilternode.hxx
@@ -19,28 +19,33 @@
 
 #pragma once
 
+#include <unordered_map>
 #include "svgnode.hxx"
 #include "svgstyleattributes.hxx"
 #include <basegfx/matrix/b2dhommatrix.hxx>
 
+typedef std::unordered_map<OUString, 
drawinglayer::primitive2d::Primitive2DContainer>
+    IdGraphicSourceMapper;
+
 namespace svgio::svgreader
 {
 class SvgFilterNode : public SvgNode
 {
 private:
-    OUString maIn;
-    OUString maResult;
+    IdGraphicSourceMapper maIdGraphicSourceMapperList;
 
 public:
     SvgFilterNode(SVGToken aType, SvgDocument& rDocument, SvgNode* pParent);
     virtual ~SvgFilterNode() override;
 
-    virtual void parseAttribute(SVGToken aSVGToken, const OUString& aContent) 
override;
-
-    virtual void apply(drawinglayer::primitive2d::Primitive2DContainer& 
rTarget) const;
+    virtual void apply(drawinglayer::primitive2d::Primitive2DContainer& 
rTarget,
+                       const SvgFilterNode* pParent) const;
 
-    const OUString& getIn() const { return maIn; }
-    const OUString& getResult() const { return maResult; }
+    void
+    addGraphicSourceToMapper(const OUString& rStr,
+                             drawinglayer::primitive2d::Primitive2DContainer 
pGrapicSource) const;
+    const drawinglayer::primitive2d::Primitive2DContainer*
+    findGraphicSource(const OUString& rStr) const;
 };
 
 } // end of namespace svgio::svgreader
diff --git a/svgio/source/svgreader/svgfecolormatrixnode.cxx 
b/svgio/source/svgreader/svgfecolormatrixnode.cxx
index da42fa72f899..76bfbee2799c 100644
--- a/svgio/source/svgreader/svgfecolormatrixnode.cxx
+++ b/svgio/source/svgreader/svgfecolormatrixnode.cxx
@@ -33,12 +33,19 @@ SvgFeColorMatrixNode::~SvgFeColorMatrixNode() {}
 
 void SvgFeColorMatrixNode::parseAttribute(SVGToken aSVGToken, const OUString& 
aContent)
 {
-    // call parent
-    SvgFilterNode::parseAttribute(aSVGToken, aContent);
-
     // parse own
     switch (aSVGToken)
     {
+        case SVGToken::In:
+        {
+            maIn = aContent.trim();
+            break;
+        }
+        case SVGToken::Result:
+        {
+            maResult = aContent.trim();
+            break;
+        }
         case SVGToken::Type:
         {
             if (!aContent.isEmpty())
@@ -74,8 +81,15 @@ void SvgFeColorMatrixNode::parseAttribute(SVGToken 
aSVGToken, const OUString& aC
     }
 }
 
-void 
SvgFeColorMatrixNode::apply(drawinglayer::primitive2d::Primitive2DContainer& 
rTarget) const
+void 
SvgFeColorMatrixNode::apply(drawinglayer::primitive2d::Primitive2DContainer& 
rTarget,
+                                 const SvgFilterNode* pParent) const
 {
+    if (const drawinglayer::primitive2d::Primitive2DContainer* rSource
+        = pParent->findGraphicSource(maIn))
+    {
+        rTarget = *rSource;
+    }
+
     if (maType == ColorType::LuminanceToAlpha)
     {
         const drawinglayer::primitive2d::Primitive2DReference xRef(
@@ -114,6 +128,8 @@ void 
SvgFeColorMatrixNode::apply(drawinglayer::primitive2d::Primitive2DContainer
                 std::move(rTarget), 
std::make_shared<basegfx::BColorModifier_matrix>(aVector)));
         rTarget = drawinglayer::primitive2d::Primitive2DContainer{ xRef };
     }
+
+    pParent->addGraphicSourceToMapper(maResult, rTarget);
 }
 
 } // end of namespace svgio::svgreader
diff --git a/svgio/source/svgreader/svgfedropshadownode.cxx 
b/svgio/source/svgreader/svgfedropshadownode.cxx
index d5c67e162af1..23a6464d523e 100644
--- a/svgio/source/svgreader/svgfedropshadownode.cxx
+++ b/svgio/source/svgreader/svgfedropshadownode.cxx
@@ -40,9 +40,6 @@ SvgFeDropShadowNode::~SvgFeDropShadowNode() {}
 
 void SvgFeDropShadowNode::parseAttribute(SVGToken aSVGToken, const OUString& 
aContent)
 {
-    // call parent
-    SvgFilterNode::parseAttribute(aSVGToken, aContent);
-
     // parse own
     switch (aSVGToken)
     {
@@ -51,6 +48,16 @@ void SvgFeDropShadowNode::parseAttribute(SVGToken aSVGToken, 
const OUString& aCo
             readLocalCssStyle(aContent);
             break;
         }
+        case SVGToken::In:
+        {
+            maIn = aContent.trim();
+            break;
+        }
+        case SVGToken::Result:
+        {
+            maResult = aContent.trim();
+            break;
+        }
         case SVGToken::Dx:
         {
             SvgNumber aNum;
@@ -112,8 +119,15 @@ void SvgFeDropShadowNode::parseAttribute(SVGToken 
aSVGToken, const OUString& aCo
     }
 }
 
-void 
SvgFeDropShadowNode::apply(drawinglayer::primitive2d::Primitive2DContainer& 
rTarget) const
+void 
SvgFeDropShadowNode::apply(drawinglayer::primitive2d::Primitive2DContainer& 
rTarget,
+                                const SvgFilterNode* pParent) const
 {
+    if (const drawinglayer::primitive2d::Primitive2DContainer* rSource
+        = pParent->findGraphicSource(maIn))
+    {
+        rTarget = *rSource;
+    }
+
     basegfx::B2DHomMatrix aTransform;
     if (maDx.isSet() || maDy.isSet())
     {
@@ -140,6 +154,8 @@ void 
SvgFeDropShadowNode::apply(drawinglayer::primitive2d::Primitive2DContainer&
     aTempTarget.append(rTarget);
 
     rTarget = aTempTarget;
+
+    pParent->addGraphicSourceToMapper(maResult, rTarget);
 }
 
 } // end of namespace svgio::svgreader
diff --git a/svgio/source/svgreader/svgfefloodnode.cxx 
b/svgio/source/svgreader/svgfefloodnode.cxx
index 4c4efe9bf4c9..ede285b6d756 100644
--- a/svgio/source/svgreader/svgfefloodnode.cxx
+++ b/svgio/source/svgreader/svgfefloodnode.cxx
@@ -41,9 +41,6 @@ SvgFeFloodNode::~SvgFeFloodNode() {}
 
 void SvgFeFloodNode::parseAttribute(SVGToken aSVGToken, const OUString& 
aContent)
 {
-    // call parent
-    SvgFilterNode::parseAttribute(aSVGToken, aContent);
-
     // parse own
     switch (aSVGToken)
     {
@@ -52,6 +49,16 @@ void SvgFeFloodNode::parseAttribute(SVGToken aSVGToken, 
const OUString& aContent
             readLocalCssStyle(aContent);
             break;
         }
+        case SVGToken::In:
+        {
+            maIn = aContent.trim();
+            break;
+        }
+        case SVGToken::Result:
+        {
+            maResult = aContent.trim();
+            break;
+        }
         case SVGToken::X:
         {
             SvgNumber aNum;
@@ -129,7 +136,8 @@ void SvgFeFloodNode::parseAttribute(SVGToken aSVGToken, 
const OUString& aContent
     }
 }
 
-void SvgFeFloodNode::apply(drawinglayer::primitive2d::Primitive2DContainer& 
rTarget) const
+void SvgFeFloodNode::apply(drawinglayer::primitive2d::Primitive2DContainer& 
rTarget,
+                           const SvgFilterNode* pParent) const
 {
     const double fWidth(maWidth.solve(*this, NumberType::xcoordinate));
     const double fHeight(maHeight.solve(*this, NumberType::ycoordinate));
@@ -137,6 +145,12 @@ void 
SvgFeFloodNode::apply(drawinglayer::primitive2d::Primitive2DContainer& rTar
     if (fWidth <= 0.0 || fHeight <= 0.0)
         return;
 
+    if (const drawinglayer::primitive2d::Primitive2DContainer* rSource
+        = pParent->findGraphicSource(maIn))
+    {
+        rTarget = *rSource;
+    }
+
     const double fX(maX.solve(*this, NumberType::xcoordinate));
     const double fY(maY.solve(*this, NumberType::ycoordinate));
     const basegfx::B2DRange aRange(fX, fY, fX + fWidth, fY + fHeight);
@@ -157,6 +171,8 @@ void 
SvgFeFloodNode::apply(drawinglayer::primitive2d::Primitive2DContainer& rTar
 
         rTarget = drawinglayer::primitive2d::Primitive2DContainer{ xRef };
     }
+
+    pParent->addGraphicSourceToMapper(maResult, rTarget);
 }
 
 } // end of namespace svgio::svgreader
diff --git a/svgio/source/svgreader/svgfegaussianblurnode.cxx 
b/svgio/source/svgreader/svgfegaussianblurnode.cxx
index 8c6d26681a2a..132cbae3fba7 100644
--- a/svgio/source/svgreader/svgfegaussianblurnode.cxx
+++ b/svgio/source/svgreader/svgfegaussianblurnode.cxx
@@ -33,9 +33,6 @@ SvgFeGaussianBlurNode::~SvgFeGaussianBlurNode() {}
 
 void SvgFeGaussianBlurNode::parseAttribute(SVGToken aSVGToken, const OUString& 
aContent)
 {
-    // call parent
-    SvgFilterNode::parseAttribute(aSVGToken, aContent);
-
     // parse own
     switch (aSVGToken)
     {
@@ -52,6 +49,16 @@ void SvgFeGaussianBlurNode::parseAttribute(SVGToken 
aSVGToken, const OUString& a
             }
             break;
         }
+        case SVGToken::In:
+        {
+            maIn = aContent.trim();
+            break;
+        }
+        case SVGToken::Result:
+        {
+            maResult = aContent.trim();
+            break;
+        }
         default:
         {
             break;
@@ -59,13 +66,22 @@ void SvgFeGaussianBlurNode::parseAttribute(SVGToken 
aSVGToken, const OUString& a
     }
 }
 
-void 
SvgFeGaussianBlurNode::apply(drawinglayer::primitive2d::Primitive2DContainer& 
rTarget) const
+void 
SvgFeGaussianBlurNode::apply(drawinglayer::primitive2d::Primitive2DContainer& 
rTarget,
+                                  const SvgFilterNode* pParent) const
 {
+    if (const drawinglayer::primitive2d::Primitive2DContainer* rSource
+        = pParent->findGraphicSource(maIn))
+    {
+        rTarget = *rSource;
+    }
+
     const drawinglayer::primitive2d::Primitive2DReference xRef(
         new 
drawinglayer::primitive2d::SoftEdgePrimitive2D(maStdDeviation.getNumber(),
                                                            
std::move(rTarget)));
 
     rTarget = drawinglayer::primitive2d::Primitive2DContainer{ xRef };
+
+    pParent->addGraphicSourceToMapper(maResult, rTarget);
 }
 
 } // end of namespace svgio::svgreader
diff --git a/svgio/source/svgreader/svgfeimagenode.cxx 
b/svgio/source/svgreader/svgfeimagenode.cxx
index 777f1fd48f22..c7b1f65b8f2d 100644
--- a/svgio/source/svgreader/svgfeimagenode.cxx
+++ b/svgio/source/svgreader/svgfeimagenode.cxx
@@ -38,9 +38,6 @@ SvgFeImageNode::~SvgFeImageNode() {}
 
 void SvgFeImageNode::parseAttribute(SVGToken aSVGToken, const OUString& 
aContent)
 {
-    // call parent
-    SvgFilterNode::parseAttribute(aSVGToken, aContent);
-
     // parse own
     switch (aSVGToken)
     {
@@ -49,6 +46,16 @@ void SvgFeImageNode::parseAttribute(SVGToken aSVGToken, 
const OUString& aContent
             readLocalCssStyle(aContent);
             break;
         }
+        case SVGToken::In:
+        {
+            maIn = aContent.trim();
+            break;
+        }
+        case SVGToken::Result:
+        {
+            maResult = aContent.trim();
+            break;
+        }
         case SVGToken::Href:
         case SVGToken::XlinkHref:
         {
@@ -69,8 +76,15 @@ void SvgFeImageNode::parseAttribute(SVGToken aSVGToken, 
const OUString& aContent
     }
 }
 
-void SvgFeImageNode::apply(drawinglayer::primitive2d::Primitive2DContainer& 
rTarget) const
+void SvgFeImageNode::apply(drawinglayer::primitive2d::Primitive2DContainer& 
rTarget,
+                           const SvgFilterNode* pParent) const
 {
+    if (const drawinglayer::primitive2d::Primitive2DContainer* rSource
+        = pParent->findGraphicSource(maIn))
+    {
+        rTarget = *rSource;
+    }
+
     BitmapEx aBitmapEx;
 
     if (!maData.isEmpty())
@@ -129,6 +143,8 @@ void 
SvgFeImageNode::apply(drawinglayer::primitive2d::Primitive2DContainer& rTar
 
         rTarget = drawinglayer::primitive2d::Primitive2DContainer{ xRef };
     }
+
+    pParent->addGraphicSourceToMapper(maResult, rTarget);
 }
 
 } // end of namespace svgio::svgreader
diff --git a/svgio/source/svgreader/svgfeoffsetnode.cxx 
b/svgio/source/svgreader/svgfeoffsetnode.cxx
index fd85b22a3116..aec7c3758a83 100644
--- a/svgio/source/svgreader/svgfeoffsetnode.cxx
+++ b/svgio/source/svgreader/svgfeoffsetnode.cxx
@@ -34,12 +34,19 @@ SvgFeOffsetNode::~SvgFeOffsetNode() {}
 
 void SvgFeOffsetNode::parseAttribute(SVGToken aSVGToken, const OUString& 
aContent)
 {
-    // call parent
-    SvgFilterNode::parseAttribute(aSVGToken, aContent);
-
     // parse own
     switch (aSVGToken)
     {
+        case SVGToken::In:
+        {
+            maIn = aContent.trim();
+            break;
+        }
+        case SVGToken::Result:
+        {
+            maResult = aContent.trim();
+            break;
+        }
         case SVGToken::Dx:
         {
             SvgNumber aNum;
@@ -73,8 +80,15 @@ void SvgFeOffsetNode::parseAttribute(SVGToken aSVGToken, 
const OUString& aConten
     }
 }
 
-void SvgFeOffsetNode::apply(drawinglayer::primitive2d::Primitive2DContainer& 
rTarget) const
+void SvgFeOffsetNode::apply(drawinglayer::primitive2d::Primitive2DContainer& 
rTarget,
+                            const SvgFilterNode* pParent) const
 {
+    if (const drawinglayer::primitive2d::Primitive2DContainer* rSource
+        = pParent->findGraphicSource(maIn))
+    {
+        rTarget = *rSource;
+    }
+
     basegfx::B2DHomMatrix aTransform;
 
     if (maDx.isSet() || maDy.isSet())
@@ -87,6 +101,8 @@ void 
SvgFeOffsetNode::apply(drawinglayer::primitive2d::Primitive2DContainer& rTa
         new drawinglayer::primitive2d::TransformPrimitive2D(aTransform, 
std::move(rTarget)));
 
     rTarget = drawinglayer::primitive2d::Primitive2DContainer{ xRef };
+
+    pParent->addGraphicSourceToMapper(maResult, rTarget);
 }
 
 } // end of namespace svgio::svgreader
diff --git a/svgio/source/svgreader/svgfilternode.cxx 
b/svgio/source/svgreader/svgfilternode.cxx
index 1d7198b7d466..168d7c50d608 100644
--- a/svgio/source/svgreader/svgfilternode.cxx
+++ b/svgio/source/svgreader/svgfilternode.cxx
@@ -17,7 +17,6 @@
  *   the License at http://www.apache.org/licenses/LICENSE-2.0 .
  */
 
-#include <unordered_map>
 #include <svgfilternode.hxx>
 #include <svgfecolormatrixnode.hxx>
 #include <svgfedropshadownode.hxx>
@@ -26,9 +25,6 @@
 #include <svgfegaussianblurnode.hxx>
 #include <svgfeoffsetnode.hxx>
 
-typedef std::unordered_map<OUString, const 
drawinglayer::primitive2d::Primitive2DContainer*>
-    IdGraphicSourceMapper;
-
 namespace svgio::svgreader
 {
 SvgFilterNode::SvgFilterNode(SVGToken aType, SvgDocument& rDocument, SvgNode* 
pParent)
@@ -38,31 +34,8 @@ SvgFilterNode::SvgFilterNode(SVGToken aType, SvgDocument& 
rDocument, SvgNode* pP
 
 SvgFilterNode::~SvgFilterNode() {}
 
-void SvgFilterNode::parseAttribute(SVGToken aSVGToken, const OUString& 
aContent)
-{
-    // call parent
-    SvgNode::parseAttribute(aSVGToken, aContent);
-
-    switch (aSVGToken)
-    {
-        case SVGToken::In:
-        {
-            maIn = aContent.trim();
-            break;
-        }
-        case SVGToken::Result:
-        {
-            maResult = aContent.trim();
-            break;
-        }
-        default:
-        {
-            break;
-        }
-    }
-}
-
-void SvgFilterNode::apply(drawinglayer::primitive2d::Primitive2DContainer& 
rTarget) const
+void SvgFilterNode::apply(drawinglayer::primitive2d::Primitive2DContainer& 
rTarget,
+                          const SvgFilterNode* /*pParent*/) const
 {
     if (rTarget.empty())
         return;
@@ -70,9 +43,7 @@ void 
SvgFilterNode::apply(drawinglayer::primitive2d::Primitive2DContainer& rTarg
     const auto& rChildren = getChildren();
     const sal_uInt32 nCount(rChildren.size());
 
-    IdGraphicSourceMapper aIdGraphicSourceMapperList;
-    drawinglayer::primitive2d::Primitive2DContainer aNewTarget = rTarget;
-    aIdGraphicSourceMapperList.emplace("SourceGraphic", &aNewTarget);
+    addGraphicSourceToMapper("SourceGraphic", rTarget);
     //TODO: Add SourceAlpha, BackgroundImage, BackgroundAlpha, FillPaint, 
StrokePaint ??
 
     // apply children's filters
@@ -81,25 +52,34 @@ void 
SvgFilterNode::apply(drawinglayer::primitive2d::Primitive2DContainer& rTarg
         SvgFilterNode* pFilterNode = 
dynamic_cast<SvgFilterNode*>(rChildren[a].get());
         if (pFilterNode)
         {
-            if (!pFilterNode->getIn().isEmpty())
-            {
-                const IdGraphicSourceMapper::const_iterator aResult(
-                    aIdGraphicSourceMapperList.find(pFilterNode->getIn()));
+            pFilterNode->apply(rTarget, this);
+        }
+    }
+}
 
-                if (aResult != aIdGraphicSourceMapperList.end())
-                {
-                    rTarget = *aResult->second;
-                }
-            }
+void SvgFilterNode::addGraphicSourceToMapper(
+    const OUString& rStr, drawinglayer::primitive2d::Primitive2DContainer 
pGraphicSource) const
+{
+    if (!rStr.isEmpty())
+    {
+        
const_cast<SvgFilterNode*>(this)->maIdGraphicSourceMapperList.emplace(rStr, 
pGraphicSource);
+    }
+}
 
-            pFilterNode->apply(rTarget);
+const drawinglayer::primitive2d::Primitive2DContainer*
+SvgFilterNode::findGraphicSource(const OUString& rStr) const
+{
+    if (rStr.isEmpty())
+        return nullptr;
 
-            if (!pFilterNode->getResult().isEmpty())
-            {
-                aNewTarget = rTarget;
-                aIdGraphicSourceMapperList.emplace(pFilterNode->getResult(), 
&aNewTarget);
-            }
-        }
+    const IdGraphicSourceMapper::const_iterator 
aResult(maIdGraphicSourceMapperList.find(rStr));
+    if (aResult == maIdGraphicSourceMapperList.end())
+    {
+        return nullptr;
+    }
+    else
+    {
+        return &aResult->second;
     }
 }
 
diff --git a/svgio/source/svgreader/svgstyleattributes.cxx 
b/svgio/source/svgreader/svgstyleattributes.cxx
index cdebccbd2526..d5e3ad33209e 100644
--- a/svgio/source/svgreader/svgstyleattributes.cxx
+++ b/svgio/source/svgreader/svgstyleattributes.cxx
@@ -1210,7 +1210,7 @@ namespace svgio::svgreader
                 const SvgFilterNode* pFilter = accessFilterXLink();
                 if(pFilter)
                 {
-                    pFilter->apply(aSource);
+                    pFilter->apply(aSource, nullptr);
                 }
             }
 

Reply via email to