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 326b59f9bc834b84bc0d53a95071e5812df0dcb5..2c3c8c335506170fcb49d553695705dfeb61e417 100644 |
--- a/content/browser/renderer_host/input/motion_event_android.cc |
+++ b/content/browser/renderer_host/input/motion_event_android.cc |
@@ -64,18 +64,64 @@ base::TimeTicks FromAndroidTime(int64 time_ms) { |
} // namespace |
-MotionEventAndroid::MotionEventAndroid(JNIEnv* env, jobject event, bool recycle) |
+MotionEventAndroid::MotionEventAndroid(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, |
+ jint pointer_id_0, |
+ jint pointer_id_1, |
+ jfloat touch_major_0, |
+ jfloat touch_major_1) |
+ : 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), |
+ should_recycle_(false) { |
+ DCHECK_GT(pointer_count, 0); |
+ DCHECK_GE(history_size, 0); |
+ |
+ 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_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; |
+} |
+ |
+MotionEventAndroid::MotionEventAndroid(JNIEnv* env, jobject event) |
: cached_time_(FromAndroidTime(Java_MotionEvent_getEventTime(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)), |
- cached_x_(Java_MotionEvent_getXF(env, event)), |
- cached_y_(Java_MotionEvent_getYF(env, event)), |
- should_recycle_(recycle) { |
+ 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_pointer_ids_[i] = Java_MotionEvent_getPointerId(env, event, i); |
+ cached_touch_majors_[i] = |
+ Java_MotionEvent_getTouchMajorF_I(env, event, i); |
+ } else { |
+ cached_pointer_ids_[i] = 0; |
+ cached_touch_majors_[i] = 0.f; |
+ } |
+ } |
} |
MotionEventAndroid::MotionEventAndroid(const MotionEventAndroid& other) |
@@ -85,10 +131,13 @@ 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_), |
- cached_x_(other.cached_x_), |
- cached_y_(other.cached_y_), |
should_recycle_(true) { |
DCHECK(event_.obj()); |
+ for (size_t i = 0; i < MAX_POINTERS_TO_CACHE; ++i) { |
+ cached_positions_[i] = other.cached_positions_[i]; |
+ cached_pointer_ids_[i] = other.cached_pointer_ids_[i]; |
+ cached_touch_majors_[i] = other.cached_touch_majors_[i]; |
+ } |
} |
MotionEventAndroid::~MotionEventAndroid() { |
@@ -110,28 +159,32 @@ size_t MotionEventAndroid::GetPointerCount() const { |
int MotionEventAndroid::GetPointerId(size_t pointer_index) const { |
DCHECK_LT(pointer_index, cached_pointer_count_); |
+ if (pointer_index < MAX_POINTERS_TO_CACHE) |
+ return cached_pointer_ids_[pointer_index]; |
return Java_MotionEvent_getPointerId( |
AttachCurrentThread(), event_.obj(), pointer_index); |
} |
float MotionEventAndroid::GetX(size_t pointer_index) const { |
DCHECK_LT(pointer_index, cached_pointer_count_); |
- if (pointer_index == 0) |
- return cached_x_; |
+ if (pointer_index < MAX_POINTERS_TO_CACHE) |
+ return cached_positions_[pointer_index].x(); |
return 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 == 0) |
- return cached_y_; |
+ if (pointer_index < MAX_POINTERS_TO_CACHE) |
+ return cached_positions_[pointer_index].y(); |
return 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); |
} |
@@ -186,8 +239,7 @@ scoped_ptr<ui::MotionEvent> MotionEventAndroid::Cancel() const { |
GetEventTime(), |
MotionEventAndroid::ACTION_CANCEL, |
GetX(0), |
- GetY(0)).obj(), |
- true)); |
+ GetY(0)).obj())); |
} |
float MotionEventAndroid::GetTouchMinor(size_t pointer_index) const { |