| OLD | NEW |
| 1 // Copyright 2014 The Chromium Authors. All rights reserved. | 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 | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "ui/events/gesture_detection/scale_gesture_detector.h" | 5 #include "ui/events/gesture_detection/scale_gesture_detector.h" |
| 6 | 6 |
| 7 #include <limits.h> | 7 #include <limits.h> |
| 8 #include <cmath> | 8 #include <cmath> |
| 9 | 9 |
| 10 #include "base/float_util.h" | 10 #include "base/float_util.h" |
| (...skipping 14 matching lines...) Expand all Loading... |
| 25 const int kTouchStabilizeTimeMs = 128; | 25 const int kTouchStabilizeTimeMs = 128; |
| 26 | 26 |
| 27 const float kScaleFactor = .5f; | 27 const float kScaleFactor = .5f; |
| 28 | 28 |
| 29 } // namespace | 29 } // namespace |
| 30 | 30 |
| 31 // Note: These constants were taken directly from the default (unscaled) | 31 // Note: These constants were taken directly from the default (unscaled) |
| 32 // versions found in Android's ViewConfiguration. | 32 // versions found in Android's ViewConfiguration. |
| 33 ScaleGestureDetector::Config::Config() | 33 ScaleGestureDetector::Config::Config() |
| 34 : min_scaling_touch_major(48), | 34 : min_scaling_touch_major(48), |
| 35 min_scaling_span(200), | 35 min_scaling_span(100), |
| 36 use_touch_major_in_span(false), |
| 36 quick_scale_enabled(true), | 37 quick_scale_enabled(true), |
| 37 min_pinch_update_span_delta(0) { | 38 min_pinch_update_span_delta(0) { |
| 38 } | 39 } |
| 39 | 40 |
| 40 ScaleGestureDetector::Config::~Config() {} | 41 ScaleGestureDetector::Config::~Config() {} |
| 41 | 42 |
| 42 bool ScaleGestureDetector::SimpleScaleGestureListener::OnScale( | 43 bool ScaleGestureDetector::SimpleScaleGestureListener::OnScale( |
| 43 const ScaleGestureDetector&, const MotionEvent&) { | 44 const ScaleGestureDetector&, const MotionEvent&) { |
| 44 return false; | 45 return false; |
| 45 } | 46 } |
| (...skipping 16 matching lines...) Expand all Loading... |
| 62 curr_span_(0), | 63 curr_span_(0), |
| 63 prev_span_(0), | 64 prev_span_(0), |
| 64 initial_span_(0), | 65 initial_span_(0), |
| 65 curr_span_x_(0), | 66 curr_span_x_(0), |
| 66 curr_span_y_(0), | 67 curr_span_y_(0), |
| 67 prev_span_x_(0), | 68 prev_span_x_(0), |
| 68 prev_span_y_(0), | 69 prev_span_y_(0), |
| 69 in_progress_(0), | 70 in_progress_(0), |
| 70 span_slop_(0), | 71 span_slop_(0), |
| 71 min_span_(0), | 72 min_span_(0), |
| 73 use_touch_major_in_span_(config.use_touch_major_in_span), |
| 72 touch_upper_(0), | 74 touch_upper_(0), |
| 73 touch_lower_(0), | 75 touch_lower_(0), |
| 74 touch_history_last_accepted_(0), | 76 touch_history_last_accepted_(0), |
| 75 touch_history_direction_(0), | 77 touch_history_direction_(0), |
| 76 touch_min_major_(0), | 78 touch_min_major_(0), |
| 79 touch_max_major_(0), |
| 77 double_tap_focus_x_(0), | 80 double_tap_focus_x_(0), |
| 78 double_tap_focus_y_(0), | 81 double_tap_focus_y_(0), |
| 79 double_tap_mode_(DOUBLE_TAP_MODE_NONE), | 82 double_tap_mode_(DOUBLE_TAP_MODE_NONE), |
| 80 event_before_or_above_starting_gesture_event_(false) { | 83 event_before_or_above_starting_gesture_event_(false) { |
| 81 DCHECK(listener_); | 84 DCHECK(listener_); |
| 82 span_slop_ = | 85 span_slop_ = (config.gesture_detector_config.touch_slop + kSlopEpsilon) * 2; |
| 83 (config.gesture_detector_config.touch_slop + kSlopEpsilon) * 2; | |
| 84 touch_min_major_ = config.min_scaling_touch_major; | 86 touch_min_major_ = config.min_scaling_touch_major; |
| 87 touch_max_major_ = std::min(config.min_scaling_span, 2.f * touch_min_major_); |
| 85 min_span_ = config.min_scaling_span + kSlopEpsilon; | 88 min_span_ = config.min_scaling_span + kSlopEpsilon; |
| 86 ResetTouchHistory(); | 89 ResetTouchHistory(); |
| 87 SetQuickScaleEnabled(config.quick_scale_enabled); | 90 SetQuickScaleEnabled(config.quick_scale_enabled); |
| 88 } | 91 } |
| 89 | 92 |
| 90 ScaleGestureDetector::~ScaleGestureDetector() {} | 93 ScaleGestureDetector::~ScaleGestureDetector() {} |
| 91 | 94 |
| 92 bool ScaleGestureDetector::OnTouchEvent(const MotionEvent& event) { | 95 bool ScaleGestureDetector::OnTouchEvent(const MotionEvent& event) { |
| 93 curr_time_ = event.GetEventTime(); | 96 curr_time_ = event.GetEventTime(); |
| 94 | 97 |
| (...skipping 57 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 152 if (skip_index == i) | 155 if (skip_index == i) |
| 153 continue; | 156 continue; |
| 154 sum_x += event.GetX(i); | 157 sum_x += event.GetX(i); |
| 155 sum_y += event.GetY(i); | 158 sum_y += event.GetY(i); |
| 156 } | 159 } |
| 157 | 160 |
| 158 focus_x = sum_x * inverse_unreleased_point_count; | 161 focus_x = sum_x * inverse_unreleased_point_count; |
| 159 focus_y = sum_y * inverse_unreleased_point_count; | 162 focus_y = sum_y * inverse_unreleased_point_count; |
| 160 } | 163 } |
| 161 | 164 |
| 162 AddTouchHistory(event); | 165 if (use_touch_major_in_span_) |
| 166 AddTouchHistory(event); |
| 163 | 167 |
| 164 // Determine average deviation from focal point. | 168 // Determine average deviation from focal point. |
| 165 float dev_sum_x = 0, dev_sum_y = 0; | 169 float dev_sum_x = 0, dev_sum_y = 0; |
| 166 for (int i = 0; i < count; i++) { | 170 for (int i = 0; i < count; i++) { |
| 167 if (skip_index == i) | 171 if (skip_index == i) |
| 168 continue; | 172 continue; |
| 169 | 173 |
| 170 dev_sum_x += std::abs(event.GetX(i) - focus_x); | 174 dev_sum_x += std::abs(event.GetX(i) - focus_x); |
| 171 dev_sum_y += std::abs(event.GetY(i) - focus_y); | 175 dev_sum_y += std::abs(event.GetY(i) - focus_y); |
| 172 } | 176 } |
| 173 // Convert the resulting diameter into a radius, to include touch | 177 // Convert the resulting diameter into a radius, to include touch |
| 174 // radius in overall deviation. | 178 // radius in overall deviation. |
| 175 const float touch_size = touch_history_last_accepted_ / 2; | 179 const float touch_radius = |
| 180 use_touch_major_in_span_ ? touch_history_last_accepted_ / 2 : 0; |
| 176 | 181 |
| 177 const float dev_x = (dev_sum_x * inverse_unreleased_point_count) + touch_size; | 182 const float dev_x = dev_sum_x * inverse_unreleased_point_count + touch_radius; |
| 178 const float dev_y = (dev_sum_y * inverse_unreleased_point_count) + touch_size; | 183 const float dev_y = dev_sum_y * inverse_unreleased_point_count + touch_radius; |
| 179 | 184 |
| 180 // Span is the average distance between touch points through the focal point; | 185 // Span is the average distance between touch points through the focal point; |
| 181 // i.e. the diameter of the circle with a radius of the average deviation from | 186 // i.e. the diameter of the circle with a radius of the average deviation from |
| 182 // the focal point. | 187 // the focal point. |
| 183 const float span_x = dev_x * 2; | 188 const float span_x = dev_x * 2; |
| 184 const float span_y = dev_y * 2; | 189 const float span_y = dev_y * 2; |
| 185 float span; | 190 float span; |
| 186 if (InDoubleTapMode()) { | 191 if (InDoubleTapMode()) { |
| 187 span = span_y; | 192 span = span_y; |
| 188 } else { | 193 } else { |
| (...skipping 132 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 321 const int pointersample_count = history_size + 1; | 326 const int pointersample_count = history_size + 1; |
| 322 for (int h = 0; h < pointersample_count; h++) { | 327 for (int h = 0; h < pointersample_count; h++) { |
| 323 float major; | 328 float major; |
| 324 if (h < history_size) { | 329 if (h < history_size) { |
| 325 major = ev.GetHistoricalTouchMajor(i, h); | 330 major = ev.GetHistoricalTouchMajor(i, h); |
| 326 } else { | 331 } else { |
| 327 major = ev.GetTouchMajor(i); | 332 major = ev.GetTouchMajor(i); |
| 328 } | 333 } |
| 329 if (major < touch_min_major_) | 334 if (major < touch_min_major_) |
| 330 major = touch_min_major_; | 335 major = touch_min_major_; |
| 336 if (major > touch_max_major_) |
| 337 major = touch_max_major_; |
| 331 total += major; | 338 total += major; |
| 332 | 339 |
| 333 if (base::IsNaN(touch_upper_) || major > touch_upper_) { | 340 if (base::IsNaN(touch_upper_) || major > touch_upper_) { |
| 334 touch_upper_ = major; | 341 touch_upper_ = major; |
| 335 } | 342 } |
| 336 if (base::IsNaN(touch_lower_) || major < touch_lower_) { | 343 if (base::IsNaN(touch_lower_) || major < touch_lower_) { |
| 337 touch_lower_ = major; | 344 touch_lower_ = major; |
| 338 } | 345 } |
| 339 | 346 |
| 340 if (has_last_accepted) { | 347 if (has_last_accepted) { |
| (...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 374 touch_history_last_accepted_time_ = base::TimeTicks(); | 381 touch_history_last_accepted_time_ = base::TimeTicks(); |
| 375 } | 382 } |
| 376 | 383 |
| 377 void ScaleGestureDetector::ResetScaleWithSpan(float span) { | 384 void ScaleGestureDetector::ResetScaleWithSpan(float span) { |
| 378 in_progress_ = false; | 385 in_progress_ = false; |
| 379 initial_span_ = span; | 386 initial_span_ = span; |
| 380 double_tap_mode_ = DOUBLE_TAP_MODE_NONE; | 387 double_tap_mode_ = DOUBLE_TAP_MODE_NONE; |
| 381 } | 388 } |
| 382 | 389 |
| 383 } // namespace ui | 390 } // namespace ui |
| OLD | NEW |