device_data_manager.cc revision 116680a4aac90f2aa7413d9095a592090648e557
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
3// found in the LICENSE file.
4
5#include "ui/events/device_data_manager.h"
6
7#include "base/at_exit.h"
8#include "base/bind.h"
9#include "base/logging.h"
10#include "ui/gfx/display.h"
11#include "ui/gfx/geometry/point3_f.h"
12
13namespace ui {
14
15// static
16DeviceDataManager* DeviceDataManager::instance_ = NULL;
17
18DeviceDataManager::DeviceDataManager() {
19  CHECK(!instance_) << "Can not create multiple instances of DeviceDataManager";
20  instance_ = this;
21
22  base::AtExitManager::RegisterTask(
23      base::Bind(&base::DeletePointer<DeviceDataManager>, this));
24
25  for (int i = 0; i < kMaxDeviceNum; ++i)
26    touch_device_to_display_map_[i] = gfx::Display::kInvalidDisplayID;
27}
28
29DeviceDataManager::~DeviceDataManager() {
30  CHECK_EQ(this, instance_);
31  instance_ = NULL;
32}
33
34// static
35DeviceDataManager* DeviceDataManager::instance() { return instance_; }
36
37// static
38void DeviceDataManager::CreateInstance() {
39  if (instance())
40    return;
41
42  new DeviceDataManager();
43}
44
45// static
46DeviceDataManager* DeviceDataManager::GetInstance() {
47  CHECK(instance_) << "DeviceDataManager was not created.";
48  return instance_;
49}
50
51// static
52bool DeviceDataManager::HasInstance() {
53  return instance_ != NULL;
54}
55
56void DeviceDataManager::ClearTouchTransformerRecord() {
57  for (int i = 0; i < kMaxDeviceNum; i++) {
58    touch_device_transformer_map_[i] = gfx::Transform();
59    touch_device_to_display_map_[i] = gfx::Display::kInvalidDisplayID;
60  }
61}
62
63bool DeviceDataManager::IsTouchDeviceIdValid(int touch_device_id) const {
64  return (touch_device_id > 0 && touch_device_id < kMaxDeviceNum);
65}
66
67void DeviceDataManager::UpdateTouchInfoForDisplay(
68    int64_t display_id,
69    int touch_device_id,
70    const gfx::Transform& touch_transformer) {
71  if (IsTouchDeviceIdValid(touch_device_id)) {
72    touch_device_to_display_map_[touch_device_id] = display_id;
73    touch_device_transformer_map_[touch_device_id] = touch_transformer;
74  }
75}
76
77void DeviceDataManager::ApplyTouchTransformer(int touch_device_id,
78                                              float* x,
79                                              float* y) {
80  if (IsTouchDeviceIdValid(touch_device_id)) {
81    gfx::Point3F point(*x, *y, 0.0);
82    const gfx::Transform& trans =
83        touch_device_transformer_map_[touch_device_id];
84    trans.TransformPoint(&point);
85    *x = point.x();
86    *y = point.y();
87  }
88}
89
90int64_t DeviceDataManager::GetDisplayForTouchDevice(int touch_device_id) const {
91  if (IsTouchDeviceIdValid(touch_device_id))
92    return touch_device_to_display_map_[touch_device_id];
93  return gfx::Display::kInvalidDisplayID;
94}
95
96}  // namespace ui
97