Index: ui/events/blink/blink_event_util.cc |
diff --git a/ui/events/blink/blink_event_util.cc b/ui/events/blink/blink_event_util.cc |
index 108013610d7988134d7f799d1a714310844c0a86..d268662044ba9063821ef47fd0253efdd1615f4d 100644 |
--- a/ui/events/blink/blink_event_util.cc |
+++ b/ui/events/blink/blink_event_util.cc |
@@ -366,4 +366,109 @@ WebGestureEvent CreateWebGestureEventFromGestureEventData( |
gfx::PointF(data.raw_x, data.raw_y), data.flags); |
} |
+scoped_ptr<blink::WebInputEvent> ScaleWebInputEvent( |
+ const blink::WebInputEvent& event, |
+ float scale) { |
+ scoped_ptr<blink::WebInputEvent> scaled_event; |
+ if (scale == 1.f) |
+ return scaled_event; |
+ if (event.type == blink::WebMouseEvent::MouseWheel) { |
+ blink::WebMouseWheelEvent* wheel_event = new blink::WebMouseWheelEvent; |
+ scaled_event.reset(wheel_event); |
+ *wheel_event = static_cast<const blink::WebMouseWheelEvent&>(event); |
+ wheel_event->x *= scale; |
+ wheel_event->y *= scale; |
+ wheel_event->deltaX *= scale; |
+ wheel_event->deltaY *= scale; |
+ wheel_event->wheelTicksX *= scale; |
+ wheel_event->wheelTicksY *= scale; |
+ } else if (blink::WebInputEvent::isMouseEventType(event.type)) { |
+ blink::WebMouseEvent* mouse_event = new blink::WebMouseEvent; |
+ scaled_event.reset(mouse_event); |
+ *mouse_event = static_cast<const blink::WebMouseEvent&>(event); |
+ mouse_event->x *= scale; |
+ mouse_event->y *= scale; |
+ mouse_event->windowX = mouse_event->x; |
+ mouse_event->windowY = mouse_event->y; |
+ mouse_event->movementX *= scale; |
+ mouse_event->movementY *= scale; |
+ } else if (blink::WebInputEvent::isTouchEventType(event.type)) { |
+ blink::WebTouchEvent* touch_event = new blink::WebTouchEvent; |
+ scaled_event.reset(touch_event); |
+ *touch_event = static_cast<const blink::WebTouchEvent&>(event); |
+ for (unsigned i = 0; i < touch_event->touchesLength; i++) { |
+ touch_event->touches[i].position.x *= scale; |
+ touch_event->touches[i].position.y *= scale; |
+ touch_event->touches[i].radiusX *= scale; |
+ touch_event->touches[i].radiusY *= scale; |
+ } |
+ } else if (blink::WebInputEvent::isGestureEventType(event.type)) { |
+ blink::WebGestureEvent* gesture_event = new blink::WebGestureEvent; |
+ scaled_event.reset(gesture_event); |
+ *gesture_event = static_cast<const blink::WebGestureEvent&>(event); |
+ gesture_event->x *= scale; |
+ gesture_event->y *= scale; |
+ switch (gesture_event->type) { |
+ case blink::WebInputEvent::GestureScrollUpdate: |
+ gesture_event->data.scrollUpdate.deltaX *= scale; |
+ gesture_event->data.scrollUpdate.deltaY *= scale; |
+ break; |
+ case blink::WebInputEvent::GestureScrollBegin: |
+ gesture_event->data.scrollBegin.deltaXHint *= scale; |
+ gesture_event->data.scrollBegin.deltaYHint *= scale; |
+ break; |
+ |
+ case blink::WebInputEvent::GesturePinchUpdate: |
+ // Scale in pinch gesture is DSF agnostic. |
+ break; |
+ |
+ case blink::WebInputEvent::GestureDoubleTap: |
+ case blink::WebInputEvent::GestureTap: |
+ case blink::WebInputEvent::GestureTapUnconfirmed: |
+ gesture_event->data.tap.width *= scale; |
+ gesture_event->data.tap.height *= scale; |
+ break; |
+ |
+ case blink::WebInputEvent::GestureTapDown: |
+ gesture_event->data.tapDown.width *= scale; |
+ gesture_event->data.tapDown.height *= scale; |
+ break; |
+ |
+ case blink::WebInputEvent::GestureShowPress: |
+ gesture_event->data.showPress.width *= scale; |
+ gesture_event->data.showPress.height *= scale; |
+ break; |
+ |
+ case blink::WebInputEvent::GestureLongPress: |
+ case blink::WebInputEvent::GestureLongTap: |
+ gesture_event->data.longPress.width *= scale; |
+ gesture_event->data.longPress.height *= scale; |
+ break; |
+ |
+ case blink::WebInputEvent::GestureTwoFingerTap: |
+ gesture_event->data.twoFingerTap.firstFingerWidth *= scale; |
+ gesture_event->data.twoFingerTap.firstFingerHeight *= scale; |
+ break; |
+ |
+ case blink::WebInputEvent::GestureFlingStart: |
+ gesture_event->data.flingStart.velocityX *= scale; |
+ gesture_event->data.flingStart.velocityY *= scale; |
+ break; |
+ |
+ // These event does not have location data. |
+ case blink::WebInputEvent::GesturePinchBegin: |
+ case blink::WebInputEvent::GesturePinchEnd: |
+ case blink::WebInputEvent::GestureTapCancel: |
+ case blink::WebInputEvent::GestureFlingCancel: |
+ case blink::WebInputEvent::GestureScrollEnd: |
+ break; |
+ |
+ // TODO(oshima): Find out if ContextMenu needs to be scaled. |
+ default: |
+ break; |
+ } |
+ } |
+ return scaled_event; |
+} |
+ |
} // namespace ui |