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