void TextureMapperAnimation::apply(Client& client) { if (!isActive()) return; double totalRunningTime = computeTotalRunningTime(); double normalizedValue = normalizedAnimationValue(totalRunningTime, m_animation->duration(), m_animation->direction(), m_animation->iterationCount()); if (m_animation->iterationCount() != Animation::IterationCountInfinite && totalRunningTime >= m_animation->duration() * m_animation->iterationCount()) { m_state = AnimationState::Stopped; m_pauseTime = 0; if (m_animation->fillsForwards()) normalizedValue = normalizedAnimationValueForFillsForwards(m_animation->iterationCount(), m_animation->direction()); } if (!normalizedValue) { applyInternal(client, m_keyframes.at(0), m_keyframes.at(1), 0); return; } if (normalizedValue == 1.0) { applyInternal(client, m_keyframes.at(m_keyframes.size() - 2), m_keyframes.at(m_keyframes.size() - 1), 1); return; } if (m_keyframes.size() == 2) { const TimingFunction* timingFunction = timingFunctionForAnimationValue(m_keyframes.at(0), m_animation.get()); normalizedValue = applyTimingFunction(timingFunction, normalizedValue, m_animation->duration()); applyInternal(client, m_keyframes.at(0), m_keyframes.at(1), normalizedValue); return; } for (size_t i = 0; i < m_keyframes.size() - 1; ++i) { const AnimationValue& from = m_keyframes.at(i); const AnimationValue& to = m_keyframes.at(i + 1); if (from.keyTime() > normalizedValue || to.keyTime() < normalizedValue) continue; normalizedValue = (normalizedValue - from.keyTime()) / (to.keyTime() - from.keyTime()); const TimingFunction* timingFunction = timingFunctionForAnimationValue(from, m_animation.get()); normalizedValue = applyTimingFunction(timingFunction, normalizedValue, m_animation->duration()); applyInternal(client, from, to, normalizedValue); break; } }
void GraphicsLayerAnimation::apply(Client* client) { if (!isActive()) return; double totalRunningTime = m_state == PausedState ? m_pauseTime : WTF::currentTime() - m_startTime; double normalizedValue = normalizedAnimationValue(totalRunningTime, m_animation->duration(), m_animation->direction(), m_animation->iterationCount()); if (m_animation->iterationCount() != Animation::IterationCountInfinite && totalRunningTime >= m_animation->duration() * m_animation->iterationCount()) { setState(StoppedState); if (m_animation->fillsForwards()) normalizedValue = normalizedAnimationValueForFillsForwards(m_animation->iterationCount(), m_animation->direction()); } if (!normalizedValue) { applyInternal(client, m_keyframes.at(0), m_keyframes.at(1), 0); return; } if (normalizedValue == 1.0) { applyInternal(client, m_keyframes.at(m_keyframes.size() - 2), m_keyframes.at(m_keyframes.size() - 1), 1); return; } if (m_keyframes.size() == 2) { const TimingFunction* timingFunction = timingFunctionForAnimationValue(m_keyframes.at(0), m_animation.get()); normalizedValue = applyTimingFunction(timingFunction, normalizedValue, m_animation->duration()); applyInternal(client, m_keyframes.at(0), m_keyframes.at(1), normalizedValue); return; } for (size_t i = 0; i < m_keyframes.size() - 1; ++i) { const AnimationValue* from = m_keyframes.at(i); const AnimationValue* to = m_keyframes.at(i + 1); if (from->keyTime() > normalizedValue || to->keyTime() < normalizedValue) continue; normalizedValue = (normalizedValue - from->keyTime()) / (to->keyTime() - from->keyTime()); const TimingFunction* timingFunction = timingFunctionForAnimationValue(from, m_animation.get()); normalizedValue = applyTimingFunction(timingFunction, normalizedValue, m_animation->duration()); applyInternal(client, from, to, normalizedValue); break; } }