diff options
| author | Armin Le Grand <alg@apache.org> | 2014-07-16 09:42:11 +0000 |
|---|---|---|
| committer | Armin Le Grand <alg@apache.org> | 2014-07-16 09:42:11 +0000 |
| commit | 3b13e15a7174f5177700fdcd4864b64fbf0b3535 (patch) | |
| tree | c4319e784d4644f5eb5646f0f32ddf9740e881c7 | |
| parent | 82fafc47de0c59c783c5df596c976a429ff8a21d (diff) | |
i125258 reworked some of the style hierarchy stuff
Notes
merged as: 0879a639bc7c734f0847f74b965809f9107b3195
| -rw-r--r-- | svgio/inc/svgio/svgreader/svgnode.hxx | 3 | ||||
| -rw-r--r-- | svgio/inc/svgio/svgreader/svgstyleattributes.hxx | 1 | ||||
| -rw-r--r-- | svgio/inc/svgio/svgreader/svgstylenode.hxx | 3 | ||||
| -rw-r--r-- | svgio/inc/svgio/svgreader/svgsvgnode.hxx | 7 | ||||
| -rw-r--r-- | svgio/source/svgreader/svggnode.cxx | 44 | ||||
| -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 | 17 | ||||
| -rw-r--r-- | svgio/source/svgreader/svgstylenode.cxx | 13 | ||||
| -rw-r--r-- | svgio/source/svgreader/svgsvgnode.cxx | 56 | ||||
| -rwxr-xr-x | svgio/source/svgreader/svgtitledescnode.cxx | 1 |
11 files changed, 133 insertions, 19 deletions
diff --git a/svgio/inc/svgio/svgreader/svgnode.hxx b/svgio/inc/svgio/svgreader/svgnode.hxx index 7142febe9ec6..149344fc0e8e 100644 --- a/svgio/inc/svgio/svgreader/svgnode.hxx +++ b/svgio/inc/svgio/svgreader/svgnode.hxx @@ -130,6 +130,9 @@ namespace svgio virtual void parseAttribute(const rtl::OUString& rTokenName, SVGToken aSVGToken, const rtl::OUString& aContent); virtual void decomposeSvgNode(drawinglayer::primitive2d::Primitive2DSequence& rTarget, bool bReferenced) const; + /// #125258# tell if this node is allowed to have a parent style (e.g. defs do not) + virtual bool supportsParentStyle() const; + /// basic data read access SVGToken getType() const { return maType; } const SvgDocument& getDocument() const { return mrDocument; } diff --git a/svgio/inc/svgio/svgreader/svgstyleattributes.hxx b/svgio/inc/svgio/svgreader/svgstyleattributes.hxx index 5c46c599167b..36e60ac1acda 100644 --- a/svgio/inc/svgio/svgreader/svgstyleattributes.hxx +++ b/svgio/inc/svgio/svgreader/svgstyleattributes.hxx @@ -286,6 +286,7 @@ namespace svgio ~SvgStyleAttributes(); /// fill content + bool isFillSet() const; // #125258# ask if fill is a direct hard attribute (no hierarchy) const basegfx::BColor* getFill() const; void setFill(const SvgPaint& rFill) { maFill = rFill; } diff --git a/svgio/inc/svgio/svgreader/svgstylenode.hxx b/svgio/inc/svgio/svgreader/svgstylenode.hxx index 04dc20ab5ade..924ef88604c2 100644 --- a/svgio/inc/svgio/svgreader/svgstylenode.hxx +++ b/svgio/inc/svgio/svgreader/svgstylenode.hxx @@ -47,6 +47,9 @@ namespace svgio SvgNode* pParent); virtual ~SvgStyleNode(); + /// #125258# tell if this node is allowed to have a parent style (e.g. defs do not) + virtual bool supportsParentStyle() const; + virtual void parseAttribute(const rtl::OUString& rTokenName, SVGToken aSVGToken, const rtl::OUString& aContent); void addCssStyleSheet(const rtl::OUString& aContent); diff --git a/svgio/inc/svgio/svgreader/svgsvgnode.hxx b/svgio/inc/svgio/svgreader/svgsvgnode.hxx index 38b7c2d8c2ac..6b4b5f7147fe 100644 --- a/svgio/inc/svgio/svgreader/svgsvgnode.hxx +++ b/svgio/inc/svgio/svgreader/svgsvgnode.hxx @@ -46,6 +46,13 @@ namespace svgio SvgNumber maHeight; SvgNumber maVersion; + /// #125258# bitfield + bool mbStyleAttributesInitialized : 1; + + // #125258# on-demand init hard attributes when this is the outmost svg element + // and more (see implementation) + void initializeStyleAttributes(); + public: SvgSvgNode( SvgDocument& rDocument, diff --git a/svgio/source/svgreader/svggnode.cxx b/svgio/source/svgreader/svggnode.cxx index 9498a883893f..a86f82f0bc8c 100644 --- a/svgio/source/svgreader/svggnode.cxx +++ b/svgio/source/svgreader/svggnode.cxx @@ -50,9 +50,18 @@ namespace svgio const SvgStyleAttributes* SvgGNode::getSvgStyleAttributes() const { - static rtl::OUString aClassStr(rtl::OUString::createFromAscii("g")); + if(SVGTokenDefs == getType()) + { + // #125258# call parent for SVGTokenDefs + return SvgNode::getSvgStyleAttributes(); + } + else + { + // #125258# for SVGTokenG take CssStyles into account + static rtl::OUString aClassStr(rtl::OUString::createFromAscii("g")); - return checkForCssStyle(aClassStr, maSvgStyleAttributes); + return checkForCssStyle(aClassStr, maSvgStyleAttributes); + } } void SvgGNode::parseAttribute(const rtl::OUString& rTokenName, SVGToken aSVGToken, const rtl::OUString& aContent) @@ -90,22 +99,31 @@ namespace svgio void SvgGNode::decomposeSvgNode(drawinglayer::primitive2d::Primitive2DSequence& rTarget, bool bReferenced) const { - const SvgStyleAttributes* pStyle = getSvgStyleAttributes(); - - if(pStyle) + if(SVGTokenDefs == getType()) { - const double fOpacity(pStyle->getOpacity().getNumber()); + // #125258# no decompose needed for defs element, call parent for SVGTokenDefs + SvgNode::decomposeSvgNode(rTarget, bReferenced); + } + else + { + // #125258# for SVGTokenG decompose childs + const SvgStyleAttributes* pStyle = getSvgStyleAttributes(); - if(fOpacity > 0.0 && Display_none != getDisplay()) + if(pStyle) { - drawinglayer::primitive2d::Primitive2DSequence aContent; - - // decompose childs - SvgNode::decomposeSvgNode(aContent, bReferenced); + const double fOpacity(pStyle->getOpacity().getNumber()); - if(aContent.hasElements()) + if(fOpacity > 0.0 && Display_none != getDisplay()) { - pStyle->add_postProcess(rTarget, aContent, getTransform()); + drawinglayer::primitive2d::Primitive2DSequence aContent; + + // decompose childs + 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 87bbbbbe2c2b..a270c24cf07e 100644 --- a/svgio/source/svgreader/svggradientnode.cxx +++ b/svgio/source/svgreader/svggradientnode.cxx @@ -61,6 +61,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 f73b008765e9..03e27954e84c 100644 --- a/svgio/source/svgreader/svgnode.cxx +++ b/svgio/source/svgreader/svgnode.cxx @@ -36,6 +36,12 @@ namespace svgio { namespace svgreader { + /// #125258# + 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 f691fc6cfff7..f4f6aa64138a 100644 --- a/svgio/source/svgreader/svgstyleattributes.cxx +++ b/svgio/source/svgreader/svgstyleattributes.cxx @@ -219,7 +219,7 @@ namespace svgio return getCssStyleParent(); } - if(mrOwner.getParent()) + if(mrOwner.supportsParentStyle() && mrOwner.getParent()) { return mrOwner.getParent()->getSvgStyleAttributes(); } @@ -1880,6 +1880,21 @@ namespace svgio } } + // #125258# 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 e72c3becbf95..8f62710b38d5 100644 --- a/svgio/source/svgreader/svgstylenode.cxx +++ b/svgio/source/svgreader/svgstylenode.cxx @@ -49,6 +49,19 @@ namespace svgio } } + // #125258# 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 rtl::OUString& rTokenName, SVGToken aSVGToken, const rtl::OUString& aContent) { // call parent diff --git a/svgio/source/svgreader/svgsvgnode.cxx b/svgio/source/svgreader/svgsvgnode.cxx index 7871a2349f5a..d4268124d66b 100644 --- a/svgio/source/svgreader/svgsvgnode.cxx +++ b/svgio/source/svgreader/svgsvgnode.cxx @@ -49,12 +49,50 @@ namespace svgio maY(), maWidth(), maHeight(), - maVersion() + maVersion(), + mbStyleAttributesInitialized(false) // #125258# { - if(!getParent()) + } + + // #125258# + void SvgSvgNode::initializeStyleAttributes() + { + if(!mbStyleAttributesInitialized) { - // initial fill is black - maSvgStyleAttributes.setFill(SvgPaint(basegfx::BColor(0.0, 0.0, 0.0), true, true)); + // #125258# 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()) + { + // #125258# no initial values when it's a SVG element embedded in SVG + bSetInitialValues = false; + } + + if(bSetInitialValues) + { + const SvgStyleAttributes* pStyles = getSvgStyleAttributes(); + + if(pStyles && pStyles->getParentStyle()) + { + // #125258# no initial values when SVG has a parent style (probably CssStyle) + bSetInitialValues = false; + } + } + + if(bSetInitialValues) + { + // #125258# only set if not yet initialized (SvgSvgNode::parseAttribute is already done, + // just setting may revert an already set valid value) + if(!maSvgStyleAttributes.isFillSet()) + { + // #125258# initial fill is black (see SVG1.1 spec) + maSvgStyleAttributes.setFill(SvgPaint(basegfx::BColor(0.0, 0.0, 0.0), true, true)); + } + } + + mbStyleAttributesInitialized = true; } } @@ -65,7 +103,10 @@ namespace svgio const SvgStyleAttributes* SvgSvgNode::getSvgStyleAttributes() const { - return &maSvgStyleAttributes; + // #125258# svg node can vahe CssStyles, too, so check for it here + static rtl::OUString aClassStr(rtl::OUString::createFromAscii("svg")); + + return checkForCssStyle(aClassStr, maSvgStyleAttributes); } void SvgSvgNode::parseAttribute(const rtl::OUString& rTokenName, SVGToken aSVGToken, const rtl::OUString& aContent) @@ -251,6 +292,11 @@ namespace svgio { drawinglayer::primitive2d::Primitive2DSequence aSequence; + // #125258# 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 childs SvgNode::decomposeSvgNode(aSequence, bReferenced); diff --git a/svgio/source/svgreader/svgtitledescnode.cxx b/svgio/source/svgreader/svgtitledescnode.cxx index 0891075d0450..08901f2292e5 100755 --- a/svgio/source/svgreader/svgtitledescnode.cxx +++ b/svgio/source/svgreader/svgtitledescnode.cxx @@ -37,6 +37,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() |
