summaryrefslogtreecommitdiff
path: root/svgio
diff options
context:
space:
mode:
authorXisco Fauli <anistenis@gmail.com>2016-03-06 19:03:27 +0100
committerXisco FaulĂ­ <anistenis@gmail.com>2016-03-07 08:48:50 +0000
commitd5649ae7b76278cb3155f951d6327157c7c92b65 (patch)
tree6312127def6dcf68afff21c05d72f88ecac7a2d4 /svgio
parent3c465c259c617e30b01c5ea25b5203a605cd4269 (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')
-rw-r--r--svgio/inc/svgio/svgreader/svgstyleattributes.hxx5
-rw-r--r--svgio/source/svgreader/svgstyleattributes.cxx46
2 files changed, 41 insertions, 10 deletions
diff --git a/svgio/inc/svgio/svgreader/svgstyleattributes.hxx b/svgio/inc/svgio/svgreader/svgstyleattributes.hxx
index f0c21ba47a49..fcd6114b730d 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 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())