OLD | NEW |
1 // Copyright 2013 The Chromium Authors. All rights reserved. | 1 // Copyright 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 "content/common/input/web_input_event_traits.h" | 5 #include "content/common/input/web_input_event_traits.h" |
6 | 6 |
7 #include <bitset> | 7 #include <bitset> |
8 #include <limits> | 8 #include <limits> |
9 | 9 |
10 #include "base/logging.h" | 10 #include "base/logging.h" |
(...skipping 76 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
87 event.data.scrollUpdate.deltaY, | 87 event.data.scrollUpdate.deltaY, |
88 event.data.scrollUpdate.velocityX, | 88 event.data.scrollUpdate.velocityX, |
89 event.data.scrollUpdate.velocityY, | 89 event.data.scrollUpdate.velocityY, |
90 event.data.scrollUpdate.previousUpdateInSequencePrevented); | 90 event.data.scrollUpdate.previousUpdateInSequencePrevented); |
91 } | 91 } |
92 | 92 |
93 void ApppendTouchPointDetails(const WebTouchPoint& point, std::string* result) { | 93 void ApppendTouchPointDetails(const WebTouchPoint& point, std::string* result) { |
94 StringAppendF(result, | 94 StringAppendF(result, |
95 " (ID: %d, State: %d, ScreenPos: (%f, %f), Pos: (%f, %f)," | 95 " (ID: %d, State: %d, ScreenPos: (%f, %f), Pos: (%f, %f)," |
96 " Radius: (%f, %f), Rot: %f, Force: %f),\n", | 96 " Radius: (%f, %f), Rot: %f, Force: %f),\n", |
97 point.id, | 97 point.pointerId, |
98 point.state, | 98 point.state, |
99 point.screenPosition.x, | 99 point.screenPosition.x, |
100 point.screenPosition.y, | 100 point.screenPosition.y, |
101 point.position.x, | 101 point.position.x, |
102 point.position.y, | 102 point.position.y, |
103 point.radiusX, | 103 point.width, |
104 point.radiusY, | 104 point.height, |
105 point.rotationAngle, | 105 point.rotationAngle, |
106 point.force); | 106 point.pressure); |
107 } | 107 } |
108 | 108 |
109 void ApppendEventDetails(const WebTouchEvent& event, std::string* result) { | 109 void ApppendEventDetails(const WebTouchEvent& event, std::string* result) { |
110 StringAppendF(result, | 110 StringAppendF(result, |
111 "{\n Touches: %u, Cancelable: %d, CausesScrolling: %d," | 111 "{\n Touches: %u, Cancelable: %d, CausesScrolling: %d," |
112 " uniqueTouchEventId: %u\n[\n", | 112 " uniqueTouchEventId: %u\n[\n", |
113 event.touchesLength, event.cancelable, | 113 event.touchesLength, event.cancelable, |
114 event.causesScrollingIfUncanceled, event.uniqueTouchEventId); | 114 event.causesScrollingIfUncanceled, event.uniqueTouchEventId); |
115 for (unsigned i = 0; i < event.touchesLength; ++i) | 115 for (unsigned i = 0; i < event.touchesLength; ++i) |
116 ApppendTouchPointDetails(event.touches[i], result); | 116 ApppendTouchPointDetails(event.touches[i], result); |
(...skipping 68 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
185 GetAccelerationRatio(event->deltaX, unaccelerated_x); | 185 GetAccelerationRatio(event->deltaX, unaccelerated_x); |
186 event->accelerationRatioY = | 186 event->accelerationRatioY = |
187 GetAccelerationRatio(event->deltaY, unaccelerated_y); | 187 GetAccelerationRatio(event->deltaY, unaccelerated_y); |
188 DCHECK_GE(event_to_coalesce.timeStampSeconds, event->timeStampSeconds); | 188 DCHECK_GE(event_to_coalesce.timeStampSeconds, event->timeStampSeconds); |
189 event->timeStampSeconds = event_to_coalesce.timeStampSeconds; | 189 event->timeStampSeconds = event_to_coalesce.timeStampSeconds; |
190 } | 190 } |
191 | 191 |
192 // Returns |kInvalidTouchIndex| iff |event| lacks a touch with an ID of |id|. | 192 // Returns |kInvalidTouchIndex| iff |event| lacks a touch with an ID of |id|. |
193 int GetIndexOfTouchID(const WebTouchEvent& event, int id) { | 193 int GetIndexOfTouchID(const WebTouchEvent& event, int id) { |
194 for (unsigned i = 0; i < event.touchesLength; ++i) { | 194 for (unsigned i = 0; i < event.touchesLength; ++i) { |
195 if (event.touches[i].id == id) | 195 if (event.touches[i].pointerId == id) |
196 return i; | 196 return i; |
197 } | 197 } |
198 return kInvalidTouchIndex; | 198 return kInvalidTouchIndex; |
199 } | 199 } |
200 | 200 |
201 bool CanCoalesce(const WebTouchEvent& event_to_coalesce, | 201 bool CanCoalesce(const WebTouchEvent& event_to_coalesce, |
202 const WebTouchEvent& event) { | 202 const WebTouchEvent& event) { |
203 if (event.type != event_to_coalesce.type || | 203 if (event.type != event_to_coalesce.type || |
204 event.type != WebInputEvent::TouchMove || | 204 event.type != WebInputEvent::TouchMove || |
205 event.modifiers != event_to_coalesce.modifiers || | 205 event.modifiers != event_to_coalesce.modifiers || |
206 event.touchesLength != event_to_coalesce.touchesLength || | 206 event.touchesLength != event_to_coalesce.touchesLength || |
207 event.touchesLength > WebTouchEvent::touchesLengthCap) | 207 event.touchesLength > WebTouchEvent::touchesLengthCap) |
208 return false; | 208 return false; |
209 | 209 |
210 static_assert(WebTouchEvent::touchesLengthCap <= sizeof(int32_t) * 8U, | 210 static_assert(WebTouchEvent::touchesLengthCap <= sizeof(int32_t) * 8U, |
211 "suboptimal touchesLengthCap size"); | 211 "suboptimal touchesLengthCap size"); |
212 // Ensure that we have a 1-to-1 mapping of pointer ids between touches. | 212 // Ensure that we have a 1-to-1 mapping of pointer ids between touches. |
213 std::bitset<WebTouchEvent::touchesLengthCap> unmatched_event_touches( | 213 std::bitset<WebTouchEvent::touchesLengthCap> unmatched_event_touches( |
214 (1 << event.touchesLength) - 1); | 214 (1 << event.touchesLength) - 1); |
215 for (unsigned i = 0; i < event_to_coalesce.touchesLength; ++i) { | 215 for (unsigned i = 0; i < event_to_coalesce.touchesLength; ++i) { |
216 int event_touch_index = | 216 int event_touch_index = |
217 GetIndexOfTouchID(event, event_to_coalesce.touches[i].id); | 217 GetIndexOfTouchID(event, event_to_coalesce.touches[i].pointerId); |
218 if (event_touch_index == kInvalidTouchIndex) | 218 if (event_touch_index == kInvalidTouchIndex) |
219 return false; | 219 return false; |
220 if (!unmatched_event_touches[event_touch_index]) | 220 if (!unmatched_event_touches[event_touch_index]) |
221 return false; | 221 return false; |
222 unmatched_event_touches[event_touch_index] = false; | 222 unmatched_event_touches[event_touch_index] = false; |
223 } | 223 } |
224 return unmatched_event_touches.none(); | 224 return unmatched_event_touches.none(); |
225 } | 225 } |
226 | 226 |
227 void Coalesce(const WebTouchEvent& event_to_coalesce, WebTouchEvent* event) { | 227 void Coalesce(const WebTouchEvent& event_to_coalesce, WebTouchEvent* event) { |
228 DCHECK(CanCoalesce(event_to_coalesce, *event)); | 228 DCHECK(CanCoalesce(event_to_coalesce, *event)); |
229 // The WebTouchPoints include absolute position information. So it is | 229 // The WebTouchPoints include absolute position information. So it is |
230 // sufficient to simply replace the previous event with the new event-> | 230 // sufficient to simply replace the previous event with the new event-> |
231 // However, it is necessary to make sure that all the points have the | 231 // However, it is necessary to make sure that all the points have the |
232 // correct state, i.e. the touch-points that moved in the last event, but | 232 // correct state, i.e. the touch-points that moved in the last event, but |
233 // didn't change in the current event, will have Stationary state. It is | 233 // didn't change in the current event, will have Stationary state. It is |
234 // necessary to change them back to Moved state. | 234 // necessary to change them back to Moved state. |
235 WebTouchEvent old_event = *event; | 235 WebTouchEvent old_event = *event; |
236 *event = event_to_coalesce; | 236 *event = event_to_coalesce; |
237 for (unsigned i = 0; i < event->touchesLength; ++i) { | 237 for (unsigned i = 0; i < event->touchesLength; ++i) { |
238 int i_old = GetIndexOfTouchID(old_event, event->touches[i].id); | 238 int i_old = GetIndexOfTouchID(old_event, event->touches[i].pointerId); |
239 if (old_event.touches[i_old].state == blink::WebTouchPoint::StateMoved) | 239 if (old_event.touches[i_old].state == blink::WebTouchPoint::StateMoved) |
240 event->touches[i].state = blink::WebTouchPoint::StateMoved; | 240 event->touches[i].state = blink::WebTouchPoint::StateMoved; |
241 } | 241 } |
242 event->causesScrollingIfUncanceled |= old_event.causesScrollingIfUncanceled; | 242 event->causesScrollingIfUncanceled |= old_event.causesScrollingIfUncanceled; |
243 } | 243 } |
244 | 244 |
245 bool CanCoalesce(const WebGestureEvent& event_to_coalesce, | 245 bool CanCoalesce(const WebGestureEvent& event_to_coalesce, |
246 const WebGestureEvent& event) { | 246 const WebGestureEvent& event) { |
247 if (event.type != event_to_coalesce.type || | 247 if (event.type != event_to_coalesce.type || |
248 event.sourceDevice != event_to_coalesce.sourceDevice || | 248 event.sourceDevice != event_to_coalesce.sourceDevice || |
(...skipping 239 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
488 } | 488 } |
489 | 489 |
490 uint32 WebInputEventTraits::GetUniqueTouchEventId(const WebInputEvent& event) { | 490 uint32 WebInputEventTraits::GetUniqueTouchEventId(const WebInputEvent& event) { |
491 if (WebInputEvent::isTouchEventType(event.type)) { | 491 if (WebInputEvent::isTouchEventType(event.type)) { |
492 return static_cast<const WebTouchEvent&>(event).uniqueTouchEventId; | 492 return static_cast<const WebTouchEvent&>(event).uniqueTouchEventId; |
493 } | 493 } |
494 return 0U; | 494 return 0U; |
495 } | 495 } |
496 | 496 |
497 } // namespace content | 497 } // namespace content |
OLD | NEW |