Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(2517)

Unified Diff: ash/touch/touch_transformer_controller.cc

Issue 611423002: [WIP][Ozone] Support external touchscreens (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@ozone-touchscreen
Patch Set: . Created 6 years, 2 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « ash/touch/touch_transformer_controller.h ('k') | ash/touch/touch_transformer_controller_ozone.cc » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: ash/touch/touch_transformer_controller.cc
diff --git a/ash/touch/touch_transformer_controller.cc b/ash/touch/touch_transformer_controller.cc
deleted file mode 100644
index 8ff8ad5c3ea4afc931b2a3a412d7a4e81e6e4667..0000000000000000000000000000000000000000
--- a/ash/touch/touch_transformer_controller.cc
+++ /dev/null
@@ -1,281 +0,0 @@
-// Copyright 2014 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 "ash/touch/touch_transformer_controller.h"
-
-#include "ash/display/display_controller.h"
-#include "ash/display/display_manager.h"
-#include "ash/host/ash_window_tree_host.h"
-#include "ash/root_window_controller.h"
-#include "ash/shell.h"
-#include "ui/aura/window_tree_host.h"
-#include "ui/display/chromeos/display_configurator.h"
-#include "ui/display/types/display_snapshot.h"
-#include "ui/events/device_data_manager.h"
-#include "ui/events/x/device_data_manager_x11.h"
-
-namespace ash {
-
-namespace {
-
-DisplayManager* GetDisplayManager() {
- return Shell::GetInstance()->display_manager();
-}
-
-} // namespace
-
-// This is to compute the scale ratio for the TouchEvent's radius. The
-// configured resolution of the display is not always the same as the touch
-// screen's reporting resolution, e.g. the display could be set as
-// 1920x1080 while the touchscreen is reporting touch position range at
-// 32767x32767. Touch radius is reported in the units the same as touch position
-// so we need to scale the touch radius to be compatible with the display's
-// resolution. We compute the scale as
-// sqrt of (display_area / touchscreen_area)
-double TouchTransformerController::GetTouchResolutionScale(
- const DisplayInfo& touch_display) const {
- if (touch_display.touch_device_id() == 0)
- return 1.0;
-
- double min_x, max_x;
- double min_y, max_y;
- if (!ui::DeviceDataManagerX11::GetInstance()->GetDataRange(
- touch_display.touch_device_id(),
- ui::DeviceDataManagerX11::DT_TOUCH_POSITION_X,
- &min_x, &max_x) ||
- !ui::DeviceDataManagerX11::GetInstance()->GetDataRange(
- touch_display.touch_device_id(),
- ui::DeviceDataManagerX11::DT_TOUCH_POSITION_Y,
- &min_y, &max_y)) {
- return 1.0;
- }
-
- double width = touch_display.bounds_in_native().width();
- double height = touch_display.bounds_in_native().height();
-
- if (max_x == 0.0 || max_y == 0.0 || width == 0.0 || height == 0.0)
- return 1.0;
-
- // [0, max_x] -> touchscreen width = max_x + 1
- // [0, max_y] -> touchscreen height = max_y + 1
- max_x += 1.0;
- max_y += 1.0;
-
- double ratio = std::sqrt((width * height) / (max_x * max_y));
-
- VLOG(2) << "Screen width/height: " << width << "/" << height
- << ", Touchscreen width/height: " << max_x << "/" << max_y
- << ", Touch radius scale ratio: " << ratio;
- return ratio;
-}
-
-// This function computes the extended mode TouchTransformer for
-// |touch_display|. The TouchTransformer maps the touch event position
-// from framebuffer size to the display size.
-gfx::Transform
-TouchTransformerController::GetExtendedModeTouchTransformer(
- const DisplayInfo& touch_display, const gfx::Size& fb_size) const {
- gfx::Transform ctm;
- if (touch_display.touch_device_id() == 0 ||
- fb_size.width() == 0.0 ||
- fb_size.height() == 0.0)
- return ctm;
- float width = touch_display.bounds_in_native().width();
- float height = touch_display.bounds_in_native().height();
- ctm.Scale(width / fb_size.width(), height / fb_size.height());
- return ctm;
-}
-
-bool TouchTransformerController::ShouldComputeMirrorModeTouchTransformer(
- const DisplayInfo& touch_display) const {
- if (force_compute_mirror_mode_touch_transformer_)
- return true;
-
- if (touch_display.touch_device_id() == 0)
- return false;
-
- if (touch_display.size_in_pixel() == touch_display.GetNativeModeSize() ||
- !touch_display.is_aspect_preserving_scaling()) {
- return false;
- }
-
- return true;
-}
-
-// This function computes the mirror mode TouchTransformer for |touch_display|.
-// When internal monitor is applied a resolution that does not have
-// the same aspect ratio as its native resolution, there would be
-// blank regions in the letterboxing/pillarboxing mode.
-// The TouchTransformer will make sure the touch events on the blank region
-// have negative coordinates and touch events within the chrome region
-// have the correct positive coordinates.
-gfx::Transform TouchTransformerController::GetMirrorModeTouchTransformer(
- const DisplayInfo& touch_display) const {
- gfx::Transform ctm;
- if (!ShouldComputeMirrorModeTouchTransformer(touch_display))
- return ctm;
-
- float mirror_width = touch_display.bounds_in_native().width();
- float mirror_height = touch_display.bounds_in_native().height();
- gfx::Size native_mode_size = touch_display.GetNativeModeSize();
- float native_width = native_mode_size.width();
- float native_height = native_mode_size.height();
-
- if (native_height == 0.0 || mirror_height == 0.0 ||
- native_width == 0.0 || mirror_width == 0.0)
- return ctm;
-
- float native_ar = native_width / native_height;
- float mirror_ar = mirror_width / mirror_height;
-
- if (mirror_ar > native_ar) { // Letterboxing
- // Translate before scale.
- ctm.Translate(0.0, (1.0 - mirror_ar / native_ar) * 0.5 * mirror_height);
- ctm.Scale(1.0, mirror_ar / native_ar);
- return ctm;
- }
-
- if (native_ar > mirror_ar) { // Pillarboxing
- // Translate before scale.
- ctm.Translate((1.0 - native_ar / mirror_ar) * 0.5 * mirror_width, 0.0);
- ctm.Scale(native_ar / mirror_ar, 1.0);
- return ctm;
- }
-
- return ctm; // Same aspect ratio - return identity
-}
-
-TouchTransformerController::TouchTransformerController() :
- force_compute_mirror_mode_touch_transformer_ (false) {
- Shell::GetInstance()->display_controller()->AddObserver(this);
-}
-
-TouchTransformerController::~TouchTransformerController() {
- Shell::GetInstance()->display_controller()->RemoveObserver(this);
-}
-
-void TouchTransformerController::UpdateTouchTransformer() const {
- ui::DeviceDataManager* device_manager = ui::DeviceDataManager::GetInstance();
- device_manager->ClearTouchTransformerRecord();
-
- // Display IDs and DisplayInfo for mirror or extended mode.
- int64 display1_id = gfx::Display::kInvalidDisplayID;
- int64 display2_id = gfx::Display::kInvalidDisplayID;
- DisplayInfo display1;
- DisplayInfo display2;
- // Display ID and DisplayInfo for single display mode.
- int64 single_display_id = gfx::Display::kInvalidDisplayID;
- DisplayInfo single_display;
-
- DisplayController* display_controller =
- Shell::GetInstance()->display_controller();
- ui::MultipleDisplayState display_state =
- Shell::GetInstance()->display_configurator()->display_state();
- if (display_state == ui::MULTIPLE_DISPLAY_STATE_INVALID ||
- display_state == ui::MULTIPLE_DISPLAY_STATE_HEADLESS) {
- return;
- } else if (display_state == ui::MULTIPLE_DISPLAY_STATE_DUAL_MIRROR ||
- display_state == ui::MULTIPLE_DISPLAY_STATE_DUAL_EXTENDED) {
- DisplayIdPair id_pair = GetDisplayManager()->GetCurrentDisplayIdPair();
- display1_id = id_pair.first;
- display2_id = id_pair.second;
- DCHECK(display1_id != gfx::Display::kInvalidDisplayID &&
- display2_id != gfx::Display::kInvalidDisplayID);
- display1 = GetDisplayManager()->GetDisplayInfo(display1_id);
- display2 = GetDisplayManager()->GetDisplayInfo(display2_id);
- device_manager->UpdateTouchRadiusScale(display1.touch_device_id(),
- GetTouchResolutionScale(display1));
- device_manager->UpdateTouchRadiusScale(display2.touch_device_id(),
- GetTouchResolutionScale(display2));
- } else {
- single_display_id = GetDisplayManager()->first_display_id();
- DCHECK(single_display_id != gfx::Display::kInvalidDisplayID);
- single_display = GetDisplayManager()->GetDisplayInfo(single_display_id);
- device_manager->UpdateTouchRadiusScale(
- single_display.touch_device_id(),
- GetTouchResolutionScale(single_display));
- }
-
- if (display_state == ui::MULTIPLE_DISPLAY_STATE_DUAL_MIRROR) {
- // In mirror mode, both displays share the same root window so
- // both display ids are associated with the root window.
- aura::Window* root = display_controller->GetPrimaryRootWindow();
- RootWindowController::ForWindow(root)->ash_host()->UpdateDisplayID(
- display1_id, display2_id);
- device_manager->UpdateTouchInfoForDisplay(
- display1_id,
- display1.touch_device_id(),
- GetMirrorModeTouchTransformer(display1));
- device_manager->UpdateTouchInfoForDisplay(
- display2_id,
- display2.touch_device_id(),
- GetMirrorModeTouchTransformer(display2));
- return;
- }
-
- if (display_state == ui::MULTIPLE_DISPLAY_STATE_DUAL_EXTENDED) {
- gfx::Size fb_size =
- Shell::GetInstance()->display_configurator()->framebuffer_size();
- // In extended but software mirroring mode, ther is only one X root window
- // that associates with both displays.
- if (GetDisplayManager()->software_mirroring_enabled()) {
- aura::Window* root = display_controller->GetPrimaryRootWindow();
- RootWindowController::ForWindow(root)->ash_host()->UpdateDisplayID(
- display1_id, display2_id);
- DisplayInfo source_display =
- gfx::Display::InternalDisplayId() == display1_id ?
- display1 : display2;
- // Mapping from framebuffer size to the source display's native
- // resolution.
- device_manager->UpdateTouchInfoForDisplay(
- display1_id,
- display1.touch_device_id(),
- GetExtendedModeTouchTransformer(source_display, fb_size));
- device_manager->UpdateTouchInfoForDisplay(
- display2_id,
- display2.touch_device_id(),
- GetExtendedModeTouchTransformer(source_display, fb_size));
- } else {
- // In actual extended mode, each display is associated with one root
- // window.
- aura::Window* root1 =
- display_controller->GetRootWindowForDisplayId(display1_id);
- aura::Window* root2 =
- display_controller->GetRootWindowForDisplayId(display2_id);
- RootWindowController::ForWindow(root1)->ash_host()->UpdateDisplayID(
- display1_id, gfx::Display::kInvalidDisplayID);
- RootWindowController::ForWindow(root2)->ash_host()->UpdateDisplayID(
- display2_id, gfx::Display::kInvalidDisplayID);
- // Mapping from framebuffer size to each display's native resolution.
- device_manager->UpdateTouchInfoForDisplay(
- display1_id,
- display1.touch_device_id(),
- GetExtendedModeTouchTransformer(display1, fb_size));
- device_manager->UpdateTouchInfoForDisplay(
- display2_id,
- display2.touch_device_id(),
- GetExtendedModeTouchTransformer(display2, fb_size));
- }
- return;
- }
-
- // Single display mode. The root window has one associated display id.
- aura::Window* root =
- display_controller->GetRootWindowForDisplayId(single_display.id());
- RootWindowController::ForWindow(root)->ash_host()->UpdateDisplayID(
- single_display.id(), gfx::Display::kInvalidDisplayID);
- device_manager->UpdateTouchInfoForDisplay(single_display_id,
- single_display.touch_device_id(),
- gfx::Transform());
-}
-
-void TouchTransformerController::OnDisplaysInitialized() {
- UpdateTouchTransformer();
-}
-
-void TouchTransformerController::OnDisplayConfigurationChanged() {
- UpdateTouchTransformer();
-}
-
-} // namespace ash
« no previous file with comments | « ash/touch/touch_transformer_controller.h ('k') | ash/touch/touch_transformer_controller_ozone.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698