diff options
author | Xisco Fauli <anistenis@gmail.com> | 2016-03-06 19:03:27 +0100 |
---|---|---|
committer | Xisco Faulí <anistenis@gmail.com> | 2016-03-07 08:48:50 +0000 |
commit | d5649ae7b76278cb3155f951d6327157c7c92b65 (patch) | |
tree | 6312127def6dcf68afff21c05d72f88ecac7a2d4 /svgio/source | |
parent | 3c465c259c617e30b01c5ea25b5203a605cd4269 (diff) |
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@libreoffice.org>
Reviewed-by: Xisco Faulí <anistenis@gmail.com>
Diffstat (limited to 'svgio/source')
-rw-r--r-- | svgio/source/svgreader/svgstyleattributes.cxx | 46 |
1 files changed, 37 insertions, 9 deletions
diff --git a/svgio/source/svgreader/svgstyleattributes.cxx b/svgio/source/svgreader/svgstyleattributes.cxx index 3e454e4babc7..691a1f8d2a41 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()) |