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