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 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 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 37 TestScreen* TestScreen::CreateFullscreen() { 38 return new TestScreen(gfx::Rect(WindowTreeHost::GetNativeScreenSize())); 39 } 40 41 TestScreen::~TestScreen() { 42 } 43 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 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 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 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 79 void TestScreen::SetWorkAreaInsets(const gfx::Insets& insets) { 80 display_.UpdateWorkAreaFromInsets(insets); 81 } 82 83 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 106 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 112 bool TestScreen::IsDIPEnabled() { 113 return true; 114 } 115 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 123 void TestScreen::OnWindowDestroying(Window* window) { 124 if (host_->window() == window) 125 host_ = NULL; 126 } 127 128 gfx::Point TestScreen::GetCursorScreenPoint() { 129 return Env::GetInstance()->last_mouse_location(); 130 } 131 132 gfx::NativeWindow TestScreen::GetWindowUnderCursor() { 133 return GetWindowAtScreenPoint(GetCursorScreenPoint()); 134 } 135 136 gfx::NativeWindow TestScreen::GetWindowAtScreenPoint(const gfx::Point& point) { 137 return host_->window()->GetTopWindowContainingPoint(point); 138 } 139 140 int TestScreen::GetNumDisplays() const { 141 return 1; 142 } 143 144 std::vector<gfx::Display> TestScreen::GetAllDisplays() const { 145 return std::vector<gfx::Display>(1, display_); 146 } 147 148 gfx::Display TestScreen::GetDisplayNearestWindow( 149 gfx::NativeWindow window) const { 150 return display_; 151 } 152 153 gfx::Display TestScreen::GetDisplayNearestPoint(const gfx::Point& point) const { 154 return display_; 155 } 156 157 gfx::Display TestScreen::GetDisplayMatching(const gfx::Rect& match_rect) const { 158 return display_; 159 } 160 161 gfx::Display TestScreen::GetPrimaryDisplay() const { 162 return display_; 163 } 164 165 void TestScreen::AddObserver(gfx::DisplayObserver* observer) { 166 } 167 168 void TestScreen::RemoveObserver(gfx::DisplayObserver* observer) { 169 } 170 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