blob: fdae25f85e6c672364ba9acee498e5c6fe39d153 [file] [log] [blame]
// 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(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