summaryrefslogtreecommitdiff
path: root/Source/WebCore/platform/ScrollAnimationSmooth.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'Source/WebCore/platform/ScrollAnimationSmooth.cpp')
-rw-r--r--Source/WebCore/platform/ScrollAnimationSmooth.cpp38
1 files changed, 38 insertions, 0 deletions
diff --git a/Source/WebCore/platform/ScrollAnimationSmooth.cpp b/Source/WebCore/platform/ScrollAnimationSmooth.cpp
index c8f5d5dc0..14bccf74a 100644
--- a/Source/WebCore/platform/ScrollAnimationSmooth.cpp
+++ b/Source/WebCore/platform/ScrollAnimationSmooth.cpp
@@ -228,36 +228,66 @@ static inline double releaseArea(ScrollAnimationSmooth::Curve curve, double star
static inline void getAnimationParametersForGranularity(ScrollGranularity granularity, double& animationTime, double& repeatMinimumSustainTime, double& attackTime, double& releaseTime, ScrollAnimationSmooth::Curve& coastTimeCurve, double& maximumCoastTime)
{
+ // Qt uses a slightly different strategy for the animation with a steep attack curve and natural release curve.
+ // The fast acceleration makes the animation look more responsive to user input.
switch (granularity) {
case ScrollByDocument:
animationTime = 20 * tickTime;
repeatMinimumSustainTime = 10 * tickTime;
+#if !PLATFORM(QT)
attackTime = 10 * tickTime;
releaseTime = 10 * tickTime;
coastTimeCurve = ScrollAnimationSmooth::Curve::Linear;
maximumCoastTime = 1;
+#else
+ attackTime = 6 * tickTime;
+ releaseTime = 10 * tickTime;
+ coastTimeCurve = ScrollAnimationSmooth::Curve::Quadratic;
+ maximumCoastTime = 22;
+#endif
break;
case ScrollByLine:
+#if !PLATFORM(QT)
animationTime = 10 * tickTime;
repeatMinimumSustainTime = 7 * tickTime;
attackTime = 3 * tickTime;
releaseTime = 3 * tickTime;
+#else
+ animationTime = 6 * tickTime;
+ repeatMinimumSustainTime = 5 * tickTime;
+ attackTime = 1 * tickTime;
+ releaseTime = 4 * tickTime;
+#endif
coastTimeCurve = ScrollAnimationSmooth::Curve::Linear;
maximumCoastTime = 1;
break;
case ScrollByPage:
+#if !PLATFORM(QT)
animationTime = 15 * tickTime;
repeatMinimumSustainTime = 10 * tickTime;
attackTime = 5 * tickTime;
releaseTime = 5 * tickTime;
+#else
+ animationTime = 12 * tickTime;
+ repeatMinimumSustainTime = 10 * tickTime;
+ attackTime = 3 * tickTime;
+ releaseTime = 6 * tickTime;
+#endif
coastTimeCurve = ScrollAnimationSmooth::Curve::Linear;
maximumCoastTime = 1;
break;
case ScrollByPixel:
+#if !PLATFORM(QT)
animationTime = 11 * tickTime;
repeatMinimumSustainTime = 2 * tickTime;
attackTime = 3 * tickTime;
releaseTime = 3 * tickTime;
+#else
+ animationTime = 8 * tickTime;
+ repeatMinimumSustainTime = 3 * tickTime;
+ attackTime = 2 * tickTime;
+ releaseTime = 5 * tickTime;
+#endif
coastTimeCurve = ScrollAnimationSmooth::Curve::Quadratic;
maximumCoastTime = 1.25;
break;
@@ -344,7 +374,11 @@ bool ScrollAnimationSmooth::updatePerAxisData(PerAxisData& data, ScrollGranulari
}
double releaseSpot = (data.releaseTime - releaseTimeLeft) / data.releaseTime;
+#if !PLATFORM(QT)
double releaseAreaLeft = releaseArea(Curve::Cubic, releaseSpot, 1) * data.releaseTime;
+#else
+ double releaseAreaLeft = releaseArea(Curve::Quadratic, releaseSpot, 1) * data.releaseTime;
+#endif
data.desiredVelocity = remainingDelta / (attackAreaLeft + sustainTimeLeft + releaseAreaLeft);
data.releasePosition = data.desiredPosition - data.desiredVelocity * releaseAreaLeft;
@@ -386,7 +420,11 @@ bool ScrollAnimationSmooth::animateScroll(PerAxisData& data, double currentTime)
else {
// release is based on targeting the exact final position.
double releaseDeltaT = deltaTime - (data.animationTime - data.releaseTime);
+#if !PLATFORM(QT)
newPosition = releaseCurve(Curve::Cubic, releaseDeltaT, data.releaseTime, data.releasePosition, data.desiredPosition);
+#else
+ newPosition = releaseCurve(Curve::Quadratic, releaseDeltaT, data.releaseTime, data.releasePosition, data.desiredPosition);
+#endif
}
// Normalize velocity to a per second amount. Could be used to check for jank.