| 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 35cce4b9c83c4f7a06a3222868b9325886d8d50d..fa21047d71b78cdf37b5c39c2ef6fe5799c2f15d 100644
|
| --- a/content/browser/renderer_host/input/motion_event_android.cc
|
| +++ b/content/browser/renderer_host/input/motion_event_android.cc
|
| @@ -17,26 +17,6 @@ using namespace JNI_MotionEvent;
|
| namespace content {
|
| namespace {
|
|
|
| -int ToAndroidAction(MotionEventAndroid::Action action) {
|
| - switch (action) {
|
| - case MotionEventAndroid::ACTION_DOWN:
|
| - return ACTION_DOWN;
|
| - case MotionEventAndroid::ACTION_UP:
|
| - return ACTION_UP;
|
| - case MotionEventAndroid::ACTION_MOVE:
|
| - return ACTION_MOVE;
|
| - case MotionEventAndroid::ACTION_CANCEL:
|
| - return ACTION_CANCEL;
|
| - case MotionEventAndroid::ACTION_POINTER_DOWN:
|
| - return ACTION_POINTER_DOWN;
|
| - case MotionEventAndroid::ACTION_POINTER_UP:
|
| - return ACTION_POINTER_UP;
|
| - };
|
| - NOTREACHED() << "Invalid Android MotionEvent type for gesture detection: "
|
| - << action;
|
| - return ACTION_CANCEL;
|
| -}
|
| -
|
| MotionEventAndroid::Action FromAndroidAction(int android_action) {
|
| switch (android_action) {
|
| case ACTION_DOWN:
|
| @@ -107,10 +87,6 @@ int FromAndroidMetaState(int meta_state) {
|
| return flags;
|
| }
|
|
|
| -int64 ToAndroidTime(base::TimeTicks time) {
|
| - return (time - base::TimeTicks()).InMilliseconds();
|
| -}
|
| -
|
| base::TimeTicks FromAndroidTime(int64 time_ms) {
|
| return base::TimeTicks() + base::TimeDelta::FromMilliseconds(time_ms);
|
| }
|
| @@ -130,6 +106,30 @@ float ToValidFloat(float x) {
|
|
|
| } // namespace
|
|
|
| +MotionEventAndroid::Pointer::Pointer(jint id,
|
| + jfloat pos_x_pixels,
|
| + jfloat pos_y_pixels,
|
| + jfloat touch_major_pixels,
|
| + jfloat touch_minor_pixels,
|
| + jfloat orientation_rad,
|
| + jint tool_type)
|
| + : id(id),
|
| + pos_x_pixels(pos_x_pixels),
|
| + pos_y_pixels(pos_y_pixels),
|
| + touch_major_pixels(touch_major_pixels),
|
| + touch_minor_pixels(touch_minor_pixels),
|
| + orientation_rad(orientation_rad),
|
| + tool_type(tool_type) {
|
| +}
|
| +
|
| +MotionEventAndroid::CachedPointer::CachedPointer()
|
| + : id(0),
|
| + touch_major(0),
|
| + touch_minor(0),
|
| + orientation(0),
|
| + tool_type(TOOL_TYPE_UNKNOWN) {
|
| +}
|
| +
|
| MotionEventAndroid::MotionEventAndroid(float pix_to_dip,
|
| JNIEnv* env,
|
| jobject event,
|
| @@ -138,129 +138,34 @@ MotionEventAndroid::MotionEventAndroid(float pix_to_dip,
|
| jint pointer_count,
|
| jint history_size,
|
| jint action_index,
|
| - 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_pixels,
|
| - jfloat touch_major_1_pixels,
|
| - jfloat touch_minor_0_pixels,
|
| - jfloat touch_minor_1_pixels,
|
| - jfloat orientation_0_rad,
|
| - jfloat orientation_1_rad,
|
| - jfloat raw_pos_x_pixels,
|
| - jfloat raw_pos_y_pixels,
|
| - jint android_tool_type_0,
|
| - jint android_tool_type_1,
|
| jint android_button_state,
|
| - jint meta_state)
|
| - : cached_time_(FromAndroidTime(time_ms)),
|
| + jint meta_state,
|
| + jfloat raw_offset_x_pixels,
|
| + jfloat raw_offset_y_pixels,
|
| + const Pointer& pointer0,
|
| + const Pointer& pointer1)
|
| + : pix_to_dip_(pix_to_dip),
|
| + 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),
|
| cached_button_state_(FromAndroidButtonState(android_button_state)),
|
| cached_flags_(FromAndroidMetaState(meta_state)),
|
| - pix_to_dip_(pix_to_dip),
|
| - should_recycle_(false) {
|
| + cached_raw_position_offset_(ToDips(raw_offset_x_pixels),
|
| + ToDips(raw_offset_y_pixels)) {
|
| DCHECK_GT(pointer_count, 0);
|
| DCHECK_GE(history_size, 0);
|
|
|
| event_.Reset(env, event);
|
| - DCHECK(event_.obj());
|
| -
|
| - 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] = ToDips(touch_major_0_pixels);
|
| - cached_touch_majors_[1] = ToDips(touch_major_1_pixels);
|
| - cached_touch_minors_[0] = ToDips(touch_minor_0_pixels);
|
| - cached_touch_minors_[1] = ToDips(touch_minor_1_pixels);
|
| - cached_orientations_[0] = ToValidFloat(orientation_0_rad);
|
| - cached_orientations_[1] = ToValidFloat(orientation_1_rad);
|
| - cached_raw_position_offset_ =
|
| - ToDips(gfx::PointF(raw_pos_x_pixels, raw_pos_y_pixels)) -
|
| - cached_positions_[0];
|
| - cached_tool_types_[0] = FromAndroidToolType(android_tool_type_0);
|
| - cached_tool_types_[1] = FromAndroidToolType(android_tool_type_1);
|
| -}
|
| + if (cached_pointer_count_ > MAX_POINTERS_TO_CACHE || history_size > 0)
|
| + DCHECK(event_.obj());
|
|
|
| -MotionEventAndroid::MotionEventAndroid(float pix_to_dip,
|
| - 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_button_state_(
|
| - FromAndroidButtonState(Java_MotionEvent_getButtonState(env, event))),
|
| - cached_flags_(
|
| - FromAndroidMetaState(Java_MotionEvent_getMetaState(env, event))),
|
| - pix_to_dip_(pix_to_dip),
|
| - 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] =
|
| - 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] =
|
| - ToDips(Java_MotionEvent_getTouchMajorF_I(env, event, i));
|
| - cached_touch_minors_[i] =
|
| - ToDips(Java_MotionEvent_getTouchMinorF_I(env, event, i));
|
| - cached_orientations_[i] =
|
| - ToValidFloat(Java_MotionEvent_getOrientationF_I(env, event, i));
|
| - cached_tool_types_[i] =
|
| - FromAndroidToolType(Java_MotionEvent_getToolType(env, event, i));
|
| - } else {
|
| - cached_pointer_ids_[i] = 0;
|
| - cached_touch_majors_[i] = 0.f;
|
| - cached_touch_minors_[i] = 0.f;
|
| - cached_orientations_[i] = 0.f;
|
| - cached_tool_types_[i] = MotionEvent::TOOL_TYPE_UNKNOWN;
|
| - }
|
| - }
|
| -
|
| - cached_raw_position_offset_ =
|
| - ToDips(gfx::PointF(Java_MotionEvent_getRawX(env, event),
|
| - Java_MotionEvent_getRawY(env, event))) -
|
| - cached_positions_[0];
|
| -}
|
| -
|
| -MotionEventAndroid::MotionEventAndroid(const MotionEventAndroid& other)
|
| - : event_(Obtain(other)),
|
| - cached_time_(other.cached_time_),
|
| - cached_action_(other.cached_action_),
|
| - cached_pointer_count_(other.cached_pointer_count_),
|
| - cached_history_size_(other.cached_history_size_),
|
| - cached_action_index_(other.cached_action_index_),
|
| - cached_raw_position_offset_(other.cached_raw_position_offset_),
|
| - cached_button_state_(other.cached_button_state_),
|
| - cached_flags_(other.cached_flags_),
|
| - pix_to_dip_(other.pix_to_dip_),
|
| - 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];
|
| - cached_touch_minors_[i] = other.cached_touch_minors_[i];
|
| - cached_orientations_[i] = other.cached_orientations_[i];
|
| - cached_tool_types_[i] = other.cached_tool_types_[i];
|
| - }
|
| + cached_pointers_[0] = FromAndroidPointer(pointer0);
|
| + cached_pointers_[1] = FromAndroidPointer(pointer1);
|
| }
|
|
|
| MotionEventAndroid::~MotionEventAndroid() {
|
| - if (should_recycle_)
|
| - Java_MotionEvent_recycle(AttachCurrentThread(), event_.obj());
|
| }
|
|
|
| int MotionEventAndroid::GetId() const {
|
| @@ -282,7 +187,7 @@ 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 cached_pointers_[pointer_index].id;
|
| return Java_MotionEvent_getPointerId(
|
| AttachCurrentThread(), event_.obj(), pointer_index);
|
| }
|
| @@ -290,7 +195,7 @@ int MotionEventAndroid::GetPointerId(size_t pointer_index) const {
|
| 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 cached_pointers_[pointer_index].position.x();
|
| return ToDips(Java_MotionEvent_getXF_I(
|
| AttachCurrentThread(), event_.obj(), pointer_index));
|
| }
|
| @@ -298,7 +203,7 @@ float MotionEventAndroid::GetX(size_t pointer_index) const {
|
| 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 cached_pointers_[pointer_index].position.y();
|
| return ToDips(Java_MotionEvent_getYF_I(
|
| AttachCurrentThread(), event_.obj(), pointer_index));
|
| }
|
| @@ -314,7 +219,7 @@ float MotionEventAndroid::GetRawY(size_t pointer_index) const {
|
| 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 cached_pointers_[pointer_index].touch_major;
|
| return ToDips(Java_MotionEvent_getTouchMajorF_I(
|
| AttachCurrentThread(), event_.obj(), pointer_index));
|
| }
|
| @@ -322,21 +227,26 @@ float MotionEventAndroid::GetTouchMajor(size_t pointer_index) const {
|
| float MotionEventAndroid::GetTouchMinor(size_t pointer_index) const {
|
| DCHECK_LT(pointer_index, cached_pointer_count_);
|
| if (pointer_index < MAX_POINTERS_TO_CACHE)
|
| - return cached_touch_minors_[pointer_index];
|
| - return ToDips(Java_MotionEvent_getTouchMinorF_I(AttachCurrentThread(),
|
| - event_.obj(), pointer_index));
|
| + return cached_pointers_[pointer_index].touch_minor;
|
| + return ToDips(Java_MotionEvent_getTouchMinorF_I(
|
| + AttachCurrentThread(), event_.obj(), pointer_index));
|
| }
|
|
|
| float MotionEventAndroid::GetOrientation(size_t pointer_index) const {
|
| DCHECK_LT(pointer_index, cached_pointer_count_);
|
| if (pointer_index < MAX_POINTERS_TO_CACHE)
|
| - return cached_orientations_[pointer_index];
|
| + return cached_pointers_[pointer_index].orientation;
|
| return ToValidFloat(Java_MotionEvent_getOrientationF_I(
|
| AttachCurrentThread(), event_.obj(), pointer_index));
|
| }
|
|
|
| float MotionEventAndroid::GetPressure(size_t pointer_index) const {
|
| DCHECK_LT(pointer_index, cached_pointer_count_);
|
| + // Note that this early return is a special case exercised only in testing, as
|
| + // caching the pressure values is not a worthwhile optimization (they're
|
| + // accessed at most once per event instance).
|
| + if (!event_.obj())
|
| + return 0.f;
|
| return Java_MotionEvent_getPressureF_I(
|
| AttachCurrentThread(), event_.obj(), pointer_index);
|
| }
|
| @@ -378,7 +288,7 @@ ui::MotionEvent::ToolType MotionEventAndroid::GetToolType(
|
| size_t pointer_index) const {
|
| DCHECK_LT(pointer_index, cached_pointer_count_);
|
| if (pointer_index < MAX_POINTERS_TO_CACHE)
|
| - return cached_tool_types_[pointer_index];
|
| + return cached_pointers_[pointer_index].tool_type;
|
| return FromAndroidToolType(Java_MotionEvent_getToolType(
|
| AttachCurrentThread(), event_.obj(), pointer_index));
|
| }
|
| @@ -391,36 +301,21 @@ int MotionEventAndroid::GetFlags() const {
|
| return cached_flags_;
|
| }
|
|
|
| -scoped_ptr<ui::MotionEvent> MotionEventAndroid::Clone() const {
|
| - return scoped_ptr<MotionEvent>(new MotionEventAndroid(*this));
|
| -}
|
| -
|
| -scoped_ptr<ui::MotionEvent> MotionEventAndroid::Cancel() const {
|
| - // The input coordinates to |MotionEventAndroid| are always in device pixels,
|
| - // but the cached coordinates are in DIPs.
|
| - const gfx::PointF position_pixels =
|
| - gfx::ScalePoint(cached_positions_[0], 1.f / pix_to_dip_);
|
| - return scoped_ptr<MotionEvent>(
|
| - new MotionEventAndroid(pix_to_dip_,
|
| - AttachCurrentThread(),
|
| - Obtain(GetDownTime(),
|
| - GetEventTime(),
|
| - MotionEventAndroid::ACTION_CANCEL,
|
| - position_pixels.x(),
|
| - position_pixels.y()).obj()));
|
| -}
|
| -
|
| -base::TimeTicks MotionEventAndroid::GetDownTime() const {
|
| - return FromAndroidTime(
|
| - Java_MotionEvent_getDownTime(AttachCurrentThread(), event_.obj()));
|
| -}
|
| -
|
| float MotionEventAndroid::ToDips(float pixels) const {
|
| return pixels * pix_to_dip_;
|
| }
|
|
|
| -gfx::PointF MotionEventAndroid::ToDips(const gfx::PointF& point_pixels) const {
|
| - return gfx::ScalePoint(point_pixels, pix_to_dip_);
|
| +MotionEventAndroid::CachedPointer MotionEventAndroid::FromAndroidPointer(
|
| + const Pointer& pointer) const {
|
| + CachedPointer result;
|
| + result.id = pointer.id;
|
| + result.position =
|
| + gfx::PointF(ToDips(pointer.pos_x_pixels), ToDips(pointer.pos_y_pixels));
|
| + result.touch_major = ToDips(pointer.touch_major_pixels);
|
| + result.touch_minor = ToDips(pointer.touch_minor_pixels);
|
| + result.orientation = ToValidFloat(pointer.orientation_rad);
|
| + result.tool_type = FromAndroidToolType(pointer.tool_type);
|
| + return result;
|
| }
|
|
|
| // static
|
| @@ -428,27 +323,4 @@ bool MotionEventAndroid::RegisterMotionEventAndroid(JNIEnv* env) {
|
| return JNI_MotionEvent::RegisterNativesImpl(env);
|
| }
|
|
|
| -// static
|
| -base::android::ScopedJavaLocalRef<jobject> MotionEventAndroid::Obtain(
|
| - const MotionEventAndroid& event) {
|
| - return Java_MotionEvent_obtainAVME_AVME(AttachCurrentThread(),
|
| - event.event_.obj());
|
| -}
|
| -
|
| -// static
|
| -base::android::ScopedJavaLocalRef<jobject> MotionEventAndroid::Obtain(
|
| - base::TimeTicks down_time,
|
| - base::TimeTicks event_time,
|
| - Action action,
|
| - 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_pixels,
|
| - y_pixels,
|
| - 0);
|
| -}
|
| -
|
| } // namespace content
|
|
|