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