| OLD | NEW |
| 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 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 "ui/compositor/scoped_layer_animation_settings.h" | 5 #include "ui/compositor/scoped_layer_animation_settings.h" |
| 6 | 6 |
| 7 #include <stddef.h> | 7 #include <stddef.h> |
| 8 | 8 |
| 9 #include "ui/compositor/layer.h" | 9 #include "ui/compositor/layer.h" |
| 10 #include "ui/compositor/layer_animation_observer.h" | 10 #include "ui/compositor/layer_animation_observer.h" |
| 11 #include "ui/compositor/layer_animation_sequence.h" | 11 #include "ui/compositor/layer_animation_sequence.h" |
| 12 #include "ui/compositor/layer_animator.h" | 12 #include "ui/compositor/layer_animator.h" |
| 13 | 13 |
| 14 namespace { | 14 namespace { |
| 15 | 15 |
| 16 const int kDefaultTransitionDurationMs = 200; | 16 const int kDefaultTransitionDurationMs = 200; |
| 17 | 17 |
| 18 } // namespace | 18 } // namespace |
| 19 | 19 |
| 20 namespace ui { | 20 namespace ui { |
| 21 | 21 |
| 22 // InvertingObserver ----------------------------------------------------------- | |
| 23 class InvertingObserver : public ImplicitAnimationObserver { | |
| 24 public: | |
| 25 InvertingObserver() | |
| 26 : base_layer_(NULL) { | |
| 27 } | |
| 28 | |
| 29 ~InvertingObserver() override {} | |
| 30 | |
| 31 void SetLayer(Layer* base_layer) { base_layer_ = base_layer; } | |
| 32 | |
| 33 Layer* layer() { return base_layer_; } | |
| 34 | |
| 35 void AddInverselyAnimatedLayer(Layer* inverse_layer) { | |
| 36 inverse_layers_.push_back(inverse_layer); | |
| 37 } | |
| 38 | |
| 39 void OnImplicitAnimationsCompleted() override {} | |
| 40 | |
| 41 void OnLayerAnimationScheduled(LayerAnimationSequence* sequence) override { | |
| 42 DCHECK(base_layer_ != NULL) | |
| 43 << "Must set base layer with ScopedLayerAnimationSettings::" | |
| 44 << "SetInverslyAnimatedBaseLayer"; | |
| 45 gfx::Transform base_transform = base_layer_->transform(); | |
| 46 std::unique_ptr<LayerAnimationElement> inverse = | |
| 47 GetInverseElement(sequence, base_transform); | |
| 48 | |
| 49 for (std::vector<Layer*>::const_iterator i = | |
| 50 inverse_layers_.begin(); i != inverse_layers_.end(); ++i) { | |
| 51 (*i)->GetAnimator()->StartAnimation(new LayerAnimationSequence( | |
| 52 LayerAnimationElement::CloneInverseTransformElement( | |
| 53 inverse.get()))); | |
| 54 } | |
| 55 } | |
| 56 private: | |
| 57 std::unique_ptr<LayerAnimationElement> GetInverseElement( | |
| 58 LayerAnimationSequence* sequence, | |
| 59 gfx::Transform base) const { | |
| 60 const size_t expected_size = 1; | |
| 61 DCHECK_EQ(expected_size, sequence->size()) | |
| 62 << "Inverse supported only for single element sequences."; | |
| 63 | |
| 64 LayerAnimationElement* element = sequence->FirstElement(); | |
| 65 DCHECK_EQ(static_cast<LayerAnimationElement::AnimatableProperties>( | |
| 66 LayerAnimationElement::TRANSFORM), | |
| 67 element->properties()) | |
| 68 << "Only transform animations are currently invertible."; | |
| 69 | |
| 70 std::unique_ptr<LayerAnimationElement> to_return( | |
| 71 LayerAnimationElement::CreateInverseTransformElement(base, element)); | |
| 72 return to_return; | |
| 73 } | |
| 74 | |
| 75 Layer* base_layer_; | |
| 76 // child layers | |
| 77 std::vector<Layer*> inverse_layers_; | |
| 78 }; | |
| 79 | |
| 80 | |
| 81 // ScopedLayerAnimationSettings ------------------------------------------------ | 22 // ScopedLayerAnimationSettings ------------------------------------------------ |
| 82 ScopedLayerAnimationSettings::ScopedLayerAnimationSettings( | 23 ScopedLayerAnimationSettings::ScopedLayerAnimationSettings( |
| 83 scoped_refptr<LayerAnimator> animator) | 24 scoped_refptr<LayerAnimator> animator) |
| 84 : animator_(animator), | 25 : animator_(animator), |
| 85 old_is_transition_duration_locked_( | 26 old_is_transition_duration_locked_( |
| 86 animator->is_transition_duration_locked_), | 27 animator->is_transition_duration_locked_), |
| 87 old_transition_duration_(animator->GetTransitionDuration()), | 28 old_transition_duration_(animator->GetTransitionDuration()), |
| 88 old_tween_type_(animator->tween_type()), | 29 old_tween_type_(animator->tween_type()), |
| 89 old_preemption_strategy_(animator->preemption_strategy()), | 30 old_preemption_strategy_(animator->preemption_strategy()) { |
| 90 inverse_observer_(new InvertingObserver()) { | |
| 91 SetTransitionDuration( | 31 SetTransitionDuration( |
| 92 base::TimeDelta::FromMilliseconds(kDefaultTransitionDurationMs)); | 32 base::TimeDelta::FromMilliseconds(kDefaultTransitionDurationMs)); |
| 93 } | 33 } |
| 94 | 34 |
| 95 ScopedLayerAnimationSettings::~ScopedLayerAnimationSettings() { | 35 ScopedLayerAnimationSettings::~ScopedLayerAnimationSettings() { |
| 96 animator_->is_transition_duration_locked_ = | 36 animator_->is_transition_duration_locked_ = |
| 97 old_is_transition_duration_locked_; | 37 old_is_transition_duration_locked_; |
| 98 animator_->SetTransitionDuration(old_transition_duration_); | 38 animator_->SetTransitionDuration(old_transition_duration_); |
| 99 animator_->set_tween_type(old_tween_type_); | 39 animator_->set_tween_type(old_tween_type_); |
| 100 animator_->set_preemption_strategy(old_preemption_strategy_); | 40 animator_->set_preemption_strategy(old_preemption_strategy_); |
| 101 | 41 |
| 102 for (std::set<ImplicitAnimationObserver*>::const_iterator i = | 42 for (std::set<ImplicitAnimationObserver*>::const_iterator i = |
| 103 observers_.begin(); i != observers_.end(); ++i) { | 43 observers_.begin(); i != observers_.end(); ++i) { |
| 104 animator_->observers_.RemoveObserver(*i); | 44 animator_->observers_.RemoveObserver(*i); |
| 105 (*i)->SetActive(true); | 45 (*i)->SetActive(true); |
| 106 } | 46 } |
| 107 | |
| 108 if (inverse_observer_->layer()) { | |
| 109 animator_->observers_.RemoveObserver(inverse_observer_.get()); | |
| 110 } | |
| 111 } | 47 } |
| 112 | 48 |
| 113 void ScopedLayerAnimationSettings::AddObserver( | 49 void ScopedLayerAnimationSettings::AddObserver( |
| 114 ImplicitAnimationObserver* observer) { | 50 ImplicitAnimationObserver* observer) { |
| 115 observers_.insert(observer); | 51 observers_.insert(observer); |
| 116 animator_->AddObserver(observer); | 52 animator_->AddObserver(observer); |
| 117 } | 53 } |
| 118 | 54 |
| 119 void ScopedLayerAnimationSettings::SetTransitionDuration( | 55 void ScopedLayerAnimationSettings::SetTransitionDuration( |
| 120 base::TimeDelta duration) { | 56 base::TimeDelta duration) { |
| (...skipping 19 matching lines...) Expand all Loading... |
| 140 void ScopedLayerAnimationSettings::SetPreemptionStrategy( | 76 void ScopedLayerAnimationSettings::SetPreemptionStrategy( |
| 141 LayerAnimator::PreemptionStrategy strategy) { | 77 LayerAnimator::PreemptionStrategy strategy) { |
| 142 animator_->set_preemption_strategy(strategy); | 78 animator_->set_preemption_strategy(strategy); |
| 143 } | 79 } |
| 144 | 80 |
| 145 LayerAnimator::PreemptionStrategy | 81 LayerAnimator::PreemptionStrategy |
| 146 ScopedLayerAnimationSettings::GetPreemptionStrategy() const { | 82 ScopedLayerAnimationSettings::GetPreemptionStrategy() const { |
| 147 return animator_->preemption_strategy(); | 83 return animator_->preemption_strategy(); |
| 148 } | 84 } |
| 149 | 85 |
| 150 void ScopedLayerAnimationSettings::SetInverselyAnimatedBaseLayer(Layer* base) { | |
| 151 if (inverse_observer_->layer() && !base) { | |
| 152 animator_->RemoveObserver(inverse_observer_.get()); | |
| 153 } else if (base && !(inverse_observer_->layer())) { | |
| 154 animator_->AddObserver(inverse_observer_.get()); | |
| 155 } | |
| 156 inverse_observer_->SetLayer(base); | |
| 157 } | |
| 158 | |
| 159 void ScopedLayerAnimationSettings::AddInverselyAnimatedLayer( | |
| 160 Layer* inverse_layer) { | |
| 161 inverse_observer_->AddInverselyAnimatedLayer(inverse_layer); | |
| 162 } | |
| 163 | |
| 164 } // namespace ui | 86 } // namespace ui |
| OLD | NEW |