Index: ash/wm/window_animations.cc |
diff --git a/ash/wm/window_animations.cc b/ash/wm/window_animations.cc |
index b6fcfa7828a5c4295da109659798e08548c49e45..87434144495afda990ddaed5eee464aa88a25bf7 100644 |
--- a/ash/wm/window_animations.cc |
+++ b/ash/wm/window_animations.cc |
@@ -67,12 +67,12 @@ int64 Round64(float f) { |
} |
base::TimeDelta GetCrossFadeDuration(aura::Window* window, |
- const gfx::Rect& old_bounds, |
+ const gfx::RectF& old_bounds, |
const gfx::Rect& new_bounds) { |
if (::wm::WindowAnimationsDisabled(window)) |
return base::TimeDelta(); |
- int old_area = old_bounds.width() * old_bounds.height(); |
+ int old_area = static_cast<int>(old_bounds.width() * old_bounds.height()); |
int new_area = new_bounds.width() * new_bounds.height(); |
int max_area = std::max(old_area, new_area); |
// Avoid divide by zero. |
@@ -327,17 +327,25 @@ base::TimeDelta CrossFadeAnimation( |
gfx::Tween::Type tween_type) { |
DCHECK(old_layer_owner->root()); |
const gfx::Rect old_bounds(old_layer_owner->root()->bounds()); |
+ gfx::RectF old_transformed_bounds(old_bounds); |
+ gfx::Transform old_transform(old_layer_owner->root()->transform()); |
+ gfx::Transform old_transform_in_root; |
+ old_transform_in_root.Translate(old_bounds.x(), old_bounds.y()); |
+ old_transform_in_root.PreconcatTransform(old_transform); |
+ old_transform_in_root.Translate(-old_bounds.x(), -old_bounds.y()); |
+ old_transform_in_root.TransformRect(&old_transformed_bounds); |
const gfx::Rect new_bounds(window->bounds()); |
const bool old_on_top = (old_bounds.width() > new_bounds.width()); |
// Shorten the animation if there's not much visual movement. |
const base::TimeDelta duration = GetCrossFadeDuration(window, |
- old_bounds, new_bounds); |
+ old_transformed_bounds, new_bounds); |
// Scale up the old layer while translating to new position. |
{ |
ui::Layer* old_layer = old_layer_owner->root(); |
old_layer->GetAnimator()->StopAnimating(); |
+ old_layer->SetTransform(old_transform); |
ui::ScopedLayerAnimationSettings settings(old_layer->GetAnimator()); |
// Animation observer owns the old layer and deletes itself. |
@@ -365,12 +373,12 @@ base::TimeDelta CrossFadeAnimation( |
// Set the new layer's current transform, such that the user sees a scaled |
// version of the window with the original bounds at the original position. |
gfx::Transform in_transform; |
- const float scale_x = static_cast<float>(old_bounds.width()) / |
+ const float scale_x = old_transformed_bounds.width() / |
static_cast<float>(new_bounds.width()); |
- const float scale_y = static_cast<float>(old_bounds.height()) / |
+ const float scale_y = old_transformed_bounds.height() / |
static_cast<float>(new_bounds.height()); |
- in_transform.Translate(old_bounds.x() - new_bounds.x(), |
- old_bounds.y() - new_bounds.y()); |
+ in_transform.Translate(old_transformed_bounds.x() - new_bounds.x(), |
+ old_transformed_bounds.y() - new_bounds.y()); |
in_transform.Scale(scale_x, scale_y); |
window->layer()->SetTransform(in_transform); |
if (!old_on_top) { |