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

Side by Side Diff: ui/gfx/compositor/layer_animation_manager.cc

Issue 8362006: Reland r107720 - Enable the new layer animation framework. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Merge Created 9 years, 1 month ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
(Empty)
1 // Copyright (c) 2011 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 "ui/gfx/compositor/layer_animation_manager.h"
6
7 #include "base/logging.h"
8 #include "base/stl_util.h"
9 #include "ui/base/animation/animation_container.h"
10 #include "ui/base/animation/animation.h"
11 #include "ui/base/animation/tween.h"
12 #include "ui/gfx/compositor/compositor.h"
13 #include "ui/gfx/compositor/layer.h"
14 #include "ui/gfx/compositor/layer_animator_delegate.h"
15 #include "ui/gfx/transform.h"
16 #include "ui/gfx/rect.h"
17
18 namespace {
19
20 void SetMatrixElement(SkMatrix44& matrix, int index, SkMScalar value) {
21 int row = index / 4;
22 int col = index % 4;
23 matrix.set(row, col, value);
24 }
25
26 SkMScalar GetMatrixElement(const SkMatrix44& matrix, int index) {
27 int row = index / 4;
28 int col = index % 4;
29 return matrix.get(row, col);
30 }
31
32 } // anonymous namespace
33
34 namespace ui {
35
36 LayerAnimationManager::LayerAnimationManager(Layer* layer)
37 : layer_(layer),
38 got_initial_tick_(false) {
39 }
40
41 LayerAnimationManager::~LayerAnimationManager() {
42 }
43
44 void LayerAnimationManager::SetAnimation(Animation* animation) {
45 animation_.reset(animation);
46 if (animation_.get()) {
47 static ui::AnimationContainer* container = NULL;
48 if (!container) {
49 container = new AnimationContainer;
50 container->AddRef();
51 }
52 animation_->set_delegate(this);
53 animation_->SetContainer(container);
54 got_initial_tick_ = false;
55 }
56 }
57
58 void LayerAnimationManager::AnimateToPoint(const gfx::Point& target) {
59 StopAnimating(LOCATION);
60 const gfx::Rect& layer_bounds = layer_->bounds();
61 if (target == layer_bounds.origin())
62 return; // Already there.
63
64 Params& element = elements_[LOCATION];
65 element.location.target_x = target.x();
66 element.location.target_y = target.y();
67 element.location.start_x = layer_bounds.origin().x();
68 element.location.start_y = layer_bounds.origin().y();
69 }
70
71 void LayerAnimationManager::AnimateTransform(const Transform& transform) {
72 StopAnimating(TRANSFORM);
73 const Transform& layer_transform = layer_->transform();
74 if (transform == layer_transform)
75 return; // Already there.
76
77 Params& element = elements_[TRANSFORM];
78 for (int i = 0; i < 16; ++i) {
79 element.transform.start[i] =
80 GetMatrixElement(layer_transform.matrix(), i);
81 element.transform.target[i] =
82 GetMatrixElement(transform.matrix(), i);
83 }
84 }
85
86 void LayerAnimationManager::AnimateOpacity(float target_opacity) {
87 StopAnimating(OPACITY);
88 if (layer_->opacity() == target_opacity)
89 return;
90
91 Params& element = elements_[OPACITY];
92 element.opacity.start = layer_->opacity();
93 element.opacity.target = target_opacity;
94 }
95
96 gfx::Point LayerAnimationManager::GetTargetPoint() {
97 return IsAnimating(LOCATION) ?
98 gfx::Point(elements_[LOCATION].location.target_x,
99 elements_[LOCATION].location.target_y) :
100 layer_->bounds().origin();
101 }
102
103 float LayerAnimationManager::GetTargetOpacity() {
104 return IsAnimating(OPACITY) ?
105 elements_[OPACITY].opacity.target : layer_->opacity();
106 }
107
108 ui::Transform LayerAnimationManager::GetTargetTransform() {
109 if (IsAnimating(TRANSFORM)) {
110 Transform transform;
111 for (int i = 0; i < 16; ++i) {
112 SetMatrixElement(transform.matrix(), i,
113 elements_[TRANSFORM].transform.target[i]);
114 }
115 return transform;
116 }
117 return layer_->transform();
118 }
119
120 bool LayerAnimationManager::IsAnimating(AnimationProperty property) const {
121 return elements_.count(property) > 0;
122 }
123
124 bool LayerAnimationManager::IsRunning() const {
125 return animation_.get() && animation_->is_animating();
126 }
127
128 void LayerAnimationManager::AnimationProgressed(
129 const ui::Animation* animation) {
130 got_initial_tick_ = true;
131 for (Elements::const_iterator i = elements_.begin(); i != elements_.end();
132 ++i) {
133 switch (i->first) {
134 case LOCATION: {
135 const gfx::Rect& current_bounds(layer_->bounds());
136 gfx::Rect new_bounds = animation_->CurrentValueBetween(
137 gfx::Rect(gfx::Point(i->second.location.start_x,
138 i->second.location.start_y),
139 current_bounds.size()),
140 gfx::Rect(gfx::Point(i->second.location.target_x,
141 i->second.location.target_y),
142 current_bounds.size()));
143 delegate()->SetBoundsFromAnimator(new_bounds);
144 break;
145 }
146
147 case TRANSFORM: {
148 Transform transform;
149 for (int j = 0; j < 16; ++j) {
150 SkMScalar value = animation_->CurrentValueBetween(
151 i->second.transform.start[j],
152 i->second.transform.target[j]);
153 SetMatrixElement(transform.matrix(), j, value);
154 }
155 delegate()->SetTransformFromAnimator(transform);
156 break;
157 }
158
159 case OPACITY: {
160 delegate()->SetOpacityFromAnimator(animation_->CurrentValueBetween(
161 i->second.opacity.start, i->second.opacity.target));
162 break;
163 }
164
165 default:
166 NOTREACHED();
167 }
168 }
169 layer_->ScheduleDraw();
170 }
171
172 void LayerAnimationManager::AnimationEnded(const ui::Animation* animation) {
173 AnimationProgressed(animation);
174 if (layer_->delegate())
175 layer_->delegate()->OnLayerAnimationEnded(animation);
176 }
177
178 void LayerAnimationManager::StopAnimating(AnimationProperty property) {
179 if (!IsAnimating(property))
180 return;
181
182 elements_.erase(property);
183 }
184
185 LayerAnimatorDelegate* LayerAnimationManager::delegate() {
186 return static_cast<LayerAnimatorDelegate*>(layer_);
187 }
188
189 } // namespace ui
OLDNEW
« no previous file with comments | « ui/gfx/compositor/layer_animation_manager.h ('k') | ui/gfx/compositor/layer_animation_sequence.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698