| Index: sky/engine/core/animation/AnimationPlayer.cpp
|
| diff --git a/sky/engine/core/animation/AnimationPlayer.cpp b/sky/engine/core/animation/AnimationPlayer.cpp
|
| index 6e9828f2bc9553a17e2d149f72b84502deb3342b..506ddf9650a76eb8711545ab82a608adbc8e2db2 100644
|
| --- a/sky/engine/core/animation/AnimationPlayer.cpp
|
| +++ b/sky/engine/core/animation/AnimationPlayer.cpp
|
| @@ -52,7 +52,7 @@ static unsigned nextSequenceNumber()
|
| PassRefPtr<AnimationPlayer> AnimationPlayer::create(ExecutionContext* executionContext, AnimationTimeline& timeline, AnimationNode* content)
|
| {
|
| RefPtr<AnimationPlayer> player = adoptRef(new AnimationPlayer(executionContext, timeline, content));
|
| - timeline.document()->compositorPendingAnimations().add(player.get());
|
| + timeline.document()->pendingAnimations().add(player.get());
|
| player->suspendIfNeeded();
|
| return player.release();
|
| }
|
| @@ -70,8 +70,7 @@ AnimationPlayer::AnimationPlayer(ExecutionContext* executionContext, AnimationTi
|
| , m_isPausedForTesting(false)
|
| , m_outdated(true)
|
| , m_finished(false)
|
| - , m_compositorState(nullptr)
|
| - , m_compositorPending(true)
|
| + , m_pending(true)
|
| , m_currentTimePending(false)
|
| {
|
| if (m_content) {
|
| @@ -161,95 +160,20 @@ double AnimationPlayer::currentTimeInternal()
|
| return calculateCurrentTime();
|
| }
|
|
|
| -void AnimationPlayer::preCommit(bool startOnCompositor)
|
| +void AnimationPlayer::preCommit()
|
| {
|
| - if (m_compositorState && m_compositorState->pendingAction == Start) {
|
| - // Still waiting for a start time.
|
| - return;
|
| - }
|
| -
|
| - bool softChange = m_compositorState && (paused() || m_compositorState->playbackRate != m_playbackRate);
|
| - bool hardChange = m_compositorState && (m_compositorState->sourceChanged || (m_compositorState->startTime != m_startTime && !std::isnan(m_compositorState->startTime) && !std::isnan(m_startTime)));
|
| -
|
| - // FIXME: softChange && !hardChange should generate a Pause/ThenStart,
|
| - // not a Cancel, but we can't communicate these to the compositor yet.
|
| -
|
| - bool changed = softChange || hardChange;
|
| - bool shouldCancel = (!playing() && m_compositorState) || changed;
|
| - bool shouldStart = playing() && (!m_compositorState || changed);
|
| -
|
| - if (shouldCancel) {
|
| - cancelAnimationOnCompositor();
|
| - m_compositorState = nullptr;
|
| -
|
| - }
|
| -
|
| - if (!shouldStart) {
|
| + if (!playing()) {
|
| m_currentTimePending = false;
|
| }
|
| -
|
| - if (shouldStart && startOnCompositor && maybeStartAnimationOnCompositor()) {
|
| - m_compositorState = adoptPtr(new CompositorState(*this));
|
| - }
|
| }
|
|
|
| void AnimationPlayer::postCommit(double timelineTime)
|
| {
|
| - m_compositorPending = false;
|
| -
|
| - if (!m_compositorState || m_compositorState->pendingAction == None)
|
| - return;
|
| -
|
| - switch (m_compositorState->pendingAction) {
|
| - case Start:
|
| - if (!std::isnan(m_compositorState->startTime)) {
|
| - ASSERT(m_startTime == m_compositorState->startTime);
|
| - m_compositorState->pendingAction = None;
|
| - }
|
| - break;
|
| - case Pause:
|
| - case PauseThenStart:
|
| - ASSERT(std::isnan(m_startTime));
|
| - m_compositorState->pendingAction = None;
|
| - setCurrentTimeInternal((timelineTime - m_compositorState->startTime) * m_playbackRate, TimingUpdateForAnimationFrame);
|
| - m_currentTimePending = false;
|
| - break;
|
| - default:
|
| - ASSERT_NOT_REACHED();
|
| - }
|
| + m_pending = false;
|
| }
|
|
|
| void AnimationPlayer::notifyCompositorStartTime(double timelineTime)
|
| {
|
| - if (m_compositorState) {
|
| - ASSERT(m_compositorState->pendingAction == Start);
|
| - ASSERT(std::isnan(m_compositorState->startTime));
|
| -
|
| - double initialCompositorHoldTime = m_compositorState->holdTime;
|
| - m_compositorState->pendingAction = None;
|
| - m_compositorState->startTime = timelineTime;
|
| -
|
| - if (paused() || m_compositorState->playbackRate != m_playbackRate || m_compositorState->sourceChanged) {
|
| - // Paused state, playback rate, or source changed while starting.
|
| - setCompositorPending();
|
| - }
|
| -
|
| - if (m_startTime == timelineTime) {
|
| - // The start time was set to the incoming compositor start time.
|
| - // Unlikely, but possible.
|
| - // FIXME: Depending on what changed above this might still be pending.
|
| - // Maybe...
|
| - m_currentTimePending = false;
|
| - return;
|
| - }
|
| -
|
| - if (!std::isnan(m_startTime) || currentTimeInternal() != initialCompositorHoldTime) {
|
| - // A new start time or current time was set while starting.
|
| - setCompositorPending();
|
| - return;
|
| - }
|
| - }
|
| -
|
| if (playing()) {
|
| ASSERT(std::isnan(m_startTime));
|
| ASSERT(m_held);
|
| @@ -286,7 +210,7 @@ void AnimationPlayer::setCurrentTime(double newCurrentTime)
|
| if (!std::isfinite(newCurrentTime))
|
| return;
|
|
|
| - setCompositorPending();
|
| + setPending();
|
|
|
| // Setting current time while pending forces a start time.
|
| if (m_currentTimePending) {
|
| @@ -306,7 +230,7 @@ void AnimationPlayer::setStartTime(double startTime)
|
| if (startTime == m_startTime)
|
| return;
|
|
|
| - setCompositorPending();
|
| + setPending();
|
| m_currentTimePending = false;
|
| setStartTimeInternal(startTime / 1000);
|
| }
|
| @@ -348,7 +272,7 @@ void AnimationPlayer::setSource(AnimationNode* newSource)
|
| if (m_content == newSource)
|
| return;
|
|
|
| - setCompositorPending(true);
|
| + setPending();
|
|
|
| double storedCurrentTime = currentTimeInternal();
|
| if (m_content)
|
| @@ -401,7 +325,7 @@ void AnimationPlayer::pause()
|
| if (m_paused)
|
| return;
|
| if (playing()) {
|
| - setCompositorPending();
|
| + setPending();
|
| m_currentTimePending = true;
|
| }
|
| m_paused = true;
|
| @@ -412,7 +336,7 @@ void AnimationPlayer::unpause()
|
| {
|
| if (!m_paused)
|
| return;
|
| - setCompositorPending();
|
| + setPending();
|
| m_currentTimePending = true;
|
| unpauseInternal();
|
| }
|
| @@ -430,7 +354,7 @@ void AnimationPlayer::play()
|
| if (!playing())
|
| m_startTime = nullValue();
|
|
|
| - setCompositorPending();
|
| + setPending();
|
| unpauseInternal();
|
| if (!m_content)
|
| return;
|
| @@ -470,7 +394,7 @@ void AnimationPlayer::finish(ExceptionState& exceptionState)
|
| return;
|
| }
|
| if (playing()) {
|
| - setCompositorPending();
|
| + setPending();
|
| }
|
| if (m_playbackRate < 0) {
|
| setCurrentTimeInternal(0, TimingUpdateOnDemand);
|
| @@ -515,7 +439,7 @@ void AnimationPlayer::setPlaybackRate(double playbackRate)
|
| if (playbackRate == m_playbackRate)
|
| return;
|
|
|
| - setCompositorPending();
|
| + setPending();
|
| if (!finished() && !paused())
|
| m_currentTimePending = true;
|
|
|
| @@ -535,54 +459,12 @@ void AnimationPlayer::setOutdated()
|
| m_timeline->setOutdatedAnimationPlayer(this);
|
| }
|
|
|
| -bool AnimationPlayer::canStartAnimationOnCompositor()
|
| -{
|
| - // FIXME: Need compositor support for playback rate != 1.
|
| - if (playbackRate() != 1)
|
| - return false;
|
| -
|
| - return m_timeline && m_content && m_content->isAnimation() && playing();
|
| -}
|
| -
|
| -bool AnimationPlayer::maybeStartAnimationOnCompositor()
|
| -{
|
| - if (!canStartAnimationOnCompositor())
|
| - return false;
|
| -
|
| - double startTime = timeline()->zeroTime() + startTimeInternal();
|
| - double timeOffset = 0;
|
| - if (std::isnan(startTime)) {
|
| - timeOffset = currentTimeInternal();
|
| - }
|
| - return toAnimation(m_content.get())->maybeStartAnimationOnCompositor(startTime, timeOffset);
|
| -}
|
| -
|
| -void AnimationPlayer::setCompositorPending(bool sourceChanged)
|
| +void AnimationPlayer::setPending()
|
| {
|
| - // FIXME: Animation could notify this directly?
|
| - if (!hasActiveAnimationsOnCompositor()) {
|
| - m_compositorState.release();
|
| + if (!m_pending) {
|
| + m_pending = true;
|
| + timeline()->document()->pendingAnimations().add(this);
|
| }
|
| - if (!m_compositorPending) {
|
| - m_compositorPending = true;
|
| - if (sourceChanged && m_compositorState)
|
| - m_compositorState->sourceChanged = true;
|
| - timeline()->document()->compositorPendingAnimations().add(this);
|
| - }
|
| -}
|
| -
|
| -bool AnimationPlayer::hasActiveAnimationsOnCompositor()
|
| -{
|
| - if (!m_content || !m_content->isAnimation())
|
| - return false;
|
| -
|
| - return toAnimation(m_content.get())->hasActiveAnimationsOnCompositor();
|
| -}
|
| -
|
| -void AnimationPlayer::cancelAnimationOnCompositor()
|
| -{
|
| - if (hasActiveAnimationsOnCompositor())
|
| - toAnimation(m_content.get())->cancelAnimationOnCompositor();
|
| }
|
|
|
| bool AnimationPlayer::update(TimingUpdateReason reason)
|
| @@ -648,8 +530,6 @@ void AnimationPlayer::pauseForTesting(double pauseTime)
|
| {
|
| RELEASE_ASSERT(!paused());
|
| setCurrentTimeInternal(pauseTime, TimingUpdateOnDemand);
|
| - if (hasActiveAnimationsOnCompositor())
|
| - toAnimation(m_content.get())->pauseAnimationForTestingOnCompositor(currentTimeInternal());
|
| m_isPausedForTesting = true;
|
| pause();
|
| }
|
|
|