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 #include <vector> | 8 #include <vector> |
9 | 9 |
10 #include "cc/animation/animation.h" | 10 #include "cc/animation/animation.h" |
(...skipping 27 matching lines...) Expand all Loading... |
38 | 38 |
39 scoped_refptr<LayerAnimationController> LayerAnimationController::Create( | 39 scoped_refptr<LayerAnimationController> LayerAnimationController::Create( |
40 int id) { | 40 int id) { |
41 return make_scoped_refptr(new LayerAnimationController(id)); | 41 return make_scoped_refptr(new LayerAnimationController(id)); |
42 } | 42 } |
43 | 43 |
44 void LayerAnimationController::PauseAnimation(int animation_id, | 44 void LayerAnimationController::PauseAnimation(int animation_id, |
45 base::TimeDelta time_offset) { | 45 base::TimeDelta time_offset) { |
46 for (size_t i = 0; i < animations_.size(); ++i) { | 46 for (size_t i = 0; i < animations_.size(); ++i) { |
47 if (animations_[i]->id() == animation_id) { | 47 if (animations_[i]->id() == animation_id) { |
48 animations_[i]->SetRunState(Animation::Paused, | 48 animations_[i]->SetRunState(Animation::PAUSED, |
49 time_offset + animations_[i]->start_time()); | 49 time_offset + animations_[i]->start_time()); |
50 } | 50 } |
51 } | 51 } |
52 } | 52 } |
53 | 53 |
54 struct HasAnimationId { | 54 struct HasAnimationId { |
55 explicit HasAnimationId(int id) : id_(id) {} | 55 explicit HasAnimationId(int id) : id_(id) {} |
56 bool operator()(Animation* animation) const { | 56 bool operator()(Animation* animation) const { |
57 return animation->id() == id_; | 57 return animation->id() == id_; |
58 } | 58 } |
59 | 59 |
60 private: | 60 private: |
61 int id_; | 61 int id_; |
62 }; | 62 }; |
63 | 63 |
64 void LayerAnimationController::RemoveAnimation(int animation_id) { | 64 void LayerAnimationController::RemoveAnimation(int animation_id) { |
65 auto animations_to_remove = | 65 auto animations_to_remove = |
66 animations_.remove_if(HasAnimationId(animation_id)); | 66 animations_.remove_if(HasAnimationId(animation_id)); |
67 for (auto it = animations_to_remove; it != animations_.end(); ++it) { | 67 for (auto it = animations_to_remove; it != animations_.end(); ++it) { |
68 if ((*it)->target_property() == Animation::ScrollOffset) { | 68 if ((*it)->target_property() == Animation::SCROLL_OFFSET) { |
69 scroll_offset_animation_was_interrupted_ = true; | 69 scroll_offset_animation_was_interrupted_ = true; |
70 break; | 70 break; |
71 } | 71 } |
72 } | 72 } |
73 animations_.erase(animations_to_remove, animations_.end()); | 73 animations_.erase(animations_to_remove, animations_.end()); |
74 UpdateActivation(NormalActivation); | 74 UpdateActivation(NORMAL_ACTIVATION); |
75 } | 75 } |
76 | 76 |
77 struct HasAnimationIdAndProperty { | 77 struct HasAnimationIdAndProperty { |
78 HasAnimationIdAndProperty(int id, Animation::TargetProperty target_property) | 78 HasAnimationIdAndProperty(int id, Animation::TargetProperty target_property) |
79 : id_(id), target_property_(target_property) {} | 79 : id_(id), target_property_(target_property) {} |
80 bool operator()(Animation* animation) const { | 80 bool operator()(Animation* animation) const { |
81 return animation->id() == id_ && | 81 return animation->id() == id_ && |
82 animation->target_property() == target_property_; | 82 animation->target_property() == target_property_; |
83 } | 83 } |
84 | 84 |
85 private: | 85 private: |
86 int id_; | 86 int id_; |
87 Animation::TargetProperty target_property_; | 87 Animation::TargetProperty target_property_; |
88 }; | 88 }; |
89 | 89 |
90 void LayerAnimationController::RemoveAnimation( | 90 void LayerAnimationController::RemoveAnimation( |
91 int animation_id, | 91 int animation_id, |
92 Animation::TargetProperty target_property) { | 92 Animation::TargetProperty target_property) { |
93 auto animations_to_remove = animations_.remove_if( | 93 auto animations_to_remove = animations_.remove_if( |
94 HasAnimationIdAndProperty(animation_id, target_property)); | 94 HasAnimationIdAndProperty(animation_id, target_property)); |
95 if (target_property == Animation::ScrollOffset && | 95 if (target_property == Animation::SCROLL_OFFSET && |
96 animations_to_remove != animations_.end()) | 96 animations_to_remove != animations_.end()) |
97 scroll_offset_animation_was_interrupted_ = true; | 97 scroll_offset_animation_was_interrupted_ = true; |
98 | 98 |
99 animations_.erase(animations_to_remove, animations_.end()); | 99 animations_.erase(animations_to_remove, animations_.end()); |
100 UpdateActivation(NormalActivation); | 100 UpdateActivation(NORMAL_ACTIVATION); |
101 } | 101 } |
102 | 102 |
103 void LayerAnimationController::AbortAnimations( | 103 void LayerAnimationController::AbortAnimations( |
104 Animation::TargetProperty target_property) { | 104 Animation::TargetProperty target_property) { |
105 for (size_t i = 0; i < animations_.size(); ++i) { | 105 for (size_t i = 0; i < animations_.size(); ++i) { |
106 if (animations_[i]->target_property() == target_property && | 106 if (animations_[i]->target_property() == target_property && |
107 !animations_[i]->is_finished()) | 107 !animations_[i]->is_finished()) |
108 animations_[i]->SetRunState(Animation::Aborted, last_tick_time_); | 108 animations_[i]->SetRunState(Animation::ABORTED, last_tick_time_); |
109 } | 109 } |
110 } | 110 } |
111 | 111 |
112 // Ensures that the list of active animations on the main thread and the impl | 112 // Ensures that the list of active animations on the main thread and the impl |
113 // thread are kept in sync. | 113 // thread are kept in sync. |
114 void LayerAnimationController::PushAnimationUpdatesTo( | 114 void LayerAnimationController::PushAnimationUpdatesTo( |
115 LayerAnimationController* controller_impl) { | 115 LayerAnimationController* controller_impl) { |
116 DCHECK(this != controller_impl); | 116 DCHECK(this != controller_impl); |
117 if (!has_any_animation() && !controller_impl->has_any_animation()) | 117 if (!has_any_animation() && !controller_impl->has_any_animation()) |
118 return; | 118 return; |
119 PurgeAnimationsMarkedForDeletion(); | 119 PurgeAnimationsMarkedForDeletion(); |
120 PushNewAnimationsToImplThread(controller_impl); | 120 PushNewAnimationsToImplThread(controller_impl); |
121 | 121 |
122 // Remove finished impl side animations only after pushing, | 122 // Remove finished impl side animations only after pushing, |
123 // and only after the animations are deleted on the main thread | 123 // and only after the animations are deleted on the main thread |
124 // this insures we will never push an animation twice. | 124 // this insures we will never push an animation twice. |
125 RemoveAnimationsCompletedOnMainThread(controller_impl); | 125 RemoveAnimationsCompletedOnMainThread(controller_impl); |
126 | 126 |
127 PushPropertiesToImplThread(controller_impl); | 127 PushPropertiesToImplThread(controller_impl); |
128 controller_impl->UpdateActivation(NormalActivation); | 128 controller_impl->UpdateActivation(NORMAL_ACTIVATION); |
129 UpdateActivation(NormalActivation); | 129 UpdateActivation(NORMAL_ACTIVATION); |
130 } | 130 } |
131 | 131 |
132 void LayerAnimationController::Animate(base::TimeTicks monotonic_time) { | 132 void LayerAnimationController::Animate(base::TimeTicks monotonic_time) { |
133 DCHECK(!monotonic_time.is_null()); | 133 DCHECK(!monotonic_time.is_null()); |
134 if (!HasValueObserver()) | 134 if (!HasValueObserver()) |
135 return; | 135 return; |
136 | 136 |
137 if (needs_to_start_animations_) | 137 if (needs_to_start_animations_) |
138 StartAnimations(monotonic_time); | 138 StartAnimations(monotonic_time); |
139 TickAnimations(monotonic_time); | 139 TickAnimations(monotonic_time); |
(...skipping 10 matching lines...) Expand all Loading... |
150 Animation* animation = animations_[i]; | 150 Animation* animation = animations_[i]; |
151 if (!animation->is_impl_only()) | 151 if (!animation->is_impl_only()) |
152 continue; | 152 continue; |
153 | 153 |
154 if (!animation->InEffect(monotonic_time)) | 154 if (!animation->InEffect(monotonic_time)) |
155 continue; | 155 continue; |
156 | 156 |
157 base::TimeDelta trimmed = | 157 base::TimeDelta trimmed = |
158 animation->TrimTimeToCurrentIteration(monotonic_time); | 158 animation->TrimTimeToCurrentIteration(monotonic_time); |
159 switch (animation->target_property()) { | 159 switch (animation->target_property()) { |
160 case Animation::Opacity: { | 160 case Animation::OPACITY: { |
161 AnimationEvent event(AnimationEvent::PropertyUpdate, | 161 AnimationEvent event(AnimationEvent::PROPERTY_UPDATE, id_, |
162 id_, | 162 animation->group(), Animation::OPACITY, |
163 animation->group(), | |
164 Animation::Opacity, | |
165 monotonic_time); | 163 monotonic_time); |
166 const FloatAnimationCurve* float_animation_curve = | 164 const FloatAnimationCurve* float_animation_curve = |
167 animation->curve()->ToFloatAnimationCurve(); | 165 animation->curve()->ToFloatAnimationCurve(); |
168 event.opacity = float_animation_curve->GetValue(trimmed); | 166 event.opacity = float_animation_curve->GetValue(trimmed); |
169 event.is_impl_only = true; | 167 event.is_impl_only = true; |
170 events->push_back(event); | 168 events->push_back(event); |
171 break; | 169 break; |
172 } | 170 } |
173 | 171 |
174 case Animation::Transform: { | 172 case Animation::TRANSFORM: { |
175 AnimationEvent event(AnimationEvent::PropertyUpdate, | 173 AnimationEvent event(AnimationEvent::PROPERTY_UPDATE, id_, |
176 id_, | 174 animation->group(), Animation::TRANSFORM, |
177 animation->group(), | |
178 Animation::Transform, | |
179 monotonic_time); | 175 monotonic_time); |
180 const TransformAnimationCurve* transform_animation_curve = | 176 const TransformAnimationCurve* transform_animation_curve = |
181 animation->curve()->ToTransformAnimationCurve(); | 177 animation->curve()->ToTransformAnimationCurve(); |
182 event.transform = transform_animation_curve->GetValue(trimmed); | 178 event.transform = transform_animation_curve->GetValue(trimmed); |
183 event.is_impl_only = true; | 179 event.is_impl_only = true; |
184 events->push_back(event); | 180 events->push_back(event); |
185 break; | 181 break; |
186 } | 182 } |
187 | 183 |
188 case Animation::Filter: { | 184 case Animation::FILTER: { |
189 AnimationEvent event(AnimationEvent::PropertyUpdate, | 185 AnimationEvent event(AnimationEvent::PROPERTY_UPDATE, id_, |
190 id_, | 186 animation->group(), Animation::FILTER, |
191 animation->group(), | |
192 Animation::Filter, | |
193 monotonic_time); | 187 monotonic_time); |
194 const FilterAnimationCurve* filter_animation_curve = | 188 const FilterAnimationCurve* filter_animation_curve = |
195 animation->curve()->ToFilterAnimationCurve(); | 189 animation->curve()->ToFilterAnimationCurve(); |
196 event.filters = filter_animation_curve->GetValue(trimmed); | 190 event.filters = filter_animation_curve->GetValue(trimmed); |
197 event.is_impl_only = true; | 191 event.is_impl_only = true; |
198 events->push_back(event); | 192 events->push_back(event); |
199 break; | 193 break; |
200 } | 194 } |
201 | 195 |
202 case Animation::BackgroundColor: { break; } | 196 case Animation::BACKGROUND_COLOR: { |
| 197 break; |
| 198 } |
203 | 199 |
204 case Animation::ScrollOffset: { | 200 case Animation::SCROLL_OFFSET: { |
205 // Impl-side changes to scroll offset are already sent back to the | 201 // Impl-side changes to scroll offset are already sent back to the |
206 // main thread (e.g. for user-driven scrolling), so a PropertyUpdate | 202 // main thread (e.g. for user-driven scrolling), so a PROPERTY_UPDATE |
207 // isn't needed. | 203 // isn't needed. |
208 break; | 204 break; |
209 } | 205 } |
210 | |
211 case Animation::TargetPropertyEnumSize: | |
212 NOTREACHED(); | |
213 } | 206 } |
214 } | 207 } |
215 } | 208 } |
216 | 209 |
217 void LayerAnimationController::UpdateState(bool start_ready_animations, | 210 void LayerAnimationController::UpdateState(bool start_ready_animations, |
218 AnimationEventsVector* events) { | 211 AnimationEventsVector* events) { |
219 if (!HasActiveValueObserver()) | 212 if (!HasActiveValueObserver()) |
220 return; | 213 return; |
221 | 214 |
222 // Animate hasn't been called, this happens if an observer has been added | 215 // Animate hasn't been called, this happens if an observer has been added |
223 // between the Commit and Draw phases. | 216 // between the Commit and Draw phases. |
224 if (last_tick_time_ == base::TimeTicks()) | 217 if (last_tick_time_ == base::TimeTicks()) |
225 return; | 218 return; |
226 | 219 |
227 if (start_ready_animations) | 220 if (start_ready_animations) |
228 PromoteStartedAnimations(last_tick_time_, events); | 221 PromoteStartedAnimations(last_tick_time_, events); |
229 | 222 |
230 MarkFinishedAnimations(last_tick_time_); | 223 MarkFinishedAnimations(last_tick_time_); |
231 MarkAnimationsForDeletion(last_tick_time_, events); | 224 MarkAnimationsForDeletion(last_tick_time_, events); |
232 | 225 |
233 if (needs_to_start_animations_ && start_ready_animations) { | 226 if (needs_to_start_animations_ && start_ready_animations) { |
234 StartAnimations(last_tick_time_); | 227 StartAnimations(last_tick_time_); |
235 PromoteStartedAnimations(last_tick_time_, events); | 228 PromoteStartedAnimations(last_tick_time_, events); |
236 } | 229 } |
237 | 230 |
238 AccumulatePropertyUpdates(last_tick_time_, events); | 231 AccumulatePropertyUpdates(last_tick_time_, events); |
239 | 232 |
240 UpdateActivation(NormalActivation); | 233 UpdateActivation(NORMAL_ACTIVATION); |
241 } | 234 } |
242 | 235 |
243 struct AffectsNoObservers { | 236 struct AffectsNoObservers { |
244 bool operator()(Animation* animation) const { | 237 bool operator()(Animation* animation) const { |
245 return !animation->affects_active_observers() && | 238 return !animation->affects_active_observers() && |
246 !animation->affects_pending_observers(); | 239 !animation->affects_pending_observers(); |
247 } | 240 } |
248 }; | 241 }; |
249 | 242 |
250 void LayerAnimationController::ActivateAnimations() { | 243 void LayerAnimationController::ActivateAnimations() { |
251 for (size_t i = 0; i < animations_.size(); ++i) { | 244 for (size_t i = 0; i < animations_.size(); ++i) { |
252 animations_[i]->set_affects_active_observers( | 245 animations_[i]->set_affects_active_observers( |
253 animations_[i]->affects_pending_observers()); | 246 animations_[i]->affects_pending_observers()); |
254 } | 247 } |
255 animations_.erase(cc::remove_if(&animations_, | 248 animations_.erase(cc::remove_if(&animations_, |
256 animations_.begin(), | 249 animations_.begin(), |
257 animations_.end(), | 250 animations_.end(), |
258 AffectsNoObservers()), | 251 AffectsNoObservers()), |
259 animations_.end()); | 252 animations_.end()); |
260 scroll_offset_animation_was_interrupted_ = false; | 253 scroll_offset_animation_was_interrupted_ = false; |
261 UpdateActivation(NormalActivation); | 254 UpdateActivation(NORMAL_ACTIVATION); |
262 } | 255 } |
263 | 256 |
264 void LayerAnimationController::AddAnimation(scoped_ptr<Animation> animation) { | 257 void LayerAnimationController::AddAnimation(scoped_ptr<Animation> animation) { |
265 animations_.push_back(animation.Pass()); | 258 animations_.push_back(animation.Pass()); |
266 needs_to_start_animations_ = true; | 259 needs_to_start_animations_ = true; |
267 UpdateActivation(NormalActivation); | 260 UpdateActivation(NORMAL_ACTIVATION); |
268 } | 261 } |
269 | 262 |
270 Animation* LayerAnimationController::GetAnimation( | 263 Animation* LayerAnimationController::GetAnimation( |
271 Animation::TargetProperty target_property) const { | 264 Animation::TargetProperty target_property) const { |
272 for (size_t i = 0; i < animations_.size(); ++i) { | 265 for (size_t i = 0; i < animations_.size(); ++i) { |
273 size_t index = animations_.size() - i - 1; | 266 size_t index = animations_.size() - i - 1; |
274 if (animations_[index]->target_property() == target_property) | 267 if (animations_[index]->target_property() == target_property) |
275 return animations_[index]; | 268 return animations_[index]; |
276 } | 269 } |
277 return 0; | 270 return 0; |
(...skipping 30 matching lines...) Expand all Loading... |
308 if (registrar_ == registrar) | 301 if (registrar_ == registrar) |
309 return; | 302 return; |
310 | 303 |
311 if (registrar_) | 304 if (registrar_) |
312 registrar_->UnregisterAnimationController(this); | 305 registrar_->UnregisterAnimationController(this); |
313 | 306 |
314 registrar_ = registrar; | 307 registrar_ = registrar; |
315 if (registrar_) | 308 if (registrar_) |
316 registrar_->RegisterAnimationController(this); | 309 registrar_->RegisterAnimationController(this); |
317 | 310 |
318 UpdateActivation(ForceActivation); | 311 UpdateActivation(FORCE_ACTIVATION); |
319 } | 312 } |
320 | 313 |
321 void LayerAnimationController::NotifyAnimationStarted( | 314 void LayerAnimationController::NotifyAnimationStarted( |
322 const AnimationEvent& event) { | 315 const AnimationEvent& event) { |
323 if (event.is_impl_only) { | 316 if (event.is_impl_only) { |
324 FOR_EACH_OBSERVER(LayerAnimationEventObserver, event_observers_, | 317 FOR_EACH_OBSERVER(LayerAnimationEventObserver, event_observers_, |
325 OnAnimationStarted(event)); | 318 OnAnimationStarted(event)); |
326 if (layer_animation_delegate_) | 319 if (layer_animation_delegate_) |
327 layer_animation_delegate_->NotifyAnimationStarted( | 320 layer_animation_delegate_->NotifyAnimationStarted( |
328 event.monotonic_time, event.target_property, event.group_id); | 321 event.monotonic_time, event.target_property, event.group_id); |
(...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
368 return; | 361 return; |
369 } | 362 } |
370 } | 363 } |
371 } | 364 } |
372 | 365 |
373 void LayerAnimationController::NotifyAnimationAborted( | 366 void LayerAnimationController::NotifyAnimationAborted( |
374 const AnimationEvent& event) { | 367 const AnimationEvent& event) { |
375 for (size_t i = 0; i < animations_.size(); ++i) { | 368 for (size_t i = 0; i < animations_.size(); ++i) { |
376 if (animations_[i]->group() == event.group_id && | 369 if (animations_[i]->group() == event.group_id && |
377 animations_[i]->target_property() == event.target_property) { | 370 animations_[i]->target_property() == event.target_property) { |
378 animations_[i]->SetRunState(Animation::Aborted, event.monotonic_time); | 371 animations_[i]->SetRunState(Animation::ABORTED, event.monotonic_time); |
379 } | 372 } |
380 } | 373 } |
381 } | 374 } |
382 | 375 |
383 void LayerAnimationController::NotifyAnimationPropertyUpdate( | 376 void LayerAnimationController::NotifyAnimationPropertyUpdate( |
384 const AnimationEvent& event) { | 377 const AnimationEvent& event) { |
385 bool notify_active_observers = true; | 378 bool notify_active_observers = true; |
386 bool notify_pending_observers = true; | 379 bool notify_pending_observers = true; |
387 switch (event.target_property) { | 380 switch (event.target_property) { |
388 case Animation::Opacity: | 381 case Animation::OPACITY: |
389 NotifyObserversOpacityAnimated( | 382 NotifyObserversOpacityAnimated( |
390 event.opacity, notify_active_observers, notify_pending_observers); | 383 event.opacity, notify_active_observers, notify_pending_observers); |
391 break; | 384 break; |
392 case Animation::Transform: | 385 case Animation::TRANSFORM: |
393 NotifyObserversTransformAnimated( | 386 NotifyObserversTransformAnimated( |
394 event.transform, notify_active_observers, notify_pending_observers); | 387 event.transform, notify_active_observers, notify_pending_observers); |
395 break; | 388 break; |
396 default: | 389 default: |
397 NOTREACHED(); | 390 NOTREACHED(); |
398 } | 391 } |
399 } | 392 } |
400 | 393 |
401 void LayerAnimationController::AddValueObserver( | 394 void LayerAnimationController::AddValueObserver( |
402 LayerAnimationValueObserver* observer) { | 395 LayerAnimationValueObserver* observer) { |
(...skipping 13 matching lines...) Expand all Loading... |
416 } | 409 } |
417 | 410 |
418 void LayerAnimationController::RemoveEventObserver( | 411 void LayerAnimationController::RemoveEventObserver( |
419 LayerAnimationEventObserver* observer) { | 412 LayerAnimationEventObserver* observer) { |
420 event_observers_.RemoveObserver(observer); | 413 event_observers_.RemoveObserver(observer); |
421 } | 414 } |
422 | 415 |
423 bool LayerAnimationController::HasFilterAnimationThatInflatesBounds() const { | 416 bool LayerAnimationController::HasFilterAnimationThatInflatesBounds() const { |
424 for (size_t i = 0; i < animations_.size(); ++i) { | 417 for (size_t i = 0; i < animations_.size(); ++i) { |
425 if (!animations_[i]->is_finished() && | 418 if (!animations_[i]->is_finished() && |
426 animations_[i]->target_property() == Animation::Filter && | 419 animations_[i]->target_property() == Animation::FILTER && |
427 animations_[i] | 420 animations_[i] |
428 ->curve() | 421 ->curve() |
429 ->ToFilterAnimationCurve() | 422 ->ToFilterAnimationCurve() |
430 ->HasFilterThatMovesPixels()) | 423 ->HasFilterThatMovesPixels()) |
431 return true; | 424 return true; |
432 } | 425 } |
433 | 426 |
434 return false; | 427 return false; |
435 } | 428 } |
436 | 429 |
437 bool LayerAnimationController::HasTransformAnimationThatInflatesBounds() const { | 430 bool LayerAnimationController::HasTransformAnimationThatInflatesBounds() const { |
438 return IsAnimatingProperty(Animation::Transform); | 431 return IsAnimatingProperty(Animation::TRANSFORM); |
439 } | 432 } |
440 | 433 |
441 bool LayerAnimationController::FilterAnimationBoundsForBox( | 434 bool LayerAnimationController::FilterAnimationBoundsForBox( |
442 const gfx::BoxF& box, gfx::BoxF* bounds) const { | 435 const gfx::BoxF& box, gfx::BoxF* bounds) const { |
443 // TODO(avallee): Implement. | 436 // TODO(avallee): Implement. |
444 return false; | 437 return false; |
445 } | 438 } |
446 | 439 |
447 bool LayerAnimationController::TransformAnimationBoundsForBox( | 440 bool LayerAnimationController::TransformAnimationBoundsForBox( |
448 const gfx::BoxF& box, | 441 const gfx::BoxF& box, |
449 gfx::BoxF* bounds) const { | 442 gfx::BoxF* bounds) const { |
450 DCHECK(HasTransformAnimationThatInflatesBounds()) | 443 DCHECK(HasTransformAnimationThatInflatesBounds()) |
451 << "TransformAnimationBoundsForBox will give incorrect results if there " | 444 << "TransformAnimationBoundsForBox will give incorrect results if there " |
452 << "are no transform animations affecting bounds, non-animated transform " | 445 << "are no transform animations affecting bounds, non-animated transform " |
453 << "is not known"; | 446 << "is not known"; |
454 | 447 |
455 // Compute bounds based on animations for which is_finished() is false. | 448 // Compute bounds based on animations for which is_finished() is false. |
456 // Do nothing if there are no such animations; in this case, it is assumed | 449 // Do nothing if there are no such animations; in this case, it is assumed |
457 // that callers will take care of computing bounds based on the owning layer's | 450 // that callers will take care of computing bounds based on the owning layer's |
458 // actual transform. | 451 // actual transform. |
459 *bounds = gfx::BoxF(); | 452 *bounds = gfx::BoxF(); |
460 for (size_t i = 0; i < animations_.size(); ++i) { | 453 for (size_t i = 0; i < animations_.size(); ++i) { |
461 if (animations_[i]->is_finished() || | 454 if (animations_[i]->is_finished() || |
462 animations_[i]->target_property() != Animation::Transform) | 455 animations_[i]->target_property() != Animation::TRANSFORM) |
463 continue; | 456 continue; |
464 | 457 |
465 const TransformAnimationCurve* transform_animation_curve = | 458 const TransformAnimationCurve* transform_animation_curve = |
466 animations_[i]->curve()->ToTransformAnimationCurve(); | 459 animations_[i]->curve()->ToTransformAnimationCurve(); |
467 gfx::BoxF animation_bounds; | 460 gfx::BoxF animation_bounds; |
468 bool success = | 461 bool success = |
469 transform_animation_curve->AnimatedBoundsForBox(box, &animation_bounds); | 462 transform_animation_curve->AnimatedBoundsForBox(box, &animation_bounds); |
470 if (!success) | 463 if (!success) |
471 return false; | 464 return false; |
472 bounds->Union(animation_bounds); | 465 bounds->Union(animation_bounds); |
473 } | 466 } |
474 | 467 |
475 return true; | 468 return true; |
476 } | 469 } |
477 | 470 |
478 bool LayerAnimationController::HasAnimationThatAffectsScale() const { | 471 bool LayerAnimationController::HasAnimationThatAffectsScale() const { |
479 for (size_t i = 0; i < animations_.size(); ++i) { | 472 for (size_t i = 0; i < animations_.size(); ++i) { |
480 if (animations_[i]->is_finished() || | 473 if (animations_[i]->is_finished() || |
481 animations_[i]->target_property() != Animation::Transform) | 474 animations_[i]->target_property() != Animation::TRANSFORM) |
482 continue; | 475 continue; |
483 | 476 |
484 const TransformAnimationCurve* transform_animation_curve = | 477 const TransformAnimationCurve* transform_animation_curve = |
485 animations_[i]->curve()->ToTransformAnimationCurve(); | 478 animations_[i]->curve()->ToTransformAnimationCurve(); |
486 if (transform_animation_curve->AffectsScale()) | 479 if (transform_animation_curve->AffectsScale()) |
487 return true; | 480 return true; |
488 } | 481 } |
489 | 482 |
490 return false; | 483 return false; |
491 } | 484 } |
492 | 485 |
493 bool LayerAnimationController::HasOnlyTranslationTransforms() const { | 486 bool LayerAnimationController::HasOnlyTranslationTransforms() const { |
494 for (size_t i = 0; i < animations_.size(); ++i) { | 487 for (size_t i = 0; i < animations_.size(); ++i) { |
495 if (animations_[i]->is_finished() || | 488 if (animations_[i]->is_finished() || |
496 animations_[i]->target_property() != Animation::Transform) | 489 animations_[i]->target_property() != Animation::TRANSFORM) |
497 continue; | 490 continue; |
498 | 491 |
499 const TransformAnimationCurve* transform_animation_curve = | 492 const TransformAnimationCurve* transform_animation_curve = |
500 animations_[i]->curve()->ToTransformAnimationCurve(); | 493 animations_[i]->curve()->ToTransformAnimationCurve(); |
501 if (!transform_animation_curve->IsTranslation()) | 494 if (!transform_animation_curve->IsTranslation()) |
502 return false; | 495 return false; |
503 } | 496 } |
504 | 497 |
505 return true; | 498 return true; |
506 } | 499 } |
507 | 500 |
508 bool LayerAnimationController::AnimationsPreserveAxisAlignment() const { | 501 bool LayerAnimationController::AnimationsPreserveAxisAlignment() const { |
509 for (size_t i = 0; i < animations_.size(); ++i) { | 502 for (size_t i = 0; i < animations_.size(); ++i) { |
510 if (animations_[i]->is_finished() || | 503 if (animations_[i]->is_finished() || |
511 animations_[i]->target_property() != Animation::Transform) | 504 animations_[i]->target_property() != Animation::TRANSFORM) |
512 continue; | 505 continue; |
513 | 506 |
514 const TransformAnimationCurve* transform_animation_curve = | 507 const TransformAnimationCurve* transform_animation_curve = |
515 animations_[i]->curve()->ToTransformAnimationCurve(); | 508 animations_[i]->curve()->ToTransformAnimationCurve(); |
516 if (!transform_animation_curve->PreservesAxisAlignment()) | 509 if (!transform_animation_curve->PreservesAxisAlignment()) |
517 return false; | 510 return false; |
518 } | 511 } |
519 | 512 |
520 return true; | 513 return true; |
521 } | 514 } |
522 | 515 |
523 bool LayerAnimationController::MaximumTargetScale(float* max_scale) const { | 516 bool LayerAnimationController::MaximumTargetScale(float* max_scale) const { |
524 *max_scale = 0.f; | 517 *max_scale = 0.f; |
525 for (size_t i = 0; i < animations_.size(); ++i) { | 518 for (size_t i = 0; i < animations_.size(); ++i) { |
526 if (animations_[i]->is_finished() || | 519 if (animations_[i]->is_finished() || |
527 animations_[i]->target_property() != Animation::Transform) | 520 animations_[i]->target_property() != Animation::TRANSFORM) |
528 continue; | 521 continue; |
529 | 522 |
530 bool forward_direction = true; | 523 bool forward_direction = true; |
531 switch (animations_[i]->direction()) { | 524 switch (animations_[i]->direction()) { |
532 case Animation::Normal: | 525 case Animation::DIRECTION_NORMAL: |
533 case Animation::Alternate: | 526 case Animation::DIRECTION_ALTERNATE: |
534 forward_direction = animations_[i]->playback_rate() >= 0.0; | 527 forward_direction = animations_[i]->playback_rate() >= 0.0; |
535 break; | 528 break; |
536 case Animation::Reverse: | 529 case Animation::DIRECTION_REVERSE: |
537 case Animation::AlternateReverse: | 530 case Animation::DIRECTION_ALTERNATE_REVERSE: |
538 forward_direction = animations_[i]->playback_rate() < 0.0; | 531 forward_direction = animations_[i]->playback_rate() < 0.0; |
539 break; | 532 break; |
540 } | 533 } |
541 | 534 |
542 const TransformAnimationCurve* transform_animation_curve = | 535 const TransformAnimationCurve* transform_animation_curve = |
543 animations_[i]->curve()->ToTransformAnimationCurve(); | 536 animations_[i]->curve()->ToTransformAnimationCurve(); |
544 float animation_scale = 0.f; | 537 float animation_scale = 0.f; |
545 if (!transform_animation_curve->MaximumTargetScale(forward_direction, | 538 if (!transform_animation_curve->MaximumTargetScale(forward_direction, |
546 &animation_scale)) | 539 &animation_scale)) |
547 return false; | 540 return false; |
(...skipping 16 matching lines...) Expand all Loading... |
564 // If the animation is not running on the impl thread, it does not | 557 // If the animation is not running on the impl thread, it does not |
565 // necessarily mean that it needs to be copied over and started; it may | 558 // necessarily mean that it needs to be copied over and started; it may |
566 // have already finished. In this case, the impl thread animation will | 559 // have already finished. In this case, the impl thread animation will |
567 // have already notified that it has started and the main thread animation | 560 // have already notified that it has started and the main thread animation |
568 // will no longer need | 561 // will no longer need |
569 // a synchronized start time. | 562 // a synchronized start time. |
570 if (!animations_[i]->needs_synchronized_start_time()) | 563 if (!animations_[i]->needs_synchronized_start_time()) |
571 continue; | 564 continue; |
572 | 565 |
573 // Scroll animations always start at the current scroll offset. | 566 // Scroll animations always start at the current scroll offset. |
574 if (animations_[i]->target_property() == Animation::ScrollOffset) { | 567 if (animations_[i]->target_property() == Animation::SCROLL_OFFSET) { |
575 gfx::ScrollOffset current_scroll_offset; | 568 gfx::ScrollOffset current_scroll_offset; |
576 if (controller_impl->value_provider_) { | 569 if (controller_impl->value_provider_) { |
577 current_scroll_offset = | 570 current_scroll_offset = |
578 controller_impl->value_provider_->ScrollOffsetForAnimation(); | 571 controller_impl->value_provider_->ScrollOffsetForAnimation(); |
579 } else { | 572 } else { |
580 // The owning layer isn't yet in the active tree, so the main thread | 573 // The owning layer isn't yet in the active tree, so the main thread |
581 // scroll offset will be up-to-date. | 574 // scroll offset will be up-to-date. |
582 current_scroll_offset = value_provider_->ScrollOffsetForAnimation(); | 575 current_scroll_offset = value_provider_->ScrollOffsetForAnimation(); |
583 } | 576 } |
584 animations_[i]->curve()->ToScrollOffsetAnimationCurve()->SetInitialValue( | 577 animations_[i]->curve()->ToScrollOffsetAnimationCurve()->SetInitialValue( |
585 current_scroll_offset); | 578 current_scroll_offset); |
586 } | 579 } |
587 | 580 |
588 // The new animation should be set to run as soon as possible. | 581 // The new animation should be set to run as soon as possible. |
589 Animation::RunState initial_run_state = | 582 Animation::RunState initial_run_state = |
590 Animation::WaitingForTargetAvailability; | 583 Animation::WAITING_FOR_TARGET_AVAILABILITY; |
591 scoped_ptr<Animation> to_add( | 584 scoped_ptr<Animation> to_add( |
592 animations_[i]->CloneAndInitialize(initial_run_state)); | 585 animations_[i]->CloneAndInitialize(initial_run_state)); |
593 DCHECK(!to_add->needs_synchronized_start_time()); | 586 DCHECK(!to_add->needs_synchronized_start_time()); |
594 to_add->set_affects_active_observers(false); | 587 to_add->set_affects_active_observers(false); |
595 controller_impl->AddAnimation(to_add.Pass()); | 588 controller_impl->AddAnimation(to_add.Pass()); |
596 } | 589 } |
597 } | 590 } |
598 | 591 |
599 static bool IsCompleted( | 592 static bool IsCompleted( |
600 Animation* animation, | 593 Animation* animation, |
601 const LayerAnimationController* main_thread_controller) { | 594 const LayerAnimationController* main_thread_controller) { |
602 if (animation->is_impl_only()) { | 595 if (animation->is_impl_only()) { |
603 return (animation->run_state() == Animation::WaitingForDeletion); | 596 return (animation->run_state() == Animation::WAITING_FOR_DELETION); |
604 } else { | 597 } else { |
605 return !main_thread_controller->GetAnimationById(animation->id()); | 598 return !main_thread_controller->GetAnimationById(animation->id()); |
606 } | 599 } |
607 } | 600 } |
608 | 601 |
609 static bool AffectsActiveOnlyAndIsWaitingForDeletion(Animation* animation) { | 602 static bool AffectsActiveOnlyAndIsWaitingForDeletion(Animation* animation) { |
610 return animation->run_state() == Animation::WaitingForDeletion && | 603 return animation->run_state() == Animation::WAITING_FOR_DELETION && |
611 !animation->affects_pending_observers(); | 604 !animation->affects_pending_observers(); |
612 } | 605 } |
613 | 606 |
614 void LayerAnimationController::RemoveAnimationsCompletedOnMainThread( | 607 void LayerAnimationController::RemoveAnimationsCompletedOnMainThread( |
615 LayerAnimationController* controller_impl) const { | 608 LayerAnimationController* controller_impl) const { |
616 // Animations removed on the main thread should no longer affect pending | 609 // Animations removed on the main thread should no longer affect pending |
617 // observers, and should stop affecting active observers after the next call | 610 // observers, and should stop affecting active observers after the next call |
618 // to ActivateAnimations. If already WaitingForDeletion, they can be removed | 611 // to ActivateAnimations. If already WAITING_FOR_DELETION, they can be removed |
619 // immediately. | 612 // immediately. |
620 ScopedPtrVector<Animation>& animations = controller_impl->animations_; | 613 ScopedPtrVector<Animation>& animations = controller_impl->animations_; |
621 for (size_t i = 0; i < animations.size(); ++i) { | 614 for (size_t i = 0; i < animations.size(); ++i) { |
622 if (IsCompleted(animations[i], this)) | 615 if (IsCompleted(animations[i], this)) |
623 animations[i]->set_affects_pending_observers(false); | 616 animations[i]->set_affects_pending_observers(false); |
624 } | 617 } |
625 animations.erase(cc::remove_if(&animations, | 618 animations.erase(cc::remove_if(&animations, |
626 animations.begin(), | 619 animations.begin(), |
627 animations.end(), | 620 animations.end(), |
628 AffectsActiveOnlyAndIsWaitingForDeletion), | 621 AffectsActiveOnlyAndIsWaitingForDeletion), |
(...skipping 16 matching lines...) Expand all Loading... |
645 void LayerAnimationController::StartAnimations(base::TimeTicks monotonic_time) { | 638 void LayerAnimationController::StartAnimations(base::TimeTicks monotonic_time) { |
646 DCHECK(needs_to_start_animations_); | 639 DCHECK(needs_to_start_animations_); |
647 needs_to_start_animations_ = false; | 640 needs_to_start_animations_ = false; |
648 // First collect running properties affecting each type of observer. | 641 // First collect running properties affecting each type of observer. |
649 TargetProperties blocked_properties_for_active_observers; | 642 TargetProperties blocked_properties_for_active_observers; |
650 TargetProperties blocked_properties_for_pending_observers; | 643 TargetProperties blocked_properties_for_pending_observers; |
651 std::vector<size_t> animations_waiting_for_target; | 644 std::vector<size_t> animations_waiting_for_target; |
652 | 645 |
653 animations_waiting_for_target.reserve(animations_.size()); | 646 animations_waiting_for_target.reserve(animations_.size()); |
654 for (size_t i = 0; i < animations_.size(); ++i) { | 647 for (size_t i = 0; i < animations_.size(); ++i) { |
655 if (animations_[i]->run_state() == Animation::Starting || | 648 if (animations_[i]->run_state() == Animation::STARTING || |
656 animations_[i]->run_state() == Animation::Running) { | 649 animations_[i]->run_state() == Animation::RUNNING) { |
657 if (animations_[i]->affects_active_observers()) { | 650 if (animations_[i]->affects_active_observers()) { |
658 blocked_properties_for_active_observers.insert( | 651 blocked_properties_for_active_observers.insert( |
659 animations_[i]->target_property()); | 652 animations_[i]->target_property()); |
660 } | 653 } |
661 if (animations_[i]->affects_pending_observers()) { | 654 if (animations_[i]->affects_pending_observers()) { |
662 blocked_properties_for_pending_observers.insert( | 655 blocked_properties_for_pending_observers.insert( |
663 animations_[i]->target_property()); | 656 animations_[i]->target_property()); |
664 } | 657 } |
665 } else if (animations_[i]->run_state() == | 658 } else if (animations_[i]->run_state() == |
666 Animation::WaitingForTargetAvailability) { | 659 Animation::WAITING_FOR_TARGET_AVAILABILITY) { |
667 animations_waiting_for_target.push_back(i); | 660 animations_waiting_for_target.push_back(i); |
668 } | 661 } |
669 } | 662 } |
670 | 663 |
671 for (size_t i = 0; i < animations_waiting_for_target.size(); ++i) { | 664 for (size_t i = 0; i < animations_waiting_for_target.size(); ++i) { |
672 // Collect all properties for animations with the same group id (they | 665 // Collect all properties for animations with the same group id (they |
673 // should all also be in the list of animations). | 666 // should all also be in the list of animations). |
674 size_t animation_index = animations_waiting_for_target[i]; | 667 size_t animation_index = animations_waiting_for_target[i]; |
675 Animation* animation_waiting_for_target = animations_[animation_index]; | 668 Animation* animation_waiting_for_target = animations_[animation_index]; |
676 // Check for the run state again even though the animation was waiting | 669 // Check for the run state again even though the animation was waiting |
677 // for target because it might have changed the run state while handling | 670 // for target because it might have changed the run state while handling |
678 // previous animation in this loop (if they belong to same group). | 671 // previous animation in this loop (if they belong to same group). |
679 if (animation_waiting_for_target->run_state() == | 672 if (animation_waiting_for_target->run_state() == |
680 Animation::WaitingForTargetAvailability) { | 673 Animation::WAITING_FOR_TARGET_AVAILABILITY) { |
681 TargetProperties enqueued_properties; | 674 TargetProperties enqueued_properties; |
682 bool affects_active_observers = | 675 bool affects_active_observers = |
683 animation_waiting_for_target->affects_active_observers(); | 676 animation_waiting_for_target->affects_active_observers(); |
684 bool affects_pending_observers = | 677 bool affects_pending_observers = |
685 animation_waiting_for_target->affects_pending_observers(); | 678 animation_waiting_for_target->affects_pending_observers(); |
686 enqueued_properties.insert( | 679 enqueued_properties.insert( |
687 animation_waiting_for_target->target_property()); | 680 animation_waiting_for_target->target_property()); |
688 for (size_t j = animation_index + 1; j < animations_.size(); ++j) { | 681 for (size_t j = animation_index + 1; j < animations_.size(); ++j) { |
689 if (animation_waiting_for_target->group() == animations_[j]->group()) { | 682 if (animation_waiting_for_target->group() == animations_[j]->group()) { |
690 enqueued_properties.insert(animations_[j]->target_property()); | 683 enqueued_properties.insert(animations_[j]->target_property()); |
(...skipping 17 matching lines...) Expand all Loading... |
708 !blocked_properties_for_active_observers.insert(*p_iter).second) | 701 !blocked_properties_for_active_observers.insert(*p_iter).second) |
709 null_intersection = false; | 702 null_intersection = false; |
710 if (affects_pending_observers && | 703 if (affects_pending_observers && |
711 !blocked_properties_for_pending_observers.insert(*p_iter).second) | 704 !blocked_properties_for_pending_observers.insert(*p_iter).second) |
712 null_intersection = false; | 705 null_intersection = false; |
713 } | 706 } |
714 | 707 |
715 // If the intersection is null, then we are free to start the animations | 708 // If the intersection is null, then we are free to start the animations |
716 // in the group. | 709 // in the group. |
717 if (null_intersection) { | 710 if (null_intersection) { |
718 animation_waiting_for_target->SetRunState(Animation::Starting, | 711 animation_waiting_for_target->SetRunState(Animation::STARTING, |
719 monotonic_time); | 712 monotonic_time); |
720 for (size_t j = animation_index + 1; j < animations_.size(); ++j) { | 713 for (size_t j = animation_index + 1; j < animations_.size(); ++j) { |
721 if (animation_waiting_for_target->group() == | 714 if (animation_waiting_for_target->group() == |
722 animations_[j]->group()) { | 715 animations_[j]->group()) { |
723 animations_[j]->SetRunState(Animation::Starting, monotonic_time); | 716 animations_[j]->SetRunState(Animation::STARTING, monotonic_time); |
724 } | 717 } |
725 } | 718 } |
726 } else { | 719 } else { |
727 needs_to_start_animations_ = true; | 720 needs_to_start_animations_ = true; |
728 } | 721 } |
729 } | 722 } |
730 } | 723 } |
731 } | 724 } |
732 | 725 |
733 void LayerAnimationController::PromoteStartedAnimations( | 726 void LayerAnimationController::PromoteStartedAnimations( |
734 base::TimeTicks monotonic_time, | 727 base::TimeTicks monotonic_time, |
735 AnimationEventsVector* events) { | 728 AnimationEventsVector* events) { |
736 for (size_t i = 0; i < animations_.size(); ++i) { | 729 for (size_t i = 0; i < animations_.size(); ++i) { |
737 if (animations_[i]->run_state() == Animation::Starting && | 730 if (animations_[i]->run_state() == Animation::STARTING && |
738 animations_[i]->affects_active_observers()) { | 731 animations_[i]->affects_active_observers()) { |
739 animations_[i]->SetRunState(Animation::Running, monotonic_time); | 732 animations_[i]->SetRunState(Animation::RUNNING, monotonic_time); |
740 if (!animations_[i]->has_set_start_time() && | 733 if (!animations_[i]->has_set_start_time() && |
741 !animations_[i]->needs_synchronized_start_time()) | 734 !animations_[i]->needs_synchronized_start_time()) |
742 animations_[i]->set_start_time(monotonic_time); | 735 animations_[i]->set_start_time(monotonic_time); |
743 if (events) { | 736 if (events) { |
744 AnimationEvent started_event(AnimationEvent::Started, | 737 AnimationEvent started_event( |
745 id_, | 738 AnimationEvent::STARTED, id_, animations_[i]->group(), |
746 animations_[i]->group(), | 739 animations_[i]->target_property(), monotonic_time); |
747 animations_[i]->target_property(), | |
748 monotonic_time); | |
749 started_event.is_impl_only = animations_[i]->is_impl_only(); | 740 started_event.is_impl_only = animations_[i]->is_impl_only(); |
750 if (started_event.is_impl_only) | 741 if (started_event.is_impl_only) |
751 NotifyAnimationStarted(started_event); | 742 NotifyAnimationStarted(started_event); |
752 else | 743 else |
753 events->push_back(started_event); | 744 events->push_back(started_event); |
754 } | 745 } |
755 } | 746 } |
756 } | 747 } |
757 } | 748 } |
758 | 749 |
759 void LayerAnimationController::MarkFinishedAnimations( | 750 void LayerAnimationController::MarkFinishedAnimations( |
760 base::TimeTicks monotonic_time) { | 751 base::TimeTicks monotonic_time) { |
761 for (size_t i = 0; i < animations_.size(); ++i) { | 752 for (size_t i = 0; i < animations_.size(); ++i) { |
762 if (animations_[i]->IsFinishedAt(monotonic_time) && | 753 if (animations_[i]->IsFinishedAt(monotonic_time) && |
763 animations_[i]->run_state() != Animation::Aborted && | 754 animations_[i]->run_state() != Animation::ABORTED && |
764 animations_[i]->run_state() != Animation::WaitingForDeletion) | 755 animations_[i]->run_state() != Animation::WAITING_FOR_DELETION) |
765 animations_[i]->SetRunState(Animation::Finished, monotonic_time); | 756 animations_[i]->SetRunState(Animation::FINISHED, monotonic_time); |
766 } | 757 } |
767 } | 758 } |
768 | 759 |
769 void LayerAnimationController::MarkAnimationsForDeletion( | 760 void LayerAnimationController::MarkAnimationsForDeletion( |
770 base::TimeTicks monotonic_time, | 761 base::TimeTicks monotonic_time, |
771 AnimationEventsVector* events) { | 762 AnimationEventsVector* events) { |
772 bool marked_animations_for_deletions = false; | 763 bool marked_animations_for_deletions = false; |
773 std::vector<size_t> animations_with_same_group_id; | 764 std::vector<size_t> animations_with_same_group_id; |
774 | 765 |
775 animations_with_same_group_id.reserve(animations_.size()); | 766 animations_with_same_group_id.reserve(animations_.size()); |
776 // Non-aborted animations are marked for deletion after a corresponding | 767 // Non-aborted animations are marked for deletion after a corresponding |
777 // AnimationEvent::Finished event is sent or received. This means that if | 768 // AnimationEvent::FINISHED event is sent or received. This means that if |
778 // we don't have an events vector, we must ensure that non-aborted animations | 769 // we don't have an events vector, we must ensure that non-aborted animations |
779 // have received a finished event before marking them for deletion. | 770 // have received a finished event before marking them for deletion. |
780 for (size_t i = 0; i < animations_.size(); i++) { | 771 for (size_t i = 0; i < animations_.size(); i++) { |
781 int group_id = animations_[i]->group(); | 772 int group_id = animations_[i]->group(); |
782 if (animations_[i]->run_state() == Animation::Aborted) { | 773 if (animations_[i]->run_state() == Animation::ABORTED) { |
783 if (events && !animations_[i]->is_impl_only()) { | 774 if (events && !animations_[i]->is_impl_only()) { |
784 AnimationEvent aborted_event(AnimationEvent::Aborted, | 775 AnimationEvent aborted_event(AnimationEvent::ABORTED, id_, group_id, |
785 id_, | |
786 group_id, | |
787 animations_[i]->target_property(), | 776 animations_[i]->target_property(), |
788 monotonic_time); | 777 monotonic_time); |
789 events->push_back(aborted_event); | 778 events->push_back(aborted_event); |
790 } | 779 } |
791 animations_[i]->SetRunState(Animation::WaitingForDeletion, | 780 animations_[i]->SetRunState(Animation::WAITING_FOR_DELETION, |
792 monotonic_time); | 781 monotonic_time); |
793 marked_animations_for_deletions = true; | 782 marked_animations_for_deletions = true; |
794 continue; | 783 continue; |
795 } | 784 } |
796 | 785 |
797 bool all_anims_with_same_id_are_finished = false; | 786 bool all_anims_with_same_id_are_finished = false; |
798 | 787 |
799 // Since deleting an animation on the main thread leads to its deletion | 788 // Since deleting an animation on the main thread leads to its deletion |
800 // on the impl thread, we only mark a Finished main thread animation for | 789 // on the impl thread, we only mark a FINISHED main thread animation for |
801 // deletion once it has received a Finished event from the impl thread. | 790 // deletion once it has received a FINISHED event from the impl thread. |
802 bool animation_i_will_send_or_has_received_finish_event = | 791 bool animation_i_will_send_or_has_received_finish_event = |
803 events || animations_[i]->received_finished_event(); | 792 events || animations_[i]->received_finished_event(); |
804 // If an animation is finished, and not already marked for deletion, | 793 // If an animation is finished, and not already marked for deletion, |
805 // find out if all other animations in the same group are also finished. | 794 // find out if all other animations in the same group are also finished. |
806 if (animations_[i]->run_state() == Animation::Finished && | 795 if (animations_[i]->run_state() == Animation::FINISHED && |
807 animation_i_will_send_or_has_received_finish_event) { | 796 animation_i_will_send_or_has_received_finish_event) { |
808 // Clear the animations_with_same_group_id if it was added for | 797 // Clear the animations_with_same_group_id if it was added for |
809 // the previous animation's iteration. | 798 // the previous animation's iteration. |
810 if (animations_with_same_group_id.size() > 0) | 799 if (animations_with_same_group_id.size() > 0) |
811 animations_with_same_group_id.clear(); | 800 animations_with_same_group_id.clear(); |
812 all_anims_with_same_id_are_finished = true; | 801 all_anims_with_same_id_are_finished = true; |
813 for (size_t j = 0; j < animations_.size(); ++j) { | 802 for (size_t j = 0; j < animations_.size(); ++j) { |
814 bool animation_j_will_send_or_has_received_finish_event = | 803 bool animation_j_will_send_or_has_received_finish_event = |
815 events || animations_[j]->received_finished_event(); | 804 events || animations_[j]->received_finished_event(); |
816 if (group_id == animations_[j]->group()) { | 805 if (group_id == animations_[j]->group()) { |
817 if (!animations_[j]->is_finished() || | 806 if (!animations_[j]->is_finished() || |
818 (animations_[j]->run_state() == Animation::Finished && | 807 (animations_[j]->run_state() == Animation::FINISHED && |
819 !animation_j_will_send_or_has_received_finish_event)) { | 808 !animation_j_will_send_or_has_received_finish_event)) { |
820 all_anims_with_same_id_are_finished = false; | 809 all_anims_with_same_id_are_finished = false; |
821 break; | 810 break; |
822 } else if (j >= i && | 811 } else if (j >= i && |
823 animations_[j]->run_state() != Animation::Aborted) { | 812 animations_[j]->run_state() != Animation::ABORTED) { |
824 // Mark down the animations which belong to the same group | 813 // Mark down the animations which belong to the same group |
825 // and is not yet aborted. If this current iteration finds that all | 814 // and is not yet aborted. If this current iteration finds that all |
826 // animations with same ID are finished, then the marked | 815 // animations with same ID are finished, then the marked |
827 // animations below will be set to WaitingForDeletion in next | 816 // animations below will be set to WAITING_FOR_DELETION in next |
828 // iteration. | 817 // iteration. |
829 animations_with_same_group_id.push_back(j); | 818 animations_with_same_group_id.push_back(j); |
830 } | 819 } |
831 } | 820 } |
832 } | 821 } |
833 } | 822 } |
834 if (all_anims_with_same_id_are_finished) { | 823 if (all_anims_with_same_id_are_finished) { |
835 // We now need to remove all animations with the same group id as | 824 // We now need to remove all animations with the same group id as |
836 // group_id (and send along animation finished notifications, if | 825 // group_id (and send along animation finished notifications, if |
837 // necessary). | 826 // necessary). |
838 for (size_t j = 0; j < animations_with_same_group_id.size(); j++) { | 827 for (size_t j = 0; j < animations_with_same_group_id.size(); j++) { |
839 size_t animation_index = animations_with_same_group_id[j]; | 828 size_t animation_index = animations_with_same_group_id[j]; |
840 if (events) { | 829 if (events) { |
841 AnimationEvent finished_event( | 830 AnimationEvent finished_event( |
842 AnimationEvent::Finished, | 831 AnimationEvent::FINISHED, id_, |
843 id_, | |
844 animations_[animation_index]->group(), | 832 animations_[animation_index]->group(), |
845 animations_[animation_index]->target_property(), | 833 animations_[animation_index]->target_property(), |
846 monotonic_time); | 834 monotonic_time); |
847 finished_event.is_impl_only = | 835 finished_event.is_impl_only = |
848 animations_[animation_index]->is_impl_only(); | 836 animations_[animation_index]->is_impl_only(); |
849 if (finished_event.is_impl_only) | 837 if (finished_event.is_impl_only) |
850 NotifyAnimationFinished(finished_event); | 838 NotifyAnimationFinished(finished_event); |
851 else | 839 else |
852 events->push_back(finished_event); | 840 events->push_back(finished_event); |
853 } | 841 } |
854 animations_[animation_index]->SetRunState( | 842 animations_[animation_index]->SetRunState( |
855 Animation::WaitingForDeletion, monotonic_time); | 843 Animation::WAITING_FOR_DELETION, monotonic_time); |
856 } | 844 } |
857 marked_animations_for_deletions = true; | 845 marked_animations_for_deletions = true; |
858 } | 846 } |
859 } | 847 } |
860 if (marked_animations_for_deletions) | 848 if (marked_animations_for_deletions) |
861 NotifyObserversAnimationWaitingForDeletion(); | 849 NotifyObserversAnimationWaitingForDeletion(); |
862 } | 850 } |
863 | 851 |
864 static bool IsWaitingForDeletion(Animation* animation) { | 852 static bool IsWaitingForDeletion(Animation* animation) { |
865 return animation->run_state() == Animation::WaitingForDeletion; | 853 return animation->run_state() == Animation::WAITING_FOR_DELETION; |
866 } | 854 } |
867 | 855 |
868 void LayerAnimationController::PurgeAnimationsMarkedForDeletion() { | 856 void LayerAnimationController::PurgeAnimationsMarkedForDeletion() { |
869 animations_.erase(cc::remove_if(&animations_, | 857 animations_.erase(cc::remove_if(&animations_, |
870 animations_.begin(), | 858 animations_.begin(), |
871 animations_.end(), | 859 animations_.end(), |
872 IsWaitingForDeletion), | 860 IsWaitingForDeletion), |
873 animations_.end()); | 861 animations_.end()); |
874 } | 862 } |
875 | 863 |
876 void LayerAnimationController::TickAnimations(base::TimeTicks monotonic_time) { | 864 void LayerAnimationController::TickAnimations(base::TimeTicks monotonic_time) { |
877 for (size_t i = 0; i < animations_.size(); ++i) { | 865 for (size_t i = 0; i < animations_.size(); ++i) { |
878 if (animations_[i]->run_state() == Animation::Starting || | 866 if (animations_[i]->run_state() == Animation::STARTING || |
879 animations_[i]->run_state() == Animation::Running || | 867 animations_[i]->run_state() == Animation::RUNNING || |
880 animations_[i]->run_state() == Animation::Paused) { | 868 animations_[i]->run_state() == Animation::PAUSED) { |
881 if (!animations_[i]->InEffect(monotonic_time)) | 869 if (!animations_[i]->InEffect(monotonic_time)) |
882 continue; | 870 continue; |
883 | 871 |
884 base::TimeDelta trimmed = | 872 base::TimeDelta trimmed = |
885 animations_[i]->TrimTimeToCurrentIteration(monotonic_time); | 873 animations_[i]->TrimTimeToCurrentIteration(monotonic_time); |
886 | 874 |
887 switch (animations_[i]->target_property()) { | 875 switch (animations_[i]->target_property()) { |
888 case Animation::Transform: { | 876 case Animation::TRANSFORM: { |
889 const TransformAnimationCurve* transform_animation_curve = | 877 const TransformAnimationCurve* transform_animation_curve = |
890 animations_[i]->curve()->ToTransformAnimationCurve(); | 878 animations_[i]->curve()->ToTransformAnimationCurve(); |
891 const gfx::Transform transform = | 879 const gfx::Transform transform = |
892 transform_animation_curve->GetValue(trimmed); | 880 transform_animation_curve->GetValue(trimmed); |
893 NotifyObserversTransformAnimated( | 881 NotifyObserversTransformAnimated( |
894 transform, | 882 transform, |
895 animations_[i]->affects_active_observers(), | 883 animations_[i]->affects_active_observers(), |
896 animations_[i]->affects_pending_observers()); | 884 animations_[i]->affects_pending_observers()); |
897 break; | 885 break; |
898 } | 886 } |
899 | 887 |
900 case Animation::Opacity: { | 888 case Animation::OPACITY: { |
901 const FloatAnimationCurve* float_animation_curve = | 889 const FloatAnimationCurve* float_animation_curve = |
902 animations_[i]->curve()->ToFloatAnimationCurve(); | 890 animations_[i]->curve()->ToFloatAnimationCurve(); |
903 const float opacity = std::max( | 891 const float opacity = std::max( |
904 std::min(float_animation_curve->GetValue(trimmed), 1.0f), 0.f); | 892 std::min(float_animation_curve->GetValue(trimmed), 1.0f), 0.f); |
905 NotifyObserversOpacityAnimated( | 893 NotifyObserversOpacityAnimated( |
906 opacity, | 894 opacity, |
907 animations_[i]->affects_active_observers(), | 895 animations_[i]->affects_active_observers(), |
908 animations_[i]->affects_pending_observers()); | 896 animations_[i]->affects_pending_observers()); |
909 break; | 897 break; |
910 } | 898 } |
911 | 899 |
912 case Animation::Filter: { | 900 case Animation::FILTER: { |
913 const FilterAnimationCurve* filter_animation_curve = | 901 const FilterAnimationCurve* filter_animation_curve = |
914 animations_[i]->curve()->ToFilterAnimationCurve(); | 902 animations_[i]->curve()->ToFilterAnimationCurve(); |
915 const FilterOperations filter = | 903 const FilterOperations filter = |
916 filter_animation_curve->GetValue(trimmed); | 904 filter_animation_curve->GetValue(trimmed); |
917 NotifyObserversFilterAnimated( | 905 NotifyObserversFilterAnimated( |
918 filter, | 906 filter, |
919 animations_[i]->affects_active_observers(), | 907 animations_[i]->affects_active_observers(), |
920 animations_[i]->affects_pending_observers()); | 908 animations_[i]->affects_pending_observers()); |
921 break; | 909 break; |
922 } | 910 } |
923 | 911 |
924 case Animation::BackgroundColor: { | 912 case Animation::BACKGROUND_COLOR: { |
925 // Not yet implemented. | 913 // Not yet implemented. |
926 break; | 914 break; |
927 } | 915 } |
928 | 916 |
929 case Animation::ScrollOffset: { | 917 case Animation::SCROLL_OFFSET: { |
930 const ScrollOffsetAnimationCurve* scroll_offset_animation_curve = | 918 const ScrollOffsetAnimationCurve* scroll_offset_animation_curve = |
931 animations_[i]->curve()->ToScrollOffsetAnimationCurve(); | 919 animations_[i]->curve()->ToScrollOffsetAnimationCurve(); |
932 const gfx::ScrollOffset scroll_offset = | 920 const gfx::ScrollOffset scroll_offset = |
933 scroll_offset_animation_curve->GetValue(trimmed); | 921 scroll_offset_animation_curve->GetValue(trimmed); |
934 NotifyObserversScrollOffsetAnimated( | 922 NotifyObserversScrollOffsetAnimated( |
935 scroll_offset, | 923 scroll_offset, |
936 animations_[i]->affects_active_observers(), | 924 animations_[i]->affects_active_observers(), |
937 animations_[i]->affects_pending_observers()); | 925 animations_[i]->affects_pending_observers()); |
938 break; | 926 break; |
939 } | 927 } |
940 | |
941 // Do nothing for sentinel value. | |
942 case Animation::TargetPropertyEnumSize: | |
943 NOTREACHED(); | |
944 } | 928 } |
945 } | 929 } |
946 } | 930 } |
947 } | 931 } |
948 | 932 |
949 void LayerAnimationController::UpdateActivation(UpdateActivationType type) { | 933 void LayerAnimationController::UpdateActivation(UpdateActivationType type) { |
950 bool force = type == ForceActivation; | 934 bool force = type == FORCE_ACTIVATION; |
951 if (registrar_) { | 935 if (registrar_) { |
952 bool was_active = is_active_; | 936 bool was_active = is_active_; |
953 is_active_ = false; | 937 is_active_ = false; |
954 for (size_t i = 0; i < animations_.size(); ++i) { | 938 for (size_t i = 0; i < animations_.size(); ++i) { |
955 if (animations_[i]->run_state() != Animation::WaitingForDeletion) { | 939 if (animations_[i]->run_state() != Animation::WAITING_FOR_DELETION) { |
956 is_active_ = true; | 940 is_active_ = true; |
957 break; | 941 break; |
958 } | 942 } |
959 } | 943 } |
960 | 944 |
961 if (is_active_ && (!was_active || force)) | 945 if (is_active_ && (!was_active || force)) |
962 registrar_->DidActivateAnimationController(this); | 946 registrar_->DidActivateAnimationController(this); |
963 else if (!is_active_ && (was_active || force)) | 947 else if (!is_active_ && (was_active || force)) |
964 registrar_->DidDeactivateAnimationController(this); | 948 registrar_->DidDeactivateAnimationController(this); |
965 } | 949 } |
(...skipping 88 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1054 value_observers_); | 1038 value_observers_); |
1055 LayerAnimationValueObserver* obs; | 1039 LayerAnimationValueObserver* obs; |
1056 while ((obs = it.GetNext()) != nullptr) | 1040 while ((obs = it.GetNext()) != nullptr) |
1057 if (obs->IsActive()) | 1041 if (obs->IsActive()) |
1058 return true; | 1042 return true; |
1059 } | 1043 } |
1060 return false; | 1044 return false; |
1061 } | 1045 } |
1062 | 1046 |
1063 } // namespace cc | 1047 } // namespace cc |
OLD | NEW |