summaryrefslogtreecommitdiff
path: root/src/immediate_interpreter.cc
diff options
context:
space:
mode:
Diffstat (limited to 'src/immediate_interpreter.cc')
-rw-r--r--src/immediate_interpreter.cc205
1 files changed, 95 insertions, 110 deletions
diff --git a/src/immediate_interpreter.cc b/src/immediate_interpreter.cc
index c1aa568..9f63427 100644
--- a/src/immediate_interpreter.cc
+++ b/src/immediate_interpreter.cc
@@ -11,6 +11,7 @@
#include <functional>
#include <limits>
#include <tuple>
+#include <vector>
#include "include/gestures.h"
#include "include/logging.h"
@@ -61,9 +62,7 @@ void TapRecord::NoteTouch(short the_id, const FingerState& fs) {
// New finger must be close enough to an existing finger
if (!touched_.empty()) {
bool reject_new_finger = true;
- for (std::map<short, FingerState>::const_iterator it =
- touched_.begin(), e = touched_.end(); it != e; ++it) {
- const FingerState& existing_fs = (*it).second;
+ for (const auto& [tracking_id, existing_fs] : touched_) {
if (immediate_interpreter_->metrics_->CloseEnoughToGesture(
Vector2(existing_fs),
Vector2(fs))) {
@@ -113,28 +112,26 @@ void TapRecord::Update(const HardwareState& hwstate,
else if (diff < 0)
t5r2_released_size_ += -diff;
}
- for (std::set<short>::const_iterator it = added.begin(),
- e = added.end(); it != e; ++it)
- Log("TapRecord::Update: Added: %d", *it);
- for (std::set<short>::const_iterator it = removed.begin(),
- e = removed.end(); it != e; ++it)
- Log("TapRecord::Update: Removed: %d", *it);
- for (std::set<short>::const_iterator it = dead.begin(),
- e = dead.end(); it != e; ++it)
- Log("TapRecord::Update: Dead: %d", *it);
+ for (short tracking_id : added) {
+ Log("TapRecord::Update: Added: %d", tracking_id);
+ }
+ for (short tracking_id: removed) {
+ Log("TapRecord::Update: Removed: %d", tracking_id);
+ }
+ for (short tracking_id : dead) {
+ Log("TapRecord::Update: Dead: %d", tracking_id);
+ }
for_each(dead.begin(), dead.end(),
bind(&TapRecord::Remove, this, std::placeholders::_1));
- for (std::set<short>::const_iterator it = added.begin(),
- e = added.end(); it != e; ++it)
- NoteTouch(*it, *hwstate.GetFingerState(*it));
+ for (short tracking_id : added) {
+ NoteTouch(tracking_id, *hwstate.GetFingerState(tracking_id));
+ }
for_each(removed.begin(), removed.end(),
bind(&TapRecord::NoteRelease, this, std::placeholders::_1));
// Check if min tap/cotap pressure met yet
const float cotap_min_pressure = CotapMinPressure();
- for (std::map<short, FingerState>::iterator it =
- touched_.begin(), e = touched_.end();
- it != e; ++it) {
- const FingerState* fs = hwstate.GetFingerState((*it).first);
+ for (auto& [tracking_id, existing_fs] : touched_) {
+ const FingerState* fs = hwstate.GetFingerState(tracking_id);
if (fs) {
if (fs->pressure >= immediate_interpreter_->tap_min_pressure() ||
!immediate_interpreter_->device_reports_pressure())
@@ -142,11 +139,11 @@ void TapRecord::Update(const HardwareState& hwstate,
if (fs->pressure >= cotap_min_pressure ||
!immediate_interpreter_->device_reports_pressure()) {
min_cotap_pressure_met_.insert(fs->tracking_id);
- if ((*it).second.pressure < cotap_min_pressure &&
+ if (existing_fs.pressure < cotap_min_pressure &&
immediate_interpreter_->device_reports_pressure()) {
// Update existing record, since the old one hadn't met the cotap
// pressure
- (*it).second = *fs;
+ existing_fs = *fs;
}
}
stime_t finger_age = hwstate.timestamp -
@@ -171,20 +168,19 @@ void TapRecord::Clear() {
bool TapRecord::Moving(const HardwareState& hwstate,
const float dist_max) const {
const float cotap_min_pressure = CotapMinPressure();
- for (std::map<short, FingerState>::const_iterator it =
- touched_.begin(), e = touched_.end(); it != e; ++it) {
- const FingerState* fs = hwstate.GetFingerState((*it).first);
+ for (const auto& [tracking_id, existing_fs] : touched_) {
+ const FingerState* fs = hwstate.GetFingerState(tracking_id);
if (!fs)
continue;
// Only look for moving when current frame meets cotap pressure and
// our history contains a contact that's met cotap pressure.
if ((fs->pressure < cotap_min_pressure ||
- (*it).second.pressure < cotap_min_pressure) &&
+ existing_fs.pressure < cotap_min_pressure) &&
immediate_interpreter_->device_reports_pressure())
continue;
// Compute distance moved
- float dist_x = fs->position_x - (*it).second.position_x;
- float dist_y = fs->position_y - (*it).second.position_y;
+ float dist_x = fs->position_x - existing_fs.position_x;
+ float dist_y = fs->position_y - existing_fs.position_y;
// Respect WARP flags
if (fs->flags & GESTURES_FINGER_WARP_X_TAP_MOVE)
dist_x = 0.0;
@@ -202,10 +198,9 @@ bool TapRecord::Moving(const HardwareState& hwstate,
bool TapRecord::Motionless(const HardwareState& hwstate, const HardwareState&
prev_hwstate, const float max_speed) const {
const float cotap_min_pressure = CotapMinPressure();
- for (std::map<short, FingerState>::const_iterator it =
- touched_.begin(), e = touched_.end(); it != e; ++it) {
- const FingerState* fs = hwstate.GetFingerState((*it).first);
- const FingerState* prev_fs = prev_hwstate.GetFingerState((*it).first);
+ for (const auto& [tracking_id, _] : touched_) {
+ const FingerState* fs = hwstate.GetFingerState(tracking_id);
+ const FingerState* prev_fs = prev_hwstate.GetFingerState(tracking_id);
if (!fs || !prev_fs)
continue;
// Only look for moving when current frame meets cotap pressure and
@@ -233,12 +228,12 @@ bool TapRecord::TapComplete() const {
ret = t5r2_touched_size_ && t5r2_touched_size_ == t5r2_released_size_;
else
ret = !touched_.empty() && (touched_.size() == released_.size());
- for (std::map<short, FingerState>::const_iterator
- it = touched_.begin(), e = touched_.end(); it != e; ++it)
- Log("TapRecord::TapComplete: touched_: %d", (*it).first);
- for (std::set<short>::const_iterator it = released_.begin(),
- e = released_.end(); it != e; ++it)
- Log("TapRecord::TapComplete: released_: %d", *it);
+ for (const auto& [tracking_id, finger_state] : touched_) {
+ Log("TapRecord::TapComplete: touched_: %d", tracking_id);
+ }
+ for (short tracking_id : released_) {
+ Log("TapRecord::TapComplete: released_: %d", tracking_id);
+ }
return ret;
}
@@ -457,10 +452,9 @@ bool ScrollManager::FillResultScroll(
float dy = 0.0;
bool stationary = true;
bool pressure_changing = false;
- for (FingerMap::const_iterator it =
- gs_fingers.begin(), e = gs_fingers.end(); it != e; ++it) {
- const FingerState* fs = state_buffer.Get(0).GetFingerState(*it);
- const FingerState* prev = state_buffer.Get(1).GetFingerState(*it);
+ for (short tracking_id : gs_fingers) {
+ const FingerState* fs = state_buffer.Get(0).GetFingerState(tracking_id);
+ const FingerState* prev = state_buffer.Get(1).GetFingerState(tracking_id);
if (!prev)
return false;
const stime_t dt =
@@ -1687,9 +1681,9 @@ void ImmediateInterpreter::UpdateThumbState(const HardwareState& hwstate) {
thumb_eval_timer_[fs.tracking_id] = thumb_eval_timeout_.val_;
}
}
- for (std::map<short, stime_t>::const_iterator it = thumb_.begin();
- it != thumb_.end(); ++it)
- pointing_.erase((*it).first);
+ for (const auto& [tracking_id, _] : thumb_) {
+ pointing_.erase(tracking_id);
+ }
}
void ImmediateInterpreter::UpdateNonGsFingers(const HardwareState& hwstate) {
@@ -1733,7 +1727,7 @@ FingerMap ImmediateInterpreter::GetGesturingFingers(
return {};
}
- const FingerState* fs[hwstate.finger_cnt];
+ std::vector<FingerState*> fs(hwstate.finger_cnt);
for (size_t i = 0; i < hwstate.finger_cnt; ++i)
fs[i] = &hwstate.fingers[i];
@@ -1743,11 +1737,12 @@ FingerMap ImmediateInterpreter::GetGesturingFingers(
FingerMap ret;
size_t sorted_cnt;
if (hwstate.finger_cnt > kMaxGesturingFingers) {
- std::partial_sort(fs, fs + kMaxGesturingFingers, fs + hwstate.finger_cnt,
+ std::partial_sort(fs.begin(), fs.begin() + kMaxGesturingFingers,
+ fs.end(),
compare);
sorted_cnt = kMaxGesturingFingers;
} else {
- std::sort(fs, fs + hwstate.finger_cnt, compare);
+ std::sort(fs.begin(), fs.end(), compare);
sorted_cnt = hwstate.finger_cnt;
}
for (size_t i = 0; i < sorted_cnt; i++)
@@ -1883,9 +1878,7 @@ void ImmediateInterpreter::UpdateCurrentGestureType(
}
if (current_gesture_type_ != kGestureTypeNull) {
active_gs_fingers->clear();
- for (vector<short, kMaxGesturingFingers>::const_iterator it =
- sorted_ids.begin(), e = sorted_ids.end(); it != e; ++it)
- active_gs_fingers->insert(*it);
+ active_gs_fingers->insert(sorted_ids.begin(), sorted_ids.end());
break;
}
}
@@ -1975,8 +1968,10 @@ void ImmediateInterpreter::SortFingersByProximity(
// that until we have enough points
size_t dist_sq_capacity =
(finger_ids.size() * (finger_ids.size() - 1)) / 2;
- DistSqElt dist_sq[dist_sq_capacity];
- size_t dist_sq_len = 0;
+
+ std::vector<DistSqElt> dist_sq;
+ dist_sq.reserve(dist_sq_capacity);
+
for (size_t i = 0; i < hwstate.finger_cnt; i++) {
const FingerState& fs1 = hwstate.fingers[i];
if (!SetContainsValue(finger_ids, fs1.tracking_id))
@@ -1989,24 +1984,20 @@ void ImmediateInterpreter::SortFingersByProximity(
DistSq(fs1, fs2),
{ fs1.tracking_id, fs2.tracking_id }
};
- if (dist_sq_len >= dist_sq_capacity) {
- Err("%s: Array overrun", __func__);
- break;
- }
- dist_sq[dist_sq_len++] = elt;
+ dist_sq.push_back(elt);
}
}
DistSqCompare distSqCompare;
- std::sort(dist_sq, dist_sq + dist_sq_len, distSqCompare);
+ std::sort(dist_sq.begin(), dist_sq.end(), distSqCompare);
if (out_sorted_ids == nullptr) {
Err("out_sorted_ids became null");
return;
}
- for (size_t i = 0; i < dist_sq_len; i++) {
- short id1 = dist_sq[i].tracking_id[0];
- short id2 = dist_sq[i].tracking_id[1];
+ for (auto const & d: dist_sq) {
+ short id1 = d.tracking_id[0];
+ short id2 = d.tracking_id[1];
bool contains1 = out_sorted_ids->find(id1) != out_sorted_ids->end();
bool contains2 = out_sorted_ids->find(id2) != out_sorted_ids->end();
if (contains1 == contains2 && !out_sorted_ids->empty()) {
@@ -2222,9 +2213,8 @@ bool ImmediateInterpreter::PalmIsArrivingOrDeparting(
bool ImmediateInterpreter::IsTooCloseToThumb(const FingerState& finger) const {
const float kMin2fDistThreshSq = tapping_finger_min_separation_.val_ *
tapping_finger_min_separation_.val_;
- for (std::map<short, stime_t>::const_iterator it = thumb_.begin();
- it != thumb_.end(); ++it) {
- const FingerState* thumb = state_buffer_.Get(0).GetFingerState(it->first);
+ for (const auto& [tracking_id, _] : thumb_) {
+ const FingerState* thumb = state_buffer_.Get(0).GetFingerState(tracking_id);
float xdist = fabsf(finger.position_x - thumb->position_x);
float ydist = fabsf(finger.position_y - thumb->position_y);
if (xdist * xdist + ydist * ydist < kMin2fDistThreshSq)
@@ -2463,8 +2453,10 @@ GestureType ImmediateInterpreter::GetMultiFingerGestureType(
return kGestureTypeNull;
}
- const FingerState* x_fingers[num_fingers];
- const FingerState* y_fingers[num_fingers];
+ assert(num_fingers <= (int) kMaxGesturingFingers);
+
+ const FingerState* x_fingers[kMaxGesturingFingers];
+ const FingerState* y_fingers[kMaxGesturingFingers];
for (int i = 0; i < num_fingers; i++) {
x_fingers[i] = fingers[i];
y_fingers[i] = fingers[i];
@@ -2478,13 +2470,13 @@ GestureType ImmediateInterpreter::GetMultiFingerGestureType(
bool horizontal =
(x_fingers[num_fingers - 1]->position_x - x_fingers[0]->position_x) >=
(y_fingers[num_fingers -1]->position_y - y_fingers[0]->position_y);
- const FingerState* sorted_fingers[num_fingers];
+ const FingerState* sorted_fingers[4];
for (int i = 0; i < num_fingers; i++) {
sorted_fingers[i] = horizontal ? x_fingers[i] : y_fingers[i];
}
- float dx[num_fingers];
- float dy[num_fingers];
+ float dx[kMaxGesturingFingers];
+ float dy[kMaxGesturingFingers];
float dy_sum = 0;
float dx_sum = 0;
for (int i = 0; i < num_fingers; i++) {
@@ -2548,7 +2540,7 @@ stime_t ImmediateInterpreter::TimeoutForTtcState(TapToClickState state) {
case kTtcDragRelease: return tap_drag_timeout_.val_;
case kTtcDragRetouch: return tap_timeout_.val_;
default:
- Log("Unknown state!");
+ Err("Unknown TapToClickState %u!", state);
return 0.0;
}
}
@@ -2606,14 +2598,13 @@ void ImmediateInterpreter::UpdateTapState(
(GESTURES_FINGER_NO_TAP | GESTURES_FINGER_MERGE))
cancel_tapping = true;
}
- for (FingerMap::const_iterator it =
- gs_fingers.begin(), e = gs_fingers.end(); it != e; ++it) {
- const FingerState* fs = hwstate->GetFingerState(*it);
+ for (short tracking_id : gs_fingers) {
+ const FingerState* fs = hwstate->GetFingerState(tracking_id);
if (!fs) {
Err("Missing finger state?!");
continue;
}
- tap_gs_fingers.insert(*it);
+ tap_gs_fingers.insert(tracking_id);
}
}
std::set<short> added_fingers;
@@ -2638,40 +2629,37 @@ void ImmediateInterpreter::UpdateTapState(
if (hwstate && (!same_fingers || prev_tap_gs_fingers_ != tap_gs_fingers)) {
// See if fingers were added
- for (FingerMap::const_iterator it =
- tap_gs_fingers.begin(), e = tap_gs_fingers.end(); it != e; ++it) {
+ for (short tracking_id : tap_gs_fingers) {
// If the finger was marked as a thumb before, it is not new.
- if (hwstate->timestamp - finger_origin_timestamp(*it) >
+ if (hwstate->timestamp - finger_origin_timestamp(tracking_id) >
thumb_click_prevention_timeout_.val_)
continue;
- if (!SetContainsValue(prev_tap_gs_fingers_, *it)) {
+ if (!SetContainsValue(prev_tap_gs_fingers_, tracking_id)) {
// Gesturing finger wasn't in prev state. It's new.
- const FingerState* fs = hwstate->GetFingerState(*it);
+ const FingerState* fs = hwstate->GetFingerState(tracking_id);
if (FingerTooCloseToTap(*hwstate, *fs) ||
FingerTooCloseToTap(state_buffer_.Get(1), *fs) ||
SetContainsValue(tap_dead_fingers_, fs->tracking_id))
continue;
- added_fingers.insert(*it);
- Log("TTC: Added %d", *it);
+ added_fingers.insert(tracking_id);
+ Log("TTC: Added %d", tracking_id);
}
}
// See if fingers were removed or are now non-gesturing (dead)
- for (FingerMap::const_iterator it =
- prev_tap_gs_fingers_.begin(), e = prev_tap_gs_fingers_.end();
- it != e; ++it) {
- if (tap_gs_fingers.find(*it) != tap_gs_fingers.end())
+ for (short tracking_id : prev_tap_gs_fingers_) {
+ if (tap_gs_fingers.find(tracking_id) != tap_gs_fingers.end())
// still gesturing; neither removed nor dead
continue;
- if (!hwstate->GetFingerState(*it)) {
+ if (!hwstate->GetFingerState(tracking_id)) {
// Previously gesturing finger isn't in current state. It's gone.
- removed_fingers.insert(*it);
- Log("TTC: Removed %d", *it);
+ removed_fingers.insert(tracking_id);
+ Log("TTC: Removed %d", tracking_id);
} else {
// Previously gesturing finger is in current state. It's dead.
- dead_fingers.insert(*it);
- Log("TTC: Dead %d", *it);
+ dead_fingers.insert(tracking_id);
+ Log("TTC: Dead %d", tracking_id);
}
}
}
@@ -2747,7 +2735,7 @@ void ImmediateInterpreter::UpdateTapState(
break;
}
if (!hwstate) {
- Log("hwstate is null but no timeout?!");
+ Err("hwstate is null but not a timeout?!");
break;
}
tap_record_.Update(
@@ -2797,7 +2785,7 @@ void ImmediateInterpreter::UpdateTapState(
break;
case kTtcSubsequentTapBegan:
if (!is_timeout && !hwstate) {
- Log("hwstate is null but not a timeout?!");
+ Err("hwstate is null but not a timeout?!");
break;
}
if (hwstate)
@@ -2901,7 +2889,7 @@ void ImmediateInterpreter::UpdateTapState(
break;
}
if (!hwstate) {
- Log("not timeout but hwstate is null?!");
+ Err("hwstate is null but not a timeout?!");
break;
}
if (tap_record_.Moving(*hwstate, tap_move_dist_.val_))
@@ -3038,15 +3026,15 @@ void ImmediateInterpreter::UpdateStartedMovingTime(
const FingerMap& gs_fingers,
const FingerMap& newly_moving_fingers) {
// Update started moving time if any gesturing finger is newly moving.
- for (auto it = gs_fingers.begin(), e = gs_fingers.end(); it != e; ++it) {
- if (SetContainsValue(newly_moving_fingers, *it)) {
+ for (short gs_tracking_id : gs_fingers) {
+ if (SetContainsValue(newly_moving_fingers, gs_tracking_id)) {
started_moving_time_ = now;
// Extend the thumb evaluation period for any finger that is still under
// evaluation as there is a new moving finger.
- for (std::map<short, stime_t>::iterator it = thumb_.begin();
- it != thumb_.end(); ++it)
- if ((*it).second < thumb_eval_timeout_.val_ && (*it).second > 0.0)
- (*it).second = thumb_eval_timeout_.val_;
+ for (auto& [_, time] : thumb_) {
+ if (time < thumb_eval_timeout_.val_ && time > 0.0)
+ time = thumb_eval_timeout_.val_;
+ }
return;
}
}
@@ -3168,9 +3156,8 @@ void ImmediateInterpreter::FillResultGesture(
const HardwareState& prev_hs = state_buffer_.Get(1);
if (!current) {
float curr_dist_sq = -1;
- for (FingerMap::const_iterator it =
- fingers.begin(), e = fingers.end(); it != e; ++it) {
- const FingerState* fs = hwstate.GetFingerState(*it);
+ for (short tracking_id : fingers) {
+ const FingerState* fs = hwstate.GetFingerState(tracking_id);
const FingerState* prev_fs = prev_hs.GetFingerState(fs->tracking_id);
if (!prev_fs)
break;
@@ -3277,9 +3264,8 @@ void ImmediateInterpreter::FillResultGesture(
float finger_cnt[] = { 0.0, 0.0 };
float FingerState::*fields[] = { &FingerState::position_x,
&FingerState::position_y };
- for (FingerMap::const_iterator it =
- fingers.begin(), e = fingers.end(); it != e; ++it) {
- if (!state_buffer_.Get(1).GetFingerState(*it)) {
+ for (short tracking_id : fingers) {
+ if (!state_buffer_.Get(1).GetFingerState(tracking_id)) {
Err("missing prev state?");
continue;
}
@@ -3290,8 +3276,8 @@ void ImmediateInterpreter::FillResultGesture(
if (!valid[i] || !correct_axis)
continue;
float FingerState::*field = fields[i];
- float delta = hwstate.GetFingerState(*it)->*field -
- state_buffer_.Get(1).GetFingerState(*it)->*field;
+ float delta = hwstate.GetFingerState(tracking_id)->*field -
+ state_buffer_.Get(1).GetFingerState(tracking_id)->*field;
// The multiply is to see if they have the same sign:
if (sum_delta[i] == 0.0 || sum_delta[i] * delta > 0) {
sum_delta[i] += delta;
@@ -3430,9 +3416,8 @@ void ImmediateInterpreter::Initialize(const HardwareProperties* hwprops,
bool AnyGesturingFingerLeft(const HardwareState& state,
const FingerMap& prev_gs_fingers) {
- for (FingerMap::const_iterator it = prev_gs_fingers.begin(),
- e = prev_gs_fingers.end(); it != e; ++it) {
- if (!state.GetFingerState(*it)) {
+ for (short tracking_id : prev_gs_fingers) {
+ if (!state.GetFingerState(tracking_id)) {
return true;
}
}