From 53b4b458982fd9520ac710843fd5b68780adf159 Mon Sep 17 00:00:00 2001
From: Kim Motoyoshi Kalland <kim.kalland@nokia.com>
Date: Thu, 10 Sep 2009 10:39:42 +0200
Subject: Fixed handling of stop-color="currentColor" in the SVG module.

The 'color' attribute is now explicitly parsed for gradient nodes.

Task-number: 260921
Reviewed-by: Trond
---
 src/svg/qsvghandler.cpp | 43 +++++++++++++++++++++++++++++--------------
 src/svg/qsvghandler_p.h |  2 ++
 2 files changed, 31 insertions(+), 14 deletions(-)

diff --git a/src/svg/qsvghandler.cpp b/src/svg/qsvghandler.cpp
index 06a49d8..98fa26f 100644
--- a/src/svg/qsvghandler.cpp
+++ b/src/svg/qsvghandler.cpp
@@ -968,6 +968,7 @@ static void parseColor(QSvgNode *,
 {
     QColor color;
     if (constructColor(attributes.color, attributes.colorOpacity, color, handler)) {
+        handler->popColor();
         handler->pushColor(color);
     }
 }
@@ -2728,6 +2729,14 @@ static void parseBaseGradient(QSvgNode *node,
     QStringRef trans  = attributes.value(QLatin1String("gradientTransform"));
     QString spread = attributes.value(QLatin1String("spreadMethod")).toString();
     QString units = attributes.value(QLatin1String("gradientUnits")).toString();
+    QStringRef colorStr = attributes.value(QLatin1String("color"));
+    QStringRef colorOpacityStr = attributes.value(QLatin1String("color-opacity"));
+
+    QColor color;
+    if (constructColor(colorStr, colorOpacityStr, color, handler)) {
+        handler->popColor();
+        handler->pushColor(color);
+    }
 
     QMatrix matrix;
     QGradient *grad = gradProp->qgradient();
@@ -3558,11 +3567,7 @@ bool QSvgHandler::startElement(const QString &localName,
 {
     QSvgNode *node = 0;
 
-    if (m_colorTagCount.count()) {
-        int top = m_colorTagCount.pop();
-        ++top;
-        m_colorTagCount.push(top);
-    }
+    pushColorCopy();
 
     /* The xml:space attribute may appear on any element. We do
      * a lookup by the qualified name here, but this is namespace aware, since
@@ -3696,15 +3701,7 @@ bool QSvgHandler::endElement(const QStringRef &localName)
     m_skipNodes.pop();
     m_whitespaceMode.pop();
 
-    if (m_colorTagCount.count()) {
-        int top = m_colorTagCount.pop();
-        --top;
-        if (!top) {
-            m_colorStack.pop();
-        } else {
-            m_colorTagCount.push(top);
-        }
-    }
+    popColor();
 
     if (node == Unknown) {
         return true;
@@ -3801,6 +3798,24 @@ void QSvgHandler::pushColor(const QColor &color)
     m_colorTagCount.push(1);
 }
 
+void QSvgHandler::pushColorCopy()
+{
+    if (m_colorTagCount.count())
+        ++m_colorTagCount.top();
+    else
+        pushColor(Qt::black);
+}
+
+void QSvgHandler::popColor()
+{
+    if (m_colorTagCount.count()) {
+        if (!--m_colorTagCount.top()) {
+            m_colorStack.pop();
+            m_colorTagCount.pop();
+        }
+    }
+}
+
 QColor QSvgHandler::currentColor() const
 {
     if (!m_colorStack.isEmpty())
diff --git a/src/svg/qsvghandler_p.h b/src/svg/qsvghandler_p.h
index 1b31677..aff6f1d 100644
--- a/src/svg/qsvghandler_p.h
+++ b/src/svg/qsvghandler_p.h
@@ -111,6 +111,8 @@ public:
     LengthType defaultCoordinateSystem() const;
 
     void pushColor(const QColor &color);
+    void pushColorCopy();
+    void popColor();
     QColor currentColor() const;
 
     void setInStyle(bool b);
-- 
cgit v0.12