Chromium Code Reviews| Index: views/animation/screen_rotation_setter.cc |
| diff --git a/views/animation/screen_rotation_setter.cc b/views/animation/screen_rotation_setter.cc |
| new file mode 100644 |
| index 0000000000000000000000000000000000000000..9edd193b01ccb3c13144ba9ba769c21743b0edc5 |
| --- /dev/null |
| +++ b/views/animation/screen_rotation_setter.cc |
| @@ -0,0 +1,69 @@ |
| +// Copyright (c) 2011 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 "views/animation/screen_rotation_setter.h" |
| + |
| +#include "ui/gfx/compositor/layer.h" |
| +#include "ui/gfx/interpolated_transform.h" |
| +#include "views/view.h" |
| + |
| +namespace { |
| + |
| +static int SymmetricRound(float x) { |
| + return static_cast<int>( |
| + x > 0 |
| + ? std::floor(x + 0.5f) |
| + : std::ceil(x - 0.5f)); |
| +} |
| + |
| +} // namespace |
| + |
| +namespace views { |
| + |
| +ScreenRotationSetter::ScreenRotationSetter(views::View* view) |
| + : rotation_(NULL), |
|
sky
2011/08/25 03:00:13
don't need rotation_
|
| + view_(view) { |
| +} |
| + |
| +void ScreenRotationSetter::Installed(ui::Layer* layer) OVERRIDE { |
| +} |
| + |
| +void ScreenRotationSetter::Uninstalled(ui::Layer* layer) OVERRIDE { |
| +} |
| + |
| +void ScreenRotationSetter::SetTransform( |
| + ui::Layer* layer, const ui::Transform& transform) OVERRIDE { |
| + float degrees; |
| + if (!ui::InterpolatedTransform::FactorTRS(transform, NULL, °rees, NULL)) |
| + return; |
| + |
| + if (rotation_.get()) { |
| + rotation_->UpdateTarget(SymmetricRound(degrees)); |
| + } else { |
| + float old_degrees; |
| + if (ui::InterpolatedTransform::FactorTRS(layer->transform(), |
| + NULL, &old_degrees, NULL)) { |
| + rotation_.reset(new views::ScreenRotation(view_, |
| + SymmetricRound(old_degrees), |
| + SymmetricRound(degrees))); |
| + rotation_->set_listener(this); |
| + } |
| + } |
| +} |
| + |
| +void ScreenRotationSetter::SetBounds( |
| + ui::Layer* layer, const gfx::Rect& bounds) { |
|
sky
2011/08/25 03:00:13
nit: each param on its own line.
|
| + // Ignore bounds changes during an animation. |
| + if (rotation_.get() && !rotation_->done()) |
| + return; |
|
sky
2011/08/25 03:00:13
Don't you need to cache and apply the bounds chang
|
| + layer->SetBounds(bounds); |
| +} |
| + |
| +void ScreenRotationSetter::OnScreenRotationCompleted( |
| + views::ScreenRotation* rotation) { |
| + DCHECK(rotation_.get() == rotation); |
|
sky
2011/08/25 03:00:13
nit: DCHECK_EQ
|
| + rotation_.reset(); |
| +} |
| + |
| +} // namespace views |