15f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)// Copyright 2014 The Chromium Authors. All rights reserved. 25f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 35f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)// found in the LICENSE file. 45f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 55f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#ifndef UI_EVENTS_GESTURE_DETECTION_MOTION_EVENT_BUFFER_H_ 65f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#define UI_EVENTS_GESTURE_DETECTION_MOTION_EVENT_BUFFER_H_ 75f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 85f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#include "base/memory/scoped_ptr.h" 95f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#include "base/memory/scoped_vector.h" 105f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#include "base/time/time.h" 115f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#include "ui/events/gesture_detection/gesture_detection_export.h" 125f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 135f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)namespace ui { 145f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 155f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)class MotionEvent; 165f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 175f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)// Allows event forwarding and flush requests from a |MotionEventBuffer|. 185f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)class MotionEventBufferClient { 195f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) public: 205f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) virtual ~MotionEventBufferClient() {} 215f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) virtual void ForwardMotionEvent(const MotionEvent& event) = 0; 225f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) virtual void SetNeedsFlush() = 0; 235f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)}; 245f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 255f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)// Utility class for buffering streamed MotionEventVector until a given flush. 265f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)// Events that can be combined will remain buffered, and depending on the flush 275f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)// time and buffered events, a resampled event with history will be synthesized. 285f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)// The primary purpose of this class is to ensure a smooth output motion signal 295f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)// by resampling a discrete input signal that may run on a different frequency 305f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)// or lack alignment with the output display signal. 315f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)// Note that this class is largely based on code from Android's existing touch 325f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)// pipeline (in particular, logic from ImageTransport, http://goo.gl/Ixsb0D). 335f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)// See the design doc at http://goo.gl/MdmpCf for more details. 345f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)class GESTURE_DETECTION_EXPORT MotionEventBuffer { 355f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) public: 365f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) // The provided |client| must not be null, and |enable_resampling| determines 375f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) // resampling behavior (see |resample_|). 385f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) MotionEventBuffer(MotionEventBufferClient* client, bool enable_resampling); 395f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) ~MotionEventBuffer(); 405f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 415f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) // Should be called upon receipt of an event from the platform, prior to event 425f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) // dispatch to UI or content components. Events that can be coalesced will 435f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) // remain buffered until the next |Flush()|, while other events will be 445f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) // forwarded immediately (incidentally flushing currently buffered events). 455f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) void OnMotionEvent(const MotionEvent& event); 465f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 475f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) // Forward any buffered events, resampling if necessary (see |resample_|) 485f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) // according to the provided |frame_time|. This should be called in response 495f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) // to |SetNeedsFlush()| calls on the client. If the buffer is empty, no 505f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) // events will be forwarded, and if another flush is necessary it will be 515f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) // requested. 525f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) void Flush(base::TimeTicks frame_time); 535f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 545f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) private: 555f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) typedef ScopedVector<MotionEvent> MotionEventVector; 565f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 575f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) void FlushWithoutResampling(MotionEventVector events); 585f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 595f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) MotionEventBufferClient* const client_; 605f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) MotionEventVector buffered_events_; 615f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 625f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) // Time of the most recently extrapolated event. This will be 0 if the 635f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) // last sent event was not extrapolated. Used internally to guard against 645f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) // conflicts between events received from the platfrom that may have an 655f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) // earlier timestamp than that synthesized at the latest resample. 665f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) base::TimeTicks last_extrapolated_event_time_; 675f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 685f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) // Whether buffered events should be resampled upon |Flush()|. If true, short 695f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) // horizon interpolation/extrapolation will be used to synthesize the 705f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) // forwarded event. Otherwise the most recently buffered event will be 715f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) // forwarded, with preceding events as historical entries. Defaults to true. 725f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) bool resample_; 735f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 745f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(MotionEventBuffer); 755f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)}; 765f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 775f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)} // namespace ui 785f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 795f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#endif // UI_EVENTS_GESTURE_DETECTION_MOTION_EVENT_BUFFER_H_ 80