Chromium Code Reviews| Index: content/browser/renderer_host/input/motion_event_android.cc |
| diff --git a/content/browser/renderer_host/input/motion_event_android.cc b/content/browser/renderer_host/input/motion_event_android.cc |
| index eea14e961aa0d3f44e6cd78f682d48936fa720a9..444bf30b25920224b2099ce0560bf7707454480c 100644 |
| --- a/content/browser/renderer_host/input/motion_event_android.cc |
| +++ b/content/browser/renderer_host/input/motion_event_android.cc |
| @@ -6,6 +6,7 @@ |
| #include "base/android/jni_android.h" |
| #include "jni/MotionEvent_jni.h" |
| +#include "ui/gfx/android/device_display_info.h" |
| using base::android::AttachCurrentThread; |
| using namespace JNI_MotionEvent; |
| @@ -64,26 +65,28 @@ base::TimeTicks FromAndroidTime(int64 time_ms) { |
| } // namespace |
| -MotionEventAndroid::MotionEventAndroid(JNIEnv* env, |
| +MotionEventAndroid::MotionEventAndroid(float px_to_dp, |
| + JNIEnv* env, |
| jobject event, |
| jlong time_ms, |
| jint android_action, |
| jint pointer_count, |
| jint history_size, |
| jint action_index, |
| - jfloat pos_x_0, |
| - jfloat pos_y_0, |
| - jfloat pos_x_1, |
| - jfloat pos_y_1, |
| + jfloat pos_x_0_pixels, |
| + jfloat pos_y_0_pixels, |
| + jfloat pos_x_1_pixels, |
| + jfloat pos_y_1_pixels, |
| jint pointer_id_0, |
| jint pointer_id_1, |
| - jfloat touch_major_0, |
| - jfloat touch_major_1) |
| + jfloat touch_major_0_pixels, |
| + jfloat touch_major_1_pixels) |
| : cached_time_(FromAndroidTime(time_ms)), |
| cached_action_(FromAndroidAction(android_action)), |
| cached_pointer_count_(pointer_count), |
| cached_history_size_(history_size), |
| cached_action_index_(action_index), |
| + px_to_dp_(px_to_dp), |
| should_recycle_(false) { |
| DCHECK_GT(pointer_count, 0); |
| DCHECK_GE(history_size, 0); |
| @@ -91,32 +94,34 @@ MotionEventAndroid::MotionEventAndroid(JNIEnv* env, |
| event_.Reset(env, event); |
| DCHECK(event_.obj()); |
| - cached_positions_[0] = gfx::PointF(pos_x_0, pos_y_0); |
| - cached_positions_[1] = gfx::PointF(pos_x_1, pos_y_1); |
| + cached_positions_[0] = ToDips(gfx::PointF(pos_x_0_pixels, pos_y_0_pixels)); |
| + cached_positions_[1] = ToDips(gfx::PointF(pos_x_1_pixels, pos_y_1_pixels)); |
| cached_pointer_ids_[0] = pointer_id_0; |
| cached_pointer_ids_[1] = pointer_id_1; |
| - cached_touch_majors_[0] = touch_major_0; |
| - cached_touch_majors_[1] = touch_major_1; |
| + cached_touch_majors_[0] = ToDips(touch_major_0_pixels); |
| + cached_touch_majors_[1] = ToDips(touch_major_1_pixels); |
| } |
| MotionEventAndroid::MotionEventAndroid(JNIEnv* env, jobject event) |
| : cached_time_(FromAndroidTime(Java_MotionEvent_getEventTime(env, event))), |
| - cached_action_(FromAndroidAction( |
| - Java_MotionEvent_getActionMasked(env, event))), |
| + cached_action_( |
| + FromAndroidAction(Java_MotionEvent_getActionMasked(env, event))), |
| cached_pointer_count_(Java_MotionEvent_getPointerCount(env, event)), |
| cached_history_size_(Java_MotionEvent_getHistorySize(env, event)), |
| cached_action_index_(Java_MotionEvent_getActionIndex(env, event)), |
| + px_to_dp_(1.f / gfx::DeviceDisplayInfo().GetDIPScale()), |
| should_recycle_(true) { |
| event_.Reset(env, event); |
| DCHECK(event_.obj()); |
| for (size_t i = 0; i < MAX_POINTERS_TO_CACHE; ++i) { |
| if (i < cached_pointer_count_) { |
| - cached_positions_[i].set_x(Java_MotionEvent_getXF_I(env, event, i)); |
| - cached_positions_[i].set_y(Java_MotionEvent_getYF_I(env, event, i)); |
| + cached_positions_[i] = |
| + ToDips(gfx::PointF(Java_MotionEvent_getXF_I(env, event, i), |
| + Java_MotionEvent_getYF_I(env, event, i))); |
| cached_pointer_ids_[i] = Java_MotionEvent_getPointerId(env, event, i); |
| cached_touch_majors_[i] = |
| - Java_MotionEvent_getTouchMajorF_I(env, event, i); |
| + ToDips(Java_MotionEvent_getTouchMajorF_I(env, event, i)); |
| } else { |
| cached_pointer_ids_[i] = 0; |
| cached_touch_majors_[i] = 0.f; |
| @@ -131,6 +136,7 @@ MotionEventAndroid::MotionEventAndroid(const MotionEventAndroid& other) |
| cached_pointer_count_(other.cached_pointer_count_), |
| cached_history_size_(other.cached_history_size_), |
| cached_action_index_(other.cached_action_index_), |
| + px_to_dp_(other.px_to_dp_), |
| should_recycle_(true) { |
| DCHECK(event_.obj()); |
| for (size_t i = 0; i < MAX_POINTERS_TO_CACHE; ++i) { |
| @@ -153,9 +159,7 @@ MotionEventAndroid::Action MotionEventAndroid::GetAction() const { |
| return cached_action_; |
| } |
| -int MotionEventAndroid::GetActionIndex() const { |
| - return cached_action_index_; |
| -} |
| +int MotionEventAndroid::GetActionIndex() const { return cached_action_index_; } |
| size_t MotionEventAndroid::GetPointerCount() const { |
| return cached_pointer_count_; |
| @@ -173,24 +177,24 @@ float MotionEventAndroid::GetX(size_t pointer_index) const { |
| DCHECK_LT(pointer_index, cached_pointer_count_); |
| if (pointer_index < MAX_POINTERS_TO_CACHE) |
| return cached_positions_[pointer_index].x(); |
| - return Java_MotionEvent_getXF_I( |
| - AttachCurrentThread(), event_.obj(), pointer_index); |
| + return ToDips(Java_MotionEvent_getXF_I( |
| + AttachCurrentThread(), event_.obj(), pointer_index)); |
| } |
| float MotionEventAndroid::GetY(size_t pointer_index) const { |
| DCHECK_LT(pointer_index, cached_pointer_count_); |
| if (pointer_index < MAX_POINTERS_TO_CACHE) |
| return cached_positions_[pointer_index].y(); |
| - return Java_MotionEvent_getYF_I( |
| - AttachCurrentThread(), event_.obj(), pointer_index); |
| + return ToDips(Java_MotionEvent_getYF_I( |
| + AttachCurrentThread(), event_.obj(), pointer_index)); |
| } |
| float MotionEventAndroid::GetTouchMajor(size_t pointer_index) const { |
| DCHECK_LT(pointer_index, cached_pointer_count_); |
| if (pointer_index < MAX_POINTERS_TO_CACHE) |
| return cached_touch_majors_[pointer_index]; |
| - return Java_MotionEvent_getTouchMajorF_I( |
| - AttachCurrentThread(), event_.obj(), pointer_index); |
| + return ToDips(Java_MotionEvent_getTouchMajorF_I( |
| + AttachCurrentThread(), event_.obj(), pointer_index)); |
| } |
| float MotionEventAndroid::GetPressure(size_t pointer_index) const { |
| @@ -213,23 +217,23 @@ base::TimeTicks MotionEventAndroid::GetHistoricalEventTime( |
| AttachCurrentThread(), event_.obj(), historical_index)); |
| } |
| -float MotionEventAndroid::GetHistoricalTouchMajor(size_t pointer_index, |
| - size_t historical_index) |
| - const { |
| - return Java_MotionEvent_getHistoricalTouchMajorF_I_I( |
| - AttachCurrentThread(), event_.obj(), pointer_index, historical_index); |
| +float MotionEventAndroid::GetHistoricalTouchMajor( |
| + size_t pointer_index, |
| + size_t historical_index) const { |
| + return ToDips(Java_MotionEvent_getHistoricalTouchMajorF_I_I( |
| + AttachCurrentThread(), event_.obj(), pointer_index, historical_index)); |
| } |
| float MotionEventAndroid::GetHistoricalX(size_t pointer_index, |
| size_t historical_index) const { |
| - return Java_MotionEvent_getHistoricalXF_I_I( |
| - AttachCurrentThread(), event_.obj(), pointer_index, historical_index); |
| + return ToDips(Java_MotionEvent_getHistoricalXF_I_I( |
| + AttachCurrentThread(), event_.obj(), pointer_index, historical_index)); |
| } |
| float MotionEventAndroid::GetHistoricalY(size_t pointer_index, |
| size_t historical_index) const { |
| - return Java_MotionEvent_getHistoricalYF_I_I( |
| - AttachCurrentThread(), event_.obj(), pointer_index, historical_index); |
| + return ToDips(Java_MotionEvent_getHistoricalYF_I_I( |
| + AttachCurrentThread(), event_.obj(), pointer_index, historical_index)); |
| } |
| scoped_ptr<ui::MotionEvent> MotionEventAndroid::Clone() const { |
| @@ -237,18 +241,18 @@ scoped_ptr<ui::MotionEvent> MotionEventAndroid::Clone() const { |
| } |
| scoped_ptr<ui::MotionEvent> MotionEventAndroid::Cancel() const { |
| - return scoped_ptr<MotionEvent>(new MotionEventAndroid( |
| - AttachCurrentThread(), |
| - Obtain(GetDownTime(), |
| - GetEventTime(), |
| - MotionEventAndroid::ACTION_CANCEL, |
| - GetX(0), |
| - GetY(0)).obj())); |
| + return scoped_ptr<MotionEvent>( |
| + new MotionEventAndroid(AttachCurrentThread(), |
| + Obtain(GetDownTime(), |
| + GetEventTime(), |
| + MotionEventAndroid::ACTION_CANCEL, |
| + GetX(0) / px_to_dp_, |
|
tdresser
2014/04/09 14:00:01
I guess caching the coordinates in pixels to avoid
jdduke (slow)
2014/04/10 22:04:53
|Cancel()| should be called relatively infrequentl
|
| + GetY(0) / px_to_dp_).obj())); |
| } |
| float MotionEventAndroid::GetTouchMinor(size_t pointer_index) const { |
| - return Java_MotionEvent_getTouchMinorF_I( |
| - AttachCurrentThread(), event_.obj(), pointer_index); |
| + return ToDips(Java_MotionEvent_getTouchMinorF_I( |
| + AttachCurrentThread(), event_.obj(), pointer_index)); |
| } |
| float MotionEventAndroid::GetOrientation() const { |
| @@ -260,6 +264,14 @@ base::TimeTicks MotionEventAndroid::GetDownTime() const { |
| Java_MotionEvent_getDownTime(AttachCurrentThread(), event_.obj())); |
| } |
| +float MotionEventAndroid::ToDips(float pixels) const { |
| + return pixels * px_to_dp_; |
| +} |
| + |
| +gfx::PointF MotionEventAndroid::ToDips(const gfx::PointF& point_pixels) const { |
| + return gfx::ScalePoint(point_pixels, px_to_dp_); |
| +} |
| + |
| // static |
| bool MotionEventAndroid::RegisterMotionEventAndroid(JNIEnv* env) { |
| return JNI_MotionEvent::RegisterNativesImpl(env); |
| @@ -277,14 +289,14 @@ base::android::ScopedJavaLocalRef<jobject> MotionEventAndroid::Obtain( |
| base::TimeTicks down_time, |
| base::TimeTicks event_time, |
| Action action, |
| - float x, |
| - float y) { |
| + float x_pixels, |
| + float y_pixels) { |
| return Java_MotionEvent_obtainAVME_J_J_I_F_F_I(AttachCurrentThread(), |
| ToAndroidTime(down_time), |
| ToAndroidTime(event_time), |
| ToAndroidAction(action), |
| - x, |
| - y, |
| + x_pixels, |
| + y_pixels, |
| 0); |
| } |