Index: Source/WebCore/platform/ScrollAnimatorNone.cpp |
=================================================================== |
--- Source/WebCore/platform/ScrollAnimatorNone.cpp (revision 92725) |
+++ Source/WebCore/platform/ScrollAnimatorNone.cpp (working copy) |
@@ -44,6 +44,8 @@ |
#include <wtf/CurrentTime.h> |
#include <wtf/PassOwnPtr.h> |
+using namespace std; |
+ |
namespace WebCore { |
static double kTickTime = .0166; |
@@ -63,9 +65,10 @@ |
{ |
} |
-ScrollAnimatorNone::Parameters::Parameters(bool isEnabled, double animationTime, Curve attackCurve, double attackTime, Curve releaseCurve, double releaseTime) |
+ScrollAnimatorNone::Parameters::Parameters(bool isEnabled, double animationTime, double repeatMinimumSustainTime, Curve attackCurve, double attackTime, Curve releaseCurve, double releaseTime) |
: m_isEnabled(isEnabled) |
, m_animationTime(animationTime) |
+ , m_repeatMinimumSustainTime(repeatMinimumSustainTime) |
, m_attackCurve(attackCurve) |
, m_attackTime(attackTime) |
, m_releaseCurve(releaseCurve) |
@@ -159,7 +162,8 @@ |
bool ScrollAnimatorNone::PerAxisData::updateDataFromParameters(ScrollbarOrientation orientation, float step, float multiplier, float scrollableSize, double currentTime, Parameters* parameters) |
{ |
- m_animationTime = parameters->m_animationTime; |
+ if (parameters->m_animationTime > m_animationTime) |
+ m_animationTime = parameters->m_animationTime; |
m_attackTime = parameters->m_attackTime; |
m_releaseTime = parameters->m_releaseTime; |
m_attackCurve = parameters->m_attackCurve; |
@@ -174,12 +178,12 @@ |
m_orientation = orientation; |
- if (!m_desiredPosition) |
+ if (!m_startTime) |
m_desiredPosition = *m_currentPosition; |
float newPosition = m_desiredPosition + (step * multiplier); |
if (newPosition < 0 || newPosition > scrollableSize) |
- newPosition = std::max(std::min(newPosition, scrollableSize), 0.0f); |
+ newPosition = max(min(newPosition, scrollableSize), 0.0f); |
if (newPosition == m_desiredPosition) |
return false; |
@@ -199,15 +203,17 @@ |
double attackAreaLeft = 0; |
double deltaTime = m_lastAnimationTime - m_startTime; |
+ double attackTimeLeft = max(0., m_attackTime - deltaTime); |
double timeLeft = m_animationTime - deltaTime; |
- if (timeLeft < m_releaseTime) { |
- m_animationTime = deltaTime + m_releaseTime; |
- timeLeft = m_releaseTime; |
+ double minTimeLeft = m_releaseTime + min(parameters->m_repeatMinimumSustainTime, m_animationTime - m_releaseTime - attackTimeLeft); |
+ if (timeLeft < minTimeLeft) { |
+ m_animationTime = deltaTime + minTimeLeft; |
+ timeLeft = minTimeLeft; |
} |
- double releaseTimeLeft = std::min(timeLeft, m_releaseTime); |
- double attackTimeLeft = std::max(0., m_attackTime - deltaTime); |
- double sustainTimeLeft = std::max(0., timeLeft - releaseTimeLeft - attackTimeLeft); |
+ double releaseTimeLeft = min(timeLeft, m_releaseTime); |
+ double sustainTimeLeft = max(0., timeLeft - releaseTimeLeft - attackTimeLeft); |
+ |
if (attackTimeLeft) { |
double attackSpot = deltaTime / m_attackTime; |
attackAreaLeft = attackTimeLeft / (curveDerivativeAt(m_attackCurve, 1) - curveDerivativeAt(m_attackCurve, attackSpot)); |
@@ -289,13 +295,13 @@ |
case ScrollByDocument: |
break; |
case ScrollByLine: |
- parameters = Parameters(true, 10 * kTickTime, Quadratic, 3 * kTickTime, Quadratic, 3 * kTickTime); |
+ parameters = Parameters(true, 10 * kTickTime, 7 * kTickTime, Quadratic, 3 * kTickTime, Quadratic, 3 * kTickTime); |
break; |
case ScrollByPage: |
- parameters = Parameters(true, 15 * kTickTime, Quadratic, 5 * kTickTime, Quadratic, 5 * kTickTime); |
+ parameters = Parameters(true, 15 * kTickTime, 10 * kTickTime, Quadratic, 5 * kTickTime, Quadratic, 5 * kTickTime); |
break; |
case ScrollByPixel: |
- parameters = Parameters(true, 11 * kTickTime, Quadratic, 3 * kTickTime, Quadratic, 3 * kTickTime); |
+ parameters = Parameters(true, 11 * kTickTime, 2 * kTickTime, Quadratic, 3 * kTickTime, Quadratic, 3 * kTickTime); |
break; |
default: |
break; |