transformer_helper.cc 4.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130
  1. // Copyright 2014 The Chromium Authors. All rights reserved.
  2. // Use of this source code is governed by a BSD-style license that can be
  3. // found in the LICENSE file.
  4. #include "ash/host/transformer_helper.h"
  5. #include <utility>
  6. #include "ash/host/ash_window_tree_host.h"
  7. #include "ash/host/root_window_transformer.h"
  8. #include "ui/aura/window.h"
  9. #include "ui/aura/window_tree_host.h"
  10. #include "ui/compositor/layer.h"
  11. #include "ui/compositor/layer_animation_element.h"
  12. #include "ui/compositor/layer_animator.h"
  13. #include "ui/display/display.h"
  14. #include "ui/display/screen.h"
  15. #include "ui/gfx/geometry/dip_util.h"
  16. #include "ui/gfx/geometry/insets.h"
  17. #include "ui/gfx/geometry/rect.h"
  18. #include "ui/gfx/geometry/rect_conversions.h"
  19. #include "ui/gfx/geometry/rect_f.h"
  20. #include "ui/gfx/geometry/size.h"
  21. #include "ui/gfx/geometry/size_conversions.h"
  22. #include "ui/gfx/geometry/transform.h"
  23. namespace ash {
  24. namespace {
  25. // A simple RootWindowTransformer without host insets.
  26. class SimpleRootWindowTransformer : public RootWindowTransformer {
  27. public:
  28. SimpleRootWindowTransformer(const aura::Window* root_window,
  29. const gfx::Transform& transform)
  30. : root_window_(root_window), transform_(transform) {}
  31. SimpleRootWindowTransformer(const SimpleRootWindowTransformer&) = delete;
  32. SimpleRootWindowTransformer& operator=(const SimpleRootWindowTransformer&) =
  33. delete;
  34. // RootWindowTransformer overrides:
  35. gfx::Transform GetTransform() const override { return transform_; }
  36. gfx::Transform GetInverseTransform() const override {
  37. gfx::Transform invert;
  38. if (!transform_.GetInverse(&invert))
  39. return transform_;
  40. return invert;
  41. }
  42. gfx::Rect GetRootWindowBounds(const gfx::Size& host_size) const override {
  43. gfx::Rect host_bounds_in_pixels(host_size);
  44. gfx::RectF host_bounds_in_dips = gfx::ConvertRectToDips(
  45. host_bounds_in_pixels, root_window_->layer()->device_scale_factor());
  46. gfx::RectF root_window_bounds = host_bounds_in_dips;
  47. GetInverseTransform().TransformRect(&root_window_bounds);
  48. return gfx::Rect(gfx::ToFlooredSize(root_window_bounds.size()));
  49. }
  50. gfx::Insets GetHostInsets() const override { return gfx::Insets(); }
  51. gfx::Transform GetInsetsAndScaleTransform() const override {
  52. return transform_;
  53. }
  54. private:
  55. ~SimpleRootWindowTransformer() override = default;
  56. const aura::Window* root_window_;
  57. const gfx::Transform transform_;
  58. };
  59. } // namespace
  60. TransformerHelper::TransformerHelper(AshWindowTreeHost* ash_host)
  61. : ash_host_(ash_host) {}
  62. TransformerHelper::~TransformerHelper() = default;
  63. void TransformerHelper::Init() {
  64. SetTransform(gfx::Transform());
  65. }
  66. gfx::Insets TransformerHelper::GetHostInsets() const {
  67. return transformer_->GetHostInsets();
  68. }
  69. void TransformerHelper::SetTransform(const gfx::Transform& transform) {
  70. std::unique_ptr<RootWindowTransformer> transformer(
  71. new SimpleRootWindowTransformer(ash_host_->AsWindowTreeHost()->window(),
  72. transform));
  73. SetRootWindowTransformer(std::move(transformer));
  74. }
  75. void TransformerHelper::SetRootWindowTransformer(
  76. std::unique_ptr<RootWindowTransformer> transformer) {
  77. transformer_ = std::move(transformer);
  78. aura::WindowTreeHost* host = ash_host_->AsWindowTreeHost();
  79. aura::Window* window = host->window();
  80. window->SetTransform(transformer_->GetInsetsAndScaleTransform());
  81. // If the layer is not animating with a transform animation, then we need to
  82. // update the root window size immediately.
  83. if (!window->layer()->GetAnimator()->IsAnimatingProperty(
  84. ui::LayerAnimationElement::TRANSFORM)) {
  85. ash_host_->UpdateRootWindowSize();
  86. }
  87. }
  88. gfx::Transform TransformerHelper::GetTransform() const {
  89. float scale =
  90. ash_host_->AsWindowTreeHost()->window()->layer()->device_scale_factor();
  91. gfx::Transform transform;
  92. transform.Scale(scale, scale);
  93. transform *= transformer_->GetTransform();
  94. return transform;
  95. }
  96. gfx::Transform TransformerHelper::GetInverseTransform() const {
  97. float scale =
  98. ash_host_->AsWindowTreeHost()->window()->layer()->device_scale_factor();
  99. gfx::Transform transform;
  100. transform.Scale(1.0f / scale, 1.0f / scale);
  101. return transformer_->GetInverseTransform() * transform;
  102. }
  103. gfx::Rect TransformerHelper::GetTransformedWindowBounds(
  104. const gfx::Size& host_size) const {
  105. return transformer_->GetRootWindowBounds(host_size);
  106. }
  107. } // namespace ash