OLD | NEW |
---|---|
1 // Copyright 2012 The Chromium Authors. All rights reserved. | 1 // Copyright 2012 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "cc/animation/layer_animation_controller.h" | 5 #include "cc/animation/layer_animation_controller.h" |
6 | 6 |
7 #include <algorithm> | 7 #include <algorithm> |
8 | 8 |
9 #include "cc/animation/animation.h" | 9 #include "cc/animation/animation.h" |
10 #include "cc/animation/animation_delegate.h" | 10 #include "cc/animation/animation_delegate.h" |
11 #include "cc/animation/animation_registrar.h" | 11 #include "cc/animation/animation_registrar.h" |
12 #include "cc/animation/keyframed_animation_curve.h" | 12 #include "cc/animation/keyframed_animation_curve.h" |
13 #include "cc/animation/layer_animation_value_observer.h" | 13 #include "cc/animation/layer_animation_value_observer.h" |
14 #include "cc/animation/layer_animation_value_provider.h" | 14 #include "cc/animation/layer_animation_value_provider.h" |
15 #include "cc/animation/scroll_offset_animation_curve.h" | 15 #include "cc/animation/scroll_offset_animation_curve.h" |
16 #include "cc/base/scoped_ptr_algorithm.h" | 16 #include "cc/base/scoped_ptr_algorithm.h" |
17 #include "cc/output/filter_operations.h" | 17 #include "cc/output/filter_operations.h" |
18 #include "ui/gfx/box_f.h" | 18 #include "ui/gfx/box_f.h" |
19 #include "ui/gfx/transform.h" | 19 #include "ui/gfx/transform.h" |
20 | 20 |
21 namespace cc { | 21 namespace cc { |
22 | 22 |
23 LayerAnimationController::LayerAnimationController(int id) | 23 LayerAnimationController::LayerAnimationController(int id) |
24 : registrar_(0), | 24 : registrar_(0), |
25 id_(id), | 25 id_(id), |
26 is_active_(false), | 26 is_active_(false), |
27 last_tick_time_(0), | 27 last_tick_time_(), |
ajuma
2014/05/07 17:04:42
Not needed.
Sikugu_
2014/05/12 16:01:53
Done.
| |
28 value_provider_(NULL), | 28 value_provider_(NULL), |
29 layer_animation_delegate_(NULL) {} | 29 layer_animation_delegate_(NULL) { |
30 } | |
30 | 31 |
31 LayerAnimationController::~LayerAnimationController() { | 32 LayerAnimationController::~LayerAnimationController() { |
32 if (registrar_) | 33 if (registrar_) |
33 registrar_->UnregisterAnimationController(this); | 34 registrar_->UnregisterAnimationController(this); |
34 } | 35 } |
35 | 36 |
36 scoped_refptr<LayerAnimationController> LayerAnimationController::Create( | 37 scoped_refptr<LayerAnimationController> LayerAnimationController::Create( |
37 int id) { | 38 int id) { |
38 return make_scoped_refptr(new LayerAnimationController(id)); | 39 return make_scoped_refptr(new LayerAnimationController(id)); |
39 } | 40 } |
40 | 41 |
41 void LayerAnimationController::PauseAnimation(int animation_id, | 42 void LayerAnimationController::PauseAnimation(int animation_id, |
42 double time_offset) { | 43 base::TimeDelta time_offset) { |
43 for (size_t i = 0; i < animations_.size(); ++i) { | 44 for (size_t i = 0; i < animations_.size(); ++i) { |
44 if (animations_[i]->id() == animation_id) { | 45 if (animations_[i]->id() == animation_id) { |
45 animations_[i]->SetRunState(Animation::Paused, | 46 animations_[i]->SetRunState(Animation::Paused, |
46 time_offset + animations_[i]->start_time()); | 47 time_offset + animations_[i]->start_time()); |
47 } | 48 } |
48 } | 49 } |
49 } | 50 } |
50 | 51 |
51 struct HasAnimationId { | 52 struct HasAnimationId { |
52 explicit HasAnimationId(int id) : id_(id) {} | 53 explicit HasAnimationId(int id) : id_(id) {} |
(...skipping 61 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
114 // Remove finished impl side animations only after pushing, | 115 // Remove finished impl side animations only after pushing, |
115 // and only after the animations are deleted on the main thread | 116 // and only after the animations are deleted on the main thread |
116 // this insures we will never push an animation twice. | 117 // this insures we will never push an animation twice. |
117 RemoveAnimationsCompletedOnMainThread(controller_impl); | 118 RemoveAnimationsCompletedOnMainThread(controller_impl); |
118 | 119 |
119 PushPropertiesToImplThread(controller_impl); | 120 PushPropertiesToImplThread(controller_impl); |
120 controller_impl->UpdateActivation(NormalActivation); | 121 controller_impl->UpdateActivation(NormalActivation); |
121 UpdateActivation(NormalActivation); | 122 UpdateActivation(NormalActivation); |
122 } | 123 } |
123 | 124 |
124 void LayerAnimationController::Animate(double monotonic_time) { | 125 void LayerAnimationController::Animate(base::TimeTicks monotonic_time) { |
125 DCHECK(monotonic_time); | 126 DCHECK(monotonic_time != base::TimeTicks()); |
126 if (!HasValueObserver()) | 127 if (!HasValueObserver()) |
127 return; | 128 return; |
128 | 129 |
129 StartAnimations(monotonic_time); | 130 StartAnimations(monotonic_time); |
130 TickAnimations(monotonic_time); | 131 TickAnimations(monotonic_time); |
131 last_tick_time_ = monotonic_time; | 132 last_tick_time_ = monotonic_time; |
132 } | 133 } |
133 | 134 |
134 void LayerAnimationController::AccumulatePropertyUpdates( | 135 void LayerAnimationController::AccumulatePropertyUpdates( |
135 double monotonic_time, | 136 base::TimeTicks monotonic_time, |
136 AnimationEventsVector* events) { | 137 AnimationEventsVector* events) { |
137 if (!events) | 138 if (!events) |
138 return; | 139 return; |
139 | 140 |
140 for (size_t i = 0; i < animations_.size(); ++i) { | 141 for (size_t i = 0; i < animations_.size(); ++i) { |
141 Animation* animation = animations_[i]; | 142 Animation* animation = animations_[i]; |
142 if (!animation->is_impl_only()) | 143 if (!animation->is_impl_only()) |
143 continue; | 144 continue; |
144 | 145 |
145 double trimmed = animation->TrimTimeToCurrentIteration(monotonic_time); | 146 double trimmed = animation->TrimTimeToCurrentIteration(monotonic_time); |
(...skipping 50 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
196 NOTREACHED(); | 197 NOTREACHED(); |
197 } | 198 } |
198 } | 199 } |
199 } | 200 } |
200 | 201 |
201 void LayerAnimationController::UpdateState(bool start_ready_animations, | 202 void LayerAnimationController::UpdateState(bool start_ready_animations, |
202 AnimationEventsVector* events) { | 203 AnimationEventsVector* events) { |
203 if (!HasActiveValueObserver()) | 204 if (!HasActiveValueObserver()) |
204 return; | 205 return; |
205 | 206 |
206 DCHECK(last_tick_time_); | 207 DCHECK(last_tick_time_ != base::TimeTicks()); |
207 if (start_ready_animations) | 208 if (start_ready_animations) |
208 PromoteStartedAnimations(last_tick_time_, events); | 209 PromoteStartedAnimations(last_tick_time_, events); |
209 | 210 |
210 MarkFinishedAnimations(last_tick_time_); | 211 MarkFinishedAnimations(last_tick_time_); |
211 MarkAnimationsForDeletion(last_tick_time_, events); | 212 MarkAnimationsForDeletion(last_tick_time_, events); |
212 | 213 |
213 if (start_ready_animations) { | 214 if (start_ready_animations) { |
214 StartAnimations(last_tick_time_); | 215 StartAnimations(last_tick_time_); |
215 PromoteStartedAnimations(last_tick_time_, events); | 216 PromoteStartedAnimations(last_tick_time_, events); |
216 } | 217 } |
(...skipping 76 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
293 | 294 |
294 registrar_ = registrar; | 295 registrar_ = registrar; |
295 if (registrar_) | 296 if (registrar_) |
296 registrar_->RegisterAnimationController(this); | 297 registrar_->RegisterAnimationController(this); |
297 | 298 |
298 UpdateActivation(ForceActivation); | 299 UpdateActivation(ForceActivation); |
299 } | 300 } |
300 | 301 |
301 void LayerAnimationController::NotifyAnimationStarted( | 302 void LayerAnimationController::NotifyAnimationStarted( |
302 const AnimationEvent& event) { | 303 const AnimationEvent& event) { |
303 base::TimeTicks monotonic_time = base::TimeTicks::FromInternalValue( | |
304 event.monotonic_time * base::Time::kMicrosecondsPerSecond); | |
305 if (event.is_impl_only) { | 304 if (event.is_impl_only) { |
306 FOR_EACH_OBSERVER(LayerAnimationEventObserver, event_observers_, | 305 FOR_EACH_OBSERVER(LayerAnimationEventObserver, event_observers_, |
307 OnAnimationStarted(event)); | 306 OnAnimationStarted(event)); |
308 if (layer_animation_delegate_) | 307 if (layer_animation_delegate_) |
309 layer_animation_delegate_->NotifyAnimationStarted(monotonic_time, | 308 layer_animation_delegate_->NotifyAnimationStarted(event.monotonic_time, |
310 event.target_property); | 309 event.target_property); |
311 | |
312 return; | 310 return; |
313 } | 311 } |
314 | 312 |
315 for (size_t i = 0; i < animations_.size(); ++i) { | 313 for (size_t i = 0; i < animations_.size(); ++i) { |
316 if (animations_[i]->group() == event.group_id && | 314 if (animations_[i]->group() == event.group_id && |
317 animations_[i]->target_property() == event.target_property && | 315 animations_[i]->target_property() == event.target_property && |
318 animations_[i]->needs_synchronized_start_time()) { | 316 animations_[i]->needs_synchronized_start_time()) { |
319 animations_[i]->set_needs_synchronized_start_time(false); | 317 animations_[i]->set_needs_synchronized_start_time(false); |
320 if (!animations_[i]->has_set_start_time()) | 318 if (!animations_[i]->has_set_start_time()) |
321 animations_[i]->set_start_time(event.monotonic_time); | 319 animations_[i]->set_start_time(event.monotonic_time); |
322 | 320 |
323 FOR_EACH_OBSERVER(LayerAnimationEventObserver, event_observers_, | 321 FOR_EACH_OBSERVER(LayerAnimationEventObserver, event_observers_, |
324 OnAnimationStarted(event)); | 322 OnAnimationStarted(event)); |
325 if (layer_animation_delegate_) | 323 if (layer_animation_delegate_) |
326 layer_animation_delegate_->NotifyAnimationStarted( | 324 layer_animation_delegate_->NotifyAnimationStarted( |
327 monotonic_time, event.target_property); | 325 event.monotonic_time, event.target_property); |
328 | 326 |
329 return; | 327 return; |
330 } | 328 } |
331 } | 329 } |
332 } | 330 } |
333 | 331 |
334 void LayerAnimationController::NotifyAnimationFinished( | 332 void LayerAnimationController::NotifyAnimationFinished( |
335 const AnimationEvent& event) { | 333 const AnimationEvent& event) { |
336 base::TimeTicks monotonic_time = base::TimeTicks::FromInternalValue( | |
337 event.monotonic_time * base::Time::kMicrosecondsPerSecond); | |
338 if (event.is_impl_only) { | 334 if (event.is_impl_only) { |
339 if (layer_animation_delegate_) | 335 if (layer_animation_delegate_) |
340 layer_animation_delegate_->NotifyAnimationFinished(monotonic_time, | 336 layer_animation_delegate_->NotifyAnimationFinished(event.monotonic_time, |
341 event.target_property); | 337 event.target_property); |
342 return; | 338 return; |
343 } | 339 } |
344 | 340 |
345 for (size_t i = 0; i < animations_.size(); ++i) { | 341 for (size_t i = 0; i < animations_.size(); ++i) { |
346 if (animations_[i]->group() == event.group_id && | 342 if (animations_[i]->group() == event.group_id && |
347 animations_[i]->target_property() == event.target_property) { | 343 animations_[i]->target_property() == event.target_property) { |
348 animations_[i]->set_received_finished_event(true); | 344 animations_[i]->set_received_finished_event(true); |
349 if (layer_animation_delegate_) | 345 if (layer_animation_delegate_) |
350 layer_animation_delegate_->NotifyAnimationFinished( | 346 layer_animation_delegate_->NotifyAnimationFinished( |
351 monotonic_time, event.target_property); | 347 event.monotonic_time, event.target_property); |
352 | 348 |
353 return; | 349 return; |
354 } | 350 } |
355 } | 351 } |
356 } | 352 } |
357 | 353 |
358 void LayerAnimationController::NotifyAnimationAborted( | 354 void LayerAnimationController::NotifyAnimationAborted( |
359 const AnimationEvent& event) { | 355 const AnimationEvent& event) { |
360 for (size_t i = 0; i < animations_.size(); ++i) { | 356 for (size_t i = 0; i < animations_.size(); ++i) { |
361 if (animations_[i]->group() == event.group_id && | 357 if (animations_[i]->group() == event.group_id && |
(...skipping 229 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
591 void LayerAnimationController::PushPropertiesToImplThread( | 587 void LayerAnimationController::PushPropertiesToImplThread( |
592 LayerAnimationController* controller_impl) const { | 588 LayerAnimationController* controller_impl) const { |
593 for (size_t i = 0; i < animations_.size(); ++i) { | 589 for (size_t i = 0; i < animations_.size(); ++i) { |
594 Animation* current_impl = controller_impl->GetAnimation( | 590 Animation* current_impl = controller_impl->GetAnimation( |
595 animations_[i]->group(), animations_[i]->target_property()); | 591 animations_[i]->group(), animations_[i]->target_property()); |
596 if (current_impl) | 592 if (current_impl) |
597 animations_[i]->PushPropertiesTo(current_impl); | 593 animations_[i]->PushPropertiesTo(current_impl); |
598 } | 594 } |
599 } | 595 } |
600 | 596 |
601 void LayerAnimationController::StartAnimations(double monotonic_time) { | 597 void LayerAnimationController::StartAnimations(base::TimeTicks monotonic_time) { |
602 // First collect running properties affecting each type of observer. | 598 // First collect running properties affecting each type of observer. |
603 TargetProperties blocked_properties_for_active_observers; | 599 TargetProperties blocked_properties_for_active_observers; |
604 TargetProperties blocked_properties_for_pending_observers; | 600 TargetProperties blocked_properties_for_pending_observers; |
605 for (size_t i = 0; i < animations_.size(); ++i) { | 601 for (size_t i = 0; i < animations_.size(); ++i) { |
606 if (animations_[i]->run_state() == Animation::Starting || | 602 if (animations_[i]->run_state() == Animation::Starting || |
607 animations_[i]->run_state() == Animation::Running) { | 603 animations_[i]->run_state() == Animation::Running) { |
608 if (animations_[i]->affects_active_observers()) { | 604 if (animations_[i]->affects_active_observers()) { |
609 blocked_properties_for_active_observers.insert( | 605 blocked_properties_for_active_observers.insert( |
610 animations_[i]->target_property()); | 606 animations_[i]->target_property()); |
611 } | 607 } |
(...skipping 50 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
662 if (animations_[i]->group() == animations_[j]->group()) { | 658 if (animations_[i]->group() == animations_[j]->group()) { |
663 animations_[j]->SetRunState(Animation::Starting, monotonic_time); | 659 animations_[j]->SetRunState(Animation::Starting, monotonic_time); |
664 } | 660 } |
665 } | 661 } |
666 } | 662 } |
667 } | 663 } |
668 } | 664 } |
669 } | 665 } |
670 | 666 |
671 void LayerAnimationController::PromoteStartedAnimations( | 667 void LayerAnimationController::PromoteStartedAnimations( |
672 double monotonic_time, | 668 base::TimeTicks monotonic_time, |
673 AnimationEventsVector* events) { | 669 AnimationEventsVector* events) { |
674 for (size_t i = 0; i < animations_.size(); ++i) { | 670 for (size_t i = 0; i < animations_.size(); ++i) { |
675 if (animations_[i]->run_state() == Animation::Starting && | 671 if (animations_[i]->run_state() == Animation::Starting && |
676 animations_[i]->affects_active_observers()) { | 672 animations_[i]->affects_active_observers()) { |
677 animations_[i]->SetRunState(Animation::Running, monotonic_time); | 673 animations_[i]->SetRunState(Animation::Running, monotonic_time); |
678 if (!animations_[i]->has_set_start_time() && | 674 if (!animations_[i]->has_set_start_time() && |
679 !animations_[i]->needs_synchronized_start_time()) | 675 !animations_[i]->needs_synchronized_start_time()) |
680 animations_[i]->set_start_time(monotonic_time); | 676 animations_[i]->set_start_time(monotonic_time); |
681 if (events) { | 677 if (events) { |
682 AnimationEvent started_event(AnimationEvent::Started, | 678 AnimationEvent started_event(AnimationEvent::Started, |
683 id_, | 679 id_, |
684 animations_[i]->group(), | 680 animations_[i]->group(), |
685 animations_[i]->target_property(), | 681 animations_[i]->target_property(), |
686 monotonic_time); | 682 monotonic_time); |
687 started_event.is_impl_only = animations_[i]->is_impl_only(); | 683 started_event.is_impl_only = animations_[i]->is_impl_only(); |
688 events->push_back(started_event); | 684 events->push_back(started_event); |
689 } | 685 } |
690 } | 686 } |
691 } | 687 } |
692 } | 688 } |
693 | 689 |
694 void LayerAnimationController::MarkFinishedAnimations(double monotonic_time) { | 690 void LayerAnimationController::MarkFinishedAnimations( |
691 base::TimeTicks monotonic_time) { | |
695 for (size_t i = 0; i < animations_.size(); ++i) { | 692 for (size_t i = 0; i < animations_.size(); ++i) { |
696 if (animations_[i]->IsFinishedAt(monotonic_time) && | 693 if (animations_[i]->IsFinishedAt(monotonic_time) && |
697 animations_[i]->run_state() != Animation::Aborted && | 694 animations_[i]->run_state() != Animation::Aborted && |
698 animations_[i]->run_state() != Animation::WaitingForDeletion) | 695 animations_[i]->run_state() != Animation::WaitingForDeletion) |
699 animations_[i]->SetRunState(Animation::Finished, monotonic_time); | 696 animations_[i]->SetRunState(Animation::Finished, monotonic_time); |
700 } | 697 } |
701 } | 698 } |
702 | 699 |
703 void LayerAnimationController::MarkAnimationsForDeletion( | 700 void LayerAnimationController::MarkAnimationsForDeletion( |
704 double monotonic_time, AnimationEventsVector* events) { | 701 base::TimeTicks monotonic_time, |
702 AnimationEventsVector* events) { | |
705 bool marked_animations_for_deletions = false; | 703 bool marked_animations_for_deletions = false; |
706 | 704 |
707 // Non-aborted animations are marked for deletion after a corresponding | 705 // Non-aborted animations are marked for deletion after a corresponding |
708 // AnimationEvent::Finished event is sent or received. This means that if | 706 // AnimationEvent::Finished event is sent or received. This means that if |
709 // we don't have an events vector, we must ensure that non-aborted animations | 707 // we don't have an events vector, we must ensure that non-aborted animations |
710 // have received a finished event before marking them for deletion. | 708 // have received a finished event before marking them for deletion. |
711 for (size_t i = 0; i < animations_.size(); i++) { | 709 for (size_t i = 0; i < animations_.size(); i++) { |
712 int group_id = animations_[i]->group(); | 710 int group_id = animations_[i]->group(); |
713 if (animations_[i]->run_state() == Animation::Aborted) { | 711 if (animations_[i]->run_state() == Animation::Aborted) { |
714 if (events && !animations_[i]->is_impl_only()) { | 712 if (events && !animations_[i]->is_impl_only()) { |
(...skipping 66 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
781 } | 779 } |
782 | 780 |
783 void LayerAnimationController::PurgeAnimationsMarkedForDeletion() { | 781 void LayerAnimationController::PurgeAnimationsMarkedForDeletion() { |
784 animations_.erase(cc::remove_if(&animations_, | 782 animations_.erase(cc::remove_if(&animations_, |
785 animations_.begin(), | 783 animations_.begin(), |
786 animations_.end(), | 784 animations_.end(), |
787 IsWaitingForDeletion), | 785 IsWaitingForDeletion), |
788 animations_.end()); | 786 animations_.end()); |
789 } | 787 } |
790 | 788 |
791 void LayerAnimationController::TickAnimations(double monotonic_time) { | 789 void LayerAnimationController::TickAnimations(base::TimeTicks monotonic_time) { |
792 for (size_t i = 0; i < animations_.size(); ++i) { | 790 for (size_t i = 0; i < animations_.size(); ++i) { |
793 if (animations_[i]->run_state() == Animation::Starting || | 791 if (animations_[i]->run_state() == Animation::Starting || |
794 animations_[i]->run_state() == Animation::Running || | 792 animations_[i]->run_state() == Animation::Running || |
795 animations_[i]->run_state() == Animation::Paused) { | 793 animations_[i]->run_state() == Animation::Paused) { |
796 double trimmed = | 794 double trimmed = |
797 animations_[i]->TrimTimeToCurrentIteration(monotonic_time); | 795 animations_[i]->TrimTimeToCurrentIteration(monotonic_time); |
798 | 796 |
799 switch (animations_[i]->target_property()) { | 797 switch (animations_[i]->target_property()) { |
800 case Animation::Transform: { | 798 case Animation::Transform: { |
801 const TransformAnimationCurve* transform_animation_curve = | 799 const TransformAnimationCurve* transform_animation_curve = |
(...skipping 159 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
961 value_observers_); | 959 value_observers_); |
962 LayerAnimationValueObserver* obs; | 960 LayerAnimationValueObserver* obs; |
963 while ((obs = it.GetNext()) != NULL) | 961 while ((obs = it.GetNext()) != NULL) |
964 if (obs->IsActive()) | 962 if (obs->IsActive()) |
965 return true; | 963 return true; |
966 } | 964 } |
967 return false; | 965 return false; |
968 } | 966 } |
969 | 967 |
970 } // namespace cc | 968 } // namespace cc |
OLD | NEW |