Commit 72153c86 authored by lanwei's avatar lanwei Committed by Commit Bot

Add some pointer properties to MotionEvent

We are using touch events to handle pen inputs, and when we convert
ui::touchevent to WebTouchEvent, some of the pointer properties are not
carried to WebPointerProperties. Because ui::touchevent are converted
to MotionEvent first, which does not have these attributes. Now we are
adding them to MotionEvent to pass these values to WebTouchEvent.

Bug: 867612

Change-Id: I44a262f0810791169cf2dae45c9131b8bb708927
Reviewed-on: https://chromium-review.googlesource.com/1150578
Commit-Queue: Lan Wei <lanwei@chromium.org>
Reviewed-by: default avatarNavid Zolghadr <nzolghadr@chromium.org>
Reviewed-by: default avatarTimothy Dresser <tdresser@chromium.org>
Cr-Commit-Position: refs/heads/master@{#580531}
parent 922ae26b
......@@ -168,21 +168,27 @@ float MotionEventWeb::GetPressure(size_t pointer_index) const {
float MotionEventWeb::GetTiltX(size_t pointer_index) const {
DCHECK_LT(pointer_index, GetPointerCount());
if (GetToolType(pointer_index) != ToolType::STYLUS)
return 0.f;
return event_.touches[pointer_index].tilt_x;
}
float MotionEventWeb::GetTiltY(size_t pointer_index) const {
DCHECK_LT(pointer_index, GetPointerCount());
if (GetToolType(pointer_index) != ToolType::STYLUS)
return 0.f;
return event_.touches[pointer_index].tilt_y;
}
float MotionEventWeb::GetTwist(size_t pointer_index) const {
DCHECK_LT(pointer_index, GetPointerCount());
return event_.touches[pointer_index].twist;
}
float MotionEventWeb::GetTangentialPressure(size_t pointer_index) const {
DCHECK_LT(pointer_index, GetPointerCount());
return event_.touches[pointer_index].tangential_pressure;
}
base::TimeTicks MotionEventWeb::GetEventTime() const {
return event_.TimeStamp();
}
......
......@@ -37,6 +37,8 @@ class CONTENT_EXPORT MotionEventWeb : public ui::MotionEvent {
float GetPressure(size_t pointer_index) const override;
float GetTiltX(size_t pointer_index) const override;
float GetTiltY(size_t pointer_index) const override;
float GetTwist(size_t pointer_index) const override;
float GetTangentialPressure(size_t pointer_index) const override;
base::TimeTicks GetEventTime() const override;
ToolType GetToolType(size_t pointer_index) const override;
int GetButtonState() const override;
......
......@@ -22,6 +22,8 @@ TEST(MotionEventWebTest, Constructor) {
const float orientations[] = {-pi, -2.f * pi / 3, -pi / 2};
const float tilts_x[] = {0.f, -180 / 4, -180 / 3};
const float tilts_y[] = {0.5f, 180 / 2, 180 / 3};
const float twists[] = {60, 160, 260};
const float tangential_pressures[] = {0.3f, 0.5f, 0.9f};
const MotionEvent::ToolType tool_types[] = {MotionEvent::ToolType::FINGER,
MotionEvent::ToolType::STYLUS,
MotionEvent::ToolType::MOUSE};
......@@ -34,10 +36,14 @@ TEST(MotionEventWebTest, Constructor) {
const float tilt_x = tilts_x[i];
const float tilt_y = tilts_y[i];
const float orientation = orientations[i];
const float twist = twists[i];
const float tangential_pressure = tangential_pressures[i];
PointerProperties pp2;
pp2.orientation = orientation;
pp2.tilt_x = tilt_x;
pp2.tilt_y = tilt_y;
pp2.twist = twist;
pp2.tangential_pressure = tangential_pressure;
pp2.tool_type = tool_type;
size_t pointer_index = generic_event.PushPointer(pp2);
EXPECT_GT(pointer_index, 0u);
......@@ -55,6 +61,9 @@ TEST(MotionEventWebTest, Constructor) {
<< " orientation=" << orientation;
EXPECT_NEAR(tilt_y, event.GetTiltY(pointer_index), 0.5)
<< " orientation=" << orientation;
EXPECT_EQ(twist, event.GetTwist(pointer_index));
EXPECT_EQ(tangential_pressure,
event.GetTangentialPressure(pointer_index));
} else {
EXPECT_EQ(0.f, event.GetTiltX(pointer_index));
EXPECT_EQ(0.f, event.GetTiltY(pointer_index));
......
......@@ -143,7 +143,9 @@ WebMouseEvent WebMouseEventBuilder::Build(
ui::SetWebPointerPropertiesFromMotionEventData(
result, motion_event.GetPointerId(0), motion_event.GetPressure(0),
motion_event.GetOrientation(0), motion_event.GetTiltX(0),
motion_event.GetTiltY(0), button, motion_event.GetToolType(0));
motion_event.GetTiltY(0), motion_event.GetTwist(0),
motion_event.GetTangentialPressure(0), button,
motion_event.GetToolType(0));
return result;
}
......
......@@ -36,6 +36,8 @@ TEST(WebInputEventUtilTest, MotionEventConversion) {
pointer.orientation = -base::kPiFloat / 2;
pointer.tilt_x = 60;
pointer.tilt_y = 70;
pointer.twist = 160;
pointer.tangential_pressure = 0;
for (MotionEvent::ToolType tool_type : tool_types) {
pointer.tool_type = tool_type;
MotionEventGeneric event(MotionEvent::Action::DOWN, base::TimeTicks::Now(),
......@@ -60,6 +62,8 @@ TEST(WebInputEventUtilTest, MotionEventConversion) {
if (tool_type == MotionEvent::ToolType::STYLUS) {
expected_pointer.tilt_x = 60;
expected_pointer.tilt_y = 70;
expected_pointer.twist = 160;
expected_pointer.tangential_pressure = 0;
} else {
expected_pointer.tilt_x = 0;
expected_pointer.tilt_y = 0;
......
......@@ -478,6 +478,16 @@ float MotionEventAndroid::GetTiltY(size_t pointer_index) const {
return tilt_y;
}
float MotionEventAndroid::GetTwist(size_t pointer_index) const {
DCHECK_LT(pointer_index, cached_pointer_count_);
return 0.f;
}
float MotionEventAndroid::GetTangentialPressure(size_t pointer_index) const {
DCHECK_LT(pointer_index, cached_pointer_count_);
return 0.f;
}
base::TimeTicks MotionEventAndroid::GetEventTime() const {
return cached_time_;
}
......
......@@ -100,6 +100,8 @@ class EVENTS_EXPORT MotionEventAndroid : public MotionEvent {
float GetPressure(size_t pointer_index) const override;
float GetTiltX(size_t pointer_index) const override;
float GetTiltY(size_t pointer_index) const override;
float GetTwist(size_t pointer_index) const override;
float GetTangentialPressure(size_t pointer_index) const override;
base::TimeTicks GetEventTime() const override;
size_t GetHistorySize() const override;
base::TimeTicks GetHistoricalEventTime(
......
......@@ -167,6 +167,7 @@ WebTouchPoint CreateWebTouchPoint(const MotionEvent& event,
touch, event.GetPointerId(pointer_index),
event.GetPressure(pointer_index), event.GetOrientation(pointer_index),
event.GetTiltX(pointer_index), event.GetTiltY(pointer_index),
event.GetTwist(pointer_index), event.GetTangentialPressure(pointer_index),
0 /* no button changed */, event.GetToolType(pointer_index));
touch.state = ToWebTouchPointState(event, pointer_index);
......@@ -1061,6 +1062,8 @@ void SetWebPointerPropertiesFromMotionEventData(
float orientation_rad,
float tilt_x,
float tilt_y,
float twist,
float tangential_pressure,
int android_buttons_changed,
MotionEvent::ToolType tool_type) {
webPointerProperties.id = pointer_id;
......@@ -1071,8 +1074,12 @@ void SetWebPointerPropertiesFromMotionEventData(
// the opposite direction. Coordinate system is left-handed.
webPointerProperties.tilt_x = tilt_x;
webPointerProperties.tilt_y = tilt_y;
webPointerProperties.twist = twist;
webPointerProperties.tangential_pressure = tangential_pressure;
} else {
webPointerProperties.tilt_x = webPointerProperties.tilt_y = 0;
webPointerProperties.twist = 0;
webPointerProperties.tangential_pressure = 0;
}
webPointerProperties.button = ToWebPointerButton(android_buttons_changed);
......
......@@ -85,6 +85,8 @@ void SetWebPointerPropertiesFromMotionEventData(
float orientation_rad,
float tilt_x,
float tilt_y,
float twist,
float tangential_pressure,
int android_buttons_changed,
MotionEvent::ToolType tool_type);
......
......@@ -72,11 +72,12 @@ void ApppendTouchPointDetails(const WebTouchPoint& point, std::string* result) {
StringAppendF(result,
" (ID: %d, State: %d, ScreenPos: (%f, %f), Pos: (%f, %f),"
" Radius: (%f, %f), Rot: %f, Force: %f,"
" Tilt: (%d, %d)),\n",
" Tilt: (%d, %d), Twist: %d, TangentialPressure: %f),\n",
point.id, point.state, point.PositionInScreen().x,
point.PositionInScreen().y, point.PositionInWidget().x,
point.PositionInWidget().y, point.radius_x, point.radius_y,
point.rotation_angle, point.force, point.tilt_x, point.tilt_y);
point.rotation_angle, point.force, point.tilt_x, point.tilt_y,
point.twist, point.tangential_pressure);
}
void ApppendEventDetails(const WebTouchEvent& event, std::string* result) {
......
......@@ -71,6 +71,8 @@ class GESTURE_DETECTION_EXPORT MotionEvent {
virtual float GetPressure(size_t pointer_index) const = 0;
virtual float GetTiltX(size_t pointer_index) const = 0;
virtual float GetTiltY(size_t pointer_index) const = 0;
virtual float GetTwist(size_t pointer_index) const = 0;
virtual float GetTangentialPressure(size_t pointer_index) const = 0;
virtual ToolType GetToolType(size_t pointer_index) const = 0;
virtual int GetButtonState() const = 0;
virtual int GetFlags() const = 0;
......@@ -119,6 +121,9 @@ class GESTURE_DETECTION_EXPORT MotionEvent {
// [-90,90]. See the PointerEvent spec link above for details
float GetTiltX() const { return GetTiltX(0); }
float GetTiltY() const { return GetTiltY(0); }
float GetTwist() const { return GetTwist(0); }
float GetTangentialPressure() const { return GetTangentialPressure(0); }
ToolType GetToolType() const { return GetToolType(0); }
// O(N) search of pointers (use sparingly!). Returns -1 if |id| nonexistent.
......
......@@ -31,6 +31,8 @@ PointerProperties::PointerProperties(float x, float y, float touch_major)
orientation(0),
tilt_x(0),
tilt_y(0),
twist(0),
tangential_pressure(0),
source_device_id(0) {}
PointerProperties::PointerProperties(const MotionEvent& event,
......@@ -47,6 +49,8 @@ PointerProperties::PointerProperties(const MotionEvent& event,
orientation(event.GetOrientation(pointer_index)),
tilt_x(event.GetTiltX(pointer_index)),
tilt_y(event.GetTiltY(pointer_index)),
twist(event.GetTwist(pointer_index)),
tangential_pressure(event.GetTangentialPressure(pointer_index)),
source_device_id(0) {}
PointerProperties::PointerProperties(const PointerProperties& other) = default;
......@@ -184,6 +188,16 @@ float MotionEventGeneric::GetTiltY(size_t pointer_index) const {
return pointers_[pointer_index].tilt_y;
}
float MotionEventGeneric::GetTwist(size_t pointer_index) const {
DCHECK_LT(pointer_index, pointers_->size());
return pointers_[pointer_index].twist;
}
float MotionEventGeneric::GetTangentialPressure(size_t pointer_index) const {
DCHECK_LT(pointer_index, pointers_->size());
return pointers_[pointer_index].tangential_pressure;
}
MotionEvent::ToolType MotionEventGeneric::GetToolType(
size_t pointer_index) const {
DCHECK_LT(pointer_index, pointers_->size());
......
......@@ -38,6 +38,8 @@ struct GESTURE_DETECTION_EXPORT PointerProperties {
float orientation;
float tilt_x;
float tilt_y;
float twist;
float tangential_pressure;
// source_device_id is only used on Aura.
int source_device_id;
};
......@@ -68,6 +70,8 @@ class GESTURE_DETECTION_EXPORT MotionEventGeneric : public MotionEvent {
float GetPressure(size_t pointer_index) const override;
float GetTiltX(size_t pointer_index) const override;
float GetTiltY(size_t pointer_index) const override;
float GetTwist(size_t pointer_index) const override;
float GetTangentialPressure(size_t pointer_index) const override;
ToolType GetToolType(size_t pointer_index) const override;
int GetButtonState() const override;
int GetFlags() const override;
......
......@@ -39,6 +39,9 @@ PointerProperties GetPointerPropertiesFromTouchEvent(const TouchEvent& touch) {
pointer_properties.source_device_id = touch.source_device_id();
pointer_properties.tilt_x = touch.pointer_details().tilt_x;
pointer_properties.tilt_y = touch.pointer_details().tilt_y;
pointer_properties.twist = touch.pointer_details().twist;
pointer_properties.tangential_pressure =
touch.pointer_details().tangential_pressure;
pointer_properties.SetAxesAndOrientation(touch.pointer_details().radius_x,
touch.pointer_details().radius_y,
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment