1 // Copyright 2014 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4
5 #include "ui/events/gesture_detection/velocity_tracker_state.h"
6
7 #include "base/logging.h"
8 #include "ui/events/gesture_detection/motion_event.h"
9
10 namespace ui {
11 namespace {
12 // Special constant to request the velocity of the active pointer.
13 const int ACTIVE_POINTER_ID = -1;
14 }
15
VelocityTrackerState()16 VelocityTrackerState::VelocityTrackerState()
17 : velocity_tracker_(VelocityTracker::STRATEGY_DEFAULT),
18 active_pointer_id_(ACTIVE_POINTER_ID) {}
19
VelocityTrackerState(VelocityTracker::Strategy strategy)20 VelocityTrackerState::VelocityTrackerState(VelocityTracker::Strategy strategy)
21 : velocity_tracker_(strategy), active_pointer_id_(ACTIVE_POINTER_ID) {}
22
~VelocityTrackerState()23 VelocityTrackerState::~VelocityTrackerState() {}
24
Clear()25 void VelocityTrackerState::Clear() {
26 velocity_tracker_.Clear();
27 active_pointer_id_ = ACTIVE_POINTER_ID;
28 calculated_id_bits_.clear();
29 }
30
AddMovement(const MotionEvent & event)31 void VelocityTrackerState::AddMovement(const MotionEvent& event) {
32 velocity_tracker_.AddMovement(event);
33 }
34
ComputeCurrentVelocity(int32_t units,float max_velocity)35 void VelocityTrackerState::ComputeCurrentVelocity(int32_t units,
36 float max_velocity) {
37 DCHECK_GE(max_velocity, 0);
38
39 BitSet32 id_bits(velocity_tracker_.GetCurrentPointerIdBits());
40 calculated_id_bits_ = id_bits;
41
42 for (uint32_t index = 0; !id_bits.is_empty(); index++) {
43 uint32_t id = id_bits.clear_first_marked_bit();
44
45 float vx, vy;
46 velocity_tracker_.GetVelocity(id, &vx, &vy);
47
48 vx = vx * units / 1000.f;
49 vy = vy * units / 1000.f;
50
51 if (vx > max_velocity)
52 vx = max_velocity;
53 else if (vx < -max_velocity)
54 vx = -max_velocity;
55
56 if (vy > max_velocity)
57 vy = max_velocity;
58 else if (vy < -max_velocity)
59 vy = -max_velocity;
60
61 Velocity& velocity = calculated_velocity_[index];
62 velocity.vx = vx;
63 velocity.vy = vy;
64 }
65 }
66
GetXVelocity(int32_t id) const67 float VelocityTrackerState::GetXVelocity(int32_t id) const {
68 float vx;
69 GetVelocity(id, &vx, NULL);
70 return vx;
71 }
72
GetYVelocity(int32_t id) const73 float VelocityTrackerState::GetYVelocity(int32_t id) const {
74 float vy;
75 GetVelocity(id, NULL, &vy);
76 return vy;
77 }
78
GetVelocity(int32_t id,float * out_vx,float * out_vy) const79 void VelocityTrackerState::GetVelocity(int32_t id,
80 float* out_vx,
81 float* out_vy) const {
82 DCHECK(out_vx || out_vy);
83 if (id == ACTIVE_POINTER_ID)
84 id = velocity_tracker_.GetActivePointerId();
85
86 float vx, vy;
87 if (id >= 0 && id <= MotionEvent::MAX_POINTER_ID &&
88 calculated_id_bits_.has_bit(id)) {
89 uint32_t index = calculated_id_bits_.get_index_of_bit(id);
90 const Velocity& velocity = calculated_velocity_[index];
91 vx = velocity.vx;
92 vy = velocity.vy;
93 } else {
94 vx = 0;
95 vy = 0;
96 }
97
98 if (out_vx)
99 *out_vx = vx;
100
101 if (out_vy)
102 *out_vy = vy;
103 }
104
105 } // namespace ui
106