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

Side by Side Diff: ash/wm/window_animations.cc

Issue 11418040: gfx::Transform API clean-up (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: . Created 8 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
« no previous file with comments | « ash/wm/session_state_animator.cc ('k') | ash/wm/window_animations_unittest.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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 "ash/wm/window_animations.h" 5 #include "ash/wm/window_animations.h"
6 6
7 #include <math.h> 7 #include <math.h>
8 8
9 #include <algorithm> 9 #include <algorithm>
10 #include <vector> 10 #include <vector>
(...skipping 16 matching lines...) Expand all
27 #include "ui/aura/window_observer.h" 27 #include "ui/aura/window_observer.h"
28 #include "ui/aura/window_property.h" 28 #include "ui/aura/window_property.h"
29 #include "ui/compositor/compositor_observer.h" 29 #include "ui/compositor/compositor_observer.h"
30 #include "ui/compositor/layer.h" 30 #include "ui/compositor/layer.h"
31 #include "ui/compositor/layer_animation_observer.h" 31 #include "ui/compositor/layer_animation_observer.h"
32 #include "ui/compositor/layer_animation_sequence.h" 32 #include "ui/compositor/layer_animation_sequence.h"
33 #include "ui/compositor/layer_animator.h" 33 #include "ui/compositor/layer_animator.h"
34 #include "ui/compositor/scoped_layer_animation_settings.h" 34 #include "ui/compositor/scoped_layer_animation_settings.h"
35 #include "ui/gfx/interpolated_transform.h" 35 #include "ui/gfx/interpolated_transform.h"
36 #include "ui/gfx/screen.h" 36 #include "ui/gfx/screen.h"
37 #include "ui/gfx/vector3d_f.h"
37 #include "ui/views/view.h" 38 #include "ui/views/view.h"
38 #include "ui/views/widget/widget.h" 39 #include "ui/views/widget/widget.h"
39 40
40 DECLARE_WINDOW_PROPERTY_TYPE(int) 41 DECLARE_WINDOW_PROPERTY_TYPE(int)
41 DECLARE_WINDOW_PROPERTY_TYPE(ash::WindowVisibilityAnimationType) 42 DECLARE_WINDOW_PROPERTY_TYPE(ash::WindowVisibilityAnimationType)
42 DECLARE_WINDOW_PROPERTY_TYPE(ash::WindowVisibilityAnimationTransition) 43 DECLARE_WINDOW_PROPERTY_TYPE(ash::WindowVisibilityAnimationTransition)
43 DECLARE_WINDOW_PROPERTY_TYPE(float) 44 DECLARE_WINDOW_PROPERTY_TYPE(float)
44 DECLARE_EXPORTED_WINDOW_PROPERTY_TYPE(ASH_EXPORT, bool) 45 DECLARE_EXPORTED_WINDOW_PROPERTY_TYPE(ASH_EXPORT, bool)
45 46
46 using aura::Window; 47 using aura::Window;
(...skipping 225 matching lines...) Expand 10 before | Expand all | Expand 10 after
272 273
273 base::TimeDelta duration = GetWindowVisibilityAnimationDuration(window); 274 base::TimeDelta duration = GetWindowVisibilityAnimationDuration(window);
274 if (duration.ToInternalValue() > 0) 275 if (duration.ToInternalValue() > 0)
275 settings.SetTransitionDuration(duration); 276 settings.SetTransitionDuration(duration);
276 277
277 window->layer()->SetOpacity(kWindowAnimation_HideOpacity); 278 window->layer()->SetOpacity(kWindowAnimation_HideOpacity);
278 window->layer()->SetTransform(end_transform); 279 window->layer()->SetTransform(end_transform);
279 window->layer()->SetVisible(false); 280 window->layer()->SetVisible(false);
280 } 281 }
281 282
283 static gfx::Transform GetScaleForWindow(aura::Window* window) {
284 gfx::Rect bounds = window->bounds();
285 gfx::Transform scale = gfx::GetScaleTransform(
286 gfx::Point(kWindowAnimation_TranslateFactor * bounds.width(),
287 kWindowAnimation_TranslateFactor * bounds.height()),
288 kWindowAnimation_ScaleFactor);
289 return scale;
290 }
291
282 // Show/Hide windows using a shrink animation. 292 // Show/Hide windows using a shrink animation.
283 void AnimateShowWindow_Drop(aura::Window* window) { 293 void AnimateShowWindow_Drop(aura::Window* window) {
284 gfx::Transform transform; 294 AnimateShowWindowCommon(window, GetScaleForWindow(window), gfx::Transform());
285 transform.ConcatScale(kWindowAnimation_ScaleFactor,
286 kWindowAnimation_ScaleFactor);
287 gfx::Rect bounds = window->bounds();
288 transform.ConcatTranslate(
289 kWindowAnimation_TranslateFactor * bounds.width(),
290 kWindowAnimation_TranslateFactor * bounds.height());
291 AnimateShowWindowCommon(window, transform, gfx::Transform());
292 } 295 }
293 296
294 void AnimateHideWindow_Drop(aura::Window* window) { 297 void AnimateHideWindow_Drop(aura::Window* window) {
295 gfx::Transform transform; 298 AnimateHideWindowCommon(window, GetScaleForWindow(window));
296 transform.ConcatScale(kWindowAnimation_ScaleFactor,
297 kWindowAnimation_ScaleFactor);
298 gfx::Rect bounds = window->bounds();
299 transform.ConcatTranslate(
300 kWindowAnimation_TranslateFactor * bounds.width(),
301 kWindowAnimation_TranslateFactor * bounds.height());
302 AnimateHideWindowCommon(window, transform);
303 } 299 }
304 300
305 // Show/Hide windows using a vertical Glenimation. 301 // Show/Hide windows using a vertical Glenimation.
306 void AnimateShowWindow_Vertical(aura::Window* window) { 302 void AnimateShowWindow_Vertical(aura::Window* window) {
307 gfx::Transform transform; 303 gfx::Transform transform;
308 transform.ConcatTranslate(0, window->GetProperty( 304 transform.Translate(0, window->GetProperty(
309 kWindowVisibilityAnimationVerticalPositionKey)); 305 kWindowVisibilityAnimationVerticalPositionKey));
310 AnimateShowWindowCommon(window, transform, gfx::Transform()); 306 AnimateShowWindowCommon(window, transform, gfx::Transform());
311 } 307 }
312 308
313 void AnimateHideWindow_Vertical(aura::Window* window) { 309 void AnimateHideWindow_Vertical(aura::Window* window) {
314 gfx::Transform transform; 310 gfx::Transform transform;
315 transform.ConcatTranslate(0, window->GetProperty( 311 transform.Translate(0, window->GetProperty(
316 kWindowVisibilityAnimationVerticalPositionKey)); 312 kWindowVisibilityAnimationVerticalPositionKey));
317 AnimateHideWindowCommon(window, transform); 313 AnimateHideWindowCommon(window, transform);
318 } 314 }
319 315
320 // Show/Hide windows using a fade. 316 // Show/Hide windows using a fade.
321 void AnimateShowWindow_Fade(aura::Window* window) { 317 void AnimateShowWindow_Fade(aura::Window* window) {
322 AnimateShowWindowCommon(window, gfx::Transform(), gfx::Transform()); 318 AnimateShowWindowCommon(window, gfx::Transform(), gfx::Transform());
323 } 319 }
324 320
325 void AnimateHideWindow_Fade(aura::Window* window) { 321 void AnimateHideWindow_Fade(aura::Window* window) {
(...skipping 169 matching lines...) Expand 10 before | Expand all | Expand 10 after
495 ui::LayerAnimationElement::CreateOpacityElement( 491 ui::LayerAnimationElement::CreateOpacityElement(
496 show ? kWindowAnimation_ShowOpacity : kWindowAnimation_HideOpacity, 492 show ? kWindowAnimation_ShowOpacity : kWindowAnimation_HideOpacity,
497 duration * kWindowAnimation_Rotate_OpacityDurationPercent / 100)); 493 duration * kWindowAnimation_Rotate_OpacityDurationPercent / 100));
498 opacity->set_tween_type(ui::Tween::EASE_IN_OUT); 494 opacity->set_tween_type(ui::Tween::EASE_IN_OUT);
499 window->layer()->GetAnimator()->ScheduleAnimation( 495 window->layer()->GetAnimator()->ScheduleAnimation(
500 new ui::LayerAnimationSequence(opacity.release())); 496 new ui::LayerAnimationSequence(opacity.release()));
501 497
502 float xcenter = window->bounds().width() * 0.5; 498 float xcenter = window->bounds().width() * 0.5;
503 499
504 gfx::Transform transform; 500 gfx::Transform transform;
505 transform.ConcatTranslate(-xcenter, 0); 501 transform.Translate(xcenter, 0);
506 transform.ConcatPerspectiveDepth(kWindowAnimation_Rotate_PerspectiveDepth); 502 transform.ApplyPerspectiveDepth(kWindowAnimation_Rotate_PerspectiveDepth);
507 transform.ConcatTranslate(xcenter, 0); 503 transform.Translate(-xcenter, 0);
508 scoped_ptr<ui::InterpolatedTransform> perspective( 504 scoped_ptr<ui::InterpolatedTransform> perspective(
509 new ui::InterpolatedConstantTransform(transform)); 505 new ui::InterpolatedConstantTransform(transform));
510 506
511 scoped_ptr<ui::InterpolatedTransform> scale( 507 scoped_ptr<ui::InterpolatedTransform> scale(
512 new ui::InterpolatedScale(1, kWindowAnimation_Rotate_ScaleFactor)); 508 new ui::InterpolatedScale(1, kWindowAnimation_Rotate_ScaleFactor));
513 scoped_ptr<ui::InterpolatedTransform> scale_about_pivot( 509 scoped_ptr<ui::InterpolatedTransform> scale_about_pivot(
514 new ui::InterpolatedTransformAboutPivot( 510 new ui::InterpolatedTransformAboutPivot(
515 gfx::Point(xcenter, kWindowAnimation_Rotate_TranslateY), 511 gfx::Point(xcenter, kWindowAnimation_Rotate_TranslateY),
516 scale.release())); 512 scale.release()));
517 513
518 scoped_ptr<ui::InterpolatedTransform> translation( 514 scoped_ptr<ui::InterpolatedTransform> translation(
519 new ui::InterpolatedTranslation(gfx::Point(), gfx::Point( 515 new ui::InterpolatedTranslation(gfx::Point(), gfx::Point(
520 0, kWindowAnimation_Rotate_TranslateY))); 516 0, kWindowAnimation_Rotate_TranslateY)));
521 517
522 scoped_ptr<ui::InterpolatedTransform> rotation( 518 scoped_ptr<ui::InterpolatedTransform> rotation(
523 new ui::InterpolatedAxisAngleRotation( 519 new ui::InterpolatedAxisAngleRotation(
524 gfx::Point3F(1, 0, 0), 0, kWindowAnimation_Rotate_DegreesX)); 520 gfx::Vector3dF(1, 0, 0), 0, kWindowAnimation_Rotate_DegreesX));
525 521
526 scale_about_pivot->SetChild(perspective.release()); 522 scale_about_pivot->SetChild(perspective.release());
527 translation->SetChild(scale_about_pivot.release()); 523 translation->SetChild(scale_about_pivot.release());
528 rotation->SetChild(translation.release()); 524 rotation->SetChild(translation.release());
529 rotation->SetReversed(show); 525 rotation->SetReversed(show);
530 526
531 scoped_ptr<ui::LayerAnimationElement> transition( 527 scoped_ptr<ui::LayerAnimationElement> transition(
532 ui::LayerAnimationElement::CreateInterpolatedTransformElement( 528 ui::LayerAnimationElement::CreateInterpolatedTransformElement(
533 rotation.release(), duration)); 529 rotation.release(), duration));
534 530
(...skipping 150 matching lines...) Expand 10 before | Expand all | Expand 10 after
685 681
686 // Animation observer owns the old layer and deletes itself. 682 // Animation observer owns the old layer and deletes itself.
687 settings.AddObserver(new internal::CrossFadeObserver(window, old_layer)); 683 settings.AddObserver(new internal::CrossFadeObserver(window, old_layer));
688 settings.SetTransitionDuration(duration); 684 settings.SetTransitionDuration(duration);
689 settings.SetTweenType(tween_type); 685 settings.SetTweenType(tween_type);
690 gfx::Transform out_transform; 686 gfx::Transform out_transform;
691 float scale_x = static_cast<float>(new_bounds.width()) / 687 float scale_x = static_cast<float>(new_bounds.width()) /
692 static_cast<float>(old_bounds.width()); 688 static_cast<float>(old_bounds.width());
693 float scale_y = static_cast<float>(new_bounds.height()) / 689 float scale_y = static_cast<float>(new_bounds.height()) /
694 static_cast<float>(old_bounds.height()); 690 static_cast<float>(old_bounds.height());
695 out_transform.ConcatScale(scale_x, scale_y); 691 out_transform.Translate(new_bounds.x() - old_bounds.x(),
696 out_transform.ConcatTranslate(new_bounds.x() - old_bounds.x(), 692 new_bounds.y() - old_bounds.y());
697 new_bounds.y() - old_bounds.y()); 693 out_transform.Scale(scale_x, scale_y);
698 old_layer->SetTransform(out_transform); 694 old_layer->SetTransform(out_transform);
699 if (old_on_top) { 695 if (old_on_top) {
700 // The old layer is on top, and should fade out. The new layer below will 696 // The old layer is on top, and should fade out. The new layer below will
701 // stay opaque to block the desktop. 697 // stay opaque to block the desktop.
702 old_layer->SetOpacity(0.f); 698 old_layer->SetOpacity(0.f);
703 } 699 }
704 // In tests |old_layer| is deleted here, as animations have zero duration. 700 // In tests |old_layer| is deleted here, as animations have zero duration.
705 old_layer = NULL; 701 old_layer = NULL;
706 } 702 }
707 703
708 // Set the new layer's current transform, such that the user sees a scaled 704 // Set the new layer's current transform, such that the user sees a scaled
709 // version of the window with the original bounds at the original position. 705 // version of the window with the original bounds at the original position.
710 gfx::Transform in_transform; 706 gfx::Transform in_transform;
711 const float scale_x = static_cast<float>(old_bounds.width()) / 707 const float scale_x = static_cast<float>(old_bounds.width()) /
712 static_cast<float>(new_bounds.width()); 708 static_cast<float>(new_bounds.width());
713 const float scale_y = static_cast<float>(old_bounds.height()) / 709 const float scale_y = static_cast<float>(old_bounds.height()) /
714 static_cast<float>(new_bounds.height()); 710 static_cast<float>(new_bounds.height());
715 in_transform.ConcatScale(scale_x, scale_y); 711 in_transform.Translate(old_bounds.x() - new_bounds.x(),
716 in_transform.ConcatTranslate(old_bounds.x() - new_bounds.x(),
717 old_bounds.y() - new_bounds.y()); 712 old_bounds.y() - new_bounds.y());
713 in_transform.Scale(scale_x, scale_y);
718 window->layer()->SetTransform(in_transform); 714 window->layer()->SetTransform(in_transform);
719 if (!old_on_top) { 715 if (!old_on_top) {
720 // The new layer is on top and should fade in. The old layer below will 716 // The new layer is on top and should fade in. The old layer below will
721 // stay opaque and block the desktop. 717 // stay opaque and block the desktop.
722 window->layer()->SetOpacity(0.f); 718 window->layer()->SetOpacity(0.f);
723 } 719 }
724 { 720 {
725 // Animate the new layer to the identity transform, so the window goes to 721 // Animate the new layer to the identity transform, so the window goes to
726 // its newly set bounds. 722 // its newly set bounds.
727 ui::ScopedLayerAnimationSettings settings(window->layer()->GetAnimator()); 723 ui::ScopedLayerAnimationSettings settings(window->layer()->GetAnimator());
(...skipping 157 matching lines...) Expand 10 before | Expand all | Expand 10 after
885 881
886 std::vector<ui::LayerAnimationSequence*> animations; 882 std::vector<ui::LayerAnimationSequence*> animations;
887 animations.push_back(brightness_sequence.release()); 883 animations.push_back(brightness_sequence.release());
888 animations.push_back(grayscale_sequence.release()); 884 animations.push_back(grayscale_sequence.release());
889 885
890 return animations; 886 return animations;
891 } 887 }
892 888
893 } // namespace internal 889 } // namespace internal
894 } // namespace ash 890 } // namespace ash
OLDNEW
« no previous file with comments | « ash/wm/session_state_animator.cc ('k') | ash/wm/window_animations_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698