void SVGAnimatedColorAnimator::calculateAnimatedValue(float percentage, unsigned repeatCount, SVGAnimatedType* from, SVGAnimatedType* to, SVGAnimatedType* toAtEndOfDuration, SVGAnimatedType* animated) { ASSERT(m_animationElement); ASSERT(m_contextElement); Color fromColor = m_animationElement->animationMode() == ToAnimation ? animated->color() : from->color(); Color toColor = to->color(); const Color& toAtEndOfDurationColor = toAtEndOfDuration->color(); Color& animatedColor = animated->color(); // Apply CSS inheritance rules. m_animationElement->adjustForInheritance<Color>(parseColorFromString, m_animationElement->fromPropertyValueType(), fromColor, m_contextElement); m_animationElement->adjustForInheritance<Color>(parseColorFromString, m_animationElement->toPropertyValueType(), toColor, m_contextElement); // Apply <animateColor> rules. if (m_animationElement->fromPropertyValueType() == CurrentColorValue) adjustForCurrentColor(m_contextElement, fromColor); if (m_animationElement->toPropertyValueType() == CurrentColorValue) adjustForCurrentColor(m_contextElement, toColor); float animatedRed = animatedColor.red(); m_animationElement->animateAdditiveNumber(percentage, repeatCount, fromColor.red(), toColor.red(), toAtEndOfDurationColor.red(), animatedRed); float animatedGreen = animatedColor.green(); m_animationElement->animateAdditiveNumber(percentage, repeatCount, fromColor.green(), toColor.green(), toAtEndOfDurationColor.green(), animatedGreen); float animatedBlue = animatedColor.blue(); m_animationElement->animateAdditiveNumber(percentage, repeatCount, fromColor.blue(), toColor.blue(), toAtEndOfDurationColor.blue(), animatedBlue); float animatedAlpha = animatedColor.alpha(); m_animationElement->animateAdditiveNumber(percentage, repeatCount, fromColor.alpha(), toColor.alpha(), toAtEndOfDurationColor.alpha(), animatedAlpha); animatedColor = ColorDistance::clampColor(static_cast<int>(roundf(animatedRed)), static_cast<int>(roundf(animatedGreen)), static_cast<int>(roundf(animatedBlue)), static_cast<int>(roundf(animatedAlpha))); }
void SVGAnimatedColorAnimator::calculateAnimatedValue(float percentage, unsigned repeatCount, OwnPtr<SVGAnimatedType>& from, OwnPtr<SVGAnimatedType>& to, OwnPtr<SVGAnimatedType>& animated) { ASSERT(m_animationElement); ASSERT(m_contextElement); Color& fromColor = from->color(); Color& toColor = to->color(); Color& animatedColor = animated->color(); m_animationElement->adjustFromToValues<Color>(parseColorFromString, fromColor, toColor, animatedColor, percentage, m_contextElement); // Apply <animateColor> rules. if (m_animationElement->fromPropertyValueType() == CurrentColorValue) adjustForCurrentColor(m_contextElement, fromColor); if (m_animationElement->toPropertyValueType() == CurrentColorValue) adjustForCurrentColor(m_contextElement, toColor); float animatedRed = animatedColor.red(); m_animationElement->animateAdditiveNumber(percentage, repeatCount, fromColor.red(), toColor.red(), animatedRed); float animatedGreen = animatedColor.green(); m_animationElement->animateAdditiveNumber(percentage, repeatCount, fromColor.green(), toColor.green(), animatedGreen); float animatedBlue = animatedColor.blue(); m_animationElement->animateAdditiveNumber(percentage, repeatCount, fromColor.blue(), toColor.blue(), animatedBlue); float animatedAlpha = animatedColor.alpha(); m_animationElement->animateAdditiveNumber(percentage, repeatCount, fromColor.alpha(), toColor.alpha(), animatedAlpha); animatedColor = ColorDistance::clampColor(static_cast<int>(roundf(animatedRed)), static_cast<int>(roundf(animatedGreen)), static_cast<int>(roundf(animatedBlue)), static_cast<int>(roundf(animatedAlpha))); }