Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(209)

Side by Side Diff: cc/animation/layer_animation_controller.cc

Issue 231133002: CC::Animations should use TimeTicks & TimeDelta to represent time (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Fix for build errors in ui/compositor unittests. Created 6 years, 7 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
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),
28 value_provider_(NULL), 27 value_provider_(NULL),
29 layer_animation_delegate_(NULL), 28 layer_animation_delegate_(NULL),
30 needs_to_start_animations_(false) { 29 needs_to_start_animations_(false) {
31 } 30 }
32 31
33 LayerAnimationController::~LayerAnimationController() { 32 LayerAnimationController::~LayerAnimationController() {
34 if (registrar_) 33 if (registrar_)
35 registrar_->UnregisterAnimationController(this); 34 registrar_->UnregisterAnimationController(this);
36 } 35 }
37 36
38 scoped_refptr<LayerAnimationController> LayerAnimationController::Create( 37 scoped_refptr<LayerAnimationController> LayerAnimationController::Create(
39 int id) { 38 int id) {
40 return make_scoped_refptr(new LayerAnimationController(id)); 39 return make_scoped_refptr(new LayerAnimationController(id));
41 } 40 }
42 41
43 void LayerAnimationController::PauseAnimation(int animation_id, 42 void LayerAnimationController::PauseAnimation(int animation_id,
44 double time_offset) { 43 base::TimeDelta time_offset) {
45 for (size_t i = 0; i < animations_.size(); ++i) { 44 for (size_t i = 0; i < animations_.size(); ++i) {
46 if (animations_[i]->id() == animation_id) { 45 if (animations_[i]->id() == animation_id) {
47 animations_[i]->SetRunState(Animation::Paused, 46 animations_[i]->SetRunState(Animation::Paused,
48 time_offset + animations_[i]->start_time()); 47 time_offset + animations_[i]->start_time());
49 } 48 }
50 } 49 }
51 } 50 }
52 51
53 struct HasAnimationId { 52 struct HasAnimationId {
54 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
116 // Remove finished impl side animations only after pushing, 115 // Remove finished impl side animations only after pushing,
117 // and only after the animations are deleted on the main thread 116 // and only after the animations are deleted on the main thread
118 // this insures we will never push an animation twice. 117 // this insures we will never push an animation twice.
119 RemoveAnimationsCompletedOnMainThread(controller_impl); 118 RemoveAnimationsCompletedOnMainThread(controller_impl);
120 119
121 PushPropertiesToImplThread(controller_impl); 120 PushPropertiesToImplThread(controller_impl);
122 controller_impl->UpdateActivation(NormalActivation); 121 controller_impl->UpdateActivation(NormalActivation);
123 UpdateActivation(NormalActivation); 122 UpdateActivation(NormalActivation);
124 } 123 }
125 124
126 void LayerAnimationController::Animate(double monotonic_time) { 125 void LayerAnimationController::Animate(base::TimeTicks monotonic_time) {
127 DCHECK(monotonic_time); 126 DCHECK(monotonic_time != base::TimeTicks());
mithro-old 2014/05/13 09:25:30 DCHECK(!monotonic_time.is_null()) BTW There is al
128 if (!HasValueObserver()) 127 if (!HasValueObserver())
129 return; 128 return;
130 129
131 if (needs_to_start_animations_) 130 if (needs_to_start_animations_)
132 StartAnimations(monotonic_time); 131 StartAnimations(monotonic_time);
133 TickAnimations(monotonic_time); 132 TickAnimations(monotonic_time);
134 last_tick_time_ = monotonic_time; 133 last_tick_time_ = monotonic_time;
135 } 134 }
136 135
137 void LayerAnimationController::AccumulatePropertyUpdates( 136 void LayerAnimationController::AccumulatePropertyUpdates(
138 double monotonic_time, 137 base::TimeTicks monotonic_time,
139 AnimationEventsVector* events) { 138 AnimationEventsVector* events) {
140 if (!events) 139 if (!events)
141 return; 140 return;
142 141
143 for (size_t i = 0; i < animations_.size(); ++i) { 142 for (size_t i = 0; i < animations_.size(); ++i) {
144 Animation* animation = animations_[i]; 143 Animation* animation = animations_[i];
145 if (!animation->is_impl_only()) 144 if (!animation->is_impl_only())
146 continue; 145 continue;
147 146
148 double trimmed = animation->TrimTimeToCurrentIteration(monotonic_time); 147 double trimmed = animation->TrimTimeToCurrentIteration(monotonic_time);
(...skipping 50 matching lines...) Expand 10 before | Expand all | Expand 10 after
199 NOTREACHED(); 198 NOTREACHED();
200 } 199 }
201 } 200 }
202 } 201 }
203 202
204 void LayerAnimationController::UpdateState(bool start_ready_animations, 203 void LayerAnimationController::UpdateState(bool start_ready_animations,
205 AnimationEventsVector* events) { 204 AnimationEventsVector* events) {
206 if (!HasActiveValueObserver()) 205 if (!HasActiveValueObserver())
207 return; 206 return;
208 207
209 DCHECK(last_tick_time_); 208 DCHECK(last_tick_time_ != base::TimeTicks());
210 if (start_ready_animations) 209 if (start_ready_animations)
211 PromoteStartedAnimations(last_tick_time_, events); 210 PromoteStartedAnimations(last_tick_time_, events);
212 211
213 MarkFinishedAnimations(last_tick_time_); 212 MarkFinishedAnimations(last_tick_time_);
214 MarkAnimationsForDeletion(last_tick_time_, events); 213 MarkAnimationsForDeletion(last_tick_time_, events);
215 214
216 if (needs_to_start_animations_ && start_ready_animations) { 215 if (needs_to_start_animations_ && start_ready_animations) {
217 StartAnimations(last_tick_time_); 216 StartAnimations(last_tick_time_);
218 PromoteStartedAnimations(last_tick_time_, events); 217 PromoteStartedAnimations(last_tick_time_, events);
219 } 218 }
(...skipping 77 matching lines...) Expand 10 before | Expand all | Expand 10 after
297 296
298 registrar_ = registrar; 297 registrar_ = registrar;
299 if (registrar_) 298 if (registrar_)
300 registrar_->RegisterAnimationController(this); 299 registrar_->RegisterAnimationController(this);
301 300
302 UpdateActivation(ForceActivation); 301 UpdateActivation(ForceActivation);
303 } 302 }
304 303
305 void LayerAnimationController::NotifyAnimationStarted( 304 void LayerAnimationController::NotifyAnimationStarted(
306 const AnimationEvent& event) { 305 const AnimationEvent& event) {
307 base::TimeTicks monotonic_time = base::TimeTicks::FromInternalValue(
308 event.monotonic_time * base::Time::kMicrosecondsPerSecond);
309 if (event.is_impl_only) { 306 if (event.is_impl_only) {
310 FOR_EACH_OBSERVER(LayerAnimationEventObserver, event_observers_, 307 FOR_EACH_OBSERVER(LayerAnimationEventObserver, event_observers_,
311 OnAnimationStarted(event)); 308 OnAnimationStarted(event));
312 if (layer_animation_delegate_) 309 if (layer_animation_delegate_)
313 layer_animation_delegate_->NotifyAnimationStarted(monotonic_time, 310 layer_animation_delegate_->NotifyAnimationStarted(event.monotonic_time,
314 event.target_property); 311 event.target_property);
315
316 return; 312 return;
317 } 313 }
318 314
319 for (size_t i = 0; i < animations_.size(); ++i) { 315 for (size_t i = 0; i < animations_.size(); ++i) {
320 if (animations_[i]->group() == event.group_id && 316 if (animations_[i]->group() == event.group_id &&
321 animations_[i]->target_property() == event.target_property && 317 animations_[i]->target_property() == event.target_property &&
322 animations_[i]->needs_synchronized_start_time()) { 318 animations_[i]->needs_synchronized_start_time()) {
323 animations_[i]->set_needs_synchronized_start_time(false); 319 animations_[i]->set_needs_synchronized_start_time(false);
324 if (!animations_[i]->has_set_start_time()) 320 if (!animations_[i]->has_set_start_time())
325 animations_[i]->set_start_time(event.monotonic_time); 321 animations_[i]->set_start_time(event.monotonic_time);
326 322
327 FOR_EACH_OBSERVER(LayerAnimationEventObserver, event_observers_, 323 FOR_EACH_OBSERVER(LayerAnimationEventObserver, event_observers_,
328 OnAnimationStarted(event)); 324 OnAnimationStarted(event));
329 if (layer_animation_delegate_) 325 if (layer_animation_delegate_)
330 layer_animation_delegate_->NotifyAnimationStarted( 326 layer_animation_delegate_->NotifyAnimationStarted(
331 monotonic_time, event.target_property); 327 event.monotonic_time, event.target_property);
332 328
333 return; 329 return;
334 } 330 }
335 } 331 }
336 } 332 }
337 333
338 void LayerAnimationController::NotifyAnimationFinished( 334 void LayerAnimationController::NotifyAnimationFinished(
339 const AnimationEvent& event) { 335 const AnimationEvent& event) {
340 base::TimeTicks monotonic_time = base::TimeTicks::FromInternalValue(
341 event.monotonic_time * base::Time::kMicrosecondsPerSecond);
342 if (event.is_impl_only) { 336 if (event.is_impl_only) {
343 if (layer_animation_delegate_) 337 if (layer_animation_delegate_)
344 layer_animation_delegate_->NotifyAnimationFinished(monotonic_time, 338 layer_animation_delegate_->NotifyAnimationFinished(event.monotonic_time,
345 event.target_property); 339 event.target_property);
346 return; 340 return;
347 } 341 }
348 342
349 for (size_t i = 0; i < animations_.size(); ++i) { 343 for (size_t i = 0; i < animations_.size(); ++i) {
350 if (animations_[i]->group() == event.group_id && 344 if (animations_[i]->group() == event.group_id &&
351 animations_[i]->target_property() == event.target_property) { 345 animations_[i]->target_property() == event.target_property) {
352 animations_[i]->set_received_finished_event(true); 346 animations_[i]->set_received_finished_event(true);
353 if (layer_animation_delegate_) 347 if (layer_animation_delegate_)
354 layer_animation_delegate_->NotifyAnimationFinished( 348 layer_animation_delegate_->NotifyAnimationFinished(
355 monotonic_time, event.target_property); 349 event.monotonic_time, event.target_property);
356 350
357 return; 351 return;
358 } 352 }
359 } 353 }
360 } 354 }
361 355
362 void LayerAnimationController::NotifyAnimationAborted( 356 void LayerAnimationController::NotifyAnimationAborted(
363 const AnimationEvent& event) { 357 const AnimationEvent& event) {
364 for (size_t i = 0; i < animations_.size(); ++i) { 358 for (size_t i = 0; i < animations_.size(); ++i) {
365 if (animations_[i]->group() == event.group_id && 359 if (animations_[i]->group() == event.group_id &&
(...skipping 229 matching lines...) Expand 10 before | Expand all | Expand 10 after
595 void LayerAnimationController::PushPropertiesToImplThread( 589 void LayerAnimationController::PushPropertiesToImplThread(
596 LayerAnimationController* controller_impl) const { 590 LayerAnimationController* controller_impl) const {
597 for (size_t i = 0; i < animations_.size(); ++i) { 591 for (size_t i = 0; i < animations_.size(); ++i) {
598 Animation* current_impl = controller_impl->GetAnimation( 592 Animation* current_impl = controller_impl->GetAnimation(
599 animations_[i]->group(), animations_[i]->target_property()); 593 animations_[i]->group(), animations_[i]->target_property());
600 if (current_impl) 594 if (current_impl)
601 animations_[i]->PushPropertiesTo(current_impl); 595 animations_[i]->PushPropertiesTo(current_impl);
602 } 596 }
603 } 597 }
604 598
605 void LayerAnimationController::StartAnimations(double monotonic_time) { 599 void LayerAnimationController::StartAnimations(base::TimeTicks monotonic_time) {
606 DCHECK(needs_to_start_animations_); 600 DCHECK(needs_to_start_animations_);
607 needs_to_start_animations_ = false; 601 needs_to_start_animations_ = false;
608 // First collect running properties affecting each type of observer. 602 // First collect running properties affecting each type of observer.
609 TargetProperties blocked_properties_for_active_observers; 603 TargetProperties blocked_properties_for_active_observers;
610 TargetProperties blocked_properties_for_pending_observers; 604 TargetProperties blocked_properties_for_pending_observers;
611 for (size_t i = 0; i < animations_.size(); ++i) { 605 for (size_t i = 0; i < animations_.size(); ++i) {
612 if (animations_[i]->run_state() == Animation::Starting || 606 if (animations_[i]->run_state() == Animation::Starting ||
613 animations_[i]->run_state() == Animation::Running) { 607 animations_[i]->run_state() == Animation::Running) {
614 if (animations_[i]->affects_active_observers()) { 608 if (animations_[i]->affects_active_observers()) {
615 blocked_properties_for_active_observers.insert( 609 blocked_properties_for_active_observers.insert(
(...skipping 54 matching lines...) Expand 10 before | Expand all | Expand 10 after
670 } 664 }
671 } 665 }
672 } else { 666 } else {
673 needs_to_start_animations_ = true; 667 needs_to_start_animations_ = true;
674 } 668 }
675 } 669 }
676 } 670 }
677 } 671 }
678 672
679 void LayerAnimationController::PromoteStartedAnimations( 673 void LayerAnimationController::PromoteStartedAnimations(
680 double monotonic_time, 674 base::TimeTicks monotonic_time,
681 AnimationEventsVector* events) { 675 AnimationEventsVector* events) {
682 for (size_t i = 0; i < animations_.size(); ++i) { 676 for (size_t i = 0; i < animations_.size(); ++i) {
683 if (animations_[i]->run_state() == Animation::Starting && 677 if (animations_[i]->run_state() == Animation::Starting &&
684 animations_[i]->affects_active_observers()) { 678 animations_[i]->affects_active_observers()) {
685 animations_[i]->SetRunState(Animation::Running, monotonic_time); 679 animations_[i]->SetRunState(Animation::Running, monotonic_time);
686 if (!animations_[i]->has_set_start_time() && 680 if (!animations_[i]->has_set_start_time() &&
687 !animations_[i]->needs_synchronized_start_time()) 681 !animations_[i]->needs_synchronized_start_time())
688 animations_[i]->set_start_time(monotonic_time); 682 animations_[i]->set_start_time(monotonic_time);
689 if (events) { 683 if (events) {
690 AnimationEvent started_event(AnimationEvent::Started, 684 AnimationEvent started_event(AnimationEvent::Started,
691 id_, 685 id_,
692 animations_[i]->group(), 686 animations_[i]->group(),
693 animations_[i]->target_property(), 687 animations_[i]->target_property(),
694 monotonic_time); 688 monotonic_time);
695 started_event.is_impl_only = animations_[i]->is_impl_only(); 689 started_event.is_impl_only = animations_[i]->is_impl_only();
696 events->push_back(started_event); 690 events->push_back(started_event);
697 } 691 }
698 } 692 }
699 } 693 }
700 } 694 }
701 695
702 void LayerAnimationController::MarkFinishedAnimations(double monotonic_time) { 696 void LayerAnimationController::MarkFinishedAnimations(
697 base::TimeTicks monotonic_time) {
703 for (size_t i = 0; i < animations_.size(); ++i) { 698 for (size_t i = 0; i < animations_.size(); ++i) {
704 if (animations_[i]->IsFinishedAt(monotonic_time) && 699 if (animations_[i]->IsFinishedAt(monotonic_time) &&
705 animations_[i]->run_state() != Animation::Aborted && 700 animations_[i]->run_state() != Animation::Aborted &&
706 animations_[i]->run_state() != Animation::WaitingForDeletion) 701 animations_[i]->run_state() != Animation::WaitingForDeletion)
707 animations_[i]->SetRunState(Animation::Finished, monotonic_time); 702 animations_[i]->SetRunState(Animation::Finished, monotonic_time);
708 } 703 }
709 } 704 }
710 705
711 void LayerAnimationController::MarkAnimationsForDeletion( 706 void LayerAnimationController::MarkAnimationsForDeletion(
712 double monotonic_time, AnimationEventsVector* events) { 707 base::TimeTicks monotonic_time,
708 AnimationEventsVector* events) {
713 bool marked_animations_for_deletions = false; 709 bool marked_animations_for_deletions = false;
714 710
715 // Non-aborted animations are marked for deletion after a corresponding 711 // Non-aborted animations are marked for deletion after a corresponding
716 // AnimationEvent::Finished event is sent or received. This means that if 712 // AnimationEvent::Finished event is sent or received. This means that if
717 // we don't have an events vector, we must ensure that non-aborted animations 713 // we don't have an events vector, we must ensure that non-aborted animations
718 // have received a finished event before marking them for deletion. 714 // have received a finished event before marking them for deletion.
719 for (size_t i = 0; i < animations_.size(); i++) { 715 for (size_t i = 0; i < animations_.size(); i++) {
720 int group_id = animations_[i]->group(); 716 int group_id = animations_[i]->group();
721 if (animations_[i]->run_state() == Animation::Aborted) { 717 if (animations_[i]->run_state() == Animation::Aborted) {
722 if (events && !animations_[i]->is_impl_only()) { 718 if (events && !animations_[i]->is_impl_only()) {
(...skipping 66 matching lines...) Expand 10 before | Expand all | Expand 10 after
789 } 785 }
790 786
791 void LayerAnimationController::PurgeAnimationsMarkedForDeletion() { 787 void LayerAnimationController::PurgeAnimationsMarkedForDeletion() {
792 animations_.erase(cc::remove_if(&animations_, 788 animations_.erase(cc::remove_if(&animations_,
793 animations_.begin(), 789 animations_.begin(),
794 animations_.end(), 790 animations_.end(),
795 IsWaitingForDeletion), 791 IsWaitingForDeletion),
796 animations_.end()); 792 animations_.end());
797 } 793 }
798 794
799 void LayerAnimationController::TickAnimations(double monotonic_time) { 795 void LayerAnimationController::TickAnimations(base::TimeTicks monotonic_time) {
800 for (size_t i = 0; i < animations_.size(); ++i) { 796 for (size_t i = 0; i < animations_.size(); ++i) {
801 if (animations_[i]->run_state() == Animation::Starting || 797 if (animations_[i]->run_state() == Animation::Starting ||
802 animations_[i]->run_state() == Animation::Running || 798 animations_[i]->run_state() == Animation::Running ||
803 animations_[i]->run_state() == Animation::Paused) { 799 animations_[i]->run_state() == Animation::Paused) {
804 double trimmed = 800 double trimmed =
805 animations_[i]->TrimTimeToCurrentIteration(monotonic_time); 801 animations_[i]->TrimTimeToCurrentIteration(monotonic_time);
806 802
807 switch (animations_[i]->target_property()) { 803 switch (animations_[i]->target_property()) {
808 case Animation::Transform: { 804 case Animation::Transform: {
809 const TransformAnimationCurve* transform_animation_curve = 805 const TransformAnimationCurve* transform_animation_curve =
(...skipping 159 matching lines...) Expand 10 before | Expand all | Expand 10 after
969 value_observers_); 965 value_observers_);
970 LayerAnimationValueObserver* obs; 966 LayerAnimationValueObserver* obs;
971 while ((obs = it.GetNext()) != NULL) 967 while ((obs = it.GetNext()) != NULL)
972 if (obs->IsActive()) 968 if (obs->IsActive())
973 return true; 969 return true;
974 } 970 }
975 return false; 971 return false;
976 } 972 }
977 973
978 } // namespace cc 974 } // namespace cc
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698