SVGAnimatedTransformListAnimator::SVGAnimatedTransformListAnimator(SVGAnimationElement* animationElement, SVGElement* contextElement) : SVGAnimatedTypeAnimator(AnimatedTransformList, animationElement, contextElement) , m_transformTypeString(SVGTransform::transformTypePrefixForParsing(toSVGAnimateTransformElement(animationElement)->transformType())) { // Only <animateTransform> uses this animator, as <animate> doesn't allow to animate transform lists directly. ASSERT(animationElement->hasTagName(SVGNames::animateTransformTag)); }
PassRefPtr<SVGPropertyBase> SVGAnimatedTypeAnimator::createPropertyForAnimation(const String& value) { if (isAnimatingSVGDom()) { // SVG DOM animVal animation code-path. if (m_type == AnimatedTransformList) { // TransformList must be animated via <animateTransform>, // and its {from,by,to} attribute values needs to be parsed w.r.t. its "type" attribute. // Spec: http://www.w3.org/TR/SVG/single-page.html#animate-AnimateTransformElement ASSERT(m_animationElement); SVGTransformType transformType = toSVGAnimateTransformElement(m_animationElement)->transformType(); return SVGTransformList::create(transformType, value); } ASSERT(m_animatedProperty); return m_animatedProperty->currentValueBase()->cloneForAnimation(value); } ASSERT(isAnimatingCSSProperty()); // CSS properties animation code-path. // Create a basic instance of the corresponding SVG property. // The instance will not have full context info. (e.g. SVGLengthMode) switch (m_type) { case AnimatedColor: return SVGColorProperty::create(value.isEmpty() ? StyleColor::currentColor() : SVGPaint::colorFromRGBColorString(value)); case AnimatedNumber: { RefPtr<SVGNumber> property = SVGNumber::create(); property->setValueAsString(value, IGNORE_EXCEPTION); return property.release(); } case AnimatedLength: { RefPtr<SVGLength> property = SVGLength::create(LengthModeOther); property->setValueAsString(value, IGNORE_EXCEPTION); return property.release(); } case AnimatedLengthList: { RefPtr<SVGLengthList> property = SVGLengthList::create(LengthModeOther); property->setValueAsString(value, IGNORE_EXCEPTION); return property.release(); } case AnimatedString: { RefPtr<SVGString> property = SVGString::create(); property->setValueAsString(value, IGNORE_EXCEPTION); return property.release(); } // These types don't appear in the table in SVGElement::animatedPropertyTypeForCSSAttribute() and thus don't need support. case AnimatedAngle: case AnimatedBoolean: case AnimatedEnumeration: case AnimatedInteger: case AnimatedIntegerOptionalInteger: case AnimatedNumberList: case AnimatedNumberOptionalNumber: case AnimatedPath: case AnimatedPoint: case AnimatedPoints: case AnimatedPreserveAspectRatio: case AnimatedRect: case AnimatedStringList: case AnimatedTransform: case AnimatedTransformList: ASSERT_NOT_REACHED(); case AnimatedUnknown: ASSERT_NOT_REACHED(); }; ASSERT_NOT_REACHED(); return nullptr; }