void SVGAnimateElement::calculateAnimatedValue(float percentage, unsigned repeatCount, SVGSMILElement* resultElement) { ASSERT(resultElement); SVGElement* targetElement = this->targetElement(); if (!targetElement || !isSVGAnimateElement(*resultElement)) return; ASSERT(m_animatedPropertyType == determineAnimatedPropertyType()); ASSERT(percentage >= 0 && percentage <= 1); ASSERT(m_animatedPropertyType != AnimatedTransformList || isSVGAnimateTransformElement(*this)); ASSERT(m_animatedPropertyType != AnimatedUnknown); ASSERT(m_animator); ASSERT(m_animator->type() == m_animatedPropertyType); ASSERT(m_fromProperty); ASSERT(m_fromProperty->type() == m_animatedPropertyType); ASSERT(m_toProperty); SVGAnimateElement* resultAnimationElement = toSVGAnimateElement(resultElement); ASSERT(resultAnimationElement->m_animatedProperty); ASSERT(resultAnimationElement->m_animatedPropertyType == m_animatedPropertyType); if (isSVGSetElement(*this)) percentage = 1; if (calcMode() == CalcModeDiscrete) percentage = percentage < 0.5 ? 0 : 1; // Target element might have changed. m_animator->setContextElement(targetElement); // Values-animation accumulates using the last values entry corresponding to the end of duration time. SVGPropertyBase* toAtEndOfDurationProperty = m_toAtEndOfDurationProperty ? m_toAtEndOfDurationProperty.get() : m_toProperty.get(); m_animator->calculateAnimatedValue(percentage, repeatCount, m_fromProperty.get(), m_toProperty.get(), toAtEndOfDurationProperty, resultAnimationElement->m_animatedProperty.get()); }
void SVGAnimateElement::resetAnimatedPropertyType() { ASSERT(!m_animatedType); m_fromType.clear(); m_toType.clear(); m_toAtEndOfDurationType.clear(); m_animator.clear(); m_animatedPropertyType = targetElement() ? determineAnimatedPropertyType(targetElement()) : AnimatedString; }
void SVGAnimateElement::resetAnimatedPropertyType() { ASSERT(!m_animatedProperty); m_fromProperty.clear(); m_toProperty.clear(); m_toAtEndOfDurationProperty.clear(); m_animator.clear(); m_animatedPropertyType = determineAnimatedPropertyType(); }
void SVGAnimateElement::targetElementWillChange(SVGElement* currentTarget, SVGElement* newTarget) { SVGSMILElement::targetElementWillChange(currentTarget, newTarget); ASSERT(!m_animatedType); m_fromType.clear(); m_toType.clear(); m_toAtEndOfDurationType.clear(); m_animator.clear(); m_animatedPropertyType = newTarget ? determineAnimatedPropertyType(newTarget) : AnimatedString; }
void SVGAnimateElement::targetElementWillChange(SVGElement* currentTarget, SVGElement* newTarget) { SVGSMILElement::targetElementWillChange(currentTarget, newTarget); if (!m_animatedProperties.isEmpty()) { ensureAnimator()->stopAnimValAnimation(m_animatedProperties); m_animatedProperties.clear(); } m_animatedType.clear(); m_fromType.clear(); m_toType.clear(); m_animator.clear(); m_animatedPropertyType = newTarget ? determineAnimatedPropertyType(newTarget) : AnimatedString; }
void SVGAnimateElement::calculateAnimatedValue(float percentage, unsigned repeatCount, SVGSMILElement* resultElement) { ASSERT(resultElement); SVGElement* targetElement = this->targetElement(); if (!targetElement) return; ASSERT(m_animatedPropertyType == determineAnimatedPropertyType(targetElement)); ASSERT(percentage >= 0 && percentage <= 1); ASSERT(m_animatedPropertyType != AnimatedTransformList || hasTagName(SVGNames::animateTransformTag)); ASSERT(m_animatedPropertyType != AnimatedUnknown); ASSERT(m_animator); ASSERT(m_animator->type() == m_animatedPropertyType); ASSERT(m_fromType); ASSERT(m_fromType->type() == m_animatedPropertyType); ASSERT(m_toType); ASSERT(resultElement->hasTagName(SVGNames::animateTag) || resultElement->hasTagName(SVGNames::animateColorTag) || resultElement->hasTagName(SVGNames::animateTransformTag) || resultElement->hasTagName(SVGNames::setTag)); SVGAnimateElement* resultAnimationElement = static_cast<SVGAnimateElement*>(resultElement); ASSERT(resultAnimationElement->m_animatedType); ASSERT(resultAnimationElement->m_animatedPropertyType == m_animatedPropertyType); if (hasTagName(SVGNames::setTag)) percentage = 1; if (calcMode() == CalcModeDiscrete) percentage = percentage < 0.5 ? 0 : 1; // Target element might have changed. m_animator->setContextElement(targetElement); // Be sure to detach list wrappers before we modfiy their underlying value. If we'd do // if after calculateAnimatedValue() ran the cached pointers in the list propery tear // offs would point nowhere, and we couldn't create copies of those values anymore, // while detaching. This is covered by assertions, moving this down would fire them. if (!m_animatedProperties.isEmpty()) m_animator->animValWillChange(m_animatedProperties); // Values-animation accumulates using the last values entry corresponding to the end of duration time. SVGAnimatedType* toAtEndOfDurationType = m_toAtEndOfDurationType ? m_toAtEndOfDurationType.get() : m_toType.get(); m_animator->calculateAnimatedValue(percentage, repeatCount, m_fromType.get(), m_toType.get(), toAtEndOfDurationType, resultAnimationElement->m_animatedType.get()); }