diff options
author | Armin Le Grand <alg@apache.org> | 2014-07-16 09:42:11 +0000 |
---|---|---|
committer | Caolán McNamara <caolanm@redhat.com> | 2014-07-16 11:40:58 +0100 |
commit | 0879a639bc7c734f0847f74b965809f9107b3195 (patch) | |
tree | 94501e749cdfe270b1b20302fa3bbc79535586c3 /svgio/source | |
parent | 3a1abb6804c0012718e11dab15d4f35acdef243a (diff) |
Resolves: #i125258# reworked some of the style hierarchy stuff
(cherry picked from commit 3b13e15a7174f5177700fdcd4864b64fbf0b3535)
Conflicts:
svgio/inc/svgio/svgreader/svgstylenode.hxx
svgio/source/svgreader/svggnode.cxx
svgio/source/svgreader/svgstyleattributes.cxx
svgio/source/svgreader/svgstylenode.cxx
svgio/source/svgreader/svgsvgnode.cxx
Change-Id: I5cfe6871ab235305f206d83d643884b493901dfe
Diffstat (limited to 'svgio/source')
-rw-r--r-- | svgio/source/svgreader/svggnode.cxx | 48 | ||||
-rw-r--r-- | svgio/source/svgreader/svggradientnode.cxx | 1 | ||||
-rw-r--r-- | svgio/source/svgreader/svgnode.cxx | 6 | ||||
-rw-r--r-- | svgio/source/svgreader/svgstyleattributes.cxx | 22 | ||||
-rw-r--r-- | svgio/source/svgreader/svgstylenode.cxx | 13 | ||||
-rw-r--r-- | svgio/source/svgreader/svgsvgnode.cxx | 60 | ||||
-rw-r--r-- | svgio/source/svgreader/svgtitledescnode.cxx | 1 |
7 files changed, 119 insertions, 32 deletions
diff --git a/svgio/source/svgreader/svggnode.cxx b/svgio/source/svgreader/svggnode.cxx index 45fa6a31ec53..c3957c729fa9 100644 --- a/svgio/source/svgreader/svggnode.cxx +++ b/svgio/source/svgreader/svggnode.cxx @@ -43,13 +43,16 @@ namespace svgio const SvgStyleAttributes* SvgGNode::getSvgStyleAttributes() const { - const SvgStyleAttributes* aCheckCssStyle = checkForCssStyle(OUString("g"), maSvgStyleAttributes); - const SvgStyleAttributes* aGetCssStyleParent = maSvgStyleAttributes.getCssStyleParent(); - - if (aGetCssStyleParent == NULL) - return aCheckCssStyle; - - return aGetCssStyleParent; + if (SVGTokenDefs == getType()) + { + // #i125258# call parent for SVGTokenDefs + return SvgNode::getSvgStyleAttributes(); + } + else + { + // #i125258# for SVGTokenG take CssStyles into account + return checkForCssStyle(OUString("g"), maSvgStyleAttributes); + } } void SvgGNode::parseAttribute(const OUString& rTokenName, SVGToken aSVGToken, const OUString& aContent) @@ -87,22 +90,31 @@ namespace svgio void SvgGNode::decomposeSvgNode(drawinglayer::primitive2d::Primitive2DSequence& rTarget, bool bReferenced) const { - const SvgStyleAttributes* pStyle = getSvgStyleAttributes(); - - if(pStyle) + if(SVGTokenDefs == getType()) + { + // #i125258# no decompose needed for defs element, call parent for SVGTokenDefs + SvgNode::decomposeSvgNode(rTarget, bReferenced); + } + else { - const double fOpacity(pStyle->getOpacity().getNumber()); + // #i125258# for SVGTokenG decompose childs + const SvgStyleAttributes* pStyle = getSvgStyleAttributes(); - if(fOpacity > 0.0 && Display_none != getDisplay()) + if(pStyle) { - drawinglayer::primitive2d::Primitive2DSequence aContent; + const double fOpacity(pStyle->getOpacity().getNumber()); - // decompose children - SvgNode::decomposeSvgNode(aContent, bReferenced); - - if(aContent.hasElements()) + if(fOpacity > 0.0 && Display_none != getDisplay()) { - pStyle->add_postProcess(rTarget, aContent, getTransform()); + drawinglayer::primitive2d::Primitive2DSequence aContent; + + // decompose children + SvgNode::decomposeSvgNode(aContent, bReferenced); + + if(aContent.hasElements()) + { + pStyle->add_postProcess(rTarget, aContent, getTransform()); + } } } } diff --git a/svgio/source/svgreader/svggradientnode.cxx b/svgio/source/svgreader/svggradientnode.cxx index e22ffba7f0cd..893ff9657b93 100644 --- a/svgio/source/svgreader/svggradientnode.cxx +++ b/svgio/source/svgreader/svggradientnode.cxx @@ -54,6 +54,7 @@ namespace svgio maXLink(), mpXLink(0) { + OSL_ENSURE(aType == SVGTokenLinearGradient || aType == SVGTokenRadialGradient, "SvgGradientNode should ony be used for Linear and Radial gradient (!)"); } SvgGradientNode::~SvgGradientNode() diff --git a/svgio/source/svgreader/svgnode.cxx b/svgio/source/svgreader/svgnode.cxx index 293834cdf5e9..e37594da76d1 100644 --- a/svgio/source/svgreader/svgnode.cxx +++ b/svgio/source/svgreader/svgnode.cxx @@ -29,6 +29,12 @@ namespace svgio { namespace svgreader { + /// #i125258# + bool SvgNode::supportsParentStyle() const + { + return true; + } + const SvgStyleAttributes* SvgNode::getSvgStyleAttributes() const { return 0; diff --git a/svgio/source/svgreader/svgstyleattributes.cxx b/svgio/source/svgreader/svgstyleattributes.cxx index 1051e46f4423..cc9d40cfb16e 100644 --- a/svgio/source/svgreader/svgstyleattributes.cxx +++ b/svgio/source/svgreader/svgstyleattributes.cxx @@ -205,9 +205,10 @@ namespace svgio { const SvgStyleAttributes* pParentStyle = getCssStyleParent(); - // no parent style set, check parent for its style attributes - if(pParentStyle == NULL && mrOwner.getParent() != NULL) - pParentStyle = mrOwner.getParent()->getSvgStyleAttributes(); + if(mrOwner.supportsParentStyle() && mrOwner.getParent()) + { + return mrOwner.getParent()->getSvgStyleAttributes(); + } if (pParentStyle != this) // to prevent infinite loop return pParentStyle; @@ -1808,6 +1809,21 @@ namespace svgio } } + // #i125258# ask if fill is a direct hard attribute (no hierarchy) + bool SvgStyleAttributes::isFillSet() const + { + if(mbIsClipPathContent) + { + return false; + } + else if(maFill.isSet()) + { + return true; + } + + return false; + } + const basegfx::BColor* SvgStyleAttributes::getFill() const { if(mbIsClipPathContent) diff --git a/svgio/source/svgreader/svgstylenode.cxx b/svgio/source/svgreader/svgstylenode.cxx index 1ffbade7f8db..99f7ff53e9ce 100644 --- a/svgio/source/svgreader/svgstylenode.cxx +++ b/svgio/source/svgreader/svgstylenode.cxx @@ -42,6 +42,19 @@ namespace svgio } } + // #i125258# no parent when we are a CssStyle holder to break potential loops because + // when using CssStyles we jump uncontrolled inside the node tree hierarchy + bool SvgStyleNode::supportsParentStyle() const + { + if(isTextCss()) + { + return false; + } + + // call parent + return SvgNode::supportsParentStyle(); + } + void SvgStyleNode::parseAttribute(const OUString& rTokenName, SVGToken aSVGToken, const OUString& aContent) { // call parent diff --git a/svgio/source/svgreader/svgsvgnode.cxx b/svgio/source/svgreader/svgsvgnode.cxx index 73a5efbdda9e..6c39cc996c31 100644 --- a/svgio/source/svgreader/svgsvgnode.cxx +++ b/svgio/source/svgreader/svgsvgnode.cxx @@ -42,12 +42,50 @@ namespace svgio maY(), maWidth(), maHeight(), - maVersion() + maVersion(), + mbStyleAttributesInitialized(false) // #i125258# { - if(!getParent()) + } + + // #i125258# + void SvgSvgNode::initializeStyleAttributes() + { + if(!mbStyleAttributesInitialized) { - // initial fill is black - maSvgStyleAttributes.setFill(SvgPaint(basegfx::BColor(0.0, 0.0, 0.0), true, true)); + // #i125258# determine if initial values need to be initialized with hard values + // for the case that this is the outmost SVG statement and it has no parent + // stale (CssStyle for svg may be defined) + bool bSetInitialValues(true); + + if(getParent()) + { + // #i125258# no initial values when it's a SVG element embedded in SVG + bSetInitialValues = false; + } + + if(bSetInitialValues) + { + const SvgStyleAttributes* pStyles = getSvgStyleAttributes(); + + if(pStyles && pStyles->getParentStyle()) + { + // #i125258# no initial values when SVG has a parent style (probably CssStyle) + bSetInitialValues = false; + } + } + + if(bSetInitialValues) + { + // #i125258# only set if not yet initialized (SvgSvgNode::parseAttribute is already done, + // just setting may revert an already set valid value) + if(!maSvgStyleAttributes.isFillSet()) + { + // #i125258# initial fill is black (see SVG1.1 spec) + maSvgStyleAttributes.setFill(SvgPaint(basegfx::BColor(0.0, 0.0, 0.0), true, true)); + } + } + + mbStyleAttributesInitialized = true; } } @@ -58,13 +96,8 @@ namespace svgio const SvgStyleAttributes* SvgSvgNode::getSvgStyleAttributes() const { - const SvgStyleAttributes* aCheckCssStyle = checkForCssStyle(OUString("svg"), maSvgStyleAttributes); - const SvgStyleAttributes* aGetCssStyleParent = maSvgStyleAttributes.getCssStyleParent(); - - if (aGetCssStyleParent == NULL) - return aCheckCssStyle; - - return aGetCssStyleParent; + // #i125258# svg node can have CssStyles, too, so check for it here + return checkForCssStyle(OUString("svg"), maSvgStyleAttributes); } void SvgSvgNode::parseAttribute(const OUString& rTokenName, SVGToken aSVGToken, const OUString& aContent) @@ -250,6 +283,11 @@ namespace svgio { drawinglayer::primitive2d::Primitive2DSequence aSequence; + // #i125258# check now if we need to init some style settings locally. Do not do this + // in the constructor, there is not yet informatikon e.g. about existing CssStyles. + // Here all nodes are read and interpreted + const_cast< SvgSvgNode* >(this)->initializeStyleAttributes(); + // decompose children SvgNode::decomposeSvgNode(aSequence, bReferenced); diff --git a/svgio/source/svgreader/svgtitledescnode.cxx b/svgio/source/svgreader/svgtitledescnode.cxx index 836d40f0bb63..d98cf2abba58 100644 --- a/svgio/source/svgreader/svgtitledescnode.cxx +++ b/svgio/source/svgreader/svgtitledescnode.cxx @@ -32,6 +32,7 @@ namespace svgio : SvgNode(aType, rDocument, pParent), maText() { + OSL_ENSURE(aType == SVGTokenTitle || aType == SVGTokenDesc, "SvgTitleDescNode should ony be used for Title and Desc (!)"); } SvgTitleDescNode::~SvgTitleDescNode() |