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.
5 #include "ui/events/gesture_detection/velocity_tracker_state.h"
7 #include "base/logging.h"
8 #include "ui/events/gesture_detection/motion_event.h"
12 // Special constant to request the velocity of the active pointer.
13 const int ACTIVE_POINTER_ID
= -1;
16 VelocityTrackerState::VelocityTrackerState(VelocityTracker::Strategy strategy
)
17 : velocity_tracker_(strategy
), active_pointer_id_(ACTIVE_POINTER_ID
) {}
19 VelocityTrackerState::~VelocityTrackerState() {}
21 void VelocityTrackerState::Clear() {
22 velocity_tracker_
.Clear();
23 active_pointer_id_
= ACTIVE_POINTER_ID
;
24 calculated_id_bits_
.clear();
27 void VelocityTrackerState::AddMovement(const MotionEvent
& event
) {
28 velocity_tracker_
.AddMovement(event
);
31 void VelocityTrackerState::ComputeCurrentVelocity(int32_t units
,
33 DCHECK_GE(max_velocity
, 0);
35 BitSet32
id_bits(velocity_tracker_
.GetCurrentPointerIdBits());
36 calculated_id_bits_
= id_bits
;
38 for (uint32_t index
= 0; !id_bits
.is_empty(); index
++) {
39 uint32_t id
= id_bits
.clear_first_marked_bit();
42 velocity_tracker_
.GetVelocity(id
, &vx
, &vy
);
44 vx
= vx
* units
/ 1000.f
;
45 vy
= vy
* units
/ 1000.f
;
47 if (vx
> max_velocity
)
49 else if (vx
< -max_velocity
)
52 if (vy
> max_velocity
)
54 else if (vy
< -max_velocity
)
57 Velocity
& velocity
= calculated_velocity_
[index
];
63 float VelocityTrackerState::GetXVelocity(int32_t id
) const {
65 GetVelocity(id
, &vx
, NULL
);
69 float VelocityTrackerState::GetYVelocity(int32_t id
) const {
71 GetVelocity(id
, NULL
, &vy
);
75 void VelocityTrackerState::GetVelocity(int32_t id
,
77 float* out_vy
) const {
78 DCHECK(out_vx
|| out_vy
);
79 if (id
== ACTIVE_POINTER_ID
)
80 id
= velocity_tracker_
.GetActivePointerId();
83 if (id
>= 0 && id
<= MotionEvent::MAX_POINTER_ID
&&
84 calculated_id_bits_
.has_bit(id
)) {
85 uint32_t index
= calculated_id_bits_
.get_index_of_bit(id
);
86 const Velocity
& velocity
= calculated_velocity_
[index
];