[Libreoffice-commits] core.git: Branch 'aoo/trunk' - svgio/inc svgio/source

Armin Le Grand alg at apache.org
Wed Jul 16 03:09:09 PDT 2014


 svgio/inc/svgio/svgreader/svgnode.hxx            |    3 +
 svgio/inc/svgio/svgreader/svgstyleattributes.hxx |    1 
 svgio/inc/svgio/svgreader/svgstylenode.hxx       |    3 +
 svgio/inc/svgio/svgreader/svgsvgnode.hxx         |    7 ++
 svgio/source/svgreader/svggnode.cxx              |   44 ++++++++++++------
 svgio/source/svgreader/svggradientnode.cxx       |    1 
 svgio/source/svgreader/svgnode.cxx               |    6 ++
 svgio/source/svgreader/svgstyleattributes.cxx    |   17 ++++++
 svgio/source/svgreader/svgstylenode.cxx          |   13 +++++
 svgio/source/svgreader/svgsvgnode.cxx            |   56 ++++++++++++++++++++---
 svgio/source/svgreader/svgtitledescnode.cxx      |    1 
 11 files changed, 133 insertions(+), 19 deletions(-)

New commits:
commit 3b13e15a7174f5177700fdcd4864b64fbf0b3535
Author: Armin Le Grand <alg at apache.org>
Date:   Wed Jul 16 09:42:11 2014 +0000

    i125258 reworked some of the style hierarchy stuff

diff --git a/svgio/inc/svgio/svgreader/svgnode.hxx b/svgio/inc/svgio/svgreader/svgnode.hxx
index 7142feb..149344f 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 5c46c59..36e60ac 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 04dc20a..924ef88 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 38b7c2d..6b4b5f7 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 9498a88..a86f82f 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 87bbbbb..a270c24 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 f73b0087..03e2795 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 f691fc6..f4f6aa6 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 e72c3be..8f62710 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 7871a23..d426812 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 0891075..08901f2 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()


More information about the Libreoffice-commits mailing list