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