| // Copyright 2015 The Chromium Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| #include "ash/rotator/screen_rotation_animation.h" |
| |
| #include "base/time/time.h" |
| #include "ui/compositor/layer.h" |
| #include "ui/compositor/layer_animation_delegate.h" |
| #include "ui/gfx/animation/tween.h" |
| #include "ui/gfx/geometry/point.h" |
| #include "ui/gfx/interpolated_transform.h" |
| #include "ui/gfx/transform.h" |
| |
| namespace ash { |
| |
| ScreenRotationAnimation::ScreenRotationAnimation(ui::Layer* layer, |
| int start_degrees, |
| int end_degrees, |
| float initial_opacity, |
| float target_opacity, |
| gfx::Point pivot, |
| base::TimeDelta duration, |
| gfx::Tween::Type tween_type) |
| : ui::LayerAnimationElement( |
| LayerAnimationElement::TRANSFORM | LayerAnimationElement::OPACITY, |
| duration), |
| tween_type_(tween_type), |
| initial_opacity_(initial_opacity), |
| target_opacity_(target_opacity) { |
| std::unique_ptr<ui::InterpolatedTransform> rotation( |
| new ui::InterpolatedTransformAboutPivot( |
| pivot, new ui::InterpolatedRotation(start_degrees, end_degrees))); |
| |
| // Use the target transform/bounds in case the layer is already animating. |
| gfx::Transform current_transform = layer->GetTargetTransform(); |
| interpolated_transform_.reset( |
| new ui::InterpolatedConstantTransform(current_transform)); |
| interpolated_transform_->SetChild(rotation.release()); |
| } |
| |
| ScreenRotationAnimation::~ScreenRotationAnimation() {} |
| |
| void ScreenRotationAnimation::OnStart(ui::LayerAnimationDelegate* delegate) {} |
| |
| bool ScreenRotationAnimation::OnProgress(double current, |
| ui::LayerAnimationDelegate* delegate) { |
| const double tweened = gfx::Tween::CalculateValue(tween_type_, current); |
| delegate->SetTransformFromAnimation( |
| interpolated_transform_->Interpolate(tweened)); |
| delegate->SetOpacityFromAnimation(gfx::Tween::FloatValueBetween( |
| tweened, initial_opacity_, target_opacity_)); |
| return true; |
| } |
| |
| void ScreenRotationAnimation::OnGetTarget(TargetValue* target) const { |
| target->transform = interpolated_transform_->Interpolate(1.0); |
| } |
| |
| void ScreenRotationAnimation::OnAbort(ui::LayerAnimationDelegate* delegate) { |
| // ui::Layer's d'tor passes its ui::LayerAnimator a null delegate before |
| // deleting it. This is then passed here: http://crbug.com/661313 |
| if (!delegate) |
| return; |
| |
| TargetValue target_value; |
| OnGetTarget(&target_value); |
| delegate->SetTransformFromAnimation(target_value.transform); |
| } |
| |
| } // namespace ash |