Copied: branches/safari-534.54-branch/LayoutTests/svg/animations/script-tests/svgtransform-animation-discrete.js (from rev 91148, trunk/LayoutTests/svg/animations/script-tests/svgtransform-animation-discrete.js) (0 => 105188)
--- branches/safari-534.54-branch/LayoutTests/svg/animations/script-tests/svgtransform-animation-discrete.js (rev 0)
+++ branches/safari-534.54-branch/LayoutTests/svg/animations/script-tests/svgtransform-animation-discrete.js 2012-01-17 21:31:18 UTC (rev 105188)
@@ -0,0 +1,66 @@
+description("Test calcMode=discrete animation on SVGAnimateTransform.");
+createSVGTestCase();
+
+// Setup test document
+var rect = createSVGElement("rect");
+rect.setAttribute("id", "rect");
+rect.setAttribute("width", "100");
+rect.setAttribute("height", "100");
+rect.setAttribute("x", "0");
+rect.setAttribute("y", "0");
+rect.setAttribute("fill", "green");
+rect.setAttribute("onclick", "executeTest()");
+
+var animate = createSVGElement("animateTransform");
+animate.setAttribute("id", "animation");
+animate.setAttribute("attributeName", "transform");
+animate.setAttribute("type", "translate");
+animate.setAttribute("from", "100,100");
+animate.setAttribute("to", "0,0");
+animate.setAttribute("type", "translate");
+animate.setAttribute("calcMode", "discrete");
+animate.setAttribute("begin", "click");
+animate.setAttribute("dur", "4s");
+rect.appendChild(animate);
+rootSVGElement.appendChild(rect);
+
+// Setup animation test
+
+function sample1() {
+ // Check initial/end conditions
+ shouldBe("rect.transform.animVal.numberOfItems", "0");
+ shouldBeCloseEnough("document.defaultView.getComputedStyle(rect).getPropertyValue('x')", "0", 0.01);
+ shouldBeCloseEnough("document.defaultView.getComputedStyle(rect).getPropertyValue('y')", "0", 0.01);
+}
+
+function sample2() {
+ // Check initial/end conditions
+ shouldBe("rect.transform.animVal.numberOfItems", "1");
+ shouldBe("rect.transform.animVal.getItem(0).type", "SVGTransform.SVG_TRANSFORM_TRANSLATE");
+ shouldBeCloseEnough("rect.transform.animVal.getItem(0).matrix.e", "100", 0.01);
+ shouldBeCloseEnough("rect.transform.animVal.getItem(0).matrix.f", "100", 0.01);
+}
+
+function sample3() {
+ shouldBe("rect.transform.animVal.numberOfItems", "1");
+ shouldBe("rect.transform.animVal.getItem(0).type", "SVGTransform.SVG_TRANSFORM_TRANSLATE");
+ shouldBeCloseEnough("rect.transform.animVal.getItem(0).matrix.e", "0", 0.01);
+ shouldBeCloseEnough("rect.transform.animVal.getItem(0).matrix.f", "0", 0.01);
+}
+
+function executeTest() {
+ const expectedValues = [
+ // [animationId, time, elementId, sampleCallback]
+ ["animation", 0.0, "rect", sample1],
+ ["animation", 0.001, "rect", sample2],
+ ["animation", 1.0, "rect", sample2],
+ ["animation", 3.0, "rect", sample3],
+ ["animation", 3.9999, "rect", sample3],
+ ];
+
+ runAnimationTest(expectedValues);
+}
+
+// Begin test async
+window.setTimeout("triggerUpdate(50, 50)", 0);
+var successfullyParsed = true;
Modified: branches/safari-534.54-branch/Source/WebCore/svg/SVGAnimateTransformElement.cpp (105187 => 105188)
--- branches/safari-534.54-branch/Source/WebCore/svg/SVGAnimateTransformElement.cpp 2012-01-17 21:04:21 UTC (rev 105187)
+++ branches/safari-534.54-branch/Source/WebCore/svg/SVGAnimateTransformElement.cpp 2012-01-17 21:31:18 UTC (rev 105188)
@@ -98,17 +98,15 @@
SVGAnimationElement::parseMappedAttribute(attr);
}
-
-static SVGTransformList* transformListFor(SVGElement* element)
+static PassRefPtr<SVGAnimatedTransformList> animatedTransformListFor(SVGElement* element)
{
ASSERT(element);
if (element->isStyledTransformable())
- return &static_cast<SVGStyledTransformableElement*>(element)->transform();
+ return static_cast<SVGStyledTransformableElement*>(element)->transformAnimated();
if (element->hasTagName(SVGNames::textTag))
- return &static_cast<SVGTextElement*>(element)->transform();
+ return static_cast<SVGTextElement*>(element)->transformAnimated();
if (element->hasTagName(SVGNames::linearGradientTag) || element->hasTagName(SVGNames::radialGradientTag))
- return &static_cast<SVGGradientElement*>(element)->gradientTransform();
- // FIXME: Handle patternTransform, which is obviously missing!
+ return static_cast<SVGGradientElement*>(element)->gradientTransformAnimated();
return 0;
}
@@ -124,8 +122,10 @@
}
if (baseValue.isEmpty()) {
- if (SVGTransformList* list = transformListFor(targetElement))
- list->clear();
+ if (RefPtr<SVGAnimatedTransformList> list = animatedTransformListFor(targetElement)) {
+ list->detachListWrappers(0);
+ list->values().clear();
+ }
} else
targetElement->setAttribute(SVGNames::transformAttr, baseValue);
}
@@ -135,17 +135,20 @@
SVGElement* targetElement = this->targetElement();
if (!targetElement || determineAnimatedAttributeType(targetElement) == AnimatedUnknown)
return;
- SVGTransformList* transformList = transformListFor(targetElement);
- ASSERT(transformList);
+ RefPtr<SVGAnimatedTransformList> animatedList = animatedTransformListFor(targetElement);
+ ASSERT(animatedList);
- if (!isAdditive())
- transformList->clear();
+ if (!isAdditive()) {
+ animatedList->detachListWrappers(0);
+ animatedList->values().clear();
+ }
if (isAccumulated() && repeat) {
SVGTransform accumulatedTransform = SVGTransformDistance(m_fromTransform, m_toTransform).scaledDistance(repeat).addToSVGTransform(SVGTransform());
- transformList->append(accumulatedTransform);
+ animatedList->values().append(accumulatedTransform);
}
SVGTransform transform = SVGTransformDistance(m_fromTransform, m_toTransform).scaledDistance(percentage).addToSVGTransform(m_fromTransform);
- transformList->append(transform);
+ animatedList->values().append(transform);
+ animatedList->wrappers().append(RefPtr<SVGPropertyTearOff<SVGTransform> >());
}
bool SVGAnimateTransformElement::calculateFromAndToValues(const String& fromString, const String& toString)
@@ -191,9 +194,10 @@
}
// ...except in case where we have additional instances in <use> trees.
- SVGTransformList* transformList = transformListFor(targetElement);
- if (!transformList)
+ RefPtr<SVGAnimatedTransformList> animatedList = animatedTransformListFor(targetElement);
+ if (!animatedList)
return;
+ SVGTransformList* transformList = &animatedList->values();
const HashSet<SVGElementInstance*>& instances = targetElement->instancesForElement();
const HashSet<SVGElementInstance*>::const_iterator end = instances.end();