OLD | NEW |
1 // Copyright (c) 2013 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2013 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "ash/display/root_window_transformers.h" | 5 #include "ash/display/root_window_transformers.h" |
6 | 6 |
7 #include <cmath> | 7 #include <cmath> |
8 | 8 |
9 #include "ash/ash_switches.h" | 9 #include "ash/ash_switches.h" |
10 #include "ash/display/display_info.h" | 10 #include "ash/display/display_info.h" |
(...skipping 127 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
138 // RootWindowTransformer for ash environment. | 138 // RootWindowTransformer for ash environment. |
139 class AshRootWindowTransformer : public RootWindowTransformer { | 139 class AshRootWindowTransformer : public RootWindowTransformer { |
140 public: | 140 public: |
141 AshRootWindowTransformer(aura::Window* root, | 141 AshRootWindowTransformer(aura::Window* root, |
142 const gfx::Display& display) | 142 const gfx::Display& display) |
143 : root_window_(root) { | 143 : root_window_(root) { |
144 DisplayManager* display_manager = Shell::GetInstance()->display_manager(); | 144 DisplayManager* display_manager = Shell::GetInstance()->display_manager(); |
145 DisplayInfo info = display_manager->GetDisplayInfo(display.id()); | 145 DisplayInfo info = display_manager->GetDisplayInfo(display.id()); |
146 host_insets_ = info.GetOverscanInsetsInPixel(); | 146 host_insets_ = info.GetOverscanInsetsInPixel(); |
147 root_window_ui_scale_ = info.GetEffectiveUIScale(); | 147 root_window_ui_scale_ = info.GetEffectiveUIScale(); |
148 // In unified mode, the scaling happen when mirroring, so don't apply | |
149 // scaling to the root window. | |
150 const float apply_ui_scale = | |
151 display_manager->IsInUnifiedMode() ? 1.0f : root_window_ui_scale_; | |
152 | |
153 root_window_bounds_transform_ = | 148 root_window_bounds_transform_ = |
154 CreateInsetsAndScaleTransform( | 149 CreateInsetsAndScaleTransform(host_insets_, |
155 host_insets_, display.device_scale_factor(), apply_ui_scale) * | 150 display.device_scale_factor(), |
| 151 root_window_ui_scale_) * |
156 CreateRotationTransform(root, display); | 152 CreateRotationTransform(root, display); |
157 if (base::CommandLine::ForCurrentProcess()->HasSwitch( | 153 if (base::CommandLine::ForCurrentProcess()->HasSwitch( |
158 switches::kAshEnableMirroredScreen)) { | 154 switches::kAshEnableMirroredScreen)) { |
159 // Apply the tranform that flips the screen image horizontally so that | 155 // Apply the tranform that flips the screen image horizontally so that |
160 // the screen looks normal when reflected on a mirror. | 156 // the screen looks normal when reflected on a mirror. |
161 root_window_bounds_transform_ = | 157 root_window_bounds_transform_ = |
162 root_window_bounds_transform_ * CreateMirrorTransform(display); | 158 root_window_bounds_transform_ * CreateMirrorTransform(display); |
163 } | 159 } |
164 transform_ = root_window_bounds_transform_ * CreateMagnifierTransform(root); | 160 transform_ = root_window_bounds_transform_ * CreateMagnifierTransform(root); |
165 | 161 |
166 CHECK(transform_.GetInverse(&invert_transform_)); | 162 CHECK(transform_.GetInverse(&invert_transform_)); |
167 } | 163 } |
168 | 164 |
169 // aura::RootWindowTransformer overrides: | 165 // aura::RootWindowTransformer overrides: |
170 gfx::Transform GetTransform() const override { return transform_; } | 166 gfx::Transform GetTransform() const override { return transform_; } |
171 gfx::Transform GetInverseTransform() const override { | 167 gfx::Transform GetInverseTransform() const override { |
172 return invert_transform_; | 168 return invert_transform_; |
173 } | 169 } |
174 gfx::Rect GetRootWindowBounds(const gfx::Size& host_size) const override { | 170 gfx::Rect GetRootWindowBounds(const gfx::Size& host_size) const override { |
175 gfx::Rect bounds(host_size); | 171 gfx::Rect bounds(host_size); |
176 bounds.Inset(host_insets_); | 172 bounds.Inset(host_insets_); |
177 bounds = ui::ConvertRectToDIP(root_window_->layer(), bounds); | 173 bounds = ui::ConvertRectToDIP(root_window_->layer(), bounds); |
178 gfx::RectF new_bounds(bounds); | 174 gfx::RectF new_bounds(bounds); |
179 root_window_bounds_transform_.TransformRect(&new_bounds); | 175 root_window_bounds_transform_.TransformRect(&new_bounds); |
180 if (Shell::GetInstance()->display_manager()->IsInUnifiedMode()) { | 176 // Apply |root_window_scale_| twice as the downscaling |
181 new_bounds.Scale(root_window_ui_scale_); | 177 // is already applied once in |SetTransformInternal()|. |
182 } else { | 178 // TODO(oshima): This is a bit ugly. Consider specifying |
183 // Apply |root_window_scale_| twice as the downscaling | 179 // the pseudo host resolution instead. |
184 // is already applied once in |SetTransformInternal()|. | 180 new_bounds.Scale(root_window_ui_scale_ * root_window_ui_scale_); |
185 // TODO(oshima): This is a bit ugly. Consider specifying | |
186 // the pseudo host resolution instead. | |
187 new_bounds.Scale(root_window_ui_scale_ * root_window_ui_scale_); | |
188 } | |
189 // Ignore the origin because RootWindow's insets are handled by | 181 // Ignore the origin because RootWindow's insets are handled by |
190 // the transform. | 182 // the transform. |
191 // Floor the size because the bounds is no longer aligned to | 183 // Floor the size because the bounds is no longer aligned to |
192 // backing pixel when |root_window_scale_| is specified | 184 // backing pixel when |root_window_scale_| is specified |
193 // (850 height at 1.25 scale becomes 1062.5 for example.) | 185 // (850 height at 1.25 scale becomes 1062.5 for example.) |
194 return gfx::Rect(gfx::ToFlooredSize(new_bounds.size())); | 186 return gfx::Rect(gfx::ToFlooredSize(new_bounds.size())); |
195 } | 187 } |
196 | 188 |
197 gfx::Insets GetHostInsets() const override { return host_insets_; } | 189 gfx::Insets GetHostInsets() const override { return host_insets_; } |
198 | 190 |
(...skipping 81 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
280 gfx::Rect root_bounds_; | 272 gfx::Rect root_bounds_; |
281 gfx::Insets insets_; | 273 gfx::Insets insets_; |
282 | 274 |
283 DISALLOW_COPY_AND_ASSIGN(MirrorRootWindowTransformer); | 275 DISALLOW_COPY_AND_ASSIGN(MirrorRootWindowTransformer); |
284 }; | 276 }; |
285 | 277 |
286 class PartialBoundsRootWindowTransformer : public RootWindowTransformer { | 278 class PartialBoundsRootWindowTransformer : public RootWindowTransformer { |
287 public: | 279 public: |
288 PartialBoundsRootWindowTransformer(const gfx::Rect& screen_bounds, | 280 PartialBoundsRootWindowTransformer(const gfx::Rect& screen_bounds, |
289 const gfx::Display& display) { | 281 const gfx::Display& display) { |
| 282 gfx::Display unified_display = |
| 283 Shell::GetInstance()->GetScreen()->GetPrimaryDisplay(); |
290 DisplayInfo display_info = | 284 DisplayInfo display_info = |
291 Shell::GetInstance()->display_manager()->GetDisplayInfo(display.id()); | 285 Shell::GetInstance()->display_manager()->GetDisplayInfo(display.id()); |
292 root_bounds_ = gfx::Rect(display_info.bounds_in_native().size()); | 286 root_bounds_ = gfx::Rect(display_info.bounds_in_native().size()); |
293 float scale = | 287 float scale = root_bounds_.height() / |
294 root_bounds_.height() / static_cast<float>(screen_bounds.height()); | 288 static_cast<float>(screen_bounds.height()) / |
| 289 unified_display.device_scale_factor(); |
295 transform_.Scale(scale, scale); | 290 transform_.Scale(scale, scale); |
296 transform_.Translate(-SkIntToMScalar(display.bounds().x()), | 291 transform_.Translate(-SkIntToMScalar(display.bounds().x()), |
297 -SkIntToMScalar(display.bounds().y())); | 292 -SkIntToMScalar(display.bounds().y())); |
298 } | 293 } |
299 | 294 |
300 // RootWindowTransformer: | 295 // RootWindowTransformer: |
301 gfx::Transform GetTransform() const override { return transform_; } | 296 gfx::Transform GetTransform() const override { return transform_; } |
302 gfx::Transform GetInverseTransform() const override { | 297 gfx::Transform GetInverseTransform() const override { |
303 gfx::Transform invert; | 298 gfx::Transform invert; |
304 CHECK(transform_.GetInverse(&invert)); | 299 CHECK(transform_.GetInverse(&invert)); |
(...skipping 26 matching lines...) Expand all Loading... |
331 mirror_display_info); | 326 mirror_display_info); |
332 } | 327 } |
333 | 328 |
334 RootWindowTransformer* CreateRootWindowTransformerForUnifiedDesktop( | 329 RootWindowTransformer* CreateRootWindowTransformerForUnifiedDesktop( |
335 const gfx::Rect& screen_bounds, | 330 const gfx::Rect& screen_bounds, |
336 const gfx::Display& display) { | 331 const gfx::Display& display) { |
337 return new PartialBoundsRootWindowTransformer(screen_bounds, display); | 332 return new PartialBoundsRootWindowTransformer(screen_bounds, display); |
338 } | 333 } |
339 | 334 |
340 } // namespace ash | 335 } // namespace ash |
OLD | NEW |