Patch by Young Han Lee <joybro@company100.net> on 2011-07-14
authorcommit-queue@webkit.org <commit-queue@webkit.org@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Thu, 14 Jul 2011 16:20:01 +0000 (16:20 +0000)
committercommit-queue@webkit.org <commit-queue@webkit.org@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Thu, 14 Jul 2011 16:20:01 +0000 (16:20 +0000)
Reviewed by Dirk Schulze.

REGRESSION (r89774): svg/W3C-SVG-1.1/animate-elem-82-t.svg hits assertion failure.
https://bugs.webkit.org/show_bug.cgi?id=63911

Some functions assumed calculateKeyTimesIndex() does not return the last index of
the keyTimes, but it would be right behavior for calculateKeyTimesIndex() when it
accepts 1 as the percent argument.

To avoid the assumption, and for more efficiency, this patch allows the functions
using calculateKeyTimesIndex() to return early when it accepts 1 as the percent argument.
These functions have always returned the last element of the corresponding vector
in that situation.

* svg/SVGAnimationElement.cpp:
(WebCore::SVGAnimationElement::calculatePercentFromKeyPoints):
(WebCore::SVGAnimationElement::currentValuesForValuesAnimation):

git-svn-id: https://svn.webkit.org/repository/webkit/trunk@91002 268f45cc-cd09-0410-ab3c-d52691b4dbfc

Source/WebCore/ChangeLog
Source/WebCore/svg/SVGAnimationElement.cpp

index ed0ce87..feb4f12 100644 (file)
@@ -1,3 +1,23 @@
+2011-07-14  Young Han Lee  <joybro@company100.net>
+
+        Reviewed by Dirk Schulze.
+
+        REGRESSION (r89774): svg/W3C-SVG-1.1/animate-elem-82-t.svg hits assertion failure.
+        https://bugs.webkit.org/show_bug.cgi?id=63911
+
+        Some functions assumed calculateKeyTimesIndex() does not return the last index of
+        the keyTimes, but it would be right behavior for calculateKeyTimesIndex() when it
+        accepts 1 as the percent argument.
+
+        To avoid the assumption, and for more efficiency, this patch allows the functions
+        using calculateKeyTimesIndex() to return early when it accepts 1 as the percent argument.
+        These functions have always returned the last element of the corresponding vector
+        in that situation.
+
+        * svg/SVGAnimationElement.cpp:
+        (WebCore::SVGAnimationElement::calculatePercentFromKeyPoints):
+        (WebCore::SVGAnimationElement::currentValuesForValuesAnimation):
+
 2011-07-14  Andrey Kosyakov  <caseq@chromium.org>
 
         Web Inspector: remove more dead code
index 03e69c4..93eac60 100644 (file)
@@ -438,6 +438,9 @@ float SVGAnimationElement::calculatePercentFromKeyPoints(float percent) const
     ASSERT(m_keyTimes.size() > 1);
     ASSERT(m_keyPoints.size() == m_keyTimes.size());
 
+    if (percent == 1)
+        return m_keyPoints[m_keyPoints.size() - 1];
+
     unsigned index = calculateKeyTimesIndex(percent);
     float fromPercent = m_keyTimes[index];
     float toPercent = m_keyTimes[index + 1];
@@ -445,9 +448,9 @@ float SVGAnimationElement::calculatePercentFromKeyPoints(float percent) const
     float toKeyPoint = m_keyPoints[index + 1];
     
     if (calcMode() == CalcModeDiscrete)
-        return percent == 1 ? toKeyPoint : fromKeyPoint;
+        return fromKeyPoint;
     
-    float keyPointPercent = percent == 1 ? 1 : (percent - fromPercent) / (toPercent - fromPercent);
+    float keyPointPercent = (percent - fromPercent) / (toPercent - fromPercent);
     
     if (calcMode() == CalcModeSpline) {
         ASSERT(m_keySplines.size() == m_keyPoints.size() - 1);
@@ -473,6 +476,13 @@ void SVGAnimationElement::currentValuesForValuesAnimation(float percent, float&
     ASSERT(m_animationValid);
     ASSERT(valuesCount > 1);
     
+    if (percent == 1) {
+        from = m_values[valuesCount - 1];
+        to = m_values[valuesCount - 1];
+        effectivePercent = 1;
+        return;
+    }
+
     CalcMode calcMode = this->calcMode();
     if (hasTagName(SVGNames::animateTag) || hasTagName(SVGNames::animateColorTag)) {
         const SVGAnimateElement* animateElement = static_cast<const SVGAnimateElement*>(this);
@@ -494,7 +504,7 @@ void SVGAnimationElement::currentValuesForValuesAnimation(float percent, float&
     unsigned index = calculateKeyTimesIndex(percent);
     if (calcMode == CalcModeDiscrete) {
         if (!keyTimesCount) 
-            index = percent == 1 ? valuesCount - 1 : static_cast<unsigned>(percent * valuesCount);
+            index = static_cast<unsigned>(percent * valuesCount);
         from = m_values[index];
         to = m_values[index];
         effectivePercent = 0;
@@ -517,7 +527,7 @@ void SVGAnimationElement::currentValuesForValuesAnimation(float percent, float&
     from = m_values[index];
     to = m_values[index + 1];
     ASSERT(toPercent > fromPercent);
-    effectivePercent = percent == 1 ? 1 : (percent - fromPercent) / (toPercent - fromPercent);
+    effectivePercent = (percent - fromPercent) / (toPercent - fromPercent);
     
     if (calcMode == CalcModeSpline) {
         ASSERT(m_keySplines.size() == m_values.size() - 1);