| Index: ui/events/gesture_detection/scale_gesture_detector.cc
|
| diff --git a/ui/events/gesture_detection/scale_gesture_detector.cc b/ui/events/gesture_detection/scale_gesture_detector.cc
|
| index 18fd6d85b5970d69adbf0d9a121de543ca94b415..e7605c70373f41615126fb2bb3e33deda9214035 100644
|
| --- a/ui/events/gesture_detection/scale_gesture_detector.cc
|
| +++ b/ui/events/gesture_detection/scale_gesture_detector.cc
|
| @@ -32,7 +32,8 @@ const float kScaleFactor = .5f;
|
| // versions found in Android's ViewConfiguration.
|
| ScaleGestureDetector::Config::Config()
|
| : min_scaling_touch_major(48),
|
| - min_scaling_span(200),
|
| + min_scaling_span(100),
|
| + use_touch_major_in_span(false),
|
| quick_scale_enabled(true),
|
| min_pinch_update_span_delta(0) {
|
| }
|
| @@ -69,19 +70,21 @@ ScaleGestureDetector::ScaleGestureDetector(const Config& config,
|
| in_progress_(0),
|
| span_slop_(0),
|
| min_span_(0),
|
| + use_touch_major_in_span_(config.use_touch_major_in_span),
|
| touch_upper_(0),
|
| touch_lower_(0),
|
| touch_history_last_accepted_(0),
|
| touch_history_direction_(0),
|
| touch_min_major_(0),
|
| + touch_max_major_(0),
|
| double_tap_focus_x_(0),
|
| double_tap_focus_y_(0),
|
| double_tap_mode_(DOUBLE_TAP_MODE_NONE),
|
| event_before_or_above_starting_gesture_event_(false) {
|
| DCHECK(listener_);
|
| - span_slop_ =
|
| - (config.gesture_detector_config.touch_slop + kSlopEpsilon) * 2;
|
| + span_slop_ = (config.gesture_detector_config.touch_slop + kSlopEpsilon) * 2;
|
| touch_min_major_ = config.min_scaling_touch_major;
|
| + touch_max_major_ = std::min(config.min_scaling_span, 2.f * touch_min_major_);
|
| min_span_ = config.min_scaling_span + kSlopEpsilon;
|
| ResetTouchHistory();
|
| SetQuickScaleEnabled(config.quick_scale_enabled);
|
| @@ -159,7 +162,8 @@ bool ScaleGestureDetector::OnTouchEvent(const MotionEvent& event) {
|
| focus_y = sum_y * inverse_unreleased_point_count;
|
| }
|
|
|
| - AddTouchHistory(event);
|
| + if (use_touch_major_in_span_)
|
| + AddTouchHistory(event);
|
|
|
| // Determine average deviation from focal point.
|
| float dev_sum_x = 0, dev_sum_y = 0;
|
| @@ -172,10 +176,11 @@ bool ScaleGestureDetector::OnTouchEvent(const MotionEvent& event) {
|
| }
|
| // Convert the resulting diameter into a radius, to include touch
|
| // radius in overall deviation.
|
| - const float touch_size = touch_history_last_accepted_ / 2;
|
| + const float touch_radius =
|
| + use_touch_major_in_span_ ? touch_history_last_accepted_ / 2 : 0;
|
|
|
| - const float dev_x = (dev_sum_x * inverse_unreleased_point_count) + touch_size;
|
| - const float dev_y = (dev_sum_y * inverse_unreleased_point_count) + touch_size;
|
| + const float dev_x = dev_sum_x * inverse_unreleased_point_count + touch_radius;
|
| + const float dev_y = dev_sum_y * inverse_unreleased_point_count + touch_radius;
|
|
|
| // Span is the average distance between touch points through the focal point;
|
| // i.e. the diameter of the circle with a radius of the average deviation from
|
| @@ -328,6 +333,8 @@ void ScaleGestureDetector::AddTouchHistory(const MotionEvent& ev) {
|
| }
|
| if (major < touch_min_major_)
|
| major = touch_min_major_;
|
| + if (major > touch_max_major_)
|
| + major = touch_max_major_;
|
| total += major;
|
|
|
| if (base::IsNaN(touch_upper_) || major > touch_upper_) {
|
|
|