blob: c9f17328979cb7c72ff39f7ecc21110f433bc399 [file] [log] [blame]
/*
* Copyright (C) 2012 Google Inc. All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
*
* THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS'' AND ANY
* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
* DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS BE LIABLE FOR ANY
* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
* ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
#include "config.h"
#include "WheelFlingPlatformGestureCurve.h"
#include "PlatformGestureCurveTarget.h"
#include <math.h>
namespace WebCore {
PassOwnPtr<PlatformGestureCurve> WheelFlingPlatformGestureCurve::create(const FloatPoint& velocity)
{
return adoptPtr(new WheelFlingPlatformGestureCurve(velocity));
}
WheelFlingPlatformGestureCurve::WheelFlingPlatformGestureCurve(const FloatPoint& velocity)
: m_velocity(velocity)
{
ASSERT(velocity != FloatPoint::zero());
}
WheelFlingPlatformGestureCurve::~WheelFlingPlatformGestureCurve()
{
}
bool WheelFlingPlatformGestureCurve::apply(double time, PlatformGestureCurveTarget* target)
{
// Use a Rayleigh distribution for the curve. This simulates a velocity profile
// that starts at 0, increases to a maximum, then decreases again smoothly. By
// using the cumulative distribution function (CDF) instead of the point-mass function,
// we can isolate timing jitter by remembering the CDF value at the last tick. Since
// the CDF maxes out at 1, scale it by the input velocity.
//
// CDF -> F(x; sigma) = 1 - exp{-x^2/2\sigma^2}
// ref: http://en.wikipedia.org/wiki/Rayleigh_distribution
// FIXME: consider making the value of sigma settable in the constructor.
static double twoSigmaSquaredInverse = 16; // sigma = 0.25
float cdf = 1 - exp(-time * time * twoSigmaSquaredInverse);
IntPoint scroll(cdf * m_velocity.x(), cdf * m_velocity.y());
IntPoint scrollIncrement(scroll - m_cumulativeScroll);
m_cumulativeScroll = scroll;
if (cdf < 0.5 || scrollIncrement != IntPoint::zero()) {
target->scrollBy(scrollIncrement);
return true;
}
return false;
}
} // namespace WebCore