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

Unified 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: More 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 side-by-side diff with in-line comments
Download patch
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);
}

Powered by Google App Engine
This is Rietveld 408576698