• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 // Copyright (c) 2012 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 
5 #include "ui/aura/test/test_screen.h"
6 
7 #include "base/logging.h"
8 #include "ui/aura/env.h"
9 #include "ui/aura/window.h"
10 #include "ui/aura/window_event_dispatcher.h"
11 #include "ui/aura/window_tree_host.h"
12 #include "ui/gfx/geometry/size_conversions.h"
13 #include "ui/gfx/native_widget_types.h"
14 #include "ui/gfx/rect_conversions.h"
15 #include "ui/gfx/screen.h"
16 
17 namespace aura {
18 
19 namespace {
20 
IsRotationPortrait(gfx::Display::Rotation rotation)21 bool IsRotationPortrait(gfx::Display::Rotation rotation) {
22   return rotation == gfx::Display::ROTATE_90 ||
23          rotation == gfx::Display::ROTATE_270;
24 }
25 
26 }  // namespace
27 
28 // static
Create(const gfx::Size & size)29 TestScreen* TestScreen::Create(const gfx::Size& size) {
30   const gfx::Size kDefaultSize(800, 600);
31   // Use (0,0) because the desktop aura tests are executed in
32   // native environment where the display's origin is (0,0).
33   return new TestScreen(gfx::Rect(size.IsEmpty() ? kDefaultSize : size));
34 }
35 
36 // static
CreateFullscreen()37 TestScreen* TestScreen::CreateFullscreen() {
38   return new TestScreen(gfx::Rect(WindowTreeHost::GetNativeScreenSize()));
39 }
40 
~TestScreen()41 TestScreen::~TestScreen() {
42 }
43 
CreateHostForPrimaryDisplay()44 WindowTreeHost* TestScreen::CreateHostForPrimaryDisplay() {
45   DCHECK(!host_);
46   host_ = WindowTreeHost::Create(gfx::Rect(display_.GetSizeInPixel()));
47   host_->window()->AddObserver(this);
48   host_->InitHost();
49   return host_;
50 }
51 
SetDeviceScaleFactor(float device_scale_factor)52 void TestScreen::SetDeviceScaleFactor(float device_scale_factor) {
53   gfx::Rect bounds_in_pixel(display_.GetSizeInPixel());
54   display_.SetScaleAndBounds(device_scale_factor, bounds_in_pixel);
55   host_->OnHostResized(bounds_in_pixel.size());
56 }
57 
SetDisplayRotation(gfx::Display::Rotation rotation)58 void TestScreen::SetDisplayRotation(gfx::Display::Rotation rotation) {
59   gfx::Rect bounds_in_pixel(display_.GetSizeInPixel());
60   gfx::Rect new_bounds(bounds_in_pixel);
61   if (IsRotationPortrait(rotation) != IsRotationPortrait(display_.rotation())) {
62     new_bounds.set_width(bounds_in_pixel.height());
63     new_bounds.set_height(bounds_in_pixel.width());
64   }
65   display_.set_rotation(rotation);
66   display_.SetScaleAndBounds(display_.device_scale_factor(), new_bounds);
67   host_->SetRootTransform(GetRotationTransform() * GetUIScaleTransform());
68 }
69 
SetUIScale(float ui_scale)70 void TestScreen::SetUIScale(float ui_scale) {
71   ui_scale_ = ui_scale;
72   gfx::Rect bounds_in_pixel(display_.GetSizeInPixel());
73   gfx::Rect new_bounds = gfx::ToNearestRect(
74       gfx::ScaleRect(bounds_in_pixel, 1.0f / ui_scale));
75   display_.SetScaleAndBounds(display_.device_scale_factor(), new_bounds);
76   host_->SetRootTransform(GetRotationTransform() * GetUIScaleTransform());
77 }
78 
SetWorkAreaInsets(const gfx::Insets & insets)79 void TestScreen::SetWorkAreaInsets(const gfx::Insets& insets) {
80   display_.UpdateWorkAreaFromInsets(insets);
81 }
82 
GetRotationTransform() const83 gfx::Transform TestScreen::GetRotationTransform() const {
84   gfx::Transform rotate;
85   switch (display_.rotation()) {
86     case gfx::Display::ROTATE_0:
87       break;
88     case gfx::Display::ROTATE_90:
89       rotate.Translate(display_.bounds().height(), 0);
90       rotate.Rotate(90);
91       break;
92     case gfx::Display::ROTATE_270:
93       rotate.Translate(0, display_.bounds().width());
94       rotate.Rotate(270);
95       break;
96     case gfx::Display::ROTATE_180:
97       rotate.Translate(display_.bounds().width(),
98                        display_.bounds().height());
99       rotate.Rotate(180);
100       break;
101   }
102 
103   return rotate;
104 }
105 
GetUIScaleTransform() const106 gfx::Transform TestScreen::GetUIScaleTransform() const {
107   gfx::Transform ui_scale;
108   ui_scale.Scale(1.0f / ui_scale_, 1.0f / ui_scale_);
109   return ui_scale;
110 }
111 
IsDIPEnabled()112 bool TestScreen::IsDIPEnabled() {
113   return true;
114 }
115 
OnWindowBoundsChanged(Window * window,const gfx::Rect & old_bounds,const gfx::Rect & new_bounds)116 void TestScreen::OnWindowBoundsChanged(
117     Window* window, const gfx::Rect& old_bounds, const gfx::Rect& new_bounds) {
118   DCHECK_EQ(host_->window(), window);
119   display_.SetSize(gfx::ToFlooredSize(
120       gfx::ScaleSize(new_bounds.size(), display_.device_scale_factor())));
121 }
122 
OnWindowDestroying(Window * window)123 void TestScreen::OnWindowDestroying(Window* window) {
124   if (host_->window() == window)
125     host_ = NULL;
126 }
127 
GetCursorScreenPoint()128 gfx::Point TestScreen::GetCursorScreenPoint() {
129   return Env::GetInstance()->last_mouse_location();
130 }
131 
GetWindowUnderCursor()132 gfx::NativeWindow TestScreen::GetWindowUnderCursor() {
133   return GetWindowAtScreenPoint(GetCursorScreenPoint());
134 }
135 
GetWindowAtScreenPoint(const gfx::Point & point)136 gfx::NativeWindow TestScreen::GetWindowAtScreenPoint(const gfx::Point& point) {
137   return host_->window()->GetTopWindowContainingPoint(point);
138 }
139 
GetNumDisplays() const140 int TestScreen::GetNumDisplays() const {
141   return 1;
142 }
143 
GetAllDisplays() const144 std::vector<gfx::Display> TestScreen::GetAllDisplays() const {
145   return std::vector<gfx::Display>(1, display_);
146 }
147 
GetDisplayNearestWindow(gfx::NativeWindow window) const148 gfx::Display TestScreen::GetDisplayNearestWindow(
149     gfx::NativeWindow window) const {
150   return display_;
151 }
152 
GetDisplayNearestPoint(const gfx::Point & point) const153 gfx::Display TestScreen::GetDisplayNearestPoint(const gfx::Point& point) const {
154   return display_;
155 }
156 
GetDisplayMatching(const gfx::Rect & match_rect) const157 gfx::Display TestScreen::GetDisplayMatching(const gfx::Rect& match_rect) const {
158   return display_;
159 }
160 
GetPrimaryDisplay() const161 gfx::Display TestScreen::GetPrimaryDisplay() const {
162   return display_;
163 }
164 
AddObserver(gfx::DisplayObserver * observer)165 void TestScreen::AddObserver(gfx::DisplayObserver* observer) {
166 }
167 
RemoveObserver(gfx::DisplayObserver * observer)168 void TestScreen::RemoveObserver(gfx::DisplayObserver* observer) {
169 }
170 
TestScreen(const gfx::Rect & screen_bounds)171 TestScreen::TestScreen(const gfx::Rect& screen_bounds)
172     : host_(NULL),
173       ui_scale_(1.0f) {
174   static int64 synthesized_display_id = 2000;
175   display_.set_id(synthesized_display_id++);
176   display_.SetScaleAndBounds(1.0f, screen_bounds);
177 }
178 
179 }  // namespace aura
180