| Index: ui/events/android/motion_event_android.cc | 
| diff --git a/ui/events/android/motion_event_android.cc b/ui/events/android/motion_event_android.cc | 
| index adc13f780470eaa2749edc52fc3e34a1e51cafa2..3768d8c609e0435966467a7ef58fd432645b423d 100644 | 
| --- a/ui/events/android/motion_event_android.cc | 
| +++ b/ui/events/android/motion_event_android.cc | 
| @@ -152,6 +152,18 @@ size_t ToValidHistorySize(jint history_size, ui::MotionEvent::Action action) { | 
| return history_size; | 
| } | 
|  | 
| +// Convert tilt and orientation to tilt_x and tilt_y. Tilt_x and tilt_y will lie | 
| +// in [-90, 90]. | 
| +void ConvertTiltOrientationToTiltXY(float tilt_rad, | 
| +                                    float orientation_rad, | 
| +                                    float* tilt_x, | 
| +                                    float* tilt_y) { | 
| +  float r = sin(tilt_rad); | 
| +  float z = cos(tilt_rad); | 
| +  *tilt_x = atan2(sin(-orientation_rad) * r, z) * 180.f / M_PI; | 
| +  *tilt_y = atan2(cos(-orientation_rad) * r, z) * 180.f / M_PI; | 
| +} | 
| + | 
| }  // namespace | 
|  | 
| MotionEventAndroid::Pointer::Pointer(jint id, | 
| @@ -177,9 +189,9 @@ MotionEventAndroid::CachedPointer::CachedPointer() | 
| touch_major(0), | 
| touch_minor(0), | 
| orientation(0), | 
| -      tilt(0), | 
| -      tool_type(TOOL_TYPE_UNKNOWN) { | 
| -} | 
| +      tilt_x(0), | 
| +      tilt_y(0), | 
| +      tool_type(TOOL_TYPE_UNKNOWN) {} | 
|  | 
| MotionEventAndroid::MotionEventAndroid(JNIEnv* env, | 
| jobject event, | 
| @@ -363,14 +375,34 @@ float MotionEventAndroid::GetPressure(size_t pointer_index) const { | 
| pointer_index); | 
| } | 
|  | 
| -float MotionEventAndroid::GetTilt(size_t pointer_index) const { | 
| +float MotionEventAndroid::GetTiltX(size_t pointer_index) const { | 
| +  DCHECK_LT(pointer_index, cached_pointer_count_); | 
| +  if (pointer_index < MAX_POINTERS_TO_CACHE) | 
| +    return cached_pointers_[pointer_index].tilt_x; | 
| +  if (!event_.obj()) | 
| +    return 0.f; | 
| +  float tilt_x, tilt_y; | 
| +  float tilt_rad = ToValidFloat(Java_MotionEvent_getAxisValueF_I_I( | 
| +      AttachCurrentThread(), event_, AXIS_TILT, pointer_index)); | 
| +  float orientation_rad = ToValidFloat(Java_MotionEvent_getOrientationF_I( | 
| +      AttachCurrentThread(), event_, pointer_index)); | 
| +  ConvertTiltOrientationToTiltXY(tilt_rad, orientation_rad, &tilt_x, &tilt_y); | 
| +  return tilt_x; | 
| +} | 
| + | 
| +float MotionEventAndroid::GetTiltY(size_t pointer_index) const { | 
| DCHECK_LT(pointer_index, cached_pointer_count_); | 
| if (pointer_index < MAX_POINTERS_TO_CACHE) | 
| -    return cached_pointers_[pointer_index].tilt; | 
| +    return cached_pointers_[pointer_index].tilt_y; | 
| if (!event_.obj()) | 
| return 0.f; | 
| -  return ToValidFloat(Java_MotionEvent_getAxisValueF_I_I( | 
| +  float tilt_x, tilt_y; | 
| +  float tilt_rad = ToValidFloat(Java_MotionEvent_getAxisValueF_I_I( | 
| AttachCurrentThread(), event_, AXIS_TILT, pointer_index)); | 
| +  float orientation_rad = ToValidFloat(Java_MotionEvent_getOrientationF_I( | 
| +      AttachCurrentThread(), event_, pointer_index)); | 
| +  ConvertTiltOrientationToTiltXY(tilt_rad, orientation_rad, &tilt_x, &tilt_y); | 
| +  return tilt_y; | 
| } | 
|  | 
| base::TimeTicks MotionEventAndroid::GetEventTime() const { | 
| @@ -436,7 +468,9 @@ MotionEventAndroid::CachedPointer MotionEventAndroid::FromAndroidPointer( | 
| result.touch_major = ToDips(pointer.touch_major_pixels); | 
| result.touch_minor = ToDips(pointer.touch_minor_pixels); | 
| result.orientation = ToValidFloat(pointer.orientation_rad); | 
| -  result.tilt = ToValidFloat(pointer.tilt_rad); | 
| +  float tilt_rad = ToValidFloat(pointer.tilt_rad); | 
| +  ConvertTiltOrientationToTiltXY(tilt_rad, result.orientation, &result.tilt_x, | 
| +                                 &result.tilt_y); | 
| result.tool_type = FromAndroidToolType(pointer.tool_type); | 
| return result; | 
| } | 
| @@ -452,7 +486,8 @@ MotionEventAndroid::CachedPointer MotionEventAndroid::OffsetCachedPointer( | 
| result.touch_major = pointer.touch_major; | 
| result.touch_minor = pointer.touch_minor; | 
| result.orientation = pointer.orientation; | 
| -  result.tilt = pointer.tilt; | 
| +  result.tilt_x = pointer.tilt_x; | 
| +  result.tilt_y = pointer.tilt_y; | 
| result.tool_type = pointer.tool_type; | 
| return result; | 
| } | 
|  |