OLD | NEW |
1 // Copyright 2014 The Chromium Authors. All rights reserved. | 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 | 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/touch/touch_transformer_controller.h" | 5 #include "ash/touch/touch_transformer_controller.h" |
6 | 6 |
7 #include "ash/display/display_controller.h" | 7 #include "ash/display/display_controller.h" |
8 #include "ash/display/display_manager.h" | 8 #include "ash/display/display_manager.h" |
9 #include "ash/host/ash_window_tree_host.h" | 9 #include "ash/host/ash_window_tree_host.h" |
10 #include "ash/root_window_controller.h" | 10 #include "ash/root_window_controller.h" |
(...skipping 25 matching lines...) Expand all Loading... |
36 double TouchTransformerController::GetTouchResolutionScale( | 36 double TouchTransformerController::GetTouchResolutionScale( |
37 const DisplayInfo& touch_display) const { | 37 const DisplayInfo& touch_display) const { |
38 if (touch_display.touch_device_id() == 0) | 38 if (touch_display.touch_device_id() == 0) |
39 return 1.0; | 39 return 1.0; |
40 | 40 |
41 double min_x, max_x; | 41 double min_x, max_x; |
42 double min_y, max_y; | 42 double min_y, max_y; |
43 if (!ui::DeviceDataManagerX11::GetInstance()->GetDataRange( | 43 if (!ui::DeviceDataManagerX11::GetInstance()->GetDataRange( |
44 touch_display.touch_device_id(), | 44 touch_display.touch_device_id(), |
45 ui::DeviceDataManagerX11::DT_TOUCH_POSITION_X, | 45 ui::DeviceDataManagerX11::DT_TOUCH_POSITION_X, |
46 &min_x, &max_x) || | 46 &min_x, |
| 47 &max_x) || |
47 !ui::DeviceDataManagerX11::GetInstance()->GetDataRange( | 48 !ui::DeviceDataManagerX11::GetInstance()->GetDataRange( |
48 touch_display.touch_device_id(), | 49 touch_display.touch_device_id(), |
49 ui::DeviceDataManagerX11::DT_TOUCH_POSITION_Y, | 50 ui::DeviceDataManagerX11::DT_TOUCH_POSITION_Y, |
50 &min_y, &max_y)) { | 51 &min_y, |
| 52 &max_y)) { |
51 return 1.0; | 53 return 1.0; |
52 } | 54 } |
53 | 55 |
54 double width = touch_display.bounds_in_native().width(); | 56 double width = touch_display.bounds_in_native().width(); |
55 double height = touch_display.bounds_in_native().height(); | 57 double height = touch_display.bounds_in_native().height(); |
56 | 58 |
57 if (max_x == 0.0 || max_y == 0.0 || width == 0.0 || height == 0.0) | 59 if (max_x == 0.0 || max_y == 0.0 || width == 0.0 || height == 0.0) |
58 return 1.0; | 60 return 1.0; |
59 | 61 |
60 // [0, max_x] -> touchscreen width = max_x + 1 | 62 // [0, max_x] -> touchscreen width = max_x + 1 |
61 // [0, max_y] -> touchscreen height = max_y + 1 | 63 // [0, max_y] -> touchscreen height = max_y + 1 |
62 max_x += 1.0; | 64 max_x += 1.0; |
63 max_y += 1.0; | 65 max_y += 1.0; |
64 | 66 |
65 double ratio = std::sqrt((width * height) / (max_x * max_y)); | 67 double ratio = std::sqrt((width * height) / (max_x * max_y)); |
66 | 68 |
67 VLOG(2) << "Screen width/height: " << width << "/" << height | 69 VLOG(2) << "Screen width/height: " << width << "/" << height |
68 << ", Touchscreen width/height: " << max_x << "/" << max_y | 70 << ", Touchscreen width/height: " << max_x << "/" << max_y |
69 << ", Touch radius scale ratio: " << ratio; | 71 << ", Touch radius scale ratio: " << ratio; |
70 return ratio; | 72 return ratio; |
71 } | 73 } |
72 | 74 |
73 // This function computes the extended mode TouchTransformer for | 75 // This function computes the extended mode TouchTransformer for |
74 // |touch_display|. The TouchTransformer maps the touch event position | 76 // |touch_display|. The TouchTransformer maps the touch event position |
75 // from framebuffer size to the display size. | 77 // from framebuffer size to the display size. |
76 gfx::Transform | 78 gfx::Transform TouchTransformerController::GetExtendedModeTouchTransformer( |
77 TouchTransformerController::GetExtendedModeTouchTransformer( | 79 const DisplayInfo& touch_display, |
78 const DisplayInfo& touch_display, const gfx::Size& fb_size) const { | 80 const gfx::Size& fb_size) const { |
79 gfx::Transform ctm; | 81 gfx::Transform ctm; |
80 if (touch_display.touch_device_id() == 0 || | 82 if (touch_display.touch_device_id() == 0 || fb_size.width() == 0.0 || |
81 fb_size.width() == 0.0 || | |
82 fb_size.height() == 0.0) | 83 fb_size.height() == 0.0) |
83 return ctm; | 84 return ctm; |
84 float width = touch_display.bounds_in_native().width(); | 85 float width = touch_display.bounds_in_native().width(); |
85 float height = touch_display.bounds_in_native().height(); | 86 float height = touch_display.bounds_in_native().height(); |
86 ctm.Scale(width / fb_size.width(), height / fb_size.height()); | 87 ctm.Scale(width / fb_size.width(), height / fb_size.height()); |
87 return ctm; | 88 return ctm; |
88 } | 89 } |
89 | 90 |
90 bool TouchTransformerController::ShouldComputeMirrorModeTouchTransformer( | 91 bool TouchTransformerController::ShouldComputeMirrorModeTouchTransformer( |
91 const DisplayInfo& touch_display) const { | 92 const DisplayInfo& touch_display) const { |
(...skipping 23 matching lines...) Expand all Loading... |
115 gfx::Transform ctm; | 116 gfx::Transform ctm; |
116 if (!ShouldComputeMirrorModeTouchTransformer(touch_display)) | 117 if (!ShouldComputeMirrorModeTouchTransformer(touch_display)) |
117 return ctm; | 118 return ctm; |
118 | 119 |
119 float mirror_width = touch_display.bounds_in_native().width(); | 120 float mirror_width = touch_display.bounds_in_native().width(); |
120 float mirror_height = touch_display.bounds_in_native().height(); | 121 float mirror_height = touch_display.bounds_in_native().height(); |
121 gfx::Size native_mode_size = touch_display.GetNativeModeSize(); | 122 gfx::Size native_mode_size = touch_display.GetNativeModeSize(); |
122 float native_width = native_mode_size.width(); | 123 float native_width = native_mode_size.width(); |
123 float native_height = native_mode_size.height(); | 124 float native_height = native_mode_size.height(); |
124 | 125 |
125 if (native_height == 0.0 || mirror_height == 0.0 || | 126 if (native_height == 0.0 || mirror_height == 0.0 || native_width == 0.0 || |
126 native_width == 0.0 || mirror_width == 0.0) | 127 mirror_width == 0.0) |
127 return ctm; | 128 return ctm; |
128 | 129 |
129 float native_ar = native_width / native_height; | 130 float native_ar = native_width / native_height; |
130 float mirror_ar = mirror_width / mirror_height; | 131 float mirror_ar = mirror_width / mirror_height; |
131 | 132 |
132 if (mirror_ar > native_ar) { // Letterboxing | 133 if (mirror_ar > native_ar) { // Letterboxing |
133 // Translate before scale. | 134 // Translate before scale. |
134 ctm.Translate(0.0, (1.0 - mirror_ar / native_ar) * 0.5 * mirror_height); | 135 ctm.Translate(0.0, (1.0 - mirror_ar / native_ar) * 0.5 * mirror_height); |
135 ctm.Scale(1.0, mirror_ar / native_ar); | 136 ctm.Scale(1.0, mirror_ar / native_ar); |
136 return ctm; | 137 return ctm; |
137 } | 138 } |
138 | 139 |
139 if (native_ar > mirror_ar) { // Pillarboxing | 140 if (native_ar > mirror_ar) { // Pillarboxing |
140 // Translate before scale. | 141 // Translate before scale. |
141 ctm.Translate((1.0 - native_ar / mirror_ar) * 0.5 * mirror_width, 0.0); | 142 ctm.Translate((1.0 - native_ar / mirror_ar) * 0.5 * mirror_width, 0.0); |
142 ctm.Scale(native_ar / mirror_ar, 1.0); | 143 ctm.Scale(native_ar / mirror_ar, 1.0); |
143 return ctm; | 144 return ctm; |
144 } | 145 } |
145 | 146 |
146 return ctm; // Same aspect ratio - return identity | 147 return ctm; // Same aspect ratio - return identity |
147 } | 148 } |
148 | 149 |
149 TouchTransformerController::TouchTransformerController() : | 150 TouchTransformerController::TouchTransformerController() |
150 force_compute_mirror_mode_touch_transformer_ (false) { | 151 : force_compute_mirror_mode_touch_transformer_(false) { |
151 Shell::GetInstance()->display_controller()->AddObserver(this); | 152 Shell::GetInstance()->display_controller()->AddObserver(this); |
152 } | 153 } |
153 | 154 |
154 TouchTransformerController::~TouchTransformerController() { | 155 TouchTransformerController::~TouchTransformerController() { |
155 Shell::GetInstance()->display_controller()->RemoveObserver(this); | 156 Shell::GetInstance()->display_controller()->RemoveObserver(this); |
156 } | 157 } |
157 | 158 |
158 void TouchTransformerController::UpdateTouchTransformer() const { | 159 void TouchTransformerController::UpdateTouchTransformer() const { |
159 ui::DeviceDataManager* device_manager = ui::DeviceDataManager::GetInstance(); | 160 ui::DeviceDataManager* device_manager = ui::DeviceDataManager::GetInstance(); |
160 device_manager->ClearTouchTransformerRecord(); | 161 device_manager->ClearTouchTransformerRecord(); |
(...skipping 51 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
212 display2.touch_device_id(), | 213 display2.touch_device_id(), |
213 GetMirrorModeTouchTransformer(display2)); | 214 GetMirrorModeTouchTransformer(display2)); |
214 return; | 215 return; |
215 } | 216 } |
216 | 217 |
217 if (display_state == ui::MULTIPLE_DISPLAY_STATE_DUAL_EXTENDED) { | 218 if (display_state == ui::MULTIPLE_DISPLAY_STATE_DUAL_EXTENDED) { |
218 gfx::Size fb_size = | 219 gfx::Size fb_size = |
219 Shell::GetInstance()->display_configurator()->framebuffer_size(); | 220 Shell::GetInstance()->display_configurator()->framebuffer_size(); |
220 // In extended but software mirroring mode, ther is only one X root window | 221 // In extended but software mirroring mode, ther is only one X root window |
221 // that associates with both displays. | 222 // that associates with both displays. |
222 if (GetDisplayManager()->software_mirroring_enabled()) { | 223 if (GetDisplayManager()->software_mirroring_enabled()) { |
223 aura::Window* root = display_controller->GetPrimaryRootWindow(); | 224 aura::Window* root = display_controller->GetPrimaryRootWindow(); |
224 RootWindowController::ForWindow(root)->ash_host()->UpdateDisplayID( | 225 RootWindowController::ForWindow(root)->ash_host()->UpdateDisplayID( |
225 display1_id, display2_id); | 226 display1_id, display2_id); |
226 DisplayInfo source_display = | 227 DisplayInfo source_display = |
227 gfx::Display::InternalDisplayId() == display1_id ? | 228 gfx::Display::InternalDisplayId() == display1_id ? display1 |
228 display1 : display2; | 229 : display2; |
229 // Mapping from framebuffer size to the source display's native | 230 // Mapping from framebuffer size to the source display's native |
230 // resolution. | 231 // resolution. |
231 device_manager->UpdateTouchInfoForDisplay( | 232 device_manager->UpdateTouchInfoForDisplay( |
232 display1_id, | 233 display1_id, |
233 display1.touch_device_id(), | 234 display1.touch_device_id(), |
234 GetExtendedModeTouchTransformer(source_display, fb_size)); | 235 GetExtendedModeTouchTransformer(source_display, fb_size)); |
235 device_manager->UpdateTouchInfoForDisplay( | 236 device_manager->UpdateTouchInfoForDisplay( |
236 display2_id, | 237 display2_id, |
237 display2.touch_device_id(), | 238 display2.touch_device_id(), |
238 GetExtendedModeTouchTransformer(source_display, fb_size)); | 239 GetExtendedModeTouchTransformer(source_display, fb_size)); |
(...skipping 19 matching lines...) Expand all Loading... |
258 GetExtendedModeTouchTransformer(display2, fb_size)); | 259 GetExtendedModeTouchTransformer(display2, fb_size)); |
259 } | 260 } |
260 return; | 261 return; |
261 } | 262 } |
262 | 263 |
263 // Single display mode. The root window has one associated display id. | 264 // Single display mode. The root window has one associated display id. |
264 aura::Window* root = | 265 aura::Window* root = |
265 display_controller->GetRootWindowForDisplayId(single_display.id()); | 266 display_controller->GetRootWindowForDisplayId(single_display.id()); |
266 RootWindowController::ForWindow(root)->ash_host()->UpdateDisplayID( | 267 RootWindowController::ForWindow(root)->ash_host()->UpdateDisplayID( |
267 single_display.id(), gfx::Display::kInvalidDisplayID); | 268 single_display.id(), gfx::Display::kInvalidDisplayID); |
268 device_manager->UpdateTouchInfoForDisplay(single_display_id, | 269 device_manager->UpdateTouchInfoForDisplay( |
269 single_display.touch_device_id(), | 270 single_display_id, single_display.touch_device_id(), gfx::Transform()); |
270 gfx::Transform()); | |
271 } | 271 } |
272 | 272 |
273 void TouchTransformerController::OnDisplaysInitialized() { | 273 void TouchTransformerController::OnDisplaysInitialized() { |
274 UpdateTouchTransformer(); | 274 UpdateTouchTransformer(); |
275 } | 275 } |
276 | 276 |
277 void TouchTransformerController::OnDisplayConfigurationChanged() { | 277 void TouchTransformerController::OnDisplayConfigurationChanged() { |
278 UpdateTouchTransformer(); | 278 UpdateTouchTransformer(); |
279 } | 279 } |
280 | 280 |
281 } // namespace ash | 281 } // namespace ash |
OLD | NEW |