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

Side by Side Diff: content/browser/renderer_host/input/motion_event_android.cc

Issue 220063002: [Android] Use DIP coordinates with MotionEventAndroid (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Fixes Created 6 years, 8 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 unified diff | Download patch
OLDNEW
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 "content/browser/renderer_host/input/motion_event_android.h" 5 #include "content/browser/renderer_host/input/motion_event_android.h"
6 6
7 #include "base/android/jni_android.h" 7 #include "base/android/jni_android.h"
8 #include "jni/MotionEvent_jni.h" 8 #include "jni/MotionEvent_jni.h"
9 9
10 using base::android::AttachCurrentThread; 10 using base::android::AttachCurrentThread;
(...skipping 46 matching lines...) Expand 10 before | Expand all | Expand 10 after
57 int64 ToAndroidTime(base::TimeTicks time) { 57 int64 ToAndroidTime(base::TimeTicks time) {
58 return (time - base::TimeTicks()).InMilliseconds(); 58 return (time - base::TimeTicks()).InMilliseconds();
59 } 59 }
60 60
61 base::TimeTicks FromAndroidTime(int64 time_ms) { 61 base::TimeTicks FromAndroidTime(int64 time_ms) {
62 return base::TimeTicks() + base::TimeDelta::FromMilliseconds(time_ms); 62 return base::TimeTicks() + base::TimeDelta::FromMilliseconds(time_ms);
63 } 63 }
64 64
65 } // namespace 65 } // namespace
66 66
67 MotionEventAndroid::MotionEventAndroid(JNIEnv* env, 67 MotionEventAndroid::MotionEventAndroid(float pix_to_dip,
68 JNIEnv* env,
68 jobject event, 69 jobject event,
69 jlong time_ms, 70 jlong time_ms,
70 jint android_action, 71 jint android_action,
71 jint pointer_count, 72 jint pointer_count,
72 jint history_size, 73 jint history_size,
73 jint action_index, 74 jint action_index,
74 jfloat pos_x_0, 75 jfloat pos_x_0_pixels,
75 jfloat pos_y_0, 76 jfloat pos_y_0_pixels,
76 jfloat pos_x_1, 77 jfloat pos_x_1_pixels,
77 jfloat pos_y_1, 78 jfloat pos_y_1_pixels,
78 jint pointer_id_0, 79 jint pointer_id_0,
79 jint pointer_id_1, 80 jint pointer_id_1,
80 jfloat touch_major_0, 81 jfloat touch_major_0_pixels,
81 jfloat touch_major_1) 82 jfloat touch_major_1_pixels)
82 : cached_time_(FromAndroidTime(time_ms)), 83 : cached_time_(FromAndroidTime(time_ms)),
83 cached_action_(FromAndroidAction(android_action)), 84 cached_action_(FromAndroidAction(android_action)),
84 cached_pointer_count_(pointer_count), 85 cached_pointer_count_(pointer_count),
85 cached_history_size_(history_size), 86 cached_history_size_(history_size),
86 cached_action_index_(action_index), 87 cached_action_index_(action_index),
88 pix_to_dip_(pix_to_dip),
87 should_recycle_(false) { 89 should_recycle_(false) {
88 DCHECK_GT(pointer_count, 0); 90 DCHECK_GT(pointer_count, 0);
89 DCHECK_GE(history_size, 0); 91 DCHECK_GE(history_size, 0);
90 92
91 event_.Reset(env, event); 93 event_.Reset(env, event);
92 DCHECK(event_.obj()); 94 DCHECK(event_.obj());
93 95
94 cached_positions_[0] = gfx::PointF(pos_x_0, pos_y_0); 96 cached_positions_[0] = ToDips(gfx::PointF(pos_x_0_pixels, pos_y_0_pixels));
95 cached_positions_[1] = gfx::PointF(pos_x_1, pos_y_1); 97 cached_positions_[1] = ToDips(gfx::PointF(pos_x_1_pixels, pos_y_1_pixels));
96 cached_pointer_ids_[0] = pointer_id_0; 98 cached_pointer_ids_[0] = pointer_id_0;
97 cached_pointer_ids_[1] = pointer_id_1; 99 cached_pointer_ids_[1] = pointer_id_1;
98 cached_touch_majors_[0] = touch_major_0; 100 cached_touch_majors_[0] = ToDips(touch_major_0_pixels);
99 cached_touch_majors_[1] = touch_major_1; 101 cached_touch_majors_[1] = ToDips(touch_major_1_pixels);
100 } 102 }
101 103
102 MotionEventAndroid::MotionEventAndroid(JNIEnv* env, jobject event) 104 MotionEventAndroid::MotionEventAndroid(float pix_to_dip,
105 JNIEnv* env,
106 jobject event)
103 : cached_time_(FromAndroidTime(Java_MotionEvent_getEventTime(env, event))), 107 : cached_time_(FromAndroidTime(Java_MotionEvent_getEventTime(env, event))),
104 cached_action_(FromAndroidAction( 108 cached_action_(
105 Java_MotionEvent_getActionMasked(env, event))), 109 FromAndroidAction(Java_MotionEvent_getActionMasked(env, event))),
106 cached_pointer_count_(Java_MotionEvent_getPointerCount(env, event)), 110 cached_pointer_count_(Java_MotionEvent_getPointerCount(env, event)),
107 cached_history_size_(Java_MotionEvent_getHistorySize(env, event)), 111 cached_history_size_(Java_MotionEvent_getHistorySize(env, event)),
108 cached_action_index_(Java_MotionEvent_getActionIndex(env, event)), 112 cached_action_index_(Java_MotionEvent_getActionIndex(env, event)),
113 pix_to_dip_(pix_to_dip),
109 should_recycle_(true) { 114 should_recycle_(true) {
110 event_.Reset(env, event); 115 event_.Reset(env, event);
111 DCHECK(event_.obj()); 116 DCHECK(event_.obj());
112 117
113 for (size_t i = 0; i < MAX_POINTERS_TO_CACHE; ++i) { 118 for (size_t i = 0; i < MAX_POINTERS_TO_CACHE; ++i) {
114 if (i < cached_pointer_count_) { 119 if (i < cached_pointer_count_) {
115 cached_positions_[i].set_x(Java_MotionEvent_getXF_I(env, event, i)); 120 cached_positions_[i] =
116 cached_positions_[i].set_y(Java_MotionEvent_getYF_I(env, event, i)); 121 ToDips(gfx::PointF(Java_MotionEvent_getXF_I(env, event, i),
122 Java_MotionEvent_getYF_I(env, event, i)));
117 cached_pointer_ids_[i] = Java_MotionEvent_getPointerId(env, event, i); 123 cached_pointer_ids_[i] = Java_MotionEvent_getPointerId(env, event, i);
118 cached_touch_majors_[i] = 124 cached_touch_majors_[i] =
119 Java_MotionEvent_getTouchMajorF_I(env, event, i); 125 ToDips(Java_MotionEvent_getTouchMajorF_I(env, event, i));
120 } else { 126 } else {
121 cached_pointer_ids_[i] = 0; 127 cached_pointer_ids_[i] = 0;
122 cached_touch_majors_[i] = 0.f; 128 cached_touch_majors_[i] = 0.f;
123 } 129 }
124 } 130 }
125 } 131 }
126 132
127 MotionEventAndroid::MotionEventAndroid(const MotionEventAndroid& other) 133 MotionEventAndroid::MotionEventAndroid(const MotionEventAndroid& other)
128 : event_(Obtain(other)), 134 : event_(Obtain(other)),
129 cached_time_(other.cached_time_), 135 cached_time_(other.cached_time_),
130 cached_action_(other.cached_action_), 136 cached_action_(other.cached_action_),
131 cached_pointer_count_(other.cached_pointer_count_), 137 cached_pointer_count_(other.cached_pointer_count_),
132 cached_history_size_(other.cached_history_size_), 138 cached_history_size_(other.cached_history_size_),
133 cached_action_index_(other.cached_action_index_), 139 cached_action_index_(other.cached_action_index_),
140 pix_to_dip_(other.pix_to_dip_),
134 should_recycle_(true) { 141 should_recycle_(true) {
135 DCHECK(event_.obj()); 142 DCHECK(event_.obj());
136 for (size_t i = 0; i < MAX_POINTERS_TO_CACHE; ++i) { 143 for (size_t i = 0; i < MAX_POINTERS_TO_CACHE; ++i) {
137 cached_positions_[i] = other.cached_positions_[i]; 144 cached_positions_[i] = other.cached_positions_[i];
138 cached_pointer_ids_[i] = other.cached_pointer_ids_[i]; 145 cached_pointer_ids_[i] = other.cached_pointer_ids_[i];
139 cached_touch_majors_[i] = other.cached_touch_majors_[i]; 146 cached_touch_majors_[i] = other.cached_touch_majors_[i];
140 } 147 }
141 } 148 }
142 149
143 MotionEventAndroid::~MotionEventAndroid() { 150 MotionEventAndroid::~MotionEventAndroid() {
144 if (should_recycle_) 151 if (should_recycle_)
145 Java_MotionEvent_recycle(AttachCurrentThread(), event_.obj()); 152 Java_MotionEvent_recycle(AttachCurrentThread(), event_.obj());
146 } 153 }
147 154
148 int MotionEventAndroid::GetId() const { 155 int MotionEventAndroid::GetId() const {
149 return 0; 156 return 0;
150 } 157 }
151 158
152 MotionEventAndroid::Action MotionEventAndroid::GetAction() const { 159 MotionEventAndroid::Action MotionEventAndroid::GetAction() const {
153 return cached_action_; 160 return cached_action_;
154 } 161 }
155 162
156 int MotionEventAndroid::GetActionIndex() const { 163 int MotionEventAndroid::GetActionIndex() const { return cached_action_index_; }
157 return cached_action_index_;
158 }
159 164
160 size_t MotionEventAndroid::GetPointerCount() const { 165 size_t MotionEventAndroid::GetPointerCount() const {
161 return cached_pointer_count_; 166 return cached_pointer_count_;
162 } 167 }
163 168
164 int MotionEventAndroid::GetPointerId(size_t pointer_index) const { 169 int MotionEventAndroid::GetPointerId(size_t pointer_index) const {
165 DCHECK_LT(pointer_index, cached_pointer_count_); 170 DCHECK_LT(pointer_index, cached_pointer_count_);
166 if (pointer_index < MAX_POINTERS_TO_CACHE) 171 if (pointer_index < MAX_POINTERS_TO_CACHE)
167 return cached_pointer_ids_[pointer_index]; 172 return cached_pointer_ids_[pointer_index];
168 return Java_MotionEvent_getPointerId( 173 return Java_MotionEvent_getPointerId(
169 AttachCurrentThread(), event_.obj(), pointer_index); 174 AttachCurrentThread(), event_.obj(), pointer_index);
170 } 175 }
171 176
172 float MotionEventAndroid::GetX(size_t pointer_index) const { 177 float MotionEventAndroid::GetX(size_t pointer_index) const {
173 DCHECK_LT(pointer_index, cached_pointer_count_); 178 DCHECK_LT(pointer_index, cached_pointer_count_);
174 if (pointer_index < MAX_POINTERS_TO_CACHE) 179 if (pointer_index < MAX_POINTERS_TO_CACHE)
175 return cached_positions_[pointer_index].x(); 180 return cached_positions_[pointer_index].x();
176 return Java_MotionEvent_getXF_I( 181 return ToDips(Java_MotionEvent_getXF_I(
177 AttachCurrentThread(), event_.obj(), pointer_index); 182 AttachCurrentThread(), event_.obj(), pointer_index));
178 } 183 }
179 184
180 float MotionEventAndroid::GetY(size_t pointer_index) const { 185 float MotionEventAndroid::GetY(size_t pointer_index) const {
181 DCHECK_LT(pointer_index, cached_pointer_count_); 186 DCHECK_LT(pointer_index, cached_pointer_count_);
182 if (pointer_index < MAX_POINTERS_TO_CACHE) 187 if (pointer_index < MAX_POINTERS_TO_CACHE)
183 return cached_positions_[pointer_index].y(); 188 return cached_positions_[pointer_index].y();
184 return Java_MotionEvent_getYF_I( 189 return ToDips(Java_MotionEvent_getYF_I(
185 AttachCurrentThread(), event_.obj(), pointer_index); 190 AttachCurrentThread(), event_.obj(), pointer_index));
186 } 191 }
187 192
188 float MotionEventAndroid::GetTouchMajor(size_t pointer_index) const { 193 float MotionEventAndroid::GetTouchMajor(size_t pointer_index) const {
189 DCHECK_LT(pointer_index, cached_pointer_count_); 194 DCHECK_LT(pointer_index, cached_pointer_count_);
190 if (pointer_index < MAX_POINTERS_TO_CACHE) 195 if (pointer_index < MAX_POINTERS_TO_CACHE)
191 return cached_touch_majors_[pointer_index]; 196 return cached_touch_majors_[pointer_index];
192 return Java_MotionEvent_getTouchMajorF_I( 197 return ToDips(Java_MotionEvent_getTouchMajorF_I(
193 AttachCurrentThread(), event_.obj(), pointer_index); 198 AttachCurrentThread(), event_.obj(), pointer_index));
194 } 199 }
195 200
196 float MotionEventAndroid::GetPressure(size_t pointer_index) const { 201 float MotionEventAndroid::GetPressure(size_t pointer_index) const {
197 DCHECK_LT(pointer_index, cached_pointer_count_); 202 DCHECK_LT(pointer_index, cached_pointer_count_);
198 return Java_MotionEvent_getPressureF_I( 203 return Java_MotionEvent_getPressureF_I(
199 AttachCurrentThread(), event_.obj(), pointer_index); 204 AttachCurrentThread(), event_.obj(), pointer_index);
200 } 205 }
201 206
202 base::TimeTicks MotionEventAndroid::GetEventTime() const { 207 base::TimeTicks MotionEventAndroid::GetEventTime() const {
203 return cached_time_; 208 return cached_time_;
204 } 209 }
205 210
206 size_t MotionEventAndroid::GetHistorySize() const { 211 size_t MotionEventAndroid::GetHistorySize() const {
207 return cached_history_size_; 212 return cached_history_size_;
208 } 213 }
209 214
210 base::TimeTicks MotionEventAndroid::GetHistoricalEventTime( 215 base::TimeTicks MotionEventAndroid::GetHistoricalEventTime(
211 size_t historical_index) const { 216 size_t historical_index) const {
212 return FromAndroidTime(Java_MotionEvent_getHistoricalEventTime( 217 return FromAndroidTime(Java_MotionEvent_getHistoricalEventTime(
213 AttachCurrentThread(), event_.obj(), historical_index)); 218 AttachCurrentThread(), event_.obj(), historical_index));
214 } 219 }
215 220
216 float MotionEventAndroid::GetHistoricalTouchMajor(size_t pointer_index, 221 float MotionEventAndroid::GetHistoricalTouchMajor(
217 size_t historical_index) 222 size_t pointer_index,
218 const { 223 size_t historical_index) const {
219 return Java_MotionEvent_getHistoricalTouchMajorF_I_I( 224 return ToDips(Java_MotionEvent_getHistoricalTouchMajorF_I_I(
220 AttachCurrentThread(), event_.obj(), pointer_index, historical_index); 225 AttachCurrentThread(), event_.obj(), pointer_index, historical_index));
221 } 226 }
222 227
223 float MotionEventAndroid::GetHistoricalX(size_t pointer_index, 228 float MotionEventAndroid::GetHistoricalX(size_t pointer_index,
224 size_t historical_index) const { 229 size_t historical_index) const {
225 return Java_MotionEvent_getHistoricalXF_I_I( 230 return ToDips(Java_MotionEvent_getHistoricalXF_I_I(
226 AttachCurrentThread(), event_.obj(), pointer_index, historical_index); 231 AttachCurrentThread(), event_.obj(), pointer_index, historical_index));
227 } 232 }
228 233
229 float MotionEventAndroid::GetHistoricalY(size_t pointer_index, 234 float MotionEventAndroid::GetHistoricalY(size_t pointer_index,
230 size_t historical_index) const { 235 size_t historical_index) const {
231 return Java_MotionEvent_getHistoricalYF_I_I( 236 return ToDips(Java_MotionEvent_getHistoricalYF_I_I(
232 AttachCurrentThread(), event_.obj(), pointer_index, historical_index); 237 AttachCurrentThread(), event_.obj(), pointer_index, historical_index));
233 } 238 }
234 239
235 scoped_ptr<ui::MotionEvent> MotionEventAndroid::Clone() const { 240 scoped_ptr<ui::MotionEvent> MotionEventAndroid::Clone() const {
236 return scoped_ptr<MotionEvent>(new MotionEventAndroid(*this)); 241 return scoped_ptr<MotionEvent>(new MotionEventAndroid(*this));
237 } 242 }
238 243
239 scoped_ptr<ui::MotionEvent> MotionEventAndroid::Cancel() const { 244 scoped_ptr<ui::MotionEvent> MotionEventAndroid::Cancel() const {
240 return scoped_ptr<MotionEvent>(new MotionEventAndroid( 245 // The input coordinates to |MotionEventAndroid| are always in device pixels,
241 AttachCurrentThread(), 246 // but the cached coordinates are in DIPs.
242 Obtain(GetDownTime(), 247 const gfx::PointF position_pixels =
243 GetEventTime(), 248 gfx::ScalePoint(cached_positions_[0], 1.f / pix_to_dip_);
244 MotionEventAndroid::ACTION_CANCEL, 249 return scoped_ptr<MotionEvent>(
245 GetX(0), 250 new MotionEventAndroid(pix_to_dip_,
246 GetY(0)).obj())); 251 AttachCurrentThread(),
252 Obtain(GetDownTime(),
253 GetEventTime(),
254 MotionEventAndroid::ACTION_CANCEL,
255 position_pixels.x(),
256 position_pixels.y()).obj()));
247 } 257 }
248 258
249 float MotionEventAndroid::GetTouchMinor(size_t pointer_index) const { 259 float MotionEventAndroid::GetTouchMinor(size_t pointer_index) const {
250 return Java_MotionEvent_getTouchMinorF_I( 260 return ToDips(Java_MotionEvent_getTouchMinorF_I(
251 AttachCurrentThread(), event_.obj(), pointer_index); 261 AttachCurrentThread(), event_.obj(), pointer_index));
252 } 262 }
253 263
254 float MotionEventAndroid::GetOrientation() const { 264 float MotionEventAndroid::GetOrientation() const {
255 return Java_MotionEvent_getOrientationF(AttachCurrentThread(), event_.obj()); 265 return Java_MotionEvent_getOrientationF(AttachCurrentThread(), event_.obj());
256 } 266 }
257 267
258 base::TimeTicks MotionEventAndroid::GetDownTime() const { 268 base::TimeTicks MotionEventAndroid::GetDownTime() const {
259 return FromAndroidTime( 269 return FromAndroidTime(
260 Java_MotionEvent_getDownTime(AttachCurrentThread(), event_.obj())); 270 Java_MotionEvent_getDownTime(AttachCurrentThread(), event_.obj()));
261 } 271 }
262 272
273 float MotionEventAndroid::ToDips(float pixels) const {
274 return pixels * pix_to_dip_;
275 }
276
277 gfx::PointF MotionEventAndroid::ToDips(const gfx::PointF& point_pixels) const {
278 return gfx::ScalePoint(point_pixels, pix_to_dip_);
279 }
280
263 // static 281 // static
264 bool MotionEventAndroid::RegisterMotionEventAndroid(JNIEnv* env) { 282 bool MotionEventAndroid::RegisterMotionEventAndroid(JNIEnv* env) {
265 return JNI_MotionEvent::RegisterNativesImpl(env); 283 return JNI_MotionEvent::RegisterNativesImpl(env);
266 } 284 }
267 285
268 // static 286 // static
269 base::android::ScopedJavaLocalRef<jobject> MotionEventAndroid::Obtain( 287 base::android::ScopedJavaLocalRef<jobject> MotionEventAndroid::Obtain(
270 const MotionEventAndroid& event) { 288 const MotionEventAndroid& event) {
271 return Java_MotionEvent_obtainAVME_AVME(AttachCurrentThread(), 289 return Java_MotionEvent_obtainAVME_AVME(AttachCurrentThread(),
272 event.event_.obj()); 290 event.event_.obj());
273 } 291 }
274 292
275 // static 293 // static
276 base::android::ScopedJavaLocalRef<jobject> MotionEventAndroid::Obtain( 294 base::android::ScopedJavaLocalRef<jobject> MotionEventAndroid::Obtain(
277 base::TimeTicks down_time, 295 base::TimeTicks down_time,
278 base::TimeTicks event_time, 296 base::TimeTicks event_time,
279 Action action, 297 Action action,
280 float x, 298 float x_pixels,
281 float y) { 299 float y_pixels) {
282 return Java_MotionEvent_obtainAVME_J_J_I_F_F_I(AttachCurrentThread(), 300 return Java_MotionEvent_obtainAVME_J_J_I_F_F_I(AttachCurrentThread(),
283 ToAndroidTime(down_time), 301 ToAndroidTime(down_time),
284 ToAndroidTime(event_time), 302 ToAndroidTime(event_time),
285 ToAndroidAction(action), 303 ToAndroidAction(action),
286 x, 304 x_pixels,
287 y, 305 y_pixels,
288 0); 306 0);
289 } 307 }
290 308
291 } // namespace content 309 } // namespace content
OLDNEW
« no previous file with comments | « content/browser/renderer_host/input/motion_event_android.h ('k') | content/browser/renderer_host/input/touch_event_queue.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698