Chromium Code Reviews| OLD | NEW |
|---|---|
| (Empty) | |
| 1 // Copyright 2015 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/ozone/evdev/touch_noise/far_apart_taps_touch_noise_filter.h" | |
| 6 | |
| 7 #include <cmath> | |
| 8 | |
| 9 #include "base/logging.h" | |
| 10 #include "base/strings/stringprintf.h" | |
| 11 | |
| 12 namespace ui { | |
| 13 | |
| 14 namespace { | |
| 15 | |
| 16 // Minimum squared distance between taps to be considered far apart. | |
| 17 const int kMinDistance2 = 1500 * 1500; | |
| 18 | |
| 19 // Max time between taps considered. | |
| 20 const int kMaxTapDeltaMs = 30; | |
| 21 | |
| 22 // Maximum squared movement of a touch to still be considered a tap. | |
| 23 const int kMaxTapMovement2 = 20 * 20; | |
| 24 | |
| 25 // Returns the squared distance between |p1| and |p2|. | |
| 26 int Distance2(const gfx::PointF& p1, const gfx::PointF& p2) { | |
| 27 gfx::Vector2dF offset = p2 - p1; | |
| 28 return offset.x() * offset.x() + offset.y() * offset.y(); | |
| 29 } | |
| 30 | |
| 31 } // namespace | |
| 32 | |
| 33 void FarApartTapsTouchNoiseFilter::FilterFrame(Frame* previous, | |
| 34 Frame* current) { | |
| 35 // Remove old taps and touches moving more than min delta. | |
| 36 base::TimeDelta tap_cutoff = | |
| 37 current->timestamp - base::TimeDelta::FromMilliseconds(kMaxTapDeltaMs); | |
| 38 for (size_t i = 0; i < kNumSlots; ++i) { | |
| 39 if (tracked_taps_[i].start < tap_cutoff) | |
| 40 tracked_taps_[i].Invalidate(); | |
| 41 } | |
| 42 | |
| 43 for (size_t slot = 0; slot < kNumSlots; ++slot) { | |
| 44 Finger* cur = ¤t->fingers[slot]; | |
| 45 Finger* prev = &previous->fingers[slot]; | |
| 46 | |
| 47 // Only look at slots with active touches. | |
| 48 if (cur->tracking_id == -1 && prev->tracking_id == -1) | |
| 49 continue; | |
| 50 | |
| 51 bool arrived = prev->tracking_id == -1 && cur->tracking_id > 0; | |
| 52 bool departing = prev->tracking_id >= 0 && cur->tracking_id == -1; | |
| 53 | |
| 54 if (arrived) { | |
| 55 // Track new finger info. | |
| 56 tracked_taps_[slot] = Tap(current->timestamp, cur->location); | |
| 57 } else if (tracked_taps_[slot].is_valid()) { | |
| 58 // Check if this finger has moved too far to be considered a tap. | |
| 59 if (kMaxTapMovement2 < | |
| 60 Distance2(cur->location, tracked_taps_[slot].location)) { | |
| 61 tracked_taps_[slot].Invalidate(); | |
| 62 } | |
| 63 } | |
| 64 | |
| 65 if (tracked_taps_[slot].is_valid()) { | |
| 66 // Check distance from other tracked taps. | |
| 67 int min_distance2 = -1; | |
| 68 for (size_t i = 0; i < kNumSlots; ++i) { | |
| 69 if (i == slot || !tracked_taps_[i].is_valid()) | |
| 70 continue; | |
| 71 | |
| 72 int dist2 = Distance2(tracked_taps_[i].location, cur->location); | |
| 73 if (min_distance2 < 0 || dist2 < min_distance2) | |
| 74 min_distance2 = dist2; | |
| 75 } | |
| 76 | |
| 77 if (min_distance2 > kMinDistance2) { | |
| 78 // The other finger should see this one on its next frame and also | |
| 79 // get canceled. | |
| 80 VLOG(2) << base::StringPrintf( | |
| 81 "Cancel tracking id %d %.0fpx from other current taps.", | |
| 82 departing ? prev->tracking_id : cur->tracking_id, | |
| 83 sqrt(min_distance2)); | |
| 84 cur->canceled = true; | |
|
flackr
2015/03/10 05:23:40
Since we're in chrome codebase now, we should add
pkotwicz
2015/03/13 03:53:16
I'd rather do this in a separate CL. I have filed
flackr
2015/03/13 15:08:36
Of course, we may also want to track a histogram o
| |
| 85 } | |
| 86 } | |
| 87 | |
| 88 if (departing) | |
| 89 tracked_taps_[slot].Invalidate(); | |
| 90 } | |
| 91 } | |
| 92 | |
| 93 } // namespace ui | |
| OLD | NEW |