| Index: Source/core/animation/AnimationPlayer.cpp
|
| diff --git a/Source/core/animation/AnimationPlayer.cpp b/Source/core/animation/AnimationPlayer.cpp
|
| index 14c0f547cef8e4efa53e61eff84e2e3ac7ed1609..bfb176f2fa8a66ce49114d6f193464faccc4cca4 100644
|
| --- a/Source/core/animation/AnimationPlayer.cpp
|
| +++ b/Source/core/animation/AnimationPlayer.cpp
|
| @@ -61,7 +61,6 @@ AnimationPlayer::AnimationPlayer(ExecutionContext* executionContext, AnimationTi
|
| , m_playbackRate(1)
|
| , m_startTime(nullValue())
|
| , m_holdTime(nullValue())
|
| - , m_storedTimeLag(0)
|
| , m_sortInfo(nextSequenceNumber())
|
| , m_content(content)
|
| , m_timeline(&timeline)
|
| @@ -99,49 +98,46 @@ bool AnimationPlayer::limited(double currentTime) const
|
| return (m_playbackRate < 0 && currentTime <= 0) || (m_playbackRate > 0 && currentTime >= sourceEnd());
|
| }
|
|
|
| -double AnimationPlayer::currentTimeWithoutLag() const
|
| -{
|
| - if (isNull(m_startTime) || !m_timeline)
|
| - return 0;
|
| - return (m_timeline->effectiveTime() - m_startTime) * m_playbackRate;
|
| -}
|
| -
|
| -double AnimationPlayer::currentTimeWithLag() const
|
| +void AnimationPlayer::setCurrentTimeInternal(double newCurrentTime)
|
| {
|
| - ASSERT(!m_held);
|
| - double time = currentTimeWithoutLag();
|
| - return std::isinf(time) ? time : time - m_storedTimeLag;
|
| -}
|
| + ASSERT(std::isfinite(newCurrentTime));
|
|
|
| -void AnimationPlayer::updateTimingState(double newCurrentTime)
|
| -{
|
| - ASSERT(!isNull(newCurrentTime));
|
| bool oldHeld = m_held;
|
| + bool outdated = false;
|
| m_held = m_paused || !m_playbackRate || limited(newCurrentTime);
|
| +
|
| if (m_held) {
|
| if (!oldHeld || m_holdTime != newCurrentTime)
|
| - setOutdated();
|
| + outdated = true;
|
| m_holdTime = newCurrentTime;
|
| - m_storedTimeLag = nullValue();
|
| + if (m_paused || !m_playbackRate)
|
| + m_startTime = nullValue();
|
| } else {
|
| m_holdTime = nullValue();
|
| - m_storedTimeLag = currentTimeWithoutLag() - newCurrentTime;
|
| + m_startTime = m_timeline->effectiveTime() - newCurrentTime / m_playbackRate;
|
| m_finished = false;
|
| + outdated = true;
|
| + }
|
| +
|
| + if (outdated) {
|
| setOutdated();
|
| + cancelAnimationOnCompositor();
|
| + if (!m_held)
|
| + schedulePendingAnimationOnCompositor();
|
| }
|
| }
|
|
|
| +// Update timing to reflect updated animation clock due to tick
|
| void AnimationPlayer::updateCurrentTimingState()
|
| {
|
| if (m_held) {
|
| - updateTimingState(m_holdTime);
|
| + setCurrentTimeInternal(m_holdTime);
|
| return;
|
| }
|
| - if (!limited(currentTimeWithLag()))
|
| + if (!limited(calculateCurrentTime()))
|
| return;
|
| m_held = true;
|
| m_holdTime = m_playbackRate < 0 ? 0 : sourceEnd();
|
| - m_storedTimeLag = nullValue();
|
| }
|
|
|
| double AnimationPlayer::currentTime()
|
| @@ -154,37 +150,41 @@ double AnimationPlayer::currentTimeInternal()
|
| updateCurrentTimingState();
|
| if (m_held)
|
| return m_holdTime;
|
| - return currentTimeWithLag();
|
| + return calculateCurrentTime();
|
| }
|
|
|
| -void AnimationPlayer::setCurrentTime(double newCurrentTime)
|
| +double AnimationPlayer::calculateCurrentTime() const
|
| {
|
| - setCurrentTimeInternal(newCurrentTime / 1000);
|
| + ASSERT(!m_held);
|
| + if (isNull(m_startTime) || !m_timeline)
|
| + return 0;
|
| + return (m_timeline->effectiveTime() - m_startTime) * m_playbackRate;
|
| }
|
|
|
| -void AnimationPlayer::setCurrentTimeInternal(double newCurrentTime)
|
| +void AnimationPlayer::setCurrentTime(double newCurrentTime)
|
| {
|
| if (!std::isfinite(newCurrentTime))
|
| return;
|
| - updateTimingState(newCurrentTime);
|
| - cancelAnimationOnCompositor();
|
| - schedulePendingAnimationOnCompositor();
|
| + setCurrentTimeInternal(newCurrentTime / 1000);
|
| }
|
|
|
| void AnimationPlayer::setStartTimeInternal(double newStartTime, bool isUpdateFromCompositor)
|
| {
|
| ASSERT(!isUpdateFromCompositor || !hasStartTime());
|
|
|
| + if (m_paused)
|
| + return;
|
| if (!std::isfinite(newStartTime))
|
| return;
|
| if (newStartTime == m_startTime)
|
| return;
|
| - updateCurrentTimingState(); // Update the value of held
|
| +
|
| bool hadStartTime = hasStartTime();
|
| double previousCurrentTime = currentTimeInternal();
|
| m_startTime = newStartTime;
|
| - updateCurrentTimingState();
|
| - if (previousCurrentTime != currentTimeInternal()) {
|
| + double newCurrentTime = currentTimeInternal();
|
| +
|
| + if (previousCurrentTime != newCurrentTime) {
|
| setOutdated();
|
| } else if (!hadStartTime && m_timeline) {
|
| // Even though this player is not outdated, time to effect change is
|
| @@ -212,7 +212,7 @@ void AnimationPlayer::setSource(AnimationNode* newSource)
|
| newSource->player()->cancel();
|
| newSource->attach(this);
|
| }
|
| - updateTimingState(storedCurrentTime);
|
| + setCurrentTimeInternal(storedCurrentTime);
|
| schedulePendingAnimationOnCompositor();
|
| }
|
|
|
| @@ -221,7 +221,7 @@ void AnimationPlayer::pause()
|
| if (m_paused)
|
| return;
|
| m_paused = true;
|
| - updateTimingState(currentTimeInternal());
|
| + setCurrentTimeInternal(currentTimeInternal());
|
| cancelAnimationOnCompositor();
|
| }
|
|
|
| @@ -230,14 +230,12 @@ void AnimationPlayer::unpause()
|
| if (!m_paused)
|
| return;
|
| m_paused = false;
|
| - updateTimingState(currentTimeInternal());
|
| - schedulePendingAnimationOnCompositor();
|
| + setCurrentTimeInternal(currentTimeInternal());
|
| }
|
|
|
| void AnimationPlayer::play()
|
| {
|
| cancelAnimationOnCompositor();
|
| - // Note, unpause schedules pending animation on compositor if necessary.
|
| unpause();
|
| if (!m_content)
|
| return;
|
| @@ -260,8 +258,6 @@ void AnimationPlayer::reverse()
|
| setCurrentTimeInternal(0);
|
| }
|
| setPlaybackRate(-m_playbackRate);
|
| - cancelAnimationOnCompositor();
|
| - // Note, unpause schedules pending animation on compositor if necessary.
|
| unpause();
|
| }
|
|
|
| @@ -279,7 +275,6 @@ void AnimationPlayer::finish(ExceptionState& exceptionState)
|
| setCurrentTimeInternal(sourceEnd());
|
| }
|
| ASSERT(finished());
|
| - cancelAnimationOnCompositor();
|
| }
|
|
|
| const AtomicString& AnimationPlayer::interfaceName() const
|
| @@ -318,9 +313,7 @@ void AnimationPlayer::setPlaybackRate(double playbackRate)
|
| if ((m_playbackRate < 0 && playbackRate >= 0) || (m_playbackRate > 0 && playbackRate <= 0))
|
| m_finished = false;
|
| m_playbackRate = playbackRate;
|
| - updateTimingState(storedCurrentTime);
|
| - cancelAnimationOnCompositor();
|
| - schedulePendingAnimationOnCompositor();
|
| + setCurrentTimeInternal(storedCurrentTime);
|
| }
|
|
|
| void AnimationPlayer::setOutdated()
|
| @@ -344,7 +337,7 @@ bool AnimationPlayer::maybeStartAnimationOnCompositor()
|
| if (!canStartAnimationOnCompositor())
|
| return false;
|
|
|
| - return toAnimation(m_content.get())->maybeStartAnimationOnCompositor(timeline()->zeroTime() + startTimeInternal() + timeLagInternal());
|
| + return toAnimation(m_content.get())->maybeStartAnimationOnCompositor(timeline()->zeroTime() + startTimeInternal());
|
| }
|
|
|
| void AnimationPlayer::schedulePendingAnimationOnCompositor()
|
| @@ -371,11 +364,12 @@ void AnimationPlayer::cancelAnimationOnCompositor()
|
|
|
| bool AnimationPlayer::update(TimingUpdateReason reason)
|
| {
|
| - m_outdated = false;
|
| -
|
| if (!m_timeline)
|
| return false;
|
|
|
| + updateCurrentTimingState();
|
| + m_outdated = false;
|
| +
|
| if (m_content) {
|
| double inheritedTime = isNull(m_timeline->currentTimeInternal()) ? nullValue() : currentTimeInternal();
|
| m_content->updateInheritedTime(inheritedTime, reason);
|
| @@ -432,7 +426,7 @@ bool AnimationPlayer::addEventListener(const AtomicString& eventType, PassRefPtr
|
| void AnimationPlayer::pauseForTesting(double pauseTime)
|
| {
|
| RELEASE_ASSERT(!paused());
|
| - updateTimingState(pauseTime);
|
| + setCurrentTimeInternal(pauseTime);
|
| if (!m_isPausedForTesting && hasActiveAnimationsOnCompositor())
|
| toAnimation(m_content.get())->pauseAnimationForTestingOnCompositor(currentTimeInternal());
|
| m_isPausedForTesting = true;
|
|
|