Index: content/browser/renderer_host/input/gestures/velocity_tracker_state.cc |
diff --git a/content/browser/renderer_host/input/gestures/velocity_tracker_state.cc b/content/browser/renderer_host/input/gestures/velocity_tracker_state.cc |
new file mode 100644 |
index 0000000000000000000000000000000000000000..b53c981a2289c6f63d02d4dc48af6692c1df3dcd |
--- /dev/null |
+++ b/content/browser/renderer_host/input/gestures/velocity_tracker_state.cc |
@@ -0,0 +1,96 @@ |
+// 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. |
+ |
+#include "content/browser/renderer_host/input/gestures/velocity_tracker_state.h" |
+ |
+#include "base/logging.h" |
+ |
+namespace content { |
+namespace { |
+// Special constant to request the velocity of the active pointer. |
+const int ACTIVE_POINTER_ID = -1; |
+} |
+ |
+VelocityTrackerState::VelocityTrackerState() |
+ : active_pointer_id_(ACTIVE_POINTER_ID) {} |
+ |
+void VelocityTrackerState::Clear() { |
+ velocity_tracker_.Clear(); |
+ active_pointer_id_ = ACTIVE_POINTER_ID; |
+ calculated_id_bits_.clear(); |
+} |
+ |
+void VelocityTrackerState::AddMovement(const MotionEvent& event) { |
+ velocity_tracker_.AddMovement(event); |
+} |
+ |
+void VelocityTrackerState::ComputeCurrentVelocity(int32_t units, |
+ float max_velocity) { |
+ BitSet32 id_bits(velocity_tracker_.GetCurrentPointerIdBits()); |
+ calculated_id_bits_ = id_bits; |
+ |
+ for (uint32_t index = 0; !id_bits.is_empty(); index++) { |
+ uint32_t id = id_bits.clear_first_marked_bit(); |
+ |
+ float vx, vy; |
+ velocity_tracker_.GetVelocity(id, &vx, &vy); |
+ |
+ vx = vx * units / 1000.f; |
+ vy = vy * units / 1000.f; |
+ |
+ if (vx > max_velocity) |
+ vx = max_velocity; |
+ else if (vx < -max_velocity) |
+ vx = -max_velocity; |
+ |
+ if (vy > max_velocity) |
+ vy = max_velocity; |
+ else if (vy < -max_velocity) |
+ vy = -max_velocity; |
+ |
+ Velocity& velocity = calculated_velocity_[index]; |
+ velocity.vx = vx; |
+ velocity.vy = vy; |
+ } |
+} |
+ |
+float VelocityTrackerState::GetXVelocity(int32_t id) const { |
+ float vx; |
+ GetVelocity(id, &vx, NULL); |
+ return vx; |
+} |
+ |
+float VelocityTrackerState::GetYVelocity(int32_t id) const { |
+ float vy; |
+ GetVelocity(id, &vy, NULL); |
+ return vy; |
+} |
+ |
+void VelocityTrackerState::GetVelocity(int32_t id, |
+ float* out_vx, |
+ float* out_vy) const { |
+ DCHECK(out_vx || out_vy); |
+ if (id == ACTIVE_POINTER_ID) |
+ id = velocity_tracker_.GetActivePointerId(); |
+ |
+ float vx, vy; |
+ if (id >= 0 && id <= VelocityTracker::MAX_POINTER_ID && |
+ calculated_id_bits_.has_bit(id)) { |
+ uint32_t index = calculated_id_bits_.get_index_of_bit(id); |
+ const Velocity& velocity = calculated_velocity_[index]; |
+ vx = velocity.vx; |
+ vy = velocity.vy; |
+ } else { |
+ vx = 0; |
+ vy = 0; |
+ } |
+ |
+ if (out_vx) |
+ *out_vx = vx; |
+ |
+ if (out_vy) |
+ *out_vy = vy; |
+} |
+ |
+} // namespace content |