Index: ash/host/transformer_helper.cc |
diff --git a/ash/host/transformer_helper.cc b/ash/host/transformer_helper.cc |
new file mode 100644 |
index 0000000000000000000000000000000000000000..f68ffc95812fed78e405d033e5cd4dbc92a02dfc |
--- /dev/null |
+++ b/ash/host/transformer_helper.cc |
@@ -0,0 +1,111 @@ |
+// Copyright 2014 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/host/transformer_helper.h" |
+ |
+#include "ash/host/ash_window_tree_host.h" |
+#include "ash/host/root_window_transformer.h" |
+#include "ui/aura/window.h" |
+#include "ui/aura/window_tree_host.h" |
+#include "ui/compositor/dip_util.h" |
+#include "ui/gfx/geometry/insets.h" |
+#include "ui/gfx/geometry/rect.h" |
+#include "ui/gfx/geometry/rect_f.h" |
+#include "ui/gfx/geometry/size.h" |
+#include "ui/gfx/size_conversions.h" |
+#include "ui/gfx/transform.h" |
+ |
+namespace ash { |
+namespace { |
+ |
+// A simple RootWindowTransformer without host insets. |
+class SimpleRootWindowTransformer : public RootWindowTransformer { |
+ public: |
+ SimpleRootWindowTransformer(const aura::Window* root_window, |
+ const gfx::Transform& transform) |
+ : root_window_(root_window), transform_(transform) {} |
+ |
+ // RootWindowTransformer overrides: |
+ virtual gfx::Transform GetTransform() const OVERRIDE { return transform_; } |
+ |
+ virtual gfx::Transform GetInverseTransform() const OVERRIDE { |
+ gfx::Transform invert; |
+ if (!transform_.GetInverse(&invert)) |
+ return transform_; |
+ return invert; |
+ } |
+ |
+ virtual gfx::Rect GetRootWindowBounds(const gfx::Size& host_size) const |
+ OVERRIDE { |
+ gfx::Rect bounds(host_size); |
+ gfx::RectF new_bounds(ui::ConvertRectToDIP(root_window_->layer(), bounds)); |
+ transform_.TransformRect(&new_bounds); |
+ return gfx::Rect(gfx::ToFlooredSize(new_bounds.size())); |
+ } |
+ |
+ virtual gfx::Insets GetHostInsets() const OVERRIDE { return gfx::Insets(); } |
+ |
+ private: |
+ virtual ~SimpleRootWindowTransformer() {} |
+ |
+ const aura::Window* root_window_; |
+ const gfx::Transform transform_; |
+ |
+ DISALLOW_COPY_AND_ASSIGN(SimpleRootWindowTransformer); |
+}; |
+ |
+} // namespace |
+ |
+TransformerHelper::TransformerHelper(AshWindowTreeHost* ash_host) |
+ : ash_host_(ash_host) { |
+ SetTransform(gfx::Transform()); |
+} |
+ |
+TransformerHelper::~TransformerHelper() {} |
+ |
+gfx::Insets TransformerHelper::GetHostInsets() const { |
+ return transformer_->GetHostInsets(); |
+} |
+ |
+void TransformerHelper::SetTransform(const gfx::Transform& transform) { |
+ scoped_ptr<RootWindowTransformer> transformer(new SimpleRootWindowTransformer( |
+ ash_host_->AsWindowTreeHost()->window(), transform)); |
+ SetRootWindowTransformer(transformer.Pass()); |
+} |
+ |
+void TransformerHelper::SetRootWindowTransformer( |
+ scoped_ptr<RootWindowTransformer> transformer) { |
+ transformer_ = transformer.Pass(); |
+ aura::WindowTreeHost* host = ash_host_->AsWindowTreeHost(); |
+ aura::Window* window = host->window(); |
+ window->SetTransform(transformer_->GetTransform()); |
+ // If the layer is not animating, then we need to update the root window |
+ // size immediately. |
+ if (!window->layer()->GetAnimator()->is_animating()) |
+ host->UpdateRootWindowSize(host->GetBounds().size()); |
+} |
+ |
+gfx::Transform TransformerHelper::GetTransform() const { |
+ float scale = ui::GetDeviceScaleFactor( |
+ ash_host_->AsWindowTreeHost()->window()->layer()); |
+ gfx::Transform transform; |
+ transform.Scale(scale, scale); |
+ transform *= transformer_->GetTransform(); |
+ return transform; |
+} |
+ |
+gfx::Transform TransformerHelper::GetInverseTransform() const { |
+ float scale = ui::GetDeviceScaleFactor( |
+ ash_host_->AsWindowTreeHost()->window()->layer()); |
+ gfx::Transform transform; |
+ transform.Scale(1.0f / scale, 1.0f / scale); |
+ return transformer_->GetInverseTransform() * transform; |
+} |
+ |
+void TransformerHelper::UpdateWindowSize(const gfx::Size& host_size) { |
+ ash_host_->AsWindowTreeHost()->window()->SetBounds( |
+ transformer_->GetRootWindowBounds(host_size)); |
+} |
+ |
+} // namespace ash |