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()
17 : velocity_tracker_(VelocityTracker::STRATEGY_DEFAULT
),
18 active_pointer_id_(ACTIVE_POINTER_ID
) {}
20 VelocityTrackerState::VelocityTrackerState(VelocityTracker::Strategy strategy
)
21 : velocity_tracker_(strategy
), active_pointer_id_(ACTIVE_POINTER_ID
) {}
23 VelocityTrackerState::~VelocityTrackerState() {}
25 void VelocityTrackerState::Clear() {
26 velocity_tracker_
.Clear();
27 active_pointer_id_
= ACTIVE_POINTER_ID
;
28 calculated_id_bits_
.clear();
31 void VelocityTrackerState::AddMovement(const MotionEvent
& event
) {
32 velocity_tracker_
.AddMovement(event
);
35 void VelocityTrackerState::ComputeCurrentVelocity(int32_t units
,
37 DCHECK_GE(max_velocity
, 0);
39 BitSet32
id_bits(velocity_tracker_
.GetCurrentPointerIdBits());
40 calculated_id_bits_
= id_bits
;
42 for (uint32_t index
= 0; !id_bits
.is_empty(); index
++) {
43 uint32_t id
= id_bits
.clear_first_marked_bit();
46 velocity_tracker_
.GetVelocity(id
, &vx
, &vy
);
48 vx
= vx
* units
/ 1000.f
;
49 vy
= vy
* units
/ 1000.f
;
51 if (vx
> max_velocity
)
53 else if (vx
< -max_velocity
)
56 if (vy
> max_velocity
)
58 else if (vy
< -max_velocity
)
61 Velocity
& velocity
= calculated_velocity_
[index
];
67 float VelocityTrackerState::GetXVelocity(int32_t id
) const {
69 GetVelocity(id
, &vx
, NULL
);
73 float VelocityTrackerState::GetYVelocity(int32_t id
) const {
75 GetVelocity(id
, NULL
, &vy
);
79 void VelocityTrackerState::GetVelocity(int32_t id
,
81 float* out_vy
) const {
82 DCHECK(out_vx
|| out_vy
);
83 if (id
== ACTIVE_POINTER_ID
)
84 id
= velocity_tracker_
.GetActivePointerId();
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
];