diff options
Diffstat (limited to 'chromium/ui/events/gesture_detection/velocity_tracker_state.cc')
-rw-r--r-- | chromium/ui/events/gesture_detection/velocity_tracker_state.cc | 105 |
1 files changed, 105 insertions, 0 deletions
diff --git a/chromium/ui/events/gesture_detection/velocity_tracker_state.cc b/chromium/ui/events/gesture_detection/velocity_tracker_state.cc new file mode 100644 index 00000000000..12168560dbd --- /dev/null +++ b/chromium/ui/events/gesture_detection/velocity_tracker_state.cc @@ -0,0 +1,105 @@ +// 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 "ui/events/gesture_detection/velocity_tracker_state.h" + +#include "base/logging.h" +#include "ui/events/gesture_detection/motion_event.h" + +namespace ui { +namespace { +// Special constant to request the velocity of the active pointer. +const int ACTIVE_POINTER_ID = -1; +} + +VelocityTrackerState::VelocityTrackerState() + : velocity_tracker_(VelocityTracker::STRATEGY_DEFAULT), + active_pointer_id_(ACTIVE_POINTER_ID) {} + +VelocityTrackerState::VelocityTrackerState(VelocityTracker::Strategy strategy) + : velocity_tracker_(strategy), active_pointer_id_(ACTIVE_POINTER_ID) {} + +VelocityTrackerState::~VelocityTrackerState() {} + +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) { + DCHECK_GE(max_velocity, 0); + + 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, NULL, &vy); + 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 <= MotionEvent::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 ui |