Index: ui/events/gesture_detection/velocity_tracker.h |
diff --git a/ui/events/gesture_detection/velocity_tracker.h b/ui/events/gesture_detection/velocity_tracker.h |
new file mode 100644 |
index 0000000000000000000000000000000000000000..a82ed34a100a37a646355a717b9f62c1b0b09f58 |
--- /dev/null |
+++ b/ui/events/gesture_detection/velocity_tracker.h |
@@ -0,0 +1,148 @@ |
+// 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 UI_EVENTS_GESTURE_DETECTION_VELOCITY_TRACKER_H_ |
+#define UI_EVENTS_GESTURE_DETECTION_VELOCITY_TRACKER_H_ |
+ |
+#include "base/basictypes.h" |
+#include "base/memory/scoped_ptr.h" |
+#include "base/time/time.h" |
+#include "ui/events/gesture_detection/bitset_32.h" |
+ |
+namespace ui { |
+ |
+class MotionEvent; |
+class VelocityTrackerStrategy; |
+ |
+namespace { |
+struct Estimator; |
+struct Position; |
+} |
+ |
+// Port of VelocityTracker from Android |
+// * platform/frameworks/native/include/input/VelocityTracker.h |
+// * Change-Id: I4983db61b53e28479fc90d9211fafff68f7f49a6 |
+// * Please update the Change-Id as upstream Android changes are pulled. |
+class VelocityTracker { |
+ public: |
+ enum { |
+ // The maximum number of pointers to use when computing the velocity. |
+ // Note that the supplied MotionEvent may expose more than 16 pointers, but |
+ // at most |MAX_POINTERS| will be used. |
+ MAX_POINTERS = 16, |
+ }; |
+ |
+ enum Strategy { |
+ // 1st order least squares. Quality: POOR. |
+ // Frequently underfits the touch data especially when the finger |
+ // accelerates or changes direction. Often underestimates velocity. The |
+ // direction is overly influenced by historical touch points. |
+ LSQ1, |
+ |
+ // 2nd order least squares. Quality: VERY GOOD. |
+ // Pretty much ideal, but can be confused by certain kinds of touch data, |
+ // particularly if the panel has a tendency to generate delayed, |
+ // duplicate or jittery touch coordinates when the finger is released. |
+ LSQ2, |
+ |
+ // 3rd order least squares. Quality: UNUSABLE. |
+ // Frequently overfits the touch data yielding wildly divergent estimates |
+ // of the velocity when the finger is released. |
+ LSQ3, |
+ |
+ // 2nd order weighted least squares, delta weighting. |
+ // Quality: EXPERIMENTAL |
+ WLSQ2_DELTA, |
+ |
+ // 2nd order weighted least squares, central weighting. |
+ // Quality: EXPERIMENTAL |
+ WLSQ2_CENTRAL, |
+ |
+ // 2nd order weighted least squares, recent weighting. |
+ // Quality: EXPERIMENTAL |
+ WLSQ2_RECENT, |
+ |
+ // 1st order integrating filter. Quality: GOOD. |
+ // Not as good as 'lsq2' because it cannot estimate acceleration but it is |
+ // more tolerant of errors. Like 'lsq1', this strategy tends to |
+ // underestimate |
+ // the velocity of a fling but this strategy tends to respond to changes in |
+ // direction more quickly and accurately. |
+ INT1, |
+ |
+ // 2nd order integrating filter. Quality: EXPERIMENTAL. |
+ // For comparison purposes only. Unlike 'int1' this strategy can compensate |
+ // for acceleration but it typically overestimates the effect. |
+ INT2, |
+ STRATEGY_MAX = INT2, |
+ |
+ // The default velocity tracker strategy. |
+ // Although other strategies are available for testing and comparison |
+ // purposes, this is the strategy that applications will actually use. Be |
+ // very careful when adjusting the default strategy because it can |
+ // dramatically affect (often in a bad way) the user experience. |
+ STRATEGY_DEFAULT = LSQ2, |
+ }; |
+ |
+ // 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(Strategy 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; |
+ |
+ base::TimeTicks last_event_time_; |
+ BitSet32 current_pointer_id_bits_; |
+ int32_t active_pointer_id_; |
+ scoped_ptr<VelocityTrackerStrategy> strategy_; |
+}; |
+ |
+} // namespace ui |
+ |
+#endif // UI_EVENTS_GESTURE_DETECTION_VELOCITY_TRACKER_H_ |