| 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 53e15d78fda2dae78b4a1c223d0cc2a5b9685f9c..346eaade596c494859a7efa22a42c8da22f1cbb5 100644
|
| --- a/content/browser/renderer_host/input/synthetic_pinch_gesture.cc
|
| +++ b/content/browser/renderer_host/input/synthetic_pinch_gesture.cc
|
| @@ -1,165 +1,39 @@
|
| -// Copyright 2013 The Chromium Authors. All rights reserved.
|
| +// Copyright 2015 The Chromium Authors. All rights reserved.
|
| // Use of this source code is governed by a BSD-style license that can be
|
| // found in the LICENSE file.
|
|
|
| #include "content/browser/renderer_host/input/synthetic_pinch_gesture.h"
|
|
|
| -#include <cmath>
|
| -
|
| -#include "base/logging.h"
|
| -#include "ui/events/latency_info.h"
|
| +#include "content/browser/renderer_host/input/synthetic_touchpad_pinch_gesture.h"
|
| +#include "content/browser/renderer_host/input/synthetic_touchscreen_pinch_gesture.h"
|
|
|
| namespace content {
|
|
|
| SyntheticPinchGesture::SyntheticPinchGesture(
|
| const SyntheticPinchGestureParams& params)
|
| - : 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_GT(params_.scale_factor, 0.0f);
|
| -}
|
| -
|
| + : params_(params) {}
|
| SyntheticPinchGesture::~SyntheticPinchGesture() {}
|
|
|
| SyntheticGesture::Result SyntheticPinchGesture::ForwardInputEvents(
|
| - const base::TimeTicks& timestamp, SyntheticGestureTarget* target) {
|
| - if (state_ == SETUP) {
|
| - gesture_source_type_ = params_.gesture_source_type;
|
| - if (gesture_source_type_ == SyntheticGestureParams::DEFAULT_INPUT)
|
| - gesture_source_type_ = target->GetDefaultSyntheticGestureSourceType();
|
| -
|
| - state_ = STARTED;
|
| - start_time_ = timestamp;
|
| - }
|
| -
|
| - DCHECK_NE(gesture_source_type_, SyntheticGestureParams::DEFAULT_INPUT);
|
| - if (gesture_source_type_ == SyntheticGestureParams::TOUCH_INPUT)
|
| - ForwardTouchInputEvents(timestamp, target);
|
| - else
|
| - return SyntheticGesture::GESTURE_SOURCE_TYPE_NOT_IMPLEMENTED;
|
| -
|
| - return (state_ == DONE) ? SyntheticGesture::GESTURE_FINISHED
|
| - : SyntheticGesture::GESTURE_RUNNING;
|
| -}
|
| -
|
| -void SyntheticPinchGesture::ForwardTouchInputEvents(
|
| - const base::TimeTicks& timestamp, SyntheticGestureTarget* target) {
|
| - switch (state_) {
|
| - case STARTED:
|
| - // Check for an early finish.
|
| - if (params_.scale_factor == 1.0f) {
|
| - state_ = DONE;
|
| - break;
|
| - }
|
| - SetupCoordinatesAndStopTime(target);
|
| - PressTouchPoints(target, timestamp);
|
| - state_ = MOVING;
|
| - break;
|
| - case MOVING: {
|
| - base::TimeTicks event_timestamp = ClampTimestamp(timestamp);
|
| - float delta = GetDeltaForPointer0AtTime(event_timestamp);
|
| - MoveTouchPoints(target, delta, event_timestamp);
|
| - if (HasReachedTarget(event_timestamp)) {
|
| - ReleaseTouchPoints(target, event_timestamp);
|
| - state_ = DONE;
|
| - }
|
| - } break;
|
| - case SETUP:
|
| - NOTREACHED() << "State SETUP invalid for synthetic pinch.";
|
| - case DONE:
|
| - NOTREACHED() << "State DONE invalid for synthetic pinch.";
|
| - }
|
| -}
|
| -
|
| -void SyntheticPinchGesture::PressTouchPoints(SyntheticGestureTarget* target,
|
| - const base::TimeTicks& timestamp) {
|
| - touch_event_.PressPoint(params_.anchor.x(), start_y_0_);
|
| - touch_event_.PressPoint(params_.anchor.x(), start_y_1_);
|
| - ForwardTouchEvent(target, timestamp);
|
| -}
|
| -
|
| -void SyntheticPinchGesture::MoveTouchPoints(SyntheticGestureTarget* target,
|
| - float delta,
|
| - const base::TimeTicks& timestamp) {
|
| - // The two pointers move in opposite directions.
|
| - float current_y_0 = start_y_0_ + delta;
|
| - float current_y_1 = start_y_1_ - delta;
|
| -
|
| - touch_event_.MovePoint(0, params_.anchor.x(), current_y_0);
|
| - touch_event_.MovePoint(1, params_.anchor.x(), current_y_1);
|
| - ForwardTouchEvent(target, timestamp);
|
| -}
|
| -
|
| -void SyntheticPinchGesture::ReleaseTouchPoints(
|
| - SyntheticGestureTarget* target, const base::TimeTicks& timestamp) {
|
| - touch_event_.ReleasePoint(0);
|
| - touch_event_.ReleasePoint(1);
|
| - ForwardTouchEvent(target, timestamp);
|
| -}
|
| -
|
| -void SyntheticPinchGesture::ForwardTouchEvent(
|
| - SyntheticGestureTarget* target, const base::TimeTicks& timestamp) {
|
| - touch_event_.timeStampSeconds = ConvertTimestampToSeconds(timestamp);
|
| - target->DispatchInputEventToPlatform(touch_event_);
|
| -}
|
| -
|
| -void SyntheticPinchGesture::SetupCoordinatesAndStopTime(
|
| + const base::TimeTicks& timestamp,
|
| SyntheticGestureTarget* target) {
|
| - // 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();
|
| + if (!lazy_gesture_) {
|
| + SyntheticGestureParams::GestureSourceType source_type =
|
| + params_.gesture_source_type;
|
| + if (source_type == SyntheticGestureParams::DEFAULT_INPUT) {
|
| + source_type = target->GetDefaultSyntheticGestureSourceType();
|
| + }
|
| +
|
| + DCHECK_NE(SyntheticGestureParams::DEFAULT_INPUT, source_type);
|
| + if (source_type == SyntheticGestureParams::TOUCH_INPUT) {
|
| + lazy_gesture_.reset(new SyntheticTouchscreenPinchGesture(params_));
|
| + } else {
|
| + DCHECK_EQ(SyntheticGestureParams::MOUSE_INPUT, source_type);
|
| + lazy_gesture_.reset(new SyntheticTouchpadPinchGesture(params_));
|
| + }
|
| }
|
|
|
| - 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>(std::abs(2 * max_pointer_delta_0_)) /
|
| - params_.relative_pointer_speed_in_pixels_s));
|
| - DCHECK_GT(total_duration_in_us, 0);
|
| - stop_time_ =
|
| - start_time_ + base::TimeDelta::FromMicroseconds(total_duration_in_us);
|
| -}
|
| -
|
| -float SyntheticPinchGesture::GetDeltaForPointer0AtTime(
|
| - const base::TimeTicks& timestamp) const {
|
| - // Make sure the final delta is correct. Using the computation below can lead
|
| - // to issues with floating point precision.
|
| - if (HasReachedTarget(timestamp))
|
| - 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_.scale_factor > 1.0f) ? -abs_delta_pointer_0
|
| - : abs_delta_pointer_0;
|
| -}
|
| -
|
| -base::TimeTicks SyntheticPinchGesture::ClampTimestamp(
|
| - const base::TimeTicks& timestamp) const {
|
| - return std::min(timestamp, stop_time_);
|
| -}
|
| -
|
| -bool SyntheticPinchGesture::HasReachedTarget(const base::TimeTicks& timestamp)
|
| - const {
|
| - return timestamp >= stop_time_;
|
| + return lazy_gesture_->ForwardInputEvents(timestamp, target);
|
| }
|
|
|
| } // namespace content
|
|
|