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 // MSVC++ requires this to be set before any other includes to get M_PI. |
| 6 #define _USE_MATH_DEFINES |
| 7 |
5 #include "ui/events/gestures/motion_event_aura.h" | 8 #include "ui/events/gestures/motion_event_aura.h" |
6 | 9 |
| 10 #include <cmath> |
| 11 |
7 #include "base/logging.h" | 12 #include "base/logging.h" |
8 #include "ui/events/gestures/gesture_configuration.h" | 13 #include "ui/events/gestures/gesture_configuration.h" |
9 | 14 |
10 namespace ui { | 15 namespace ui { |
11 | 16 |
12 MotionEventAura::MotionEventAura() | 17 MotionEventAura::MotionEventAura() |
13 : pointer_count_(0), cached_action_index_(-1) { | 18 : pointer_count_(0), cached_action_index_(-1) { |
14 } | 19 } |
15 | 20 |
16 MotionEventAura::MotionEventAura(size_t pointer_count, | 21 MotionEventAura::MotionEventAura(size_t pointer_count, |
(...skipping 16 matching lines...) Expand all Loading... |
33 const TouchEvent& touch) { | 38 const TouchEvent& touch) { |
34 PointData point_data; | 39 PointData point_data; |
35 point_data.x = touch.x(); | 40 point_data.x = touch.x(); |
36 point_data.y = touch.y(); | 41 point_data.y = touch.y(); |
37 point_data.raw_x = touch.root_location_f().x(); | 42 point_data.raw_x = touch.root_location_f().x(); |
38 point_data.raw_y = touch.root_location_f().y(); | 43 point_data.raw_y = touch.root_location_f().y(); |
39 point_data.touch_id = touch.touch_id(); | 44 point_data.touch_id = touch.touch_id(); |
40 point_data.pressure = touch.force(); | 45 point_data.pressure = touch.force(); |
41 point_data.source_device_id = touch.source_device_id(); | 46 point_data.source_device_id = touch.source_device_id(); |
42 | 47 |
43 // TODO(tdresser): at some point we should start using both radii if they are | 48 float radius_x = touch.radius_x(); |
44 // available, but for now we use the max. | 49 float radius_y = touch.radius_y(); |
45 point_data.major_radius = std::max(touch.radius_x(), touch.radius_y()); | 50 float rotation_angle_rad = touch.rotation_angle() * M_PI / 180.f; |
46 if (!point_data.major_radius) | 51 DCHECK_GE(radius_x, 0) << "Unexpected x-radius < 0"; |
| 52 DCHECK_GE(radius_y, 0) << "Unexpected y-radius < 0"; |
| 53 DCHECK(0 <= rotation_angle_rad && rotation_angle_rad <= M_PI_2) |
| 54 << "Unexpected touch rotation angle"; |
| 55 |
| 56 if (radius_x >= radius_y) { |
| 57 point_data.major_radius = radius_x; |
| 58 point_data.minor_radius = radius_y; |
| 59 point_data.orientation = rotation_angle_rad; |
| 60 } else { |
| 61 point_data.major_radius = radius_y; |
| 62 point_data.minor_radius = radius_x; |
| 63 point_data.orientation = rotation_angle_rad - M_PI_2; |
| 64 } |
| 65 |
| 66 if (!point_data.major_radius) { |
47 point_data.major_radius = GestureConfiguration::default_radius(); | 67 point_data.major_radius = GestureConfiguration::default_radius(); |
| 68 point_data.minor_radius = GestureConfiguration::default_radius(); |
| 69 point_data.orientation = 0; |
| 70 } |
| 71 |
48 return point_data; | 72 return point_data; |
49 } | 73 } |
50 | 74 |
51 void MotionEventAura::OnTouch(const TouchEvent& touch) { | 75 void MotionEventAura::OnTouch(const TouchEvent& touch) { |
52 switch (touch.type()) { | 76 switch (touch.type()) { |
53 case ET_TOUCH_PRESSED: | 77 case ET_TOUCH_PRESSED: |
54 AddTouch(touch); | 78 AddTouch(touch); |
55 break; | 79 break; |
56 case ET_TOUCH_RELEASED: | 80 case ET_TOUCH_RELEASED: |
57 case ET_TOUCH_CANCELLED: | 81 case ET_TOUCH_CANCELLED: |
(...skipping 52 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
110 return active_touches_[pointer_index].raw_x; | 134 return active_touches_[pointer_index].raw_x; |
111 } | 135 } |
112 | 136 |
113 float MotionEventAura::GetRawY(size_t pointer_index) const { | 137 float MotionEventAura::GetRawY(size_t pointer_index) const { |
114 DCHECK_LT(pointer_index, pointer_count_); | 138 DCHECK_LT(pointer_index, pointer_count_); |
115 return active_touches_[pointer_index].raw_y; | 139 return active_touches_[pointer_index].raw_y; |
116 } | 140 } |
117 | 141 |
118 float MotionEventAura::GetTouchMajor(size_t pointer_index) const { | 142 float MotionEventAura::GetTouchMajor(size_t pointer_index) const { |
119 DCHECK_LT(pointer_index, pointer_count_); | 143 DCHECK_LT(pointer_index, pointer_count_); |
120 return active_touches_[pointer_index].major_radius * 2; | 144 return active_touches_[pointer_index].major_radius * 2.f; |
| 145 } |
| 146 |
| 147 float MotionEventAura::GetTouchMinor(size_t pointer_index) const { |
| 148 DCHECK_LE(pointer_index, pointer_count_); |
| 149 return active_touches_[pointer_index].minor_radius * 2.f; |
| 150 } |
| 151 |
| 152 float MotionEventAura::GetOrientation(size_t pointer_index) const { |
| 153 DCHECK_LE(pointer_index, pointer_count_); |
| 154 return active_touches_[pointer_index].orientation; |
121 } | 155 } |
122 | 156 |
123 float MotionEventAura::GetPressure(size_t pointer_index) const { | 157 float MotionEventAura::GetPressure(size_t pointer_index) const { |
124 DCHECK_LT(pointer_index, pointer_count_); | 158 DCHECK_LT(pointer_index, pointer_count_); |
125 return active_touches_[pointer_index].pressure; | 159 return active_touches_[pointer_index].pressure; |
126 } | 160 } |
127 | 161 |
128 MotionEvent::ToolType MotionEventAura::GetToolType(size_t pointer_index) const { | 162 MotionEvent::ToolType MotionEventAura::GetToolType(size_t pointer_index) const { |
129 // TODO(jdduke): Plumb tool type from the platform, crbug.com/404128. | 163 // TODO(jdduke): Plumb tool type from the platform, crbug.com/404128. |
130 DCHECK_LT(pointer_index, pointer_count_); | 164 DCHECK_LT(pointer_index, pointer_count_); |
(...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
164 } | 198 } |
165 | 199 |
166 MotionEventAura::PointData::PointData() | 200 MotionEventAura::PointData::PointData() |
167 : x(0), | 201 : x(0), |
168 y(0), | 202 y(0), |
169 raw_x(0), | 203 raw_x(0), |
170 raw_y(0), | 204 raw_y(0), |
171 touch_id(0), | 205 touch_id(0), |
172 pressure(0), | 206 pressure(0), |
173 source_device_id(0), | 207 source_device_id(0), |
174 major_radius(0) { | 208 major_radius(0), |
| 209 minor_radius(0), |
| 210 orientation(0) { |
175 } | 211 } |
176 | 212 |
177 int MotionEventAura::GetSourceDeviceId(size_t pointer_index) const { | 213 int MotionEventAura::GetSourceDeviceId(size_t pointer_index) const { |
178 DCHECK_LT(pointer_index, pointer_count_); | 214 DCHECK_LT(pointer_index, pointer_count_); |
179 return active_touches_[pointer_index].source_device_id; | 215 return active_touches_[pointer_index].source_device_id; |
180 } | 216 } |
181 | 217 |
182 void MotionEventAura::AddTouch(const TouchEvent& touch) { | 218 void MotionEventAura::AddTouch(const TouchEvent& touch) { |
183 if (pointer_count_ == MotionEvent::MAX_TOUCH_POINT_COUNT) | 219 if (pointer_count_ == MotionEvent::MAX_TOUCH_POINT_COUNT) |
184 return; | 220 return; |
(...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
230 size_t MotionEventAura::GetIndexFromId(int id) const { | 266 size_t MotionEventAura::GetIndexFromId(int id) const { |
231 for (size_t i = 0; i < pointer_count_; ++i) { | 267 for (size_t i = 0; i < pointer_count_; ++i) { |
232 if (active_touches_[i].touch_id == id) | 268 if (active_touches_[i].touch_id == id) |
233 return i; | 269 return i; |
234 } | 270 } |
235 NOTREACHED(); | 271 NOTREACHED(); |
236 return 0; | 272 return 0; |
237 } | 273 } |
238 | 274 |
239 } // namespace ui | 275 } // namespace ui |
OLD | NEW |