[Libreoffice-commits] core.git: svgio/inc svgio/source

Xisco Fauli anistenis at gmail.com
Mon Mar 7 08:49:11 UTC 2016


 svgio/inc/svgio/svgreader/svgstyleattributes.hxx |    5 ++
 svgio/source/svgreader/svgstyleattributes.cxx    |   46 ++++++++++++++++++-----
 2 files changed, 41 insertions(+), 10 deletions(-)

New commits:
commit d5649ae7b76278cb3155f951d6327157c7c92b65
Author: Xisco Fauli <anistenis at gmail.com>
Date:   Sun Mar 6 19:03:27 2016 +0100

    SVGIO: tdf#97539: clip-path elements might contain...
    
    reference to other clip-paths
    
    Change-Id: I3722b31cefa4df6225e369b3d1db9f46be5933ff
    Reviewed-on: https://gerrit.libreoffice.org/22956
    Tested-by: Jenkins <ci at libreoffice.org>
    Reviewed-by: Xisco FaulĂ­ <anistenis at gmail.com>

diff --git a/svgio/inc/svgio/svgreader/svgstyleattributes.hxx b/svgio/inc/svgio/svgreader/svgstyleattributes.hxx
index f0c21ba..fcd6114 100644
--- a/svgio/inc/svgio/svgreader/svgstyleattributes.hxx
+++ b/svgio/inc/svgio/svgreader/svgstyleattributes.hxx
@@ -32,6 +32,7 @@ namespace svgio { namespace svgreader {
     class SvgGradientNode;
     class SvgPatternNode;
     class SvgMarkerNode;
+    class SvgClipPathNode;
 }}
 
 
@@ -215,6 +216,7 @@ namespace svgio
 
             /// link to content. If set, the node can be fetched on demand
             OUString               maClipPathXLink;
+            const SvgClipPathNode* mpClipPathXLink;
             OUString               maMaskXLink;
 
             /// link to markers. If set, the node can be fetched on demand
@@ -441,7 +443,8 @@ namespace svgio
             void setDesc(const OUString& rNew) { maDesc = rNew; }
 
             // ClipPathXLink content
-            const OUString getClipPathXLink() const { return maClipPathXLink; }
+            OUString getClipPathXLink() const;
+            const SvgClipPathNode* accessClipPathXLink() const;
 
             // MaskXLink content
             const OUString getMaskXLink() const { return maMaskXLink; }
diff --git a/svgio/source/svgreader/svgstyleattributes.cxx b/svgio/source/svgreader/svgstyleattributes.cxx
index 3e454e4..691a1f8 100644
--- a/svgio/source/svgreader/svgstyleattributes.cxx
+++ b/svgio/source/svgreader/svgstyleattributes.cxx
@@ -1145,16 +1145,11 @@ namespace svgio
                     aSource = drawinglayer::primitive2d::Primitive2DContainer { xRef };
                 }
 
-                if(!getClipPathXLink().isEmpty())
+                const SvgClipPathNode* mpClip = accessClipPathXLink();
+                if(mpClip)
                 {
-                    // try to access linked ClipPath
-                    const SvgClipPathNode* mpClip = dynamic_cast< const SvgClipPathNode* >(mrOwner.getDocument().findSvgNodeById(getClipPathXLink()));
-
-                    if(mpClip)
-                    {
-                        // #i124852# transform may be needed when userSpaceOnUse
-                        mpClip->apply(aSource, pTransform);
-                    }
+                    // #i124852# transform may be needed when userSpaceOnUse
+                    mpClip->apply(aSource, pTransform);
                 }
 
                 if(!aSource.empty()) // test again, applied clipPath may have lead to empty geometry
@@ -1215,6 +1210,7 @@ namespace svgio
             maTitle(),
             maDesc(),
             maClipPathXLink(),
+            mpClipPathXLink(nullptr),
             maMaskXLink(),
             maMarkerStartXLink(),
             mpMarkerStartXLink(nullptr),
@@ -2659,6 +2655,38 @@ namespace svgio
             return nullptr;
         }
 
+        OUString SvgStyleAttributes::getClipPathXLink() const
+        {
+            if(!maClipPathXLink.isEmpty())
+            {
+                return maClipPathXLink;
+            }
+
+            const SvgStyleAttributes* pSvgStyleAttributes = getParentStyle();
+
+            if(pSvgStyleAttributes && !pSvgStyleAttributes->maClipPathXLink.isEmpty())
+            {
+                return pSvgStyleAttributes->getClipPathXLink();
+            }
+
+            return OUString();
+        }
+
+        const SvgClipPathNode* SvgStyleAttributes::accessClipPathXLink() const
+        {
+            if(!mpClipPathXLink)
+            {
+                const OUString aClipPath(getClipPathXLink());
+
+                if(!aClipPath.isEmpty())
+                {
+                    const_cast< SvgStyleAttributes* >(this)->mpClipPathXLink = dynamic_cast< const SvgClipPathNode* >(mrOwner.getDocument().findSvgNodeById(getClipPathXLink()));
+                }
+            }
+
+            return mpClipPathXLink;
+        }
+
         OUString SvgStyleAttributes::getMarkerStartXLink() const
         {
             if(!maMarkerStartXLink.isEmpty())


More information about the Libreoffice-commits mailing list