summaryrefslogtreecommitdiff
path: root/svgio
diff options
context:
space:
mode:
authorXisco Fauli <anistenis@gmail.com>2016-03-07 23:05:59 +0100
committerNoel Grandin <noelgrandin@gmail.com>2016-03-09 08:51:27 +0000
commitecc7f698b5f080530f006218fa3dd82da43d9abb (patch)
tree54307f8f7cc17c2d39dc63c530bb76def03a3e7f /svgio
parent49b78749b1323dc7978d15135bc42646cb0db719 (diff)
SVGIO: Fix problem when style's parent contains a mask element
Change-Id: I26aab6c0f959f6cc78d040f59f1acf0c7e29931b Reviewed-on: https://gerrit.libreoffice.org/23045 Tested-by: Jenkins <ci@libreoffice.org> Reviewed-by: Noel Grandin <noelgrandin@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 fcd6114b730d..f711feb3af63 100644
--- a/svgio/inc/svgio/svgreader/svgstyleattributes.hxx
+++ b/svgio/inc/svgio/svgreader/svgstyleattributes.hxx
@@ -33,6 +33,7 @@ namespace svgio { namespace svgreader {
class SvgPatternNode;
class SvgMarkerNode;
class SvgClipPathNode;
+ class SvgMaskNode;
}}
@@ -218,6 +219,7 @@ namespace svgio
OUString maClipPathXLink;
const SvgClipPathNode* mpClipPathXLink;
OUString maMaskXLink;
+ const SvgMaskNode* mpMaskXLink;
/// link to markers. If set, the node can be fetched on demand
OUString maMarkerStartXLink;
@@ -447,7 +449,8 @@ namespace svgio
const SvgClipPathNode* accessClipPathXLink() const;
// MaskXLink content
- const OUString getMaskXLink() const { return maMaskXLink; }
+ OUString getMaskXLink() const;
+ const SvgMaskNode* accessMaskXLink() const;
// MarkerStartXLink content
OUString getMarkerStartXLink() const;
diff --git a/svgio/source/svgreader/svgstyleattributes.cxx b/svgio/source/svgreader/svgstyleattributes.cxx
index 691a1f8d2a41..b226770d55b3 100644
--- a/svgio/source/svgreader/svgstyleattributes.cxx
+++ b/svgio/source/svgreader/svgstyleattributes.cxx
@@ -1154,16 +1154,11 @@ namespace svgio
if(!aSource.empty()) // test again, applied clipPath may have lead to empty geometry
{
- if(!getMaskXLink().isEmpty())
+ const SvgMaskNode* mpMask = accessMaskXLink();
+ if(mpMask)
{
- // try to access linked Mask
- const SvgMaskNode* mpMask = dynamic_cast< const SvgMaskNode* >(mrOwner.getDocument().findSvgNodeById(getMaskXLink()));
-
- if(mpMask)
- {
- // #i124852# transform may be needed when userSpaceOnUse
- mpMask->apply(aSource, pTransform);
- }
+ // #i124852# transform may be needed when userSpaceOnUse
+ mpMask->apply(aSource, pTransform);
}
if(!aSource.empty()) // test again, applied mask may have lead to empty geometry
@@ -1212,6 +1207,7 @@ namespace svgio
maClipPathXLink(),
mpClipPathXLink(nullptr),
maMaskXLink(),
+ mpMaskXLink(nullptr),
maMarkerStartXLink(),
mpMarkerStartXLink(nullptr),
maMarkerMidXLink(),
@@ -2687,6 +2683,38 @@ namespace svgio
return mpClipPathXLink;
}
+ OUString SvgStyleAttributes::getMaskXLink() const
+ {
+ if(!maMaskXLink.isEmpty())
+ {
+ return maMaskXLink;
+ }
+
+ const SvgStyleAttributes* pSvgStyleAttributes = getParentStyle();
+
+ if(pSvgStyleAttributes && !pSvgStyleAttributes->maMaskXLink.isEmpty())
+ {
+ return pSvgStyleAttributes->getMaskXLink();
+ }
+
+ return OUString();
+ }
+
+ const SvgMaskNode* SvgStyleAttributes::accessMaskXLink() const
+ {
+ if(!mpMaskXLink)
+ {
+ const OUString aMask(getMaskXLink());
+
+ if(!aMask.isEmpty())
+ {
+ const_cast< SvgStyleAttributes* >(this)->mpMaskXLink = dynamic_cast< const SvgMaskNode* >(mrOwner.getDocument().findSvgNodeById(getMaskXLink()));
+ }
+ }
+
+ return mpMaskXLink;
+ }
+
OUString SvgStyleAttributes::getMarkerStartXLink() const
{
if(!maMarkerStartXLink.isEmpty())