diff options
author | raymes@chromium.org <raymes@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2012-11-09 22:34:31 +0000 |
---|---|---|
committer | raymes@chromium.org <raymes@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2012-11-09 22:34:31 +0000 |
commit | 78449d188a8fd1883e450fa00d07872239043c08 (patch) | |
tree | a8e8fae3e62b1fdcae62b64c2a4e224412d9cf41 /ui/base | |
parent | 23e23c2b255dc1808ea79b38579645bb70527b91 (diff) | |
download | chromium_src-78449d188a8fd1883e450fa00d07872239043c08.zip chromium_src-78449d188a8fd1883e450fa00d07872239043c08.tar.gz chromium_src-78449d188a8fd1883e450fa00d07872239043c08.tar.bz2 |
Revert 166986 - Make the fling acceleration curve be easily configurable.
Broke the build at: http://build.chromium.org/p/chromium.chromiumos/builders/Linux%20ChromiumOS%20Tests%20%28dbg%29%283%29/builds/16022
A previous CL introduced a smooth curve for computing an acceleration
to be applied at the start of a touchscreen fling. This CL adds the
curve coefficients to the gesture configuration page.
BUG=141653
Review URL: https://chromiumcodereview.appspot.com/11369140
TBR=rjkroege@chromium.org
Review URL: https://codereview.chromium.org/11312176
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@166998 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'ui/base')
-rw-r--r-- | ui/base/gestures/gesture_configuration.cc | 12 | ||||
-rw-r--r-- | ui/base/gestures/gesture_configuration.h | 14 | ||||
-rw-r--r-- | ui/base/gestures/gesture_sequence.cc | 59 |
3 files changed, 61 insertions, 24 deletions
diff --git a/ui/base/gestures/gesture_configuration.cc b/ui/base/gestures/gesture_configuration.cc index 8310ed8..a3b289f 100644 --- a/ui/base/gestures/gesture_configuration.cc +++ b/ui/base/gestures/gesture_configuration.cc @@ -40,15 +40,7 @@ int GestureConfiguration::points_buffered_for_velocity_ = 3; double GestureConfiguration::rail_break_proportion_ = 15; double GestureConfiguration::rail_start_proportion_ = 2; -// Coefficients for a function that computes fling acceleration. -// These are empirically determined defaults. Do not adjust without -// additional empirical validation. -float GestureConfiguration::fling_acceleration_curve_coefficients_[ - NumAccelParams] = { - 0.0166667f, - -0.0238095f, - 0.0452381f, - 0.8f -}; +// The additional acceleration to apply to touchscreen flings. +double GestureConfiguration::touchscreen_fling_acceleration_adjustment_ = 0.85; } // namespace ui diff --git a/ui/base/gestures/gesture_configuration.h b/ui/base/gestures/gesture_configuration.h index 256c5d2..d0b5cbc 100644 --- a/ui/base/gestures/gesture_configuration.h +++ b/ui/base/gestures/gesture_configuration.h @@ -16,10 +16,6 @@ namespace ui { class UI_EXPORT GestureConfiguration { public: - // Number of parameters in the array of parameters for the fling acceleration - // curve. - static const int NumAccelParams = 4; - // Ordered alphabetically ignoring underscores, to align with the // associated list of prefs in gesture_prefs_aura.cc. static int default_radius() { @@ -143,11 +139,11 @@ class UI_EXPORT GestureConfiguration { static void set_rail_start_proportion(double val) { rail_start_proportion_ = val; } - static void set_fling_acceleration_curve_coefficients(int i, float val) { - fling_acceleration_curve_coefficients_[i] = val; + static double touchscreen_fling_acceleration_adjustment() { + return touchscreen_fling_acceleration_adjustment_; } - static float fling_acceleration_curve_coefficients(int i) { - return fling_acceleration_curve_coefficients_[i]; + static void set_touchscreen_fling_acceleration_adjustment(double val) { + touchscreen_fling_acceleration_adjustment_ = val; } private: @@ -186,7 +182,7 @@ class UI_EXPORT GestureConfiguration { static int points_buffered_for_velocity_; static double rail_break_proportion_; static double rail_start_proportion_; - static float fling_acceleration_curve_coefficients_[NumAccelParams]; + static double touchscreen_fling_acceleration_adjustment_; DISALLOW_COPY_AND_ASSIGN(GestureConfiguration); }; diff --git a/ui/base/gestures/gesture_sequence.cc b/ui/base/gestures/gesture_sequence.cc index 115229a..c4a6d31 100644 --- a/ui/base/gestures/gesture_sequence.cc +++ b/ui/base/gestures/gesture_sequence.cc @@ -7,6 +7,7 @@ #include <cmath> #include <stdlib.h> +#include "base/basictypes.h" #include "base/logging.h" #include "base/memory/scoped_ptr.h" #include "base/string_number_conversions.h" @@ -285,20 +286,68 @@ unsigned int ComputeTouchBitmask(const GesturePoint* points) { const float kFlingCurveNormalization = 1.0f / 1875.f; -float CalibrateFlingVelocity(float velocity) { - const unsigned last_coefficient = - GestureConfiguration::NumAccelParams - 1; +// TODO(rjkroege): Make this configurable from the config page. +// Touchscreen fling acceleration is cubic function of four +// parameters. These are empirically determined defaults. +// Do not adjust the default values without empirical validation. +static float fling_acceleration_curve_coefficients[4] = { + 0.0166667f, + -0.0238095f, + 0.0452381f, + 0.8f +}; + +// Read 4 comma-separated floating point values from an environment +// variable and use that to configure the fling acceleration curve. +void ReadFlingVelocityScalingIfNecessary() { + static bool did_setup_scaling = false; + if (did_setup_scaling) + return; + did_setup_scaling = true; + char* pk = getenv("FLING_ACCELERATION_CURVE_COEFFICIENTS"); + if (!pk) + return; + LOG(INFO) << "Attempting to configure fling from environment.\n"; + + unsigned coefficient_count = arraysize(fling_acceleration_curve_coefficients); + unsigned i = 0; + CStringTokenizer t(pk, pk + strlen(pk), ","); + while (t.GetNext() && i < coefficient_count) { + double d; + if (base::StringToDouble(t.token(), &d)) { + fling_acceleration_curve_coefficients[i++] = d; + } else { + LOG(WARNING) + << "BANDED_FLING_VELOCITY_ADJUSTMENT bad value: " + << t.token(); + } + } +} + +float SmoothFlingVelocityAdjustment(float velocity) { + ReadFlingVelocityScalingIfNecessary(); + unsigned last_coefficient = + arraysize(fling_acceleration_curve_coefficients) - 1; float normalized_velocity = fabs(velocity * kFlingCurveNormalization); float nu = 0.0f, x = 1.f; for (int i = last_coefficient ; i >= 0; i--) { - float a = GestureConfiguration::fling_acceleration_curve_coefficients(i); - nu += x * a; + nu += x * fling_acceleration_curve_coefficients[i]; x *= normalized_velocity; } return nu * velocity; } +// TODO(rjkroege): Provide a nicer means to turn this feature on/off. +float CalibrateFlingVelocity(float velocity) { + const float velocity_scaling = + GestureConfiguration::touchscreen_fling_acceleration_adjustment(); + if (velocity_scaling < 0.5f) + return SmoothFlingVelocityAdjustment(velocity); + else + return velocity_scaling * velocity; +} + } // namespace //////////////////////////////////////////////////////////////////////////////// |