Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(631)

Unified Diff: content/browser/renderer_host/input/gesture_event_queue.cc

Issue 2552853002: [Compositor event queue] Coalesce gesture scroll&pinch of the same sequence (Closed)
Patch Set: sadrul's comments, fix dependency Created 4 years ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « content/browser/renderer_host/input/gesture_event_queue.h ('k') | ui/events/blink/BUILD.gn » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: content/browser/renderer_host/input/gesture_event_queue.cc
diff --git a/content/browser/renderer_host/input/gesture_event_queue.cc b/content/browser/renderer_host/input/gesture_event_queue.cc
index a0a80e382ce04fa2dd27c4e8f0213f6f0fecaa16..d50bbed25d255424d66d9c88b3e05920e910fb65 100644
--- a/content/browser/renderer_host/input/gesture_event_queue.cc
+++ b/content/browser/renderer_host/input/gesture_event_queue.cc
@@ -13,47 +13,6 @@ using blink::WebGestureEvent;
using blink::WebInputEvent;
namespace content {
-namespace {
-
-// Whether |event_in_queue| is GesturePinchUpdate or GestureScrollUpdate and
-// has the same modifiers/source as the new scroll/pinch event. Compatible
-// scroll and pinch event pairs can be logically coalesced.
-bool IsCompatibleScrollorPinch(
- const GestureEventWithLatencyInfo& new_event,
- const GestureEventWithLatencyInfo& event_in_queue) {
- DCHECK(new_event.event.type == WebInputEvent::GestureScrollUpdate ||
- new_event.event.type == WebInputEvent::GesturePinchUpdate)
- << "Invalid event type for pinch/scroll coalescing: "
- << WebInputEvent::GetName(new_event.event.type);
- DLOG_IF(WARNING, new_event.event.timeStampSeconds <
- event_in_queue.event.timeStampSeconds)
- << "Event time not monotonic?\n";
- return (event_in_queue.event.type == WebInputEvent::GestureScrollUpdate ||
- event_in_queue.event.type == WebInputEvent::GesturePinchUpdate) &&
- event_in_queue.event.modifiers == new_event.event.modifiers &&
- event_in_queue.event.sourceDevice == new_event.event.sourceDevice;
-}
-
-// Returns the transform matrix corresponding to the gesture event.
-gfx::Transform GetTransformForEvent(
- const GestureEventWithLatencyInfo& gesture_event) {
- gfx::Transform gesture_transform;
- if (gesture_event.event.type == WebInputEvent::GestureScrollUpdate) {
- gesture_transform.Translate(gesture_event.event.data.scrollUpdate.deltaX,
- gesture_event.event.data.scrollUpdate.deltaY);
- } else if (gesture_event.event.type == WebInputEvent::GesturePinchUpdate) {
- float scale = gesture_event.event.data.pinchUpdate.scale;
- gesture_transform.Translate(-gesture_event.event.x, -gesture_event.event.y);
- gesture_transform.Scale(scale, scale);
- gesture_transform.Translate(gesture_event.event.x, gesture_event.event.y);
- } else {
- NOTREACHED() << "Invalid event type for transform retrieval: "
- << WebInputEvent::GetName(gesture_event.event.type);
- }
- return gesture_transform;
-}
-
-} // namespace
GestureEventQueue::Config::Config() {
}
@@ -332,7 +291,8 @@ void GestureEventQueue::QueueScrollOrPinchAndForwardIfNecessary(
const GestureEventWithLatencyInfo& first_event =
coalesced_gesture_events_.front();
if (gesture_event.event.type != first_event.event.type &&
- IsCompatibleScrollorPinch(gesture_event, first_event)) {
+ ui::IsCompatibleScrollorPinch(gesture_event.event,
+ first_event.event)) {
ignore_next_ack_ = true;
client_->SendGestureEventImmediately(gesture_event);
}
@@ -346,63 +306,50 @@ void GestureEventQueue::QueueScrollOrPinchAndForwardIfNecessary(
return;
}
- if (!IsCompatibleScrollorPinch(gesture_event, *last_event)) {
+ if (!ui::IsCompatibleScrollorPinch(gesture_event.event, last_event->event)) {
coalesced_gesture_events_.push_back(gesture_event);
return;
}
+ // Extract the last event in queue.
+ blink::WebGestureEvent last_gesture_event =
+ coalesced_gesture_events_.back().event;
+ DCHECK_LE(coalesced_gesture_events_.back().latency.trace_id(),
+ gesture_event.latency.trace_id());
+ ui::LatencyInfo oldest_latency = coalesced_gesture_events_.back().latency;
+ oldest_latency.set_coalesced();
+ coalesced_gesture_events_.pop_back();
+
+ // Extract the second last event in queue.
+ ui::ScopedWebInputEvent second_last_gesture_event = nullptr;
+ if (unsent_events_count > 1 &&
+ ui::IsCompatibleScrollorPinch(gesture_event.event,
+ coalesced_gesture_events_.back().event)) {
+ second_last_gesture_event =
+ ui::WebInputEventTraits::Clone(coalesced_gesture_events_.back().event);
+ DCHECK_LE(coalesced_gesture_events_.back().latency.trace_id(),
+ oldest_latency.trace_id());
+ oldest_latency = coalesced_gesture_events_.back().latency;
+ oldest_latency.set_coalesced();
+ coalesced_gesture_events_.pop_back();
+ }
+
+ std::pair<blink::WebGestureEvent, blink::WebGestureEvent> coalesced_events =
+ ui::CoalesceScrollAndPinch(
+ second_last_gesture_event
+ ? &ui::ToWebGestureEvent(*second_last_gesture_event)
+ : nullptr,
+ last_gesture_event, gesture_event.event);
+
GestureEventWithLatencyInfo scroll_event;
+ scroll_event.event = coalesced_events.first;
+ scroll_event.latency = oldest_latency;
+
GestureEventWithLatencyInfo pinch_event;
- scroll_event.event.modifiers |= gesture_event.event.modifiers;
- scroll_event.event.sourceDevice = gesture_event.event.sourceDevice;
- scroll_event.event.timeStampSeconds = gesture_event.event.timeStampSeconds;
- // Keep the oldest LatencyInfo.
- DCHECK_LE(last_event->latency.trace_id(), gesture_event.latency.trace_id());
- scroll_event.latency = last_event->latency;
- pinch_event = scroll_event;
- scroll_event.event.type = WebInputEvent::GestureScrollUpdate;
- pinch_event.event.type = WebInputEvent::GesturePinchUpdate;
- pinch_event.event.x = gesture_event.event.type ==
- WebInputEvent::GesturePinchUpdate ?
- gesture_event.event.x : last_event->event.x;
- pinch_event.event.y = gesture_event.event.type ==
- WebInputEvent::GesturePinchUpdate ?
- gesture_event.event.y : last_event->event.y;
-
- gfx::Transform combined_scroll_pinch = GetTransformForEvent(*last_event);
- // Only include the second-to-last event in the coalesced pair if it exists
- // and can be combined with the new event.
- if (unsent_events_count > 1) {
- const GestureEventWithLatencyInfo& second_last_event =
- coalesced_gesture_events_[coalesced_gesture_events_.size() - 2];
- if (IsCompatibleScrollorPinch(gesture_event, second_last_event)) {
- // Keep the oldest LatencyInfo.
- DCHECK_LE(second_last_event.latency.trace_id(),
- scroll_event.latency.trace_id());
- scroll_event.latency = second_last_event.latency;
- pinch_event.latency = second_last_event.latency;
- combined_scroll_pinch.PreconcatTransform(
- GetTransformForEvent(second_last_event));
- coalesced_gesture_events_.pop_back();
- }
- }
- combined_scroll_pinch.ConcatTransform(GetTransformForEvent(gesture_event));
- coalesced_gesture_events_.pop_back();
+ pinch_event.event = coalesced_events.second;
+ pinch_event.latency = oldest_latency;
- float combined_scale =
- SkMScalarToFloat(combined_scroll_pinch.matrix().get(0, 0));
- float combined_scroll_pinch_x =
- SkMScalarToFloat(combined_scroll_pinch.matrix().get(0, 3));
- float combined_scroll_pinch_y =
- SkMScalarToFloat(combined_scroll_pinch.matrix().get(1, 3));
- scroll_event.event.data.scrollUpdate.deltaX =
- (combined_scroll_pinch_x + pinch_event.event.x) / combined_scale -
- pinch_event.event.x;
- scroll_event.event.data.scrollUpdate.deltaY =
- (combined_scroll_pinch_y + pinch_event.event.y) / combined_scale -
- pinch_event.event.y;
coalesced_gesture_events_.push_back(scroll_event);
- pinch_event.event.data.pinchUpdate.scale = combined_scale;
coalesced_gesture_events_.push_back(pinch_event);
}
« no previous file with comments | « content/browser/renderer_host/input/gesture_event_queue.h ('k') | ui/events/blink/BUILD.gn » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698