Index: content/browser/renderer_host/input/gestures/velocity_tracker.h |
diff --git a/content/browser/renderer_host/input/gestures/velocity_tracker.h b/content/browser/renderer_host/input/gestures/velocity_tracker.h |
new file mode 100644 |
index 0000000000000000000000000000000000000000..b870ce89d1cda43251e7a293b871e5945638870e |
--- /dev/null |
+++ b/content/browser/renderer_host/input/gestures/velocity_tracker.h |
@@ -0,0 +1,117 @@ |
+// Copyright 2014 The Chromium Authors. All rights reserved. |
+// Use of this source code is governed by a BSD-style license that can be |
+// found in the LICENSE file. |
+ |
+#ifndef CONTENT_BROWSER_RENDERER_HOST_INPUT_GESTURES_VELOCITY_TRACKER_H_ |
+#define CONTENT_BROWSER_RENDERER_HOST_INPUT_GESTURES_VELOCITY_TRACKER_H_ |
+ |
+#include "base/basictypes.h" |
+#include "base/memory/scoped_ptr.h" |
+#include "base/time/time.h" |
+#include "content/browser/renderer_host/input/gestures/bitset_32.h" |
+ |
+namespace content { |
+ |
+class MotionEvent; |
+class VelocityTrackerStrategy; |
+ |
+namespace { |
+struct Estimator; |
+} |
+ |
+// Port of VelocityTracker from Android |
+// * platform/frameworks/native/include/input/VelocityTracker.h |
+// * Change-Id: I4983db61b53e28479fc90d9211fafff68f7f49a6 |
+// * Changes to this class should be cosmetic only, easing fork maintenance. |
+class VelocityTracker { |
+public: |
+ struct Position { |
+ float x, y; |
+ }; |
+ |
+ enum { |
+ MAX_POINTERS = 16, |
+ MAX_POINTER_ID = 31 |
+ }; |
+ |
+ // Creates a velocity tracker using the default strategy for the platform. |
+ VelocityTracker(); |
+ |
+ // Creates a velocity tracker using the specified strategy. |
+ // If strategy is NULL, uses the default strategy for the platform. |
+ explicit VelocityTracker(const char* strategy); |
+ |
+ ~VelocityTracker(); |
+ |
+ // Resets the velocity tracker state. |
+ void Clear(); |
+ |
+ // Adds movement information for all pointers in a MotionEvent, including |
+ // historical samples. |
+ void AddMovement(const MotionEvent& event); |
+ |
+ // Gets the velocity of the specified pointer id in position units per second. |
+ // Returns false and sets the velocity components to zero if there is |
+ // insufficient movement information for the pointer. |
+ bool GetVelocity(uint32_t id, float* outVx, float* outVy) const; |
+ |
+ // Gets the active pointer id, or -1 if none. |
+ inline int32_t GetActivePointerId() const { return active_pointer_id_; } |
+ |
+ // Gets a bitset containing all pointer ids from the most recent movement. |
+ inline BitSet32 GetCurrentPointerIdBits() const { |
+ return current_pointer_id_bits_; |
+ } |
+ |
+ private: |
+ // Resets the velocity tracker state for specific pointers. |
+ // Call this method when some pointers have changed and may be reusing |
+ // an id that was assigned to a different pointer earlier. |
+ void ClearPointers(BitSet32 id_bits); |
+ |
+ // Adds movement information for a set of pointers. |
+ // The id_bits bitfield specifies the pointer ids of the pointers whose |
+ // positions |
+ // are included in the movement. |
+ // The positions array contains position information for each pointer in order |
+ // by |
+ // increasing id. Its size should be equal to the number of one bits in |
+ // id_bits. |
+ void AddMovement(const base::TimeTicks& event_time, |
+ BitSet32 id_bits, |
+ const Position* positions); |
+ |
+ // Gets an estimator for the recent movements of the specified pointer id. |
+ // Returns false and clears the estimator if there is no information available |
+ // about the pointer. |
+ bool GetEstimator(uint32_t id, Estimator* out_estimator) const; |
+ |
+ bool ConfigureStrategy(const char* strategy); |
+ |
+ static VelocityTrackerStrategy* CreateStrategy(const char* strategy); |
+ |
+ base::TimeTicks last_event_time_; |
+ BitSet32 current_pointer_id_bits_; |
+ int32_t active_pointer_id_; |
+ scoped_ptr<VelocityTrackerStrategy> strategy_; |
+}; |
+ |
+// Implements a particular velocity tracker algorithm. |
+class VelocityTrackerStrategy { |
+ public: |
+ virtual ~VelocityTrackerStrategy() {} |
+ |
+ virtual void Clear() = 0; |
+ virtual void ClearPointers(BitSet32 id_bits) = 0; |
+ virtual void AddMovement(const base::TimeTicks& event_time, |
+ BitSet32 id_bits, |
+ const VelocityTracker::Position* positions) = 0; |
+ virtual bool GetEstimator(uint32_t id, Estimator* out_estimator) const = 0; |
+ |
+ protected: |
+ VelocityTrackerStrategy() {} |
+}; |
+ |
+} // namespace content |
+ |
+#endif // CONTENT_BROWSER_RENDERER_HOST_INPUT_GESTURES_VELOCITY_TRACKER_H_ |