File: velocity_tracker_state.cc

package info (click to toggle)
chromium-browser 41.0.2272.118-1
  • links: PTS, VCS
  • area: main
  • in suites: jessie-kfreebsd
  • size: 2,189,132 kB
  • sloc: cpp: 9,691,462; ansic: 3,341,451; python: 712,689; asm: 518,779; xml: 208,926; java: 169,820; sh: 119,353; perl: 68,907; makefile: 28,311; yacc: 13,305; objc: 11,385; tcl: 3,186; cs: 2,225; sql: 2,217; lex: 2,215; lisp: 1,349; pascal: 1,256; awk: 407; ruby: 155; sed: 53; php: 14; exp: 11
file content (101 lines) | stat: -rw-r--r-- 2,657 bytes parent folder | download | duplicates (7)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
// 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