Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(1722)

Unified Diff: content/browser/renderer_host/input/synthetic_pinch_gesture.cc

Issue 293683002: Synthetic pinch gesture take scale factor as parameter. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: rebase Created 6 years, 7 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: content/browser/renderer_host/input/synthetic_pinch_gesture.cc
diff --git a/content/browser/renderer_host/input/synthetic_pinch_gesture.cc b/content/browser/renderer_host/input/synthetic_pinch_gesture.cc
index 7a72dfdbdee78e395a0775ca1e0a81180ff86108..53e15d78fda2dae78b4a1c223d0cc2a5b9685f9c 100644
--- a/content/browser/renderer_host/input/synthetic_pinch_gesture.cc
+++ b/content/browser/renderer_host/input/synthetic_pinch_gesture.cc
@@ -16,9 +16,10 @@ SyntheticPinchGesture::SyntheticPinchGesture(
: params_(params),
start_y_0_(0.0f),
start_y_1_(0.0f),
+ max_pointer_delta_0_(0.0f),
gesture_source_type_(SyntheticGestureParams::DEFAULT_INPUT),
state_(SETUP) {
- DCHECK_GE(params_.total_num_pixels_covered, 0);
+ DCHECK_GT(params_.scale_factor, 0.0f);
}
SyntheticPinchGesture::~SyntheticPinchGesture() {}
@@ -49,7 +50,7 @@ void SyntheticPinchGesture::ForwardTouchInputEvents(
switch (state_) {
case STARTED:
// Check for an early finish.
- if (params_.total_num_pixels_covered == 0) {
+ if (params_.scale_factor == 1.0f) {
state_ = DONE;
break;
}
@@ -87,13 +88,8 @@ void SyntheticPinchGesture::MoveTouchPoints(SyntheticGestureTarget* target,
float current_y_0 = start_y_0_ + delta;
float current_y_1 = start_y_1_ - delta;
- // The current pointer positions are stored as float but the pointer
- // coordinates of the input event are integers. Floor both positions so that
- // in case of an odd distance one of the pointers (the one whose position goes
- // down) moves one pixel further than the other. The explicit flooring is only
- // needed for negative values.
- touch_event_.MovePoint(0, params_.anchor.x(), floor(current_y_0));
- touch_event_.MovePoint(1, params_.anchor.x(), floor(current_y_1));
+ touch_event_.MovePoint(0, params_.anchor.x(), current_y_0);
+ touch_event_.MovePoint(1, params_.anchor.x(), current_y_1);
ForwardTouchEvent(target, timestamp);
}
@@ -112,24 +108,30 @@ void SyntheticPinchGesture::ForwardTouchEvent(
void SyntheticPinchGesture::SetupCoordinatesAndStopTime(
SyntheticGestureTarget* target) {
- const int kTouchSlopInDips = target->GetTouchSlopInDips();
- params_.total_num_pixels_covered += 2 * kTouchSlopInDips;
- float inner_distance_to_anchor = 2 * kTouchSlopInDips;
- float outer_distance_to_anchor =
- inner_distance_to_anchor + params_.total_num_pixels_covered / 2.0f;
-
- // Move pointers away from each other to zoom in
- // or towards each other to zoom out.
- if (params_.zoom_in) {
- start_y_0_ = params_.anchor.y() - inner_distance_to_anchor;
- start_y_1_ = params_.anchor.y() + inner_distance_to_anchor;
- } else {
- start_y_0_ = params_.anchor.y() - outer_distance_to_anchor;
- start_y_1_ = params_.anchor.y() + outer_distance_to_anchor;
+ // To achieve the specified scaling factor, the ratio of the final to the
+ // initial span (distance between the pointers) has to be equal to the scaling
+ // factor. Since we're moving both pointers at the same speed, each pointer's
+ // distance to the anchor is half the span.
+ float initial_distance_to_anchor, final_distance_to_anchor;
+ if (params_.scale_factor > 1.0f) { // zooming in
+ initial_distance_to_anchor = target->GetMinScalingSpanInDips() / 2.0f;
+ final_distance_to_anchor =
+ (initial_distance_to_anchor + target->GetTouchSlopInDips()) *
+ params_.scale_factor;
+ } else { // zooming out
+ final_distance_to_anchor = target->GetMinScalingSpanInDips() / 2.0f;
+ initial_distance_to_anchor =
+ (final_distance_to_anchor / params_.scale_factor) +
+ target->GetTouchSlopInDips();
}
+ start_y_0_ = params_.anchor.y() - initial_distance_to_anchor;
+ start_y_1_ = params_.anchor.y() + initial_distance_to_anchor;
+
+ max_pointer_delta_0_ = initial_distance_to_anchor - final_distance_to_anchor;
+
int64 total_duration_in_us = static_cast<int64>(
- 1e6 * (static_cast<double>(params_.total_num_pixels_covered) /
+ 1e6 * (static_cast<double>(std::abs(2 * max_pointer_delta_0_)) /
params_.relative_pointer_speed_in_pixels_s));
DCHECK_GT(total_duration_in_us, 0);
stop_time_ =
@@ -138,18 +140,16 @@ void SyntheticPinchGesture::SetupCoordinatesAndStopTime(
float SyntheticPinchGesture::GetDeltaForPointer0AtTime(
const base::TimeTicks& timestamp) const {
- float total_abs_delta;
-
// Make sure the final delta is correct. Using the computation below can lead
// to issues with floating point precision.
if (HasReachedTarget(timestamp))
- total_abs_delta = params_.total_num_pixels_covered;
- else
- total_abs_delta = params_.relative_pointer_speed_in_pixels_s *
- (timestamp - start_time_).InSecondsF();
+ return max_pointer_delta_0_;
+ float total_abs_delta = params_.relative_pointer_speed_in_pixels_s *
+ (timestamp - start_time_).InSecondsF();
float abs_delta_pointer_0 = total_abs_delta / 2.0f;
- return params_.zoom_in ? -abs_delta_pointer_0 : abs_delta_pointer_0;
+ return (params_.scale_factor > 1.0f) ? -abs_delta_pointer_0
+ : abs_delta_pointer_0;
}
base::TimeTicks SyntheticPinchGesture::ClampTimestamp(
« no previous file with comments | « content/browser/renderer_host/input/synthetic_pinch_gesture.h ('k') | content/common/input/input_param_traits_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698