OLD | NEW |
1 /* | 1 /* |
2 * Copyright (C) 2013 Google Inc. All rights reserved. | 2 * Copyright (C) 2013 Google Inc. All rights reserved. |
3 * | 3 * |
4 * Redistribution and use in source and binary forms, with or without | 4 * Redistribution and use in source and binary forms, with or without |
5 * modification, are permitted provided that the following conditions are | 5 * modification, are permitted provided that the following conditions are |
6 * met: | 6 * met: |
7 * | 7 * |
8 * * Redistributions of source code must retain the above copyright | 8 * * Redistributions of source code must retain the above copyright |
9 * notice, this list of conditions and the following disclaimer. | 9 * notice, this list of conditions and the following disclaimer. |
10 * * Redistributions in binary form must reproduce the above | 10 * * Redistributions in binary form must reproduce the above |
(...skipping 52 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
63 , m_startTime(nullValue()) | 63 , m_startTime(nullValue()) |
64 , m_holdTime(0) | 64 , m_holdTime(0) |
65 , m_sequenceNumber(nextSequenceNumber()) | 65 , m_sequenceNumber(nextSequenceNumber()) |
66 , m_content(content) | 66 , m_content(content) |
67 , m_timeline(&timeline) | 67 , m_timeline(&timeline) |
68 , m_paused(false) | 68 , m_paused(false) |
69 , m_held(true) | 69 , m_held(true) |
70 , m_isPausedForTesting(false) | 70 , m_isPausedForTesting(false) |
71 , m_outdated(true) | 71 , m_outdated(true) |
72 , m_finished(false) | 72 , m_finished(false) |
73 , m_compositorState(nullptr) | |
74 , m_compositorPending(true) | 73 , m_compositorPending(true) |
75 , m_currentTimePending(false) | 74 , m_currentTimePending(false) |
76 { | 75 { |
77 if (m_content) { | 76 if (m_content) { |
78 if (m_content->player()) | 77 if (m_content->player()) |
79 m_content->player()->cancel(); | 78 m_content->player()->cancel(); |
80 m_content->attach(this); | 79 m_content->attach(this); |
81 } | 80 } |
82 } | 81 } |
83 | 82 |
(...skipping 72 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
156 double AnimationPlayer::currentTimeInternal() | 155 double AnimationPlayer::currentTimeInternal() |
157 { | 156 { |
158 updateCurrentTimingState(TimingUpdateOnDemand); | 157 updateCurrentTimingState(TimingUpdateOnDemand); |
159 if (m_held) | 158 if (m_held) |
160 return m_holdTime; | 159 return m_holdTime; |
161 return calculateCurrentTime(); | 160 return calculateCurrentTime(); |
162 } | 161 } |
163 | 162 |
164 void AnimationPlayer::preCommit(bool startOnCompositor) | 163 void AnimationPlayer::preCommit(bool startOnCompositor) |
165 { | 164 { |
166 if (m_compositorState && m_compositorState->pendingAction == Start) { | 165 if (!playing()) { |
167 // Still waiting for a start time. | |
168 return; | |
169 } | |
170 | |
171 bool softChange = m_compositorState && (paused() || m_compositorState->playb
ackRate != m_playbackRate); | |
172 bool hardChange = m_compositorState && (m_compositorState->sourceChanged ||
(m_compositorState->startTime != m_startTime && !std::isnan(m_compositorState->s
tartTime) && !std::isnan(m_startTime))); | |
173 | |
174 // FIXME: softChange && !hardChange should generate a Pause/ThenStart, | |
175 // not a Cancel, but we can't communicate these to the compositor yet. | |
176 | |
177 bool changed = softChange || hardChange; | |
178 bool shouldCancel = (!playing() && m_compositorState) || changed; | |
179 bool shouldStart = playing() && (!m_compositorState || changed); | |
180 | |
181 if (shouldCancel) { | |
182 cancelAnimationOnCompositor(); | |
183 m_compositorState = nullptr; | |
184 | |
185 } | |
186 | |
187 if (!shouldStart) { | |
188 m_currentTimePending = false; | 166 m_currentTimePending = false; |
189 } | 167 } |
190 | |
191 if (shouldStart && startOnCompositor && maybeStartAnimationOnCompositor()) { | |
192 m_compositorState = adoptPtr(new CompositorState(*this)); | |
193 } | |
194 } | 168 } |
195 | 169 |
196 void AnimationPlayer::postCommit(double timelineTime) | 170 void AnimationPlayer::postCommit(double timelineTime) |
197 { | 171 { |
198 m_compositorPending = false; | 172 m_compositorPending = false; |
199 | |
200 if (!m_compositorState || m_compositorState->pendingAction == None) | |
201 return; | |
202 | |
203 switch (m_compositorState->pendingAction) { | |
204 case Start: | |
205 if (!std::isnan(m_compositorState->startTime)) { | |
206 ASSERT(m_startTime == m_compositorState->startTime); | |
207 m_compositorState->pendingAction = None; | |
208 } | |
209 break; | |
210 case Pause: | |
211 case PauseThenStart: | |
212 ASSERT(std::isnan(m_startTime)); | |
213 m_compositorState->pendingAction = None; | |
214 setCurrentTimeInternal((timelineTime - m_compositorState->startTime) * m
_playbackRate, TimingUpdateForAnimationFrame); | |
215 m_currentTimePending = false; | |
216 break; | |
217 default: | |
218 ASSERT_NOT_REACHED(); | |
219 } | |
220 } | 173 } |
221 | 174 |
222 void AnimationPlayer::notifyCompositorStartTime(double timelineTime) | 175 void AnimationPlayer::notifyCompositorStartTime(double timelineTime) |
223 { | 176 { |
224 if (m_compositorState) { | |
225 ASSERT(m_compositorState->pendingAction == Start); | |
226 ASSERT(std::isnan(m_compositorState->startTime)); | |
227 | |
228 double initialCompositorHoldTime = m_compositorState->holdTime; | |
229 m_compositorState->pendingAction = None; | |
230 m_compositorState->startTime = timelineTime; | |
231 | |
232 if (paused() || m_compositorState->playbackRate != m_playbackRate || m_c
ompositorState->sourceChanged) { | |
233 // Paused state, playback rate, or source changed while starting. | |
234 setCompositorPending(); | |
235 } | |
236 | |
237 if (m_startTime == timelineTime) { | |
238 // The start time was set to the incoming compositor start time. | |
239 // Unlikely, but possible. | |
240 // FIXME: Depending on what changed above this might still be pendin
g. | |
241 // Maybe... | |
242 m_currentTimePending = false; | |
243 return; | |
244 } | |
245 | |
246 if (!std::isnan(m_startTime) || currentTimeInternal() != initialComposit
orHoldTime) { | |
247 // A new start time or current time was set while starting. | |
248 setCompositorPending(); | |
249 return; | |
250 } | |
251 } | |
252 | |
253 if (playing()) { | 177 if (playing()) { |
254 ASSERT(std::isnan(m_startTime)); | 178 ASSERT(std::isnan(m_startTime)); |
255 ASSERT(m_held); | 179 ASSERT(m_held); |
256 | 180 |
257 if (m_playbackRate == 0) { | 181 if (m_playbackRate == 0) { |
258 setStartTimeInternal(timelineTime); | 182 setStartTimeInternal(timelineTime); |
259 } else { | 183 } else { |
260 setStartTimeInternal(timelineTime + currentTimeInternal() / -m_playb
ackRate); | 184 setStartTimeInternal(timelineTime + currentTimeInternal() / -m_playb
ackRate); |
261 } | 185 } |
262 | 186 |
(...skipping 265 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
528 setCurrentTimeInternal(storedCurrentTime, TimingUpdateOnDemand); | 452 setCurrentTimeInternal(storedCurrentTime, TimingUpdateOnDemand); |
529 } | 453 } |
530 | 454 |
531 void AnimationPlayer::setOutdated() | 455 void AnimationPlayer::setOutdated() |
532 { | 456 { |
533 m_outdated = true; | 457 m_outdated = true; |
534 if (m_timeline) | 458 if (m_timeline) |
535 m_timeline->setOutdatedAnimationPlayer(this); | 459 m_timeline->setOutdatedAnimationPlayer(this); |
536 } | 460 } |
537 | 461 |
538 bool AnimationPlayer::canStartAnimationOnCompositor() | |
539 { | |
540 // FIXME: Need compositor support for playback rate != 1. | |
541 if (playbackRate() != 1) | |
542 return false; | |
543 | |
544 return m_timeline && m_content && m_content->isAnimation() && playing(); | |
545 } | |
546 | |
547 bool AnimationPlayer::maybeStartAnimationOnCompositor() | |
548 { | |
549 if (!canStartAnimationOnCompositor()) | |
550 return false; | |
551 | |
552 double startTime = timeline()->zeroTime() + startTimeInternal(); | |
553 double timeOffset = 0; | |
554 if (std::isnan(startTime)) { | |
555 timeOffset = currentTimeInternal(); | |
556 } | |
557 return toAnimation(m_content.get())->maybeStartAnimationOnCompositor(startTi
me, timeOffset); | |
558 } | |
559 | |
560 void AnimationPlayer::setCompositorPending(bool sourceChanged) | 462 void AnimationPlayer::setCompositorPending(bool sourceChanged) |
561 { | 463 { |
562 // FIXME: Animation could notify this directly? | |
563 if (!hasActiveAnimationsOnCompositor()) { | |
564 m_compositorState.release(); | |
565 } | |
566 if (!m_compositorPending) { | 464 if (!m_compositorPending) { |
567 m_compositorPending = true; | 465 m_compositorPending = true; |
568 if (sourceChanged && m_compositorState) | |
569 m_compositorState->sourceChanged = true; | |
570 timeline()->document()->compositorPendingAnimations().add(this); | 466 timeline()->document()->compositorPendingAnimations().add(this); |
571 } | 467 } |
572 } | 468 } |
573 | 469 |
574 bool AnimationPlayer::hasActiveAnimationsOnCompositor() | |
575 { | |
576 if (!m_content || !m_content->isAnimation()) | |
577 return false; | |
578 | |
579 return toAnimation(m_content.get())->hasActiveAnimationsOnCompositor(); | |
580 } | |
581 | |
582 void AnimationPlayer::cancelAnimationOnCompositor() | |
583 { | |
584 if (hasActiveAnimationsOnCompositor()) | |
585 toAnimation(m_content.get())->cancelAnimationOnCompositor(); | |
586 } | |
587 | |
588 bool AnimationPlayer::update(TimingUpdateReason reason) | 470 bool AnimationPlayer::update(TimingUpdateReason reason) |
589 { | 471 { |
590 if (!m_timeline) | 472 if (!m_timeline) |
591 return false; | 473 return false; |
592 | 474 |
593 updateCurrentTimingState(reason); | 475 updateCurrentTimingState(reason); |
594 m_outdated = false; | 476 m_outdated = false; |
595 | 477 |
596 if (m_content) { | 478 if (m_content) { |
597 double inheritedTime = isNull(m_timeline->currentTimeInternal()) ? nullV
alue() : currentTimeInternal(); | 479 double inheritedTime = isNull(m_timeline->currentTimeInternal()) ? nullV
alue() : currentTimeInternal(); |
(...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
637 return hasOneRef() && m_content->isAnimation() && m_content->hasOneRef(); | 519 return hasOneRef() && m_content->isAnimation() && m_content->hasOneRef(); |
638 } | 520 } |
639 | 521 |
640 bool AnimationPlayer::addEventListener(const AtomicString& eventType, PassRefPtr
<EventListener> listener, bool useCapture) | 522 bool AnimationPlayer::addEventListener(const AtomicString& eventType, PassRefPtr
<EventListener> listener, bool useCapture) |
641 { | 523 { |
642 if (eventType == EventTypeNames::finish) | 524 if (eventType == EventTypeNames::finish) |
643 UseCounter::count(executionContext(), UseCounter::AnimationPlayerFinishE
vent); | 525 UseCounter::count(executionContext(), UseCounter::AnimationPlayerFinishE
vent); |
644 return EventTargetWithInlineData::addEventListener(eventType, listener, useC
apture); | 526 return EventTargetWithInlineData::addEventListener(eventType, listener, useC
apture); |
645 } | 527 } |
646 | 528 |
647 void AnimationPlayer::pauseForTesting(double pauseTime) | |
648 { | |
649 RELEASE_ASSERT(!paused()); | |
650 setCurrentTimeInternal(pauseTime, TimingUpdateOnDemand); | |
651 if (hasActiveAnimationsOnCompositor()) | |
652 toAnimation(m_content.get())->pauseAnimationForTestingOnCompositor(curre
ntTimeInternal()); | |
653 m_isPausedForTesting = true; | |
654 pause(); | |
655 } | |
656 | |
657 } // namespace | 529 } // namespace |
OLD | NEW |