OLD | NEW |
1 // Copyright 2015 The Chromium Authors. All rights reserved. | 1 // Copyright 2015 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 "ash/rotator/screen_rotation_animator.h" | 5 #include "ash/rotator/screen_rotation_animator.h" |
6 | 6 |
7 #include <string> | 7 #include <string> |
8 #include <vector> | 8 #include <vector> |
9 | 9 |
10 #include "ash/ash_switches.h" | 10 #include "ash/ash_switches.h" |
(...skipping 49 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
60 | 60 |
61 // The time it takes for the rotation animations to run. | 61 // The time it takes for the rotation animations to run. |
62 const int kRotationDurationInMs = 250; | 62 const int kRotationDurationInMs = 250; |
63 | 63 |
64 // Gets the current display rotation for the display with the specified | 64 // Gets the current display rotation for the display with the specified |
65 // |display_id|. | 65 // |display_id|. |
66 gfx::Display::Rotation GetCurrentRotation(int64 display_id) { | 66 gfx::Display::Rotation GetCurrentRotation(int64 display_id) { |
67 return Shell::GetInstance() | 67 return Shell::GetInstance() |
68 ->display_manager() | 68 ->display_manager() |
69 ->GetDisplayInfo(display_id) | 69 ->GetDisplayInfo(display_id) |
70 .GetActiveRotation(); | 70 .rotation(); |
71 } | 71 } |
72 | 72 |
73 // Returns true if the rotation between |initial_rotation| and |new_rotation| is | 73 // Returns true if the rotation between |initial_rotation| and |new_rotation| is |
74 // 180 degrees. | 74 // 180 degrees. |
75 bool Is180DegreeFlip(gfx::Display::Rotation initial_rotation, | 75 bool Is180DegreeFlip(gfx::Display::Rotation initial_rotation, |
76 gfx::Display::Rotation new_rotation) { | 76 gfx::Display::Rotation new_rotation) { |
77 return (initial_rotation + 2) % 4 == new_rotation; | 77 return (initial_rotation + 2) % 4 == new_rotation; |
78 } | 78 } |
79 | 79 |
80 // A LayerAnimationObserver that will destroy the contained LayerTreeOwner when | 80 // A LayerAnimationObserver that will destroy the contained LayerTreeOwner when |
(...skipping 66 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
147 void LayerCleanupObserver::OnDetachedFromSequence( | 147 void LayerCleanupObserver::OnDetachedFromSequence( |
148 ui::LayerAnimationSequence* sequence) { | 148 ui::LayerAnimationSequence* sequence) { |
149 DCHECK_EQ(sequence, sequence_); | 149 DCHECK_EQ(sequence, sequence_); |
150 sequence_ = nullptr; | 150 sequence_ = nullptr; |
151 } | 151 } |
152 | 152 |
153 // Set the screen orientation for the given |display| to |new_rotation| and | 153 // Set the screen orientation for the given |display| to |new_rotation| and |
154 // animate the change. | 154 // animate the change. |
155 void RotateScreen(int64 display_id, | 155 void RotateScreen(int64 display_id, |
156 gfx::Display::Rotation new_rotation, | 156 gfx::Display::Rotation new_rotation, |
157 gfx::Display::RotationSource source, | |
158 base::TimeDelta duration, | 157 base::TimeDelta duration, |
159 int rotation_degrees, | 158 int rotation_degrees, |
160 int rotation_degree_offset, | 159 int rotation_degree_offset, |
161 gfx::Tween::Type tween_type, | 160 gfx::Tween::Type tween_type, |
162 bool should_scale) { | 161 bool should_scale) { |
163 aura::Window* root_window = | 162 aura::Window* root_window = |
164 Shell::GetInstance()->display_controller()->GetRootWindowForDisplayId( | 163 Shell::GetInstance()->display_controller()->GetRootWindowForDisplayId( |
165 display_id); | 164 display_id); |
166 | 165 |
167 const gfx::Display::Rotation initial_orientation = | 166 const gfx::Display::Rotation initial_orientation = |
168 GetCurrentRotation(display_id); | 167 GetCurrentRotation(display_id); |
169 | 168 |
170 const gfx::RectF original_screen_bounds = root_window->GetTargetBounds(); | 169 const gfx::RectF original_screen_bounds = root_window->GetTargetBounds(); |
171 // 180 degree rotations should animate clock-wise. | 170 // 180 degree rotations should animate clock-wise. |
172 const int rotation_factor = | 171 const int rotation_factor = |
173 (initial_orientation + 3) % 4 == new_rotation ? 1 : -1; | 172 (initial_orientation + 3) % 4 == new_rotation ? 1 : -1; |
174 | 173 |
175 scoped_ptr<ui::LayerTreeOwner> old_layer_tree = | 174 scoped_ptr<ui::LayerTreeOwner> old_layer_tree = |
176 wm::RecreateLayers(root_window); | 175 wm::RecreateLayers(root_window); |
177 | 176 |
178 // Add the cloned layer tree in to the root, so it will be rendered. | 177 // Add the cloned layer tree in to the root, so it will be rendered. |
179 root_window->layer()->Add(old_layer_tree->root()); | 178 root_window->layer()->Add(old_layer_tree->root()); |
180 root_window->layer()->StackAtTop(old_layer_tree->root()); | 179 root_window->layer()->StackAtTop(old_layer_tree->root()); |
181 | 180 |
182 scoped_ptr<LayerCleanupObserver> layer_cleanup_observer( | 181 scoped_ptr<LayerCleanupObserver> layer_cleanup_observer( |
183 new LayerCleanupObserver(old_layer_tree.Pass())); | 182 new LayerCleanupObserver(old_layer_tree.Pass())); |
184 | 183 |
185 Shell::GetInstance()->display_manager()->SetDisplayRotation( | 184 Shell::GetInstance()->display_manager()->SetDisplayRotation(display_id, |
186 display_id, new_rotation, source); | 185 new_rotation); |
187 | 186 |
188 const gfx::RectF rotated_screen_bounds = root_window->GetTargetBounds(); | 187 const gfx::RectF rotated_screen_bounds = root_window->GetTargetBounds(); |
189 const gfx::Point pivot = gfx::Point(rotated_screen_bounds.width() / 2, | 188 const gfx::Point pivot = gfx::Point(rotated_screen_bounds.width() / 2, |
190 rotated_screen_bounds.height() / 2); | 189 rotated_screen_bounds.height() / 2); |
191 | 190 |
192 gfx::Point3F new_layer_initial_scale = gfx::Point3F(1.0f, 1.0f, 1.0f); | 191 gfx::Point3F new_layer_initial_scale = gfx::Point3F(1.0f, 1.0f, 1.0f); |
193 gfx::Point3F old_layer_target_scale = gfx::Point3F(1.0f, 1.0f, 1.0f); | 192 gfx::Point3F old_layer_target_scale = gfx::Point3F(1.0f, 1.0f, 1.0f); |
194 | 193 |
195 if (should_scale) { | 194 if (should_scale) { |
196 new_layer_initial_scale = gfx::Point3F( | 195 new_layer_initial_scale = gfx::Point3F( |
(...skipping 64 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
261 | 260 |
262 } // namespace | 261 } // namespace |
263 | 262 |
264 ScreenRotationAnimator::ScreenRotationAnimator(int64 display_id) | 263 ScreenRotationAnimator::ScreenRotationAnimator(int64 display_id) |
265 : display_id_(display_id) { | 264 : display_id_(display_id) { |
266 } | 265 } |
267 | 266 |
268 ScreenRotationAnimator::~ScreenRotationAnimator() { | 267 ScreenRotationAnimator::~ScreenRotationAnimator() { |
269 } | 268 } |
270 | 269 |
271 void ScreenRotationAnimator::Rotate(gfx::Display::Rotation new_rotation, | 270 void ScreenRotationAnimator::Rotate(gfx::Display::Rotation new_rotation) { |
272 gfx::Display::RotationSource source) { | |
273 const gfx::Display::Rotation current_rotation = | 271 const gfx::Display::Rotation current_rotation = |
274 GetCurrentRotation(display_id_); | 272 GetCurrentRotation(display_id_); |
275 | 273 |
276 if (current_rotation == new_rotation) | 274 if (current_rotation == new_rotation) |
277 return; | 275 return; |
278 | 276 |
279 const std::string switch_value = | 277 const std::string switch_value = |
280 base::CommandLine::ForCurrentProcess()->GetSwitchValueASCII( | 278 base::CommandLine::ForCurrentProcess()->GetSwitchValueASCII( |
281 switches::kAshEnableScreenRotationAnimation); | 279 switches::kAshEnableScreenRotationAnimation); |
282 | 280 |
283 if (switch_value == kRotationAnimation_None) { | 281 if (switch_value == kRotationAnimation_None) { |
284 Shell::GetInstance()->display_manager()->SetDisplayRotation( | 282 Shell::GetInstance()->display_manager()->SetDisplayRotation(display_id_, |
285 display_id_, new_rotation, source); | 283 new_rotation); |
286 } else if (kRotationAnimation_Default == switch_value || | 284 } else if (kRotationAnimation_Default == switch_value || |
287 kRotationAnimation_Partial == switch_value) { | 285 kRotationAnimation_Partial == switch_value) { |
288 const int rotation_degree_offset = | 286 const int rotation_degree_offset = |
289 Is180DegreeFlip(current_rotation, new_rotation) | 287 Is180DegreeFlip(current_rotation, new_rotation) |
290 ? 180 - kPartialRotationDegrees | 288 ? 180 - kPartialRotationDegrees |
291 : 90 - kPartialRotationDegrees; | 289 : 90 - kPartialRotationDegrees; |
292 | 290 |
293 RotateScreen(display_id_, new_rotation, source, | 291 RotateScreen(display_id_, new_rotation, |
294 base::TimeDelta::FromMilliseconds(kRotationDurationInMs), | 292 base::TimeDelta::FromMilliseconds(kRotationDurationInMs), |
295 kPartialRotationDegrees, rotation_degree_offset, | 293 kPartialRotationDegrees, rotation_degree_offset, |
296 gfx::Tween::FAST_OUT_LINEAR_IN, false /* should_scale */); | 294 gfx::Tween::FAST_OUT_LINEAR_IN, false /* should_scale */); |
297 } else if (kRotationAnimation_Full == switch_value) { | 295 } else if (kRotationAnimation_Full == switch_value) { |
298 const int rotation_degrees = | 296 const int rotation_degrees = |
299 Is180DegreeFlip(current_rotation, new_rotation) ? 180 : 90; | 297 Is180DegreeFlip(current_rotation, new_rotation) ? 180 : 90; |
300 | 298 |
301 RotateScreen(display_id_, new_rotation, source, | 299 RotateScreen(display_id_, new_rotation, |
302 base::TimeDelta::FromMilliseconds(kRotationDurationInMs), | 300 base::TimeDelta::FromMilliseconds(kRotationDurationInMs), |
303 rotation_degrees, 0 /* rotation_degree_offset */, | 301 rotation_degrees, 0 /* rotation_degree_offset */, |
304 gfx::Tween::FAST_OUT_LINEAR_IN, true /* should_scale */); | 302 gfx::Tween::FAST_OUT_LINEAR_IN, true /* should_scale */); |
305 } else { | 303 } else { |
306 NOTREACHED(); | 304 NOTREACHED(); |
307 } | 305 } |
308 } | 306 } |
309 | 307 |
310 } // namespace ash | 308 } // namespace ash |
OLD | NEW |