Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(244)

Side by Side Diff: Source/WebCore/platform/ScrollAnimatorNone.cpp

Issue 7590014: Merge 92002 - Scroll animation refinements. (Closed) Base URL: http://svn.webkit.org/repository/webkit/branches/chromium/835/
Patch Set: Created 9 years, 4 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
1 /* 1 /*
2 * Copyright (c) 2011, Google Inc. All rights reserved. 2 * Copyright (c) 2011, Google Inc. All rights reserved.
3 * 3 *
4 * Redistribution and use in source and binary forms, with or without 4 * Redistribution and use in source and binary forms, with or without
5 * modification, are permitted provided that the following conditions are 5 * modification, are permitted provided that the following conditions are
6 * met: 6 * met:
7 * 7 *
8 * * Redistributions of source code must retain the above copyright 8 * * Redistributions of source code must retain the above copyright
9 * notice, this list of conditions and the following disclaimer. 9 * notice, this list of conditions and the following disclaimer.
10 * * Redistributions in binary form must reproduce the above 10 * * Redistributions in binary form must reproduce the above
(...skipping 26 matching lines...) Expand all
37 #include "FloatPoint.h" 37 #include "FloatPoint.h"
38 #include "NotImplemented.h" 38 #include "NotImplemented.h"
39 #include "OwnArrayPtr.h" 39 #include "OwnArrayPtr.h"
40 #include "ScrollableArea.h" 40 #include "ScrollableArea.h"
41 #include "ScrollbarTheme.h" 41 #include "ScrollbarTheme.h"
42 #include "TraceEvent.h" 42 #include "TraceEvent.h"
43 #include <algorithm> 43 #include <algorithm>
44 #include <wtf/CurrentTime.h> 44 #include <wtf/CurrentTime.h>
45 #include <wtf/PassOwnPtr.h> 45 #include <wtf/PassOwnPtr.h>
46 46
47 using namespace std;
48
47 namespace WebCore { 49 namespace WebCore {
48 50
49 static double kTickTime = .0166; 51 static double kTickTime = .0166;
50 52
51 // This is used to set the timer delay - it needs to be slightly smaller than th e tick count to leave some overhead. 53 // This is used to set the timer delay - it needs to be slightly smaller than th e tick count to leave some overhead.
52 static double kAnimationTimerDelay = 0.015; 54 static double kAnimationTimerDelay = 0.015;
53 55
54 PassOwnPtr<ScrollAnimator> ScrollAnimator::create(ScrollableArea* scrollableArea ) 56 PassOwnPtr<ScrollAnimator> ScrollAnimator::create(ScrollableArea* scrollableArea )
55 { 57 {
56 if (scrollableArea && scrollableArea->scrollAnimatorEnabled()) 58 if (scrollableArea && scrollableArea->scrollAnimatorEnabled())
57 return adoptPtr(new ScrollAnimatorNone(scrollableArea)); 59 return adoptPtr(new ScrollAnimatorNone(scrollableArea));
58 return adoptPtr(new ScrollAnimator(scrollableArea)); 60 return adoptPtr(new ScrollAnimator(scrollableArea));
59 } 61 }
60 62
61 ScrollAnimatorNone::Parameters::Parameters() 63 ScrollAnimatorNone::Parameters::Parameters()
62 : m_isEnabled(false) 64 : m_isEnabled(false)
63 { 65 {
64 } 66 }
65 67
66 ScrollAnimatorNone::Parameters::Parameters(bool isEnabled, double animationTime, Curve attackCurve, double attackTime, Curve releaseCurve, double releaseTime) 68 ScrollAnimatorNone::Parameters::Parameters(bool isEnabled, double animationTime, double repeatMinimumSustainTime, Curve attackCurve, double attackTime, Curve re leaseCurve, double releaseTime)
67 : m_isEnabled(isEnabled) 69 : m_isEnabled(isEnabled)
68 , m_animationTime(animationTime) 70 , m_animationTime(animationTime)
71 , m_repeatMinimumSustainTime(repeatMinimumSustainTime)
69 , m_attackCurve(attackCurve) 72 , m_attackCurve(attackCurve)
70 , m_attackTime(attackTime) 73 , m_attackTime(attackTime)
71 , m_releaseCurve(releaseCurve) 74 , m_releaseCurve(releaseCurve)
72 , m_releaseTime(releaseTime) 75 , m_releaseTime(releaseTime)
73 { 76 {
74 } 77 }
75 78
76 double ScrollAnimatorNone::PerAxisData::curveAt(Curve curve, double t) 79 double ScrollAnimatorNone::PerAxisData::curveAt(Curve curve, double t)
77 { 80 {
78 switch (curve) { 81 switch (curve) {
(...skipping 73 matching lines...) Expand 10 before | Expand all | Expand 10 after
152 m_attackCurve = Quadratic; 155 m_attackCurve = Quadratic;
153 156
154 m_releasePosition = 0; 157 m_releasePosition = 0;
155 m_releaseTime = 0; 158 m_releaseTime = 0;
156 m_releaseCurve = Quadratic; 159 m_releaseCurve = Quadratic;
157 } 160 }
158 161
159 162
160 bool ScrollAnimatorNone::PerAxisData::updateDataFromParameters(ScrollbarOrientat ion orientation, float step, float multiplier, float scrollableSize, double curr entTime, Parameters* parameters) 163 bool ScrollAnimatorNone::PerAxisData::updateDataFromParameters(ScrollbarOrientat ion orientation, float step, float multiplier, float scrollableSize, double curr entTime, Parameters* parameters)
161 { 164 {
162 m_animationTime = parameters->m_animationTime; 165 if (parameters->m_animationTime > m_animationTime)
166 m_animationTime = parameters->m_animationTime;
163 m_attackTime = parameters->m_attackTime; 167 m_attackTime = parameters->m_attackTime;
164 m_releaseTime = parameters->m_releaseTime; 168 m_releaseTime = parameters->m_releaseTime;
165 m_attackCurve = parameters->m_attackCurve; 169 m_attackCurve = parameters->m_attackCurve;
166 m_releaseCurve = parameters->m_releaseCurve; 170 m_releaseCurve = parameters->m_releaseCurve;
167 171
168 // Prioritize our way out of over constraint. 172 // Prioritize our way out of over constraint.
169 if (m_attackTime + m_releaseTime > m_animationTime) { 173 if (m_attackTime + m_releaseTime > m_animationTime) {
170 if (m_releaseTime > m_animationTime) 174 if (m_releaseTime > m_animationTime)
171 m_releaseTime = m_animationTime; 175 m_releaseTime = m_animationTime;
172 m_attackTime = m_animationTime - m_releaseTime; 176 m_attackTime = m_animationTime - m_releaseTime;
173 } 177 }
174 178
175 m_orientation = orientation; 179 m_orientation = orientation;
176 180
177 if (!m_desiredPosition) 181 if (!m_startTime)
178 m_desiredPosition = *m_currentPosition; 182 m_desiredPosition = *m_currentPosition;
179 float newPosition = m_desiredPosition + (step * multiplier); 183 float newPosition = m_desiredPosition + (step * multiplier);
180 184
181 if (newPosition < 0 || newPosition > scrollableSize) 185 if (newPosition < 0 || newPosition > scrollableSize)
182 newPosition = std::max(std::min(newPosition, scrollableSize), 0.0f); 186 newPosition = max(min(newPosition, scrollableSize), 0.0f);
183 187
184 if (newPosition == m_desiredPosition) 188 if (newPosition == m_desiredPosition)
185 return false; 189 return false;
186 190
187 m_desiredPosition = newPosition; 191 m_desiredPosition = newPosition;
188 192
189 if (!m_startTime) { 193 if (!m_startTime) {
190 // FIXME: This should be the time from the event that got us here. 194 // FIXME: This should be the time from the event that got us here.
191 m_startTime = currentTime - kTickTime / 2; 195 m_startTime = currentTime - kTickTime / 2;
192 m_startPosition = *m_currentPosition; 196 m_startPosition = *m_currentPosition;
193 m_lastAnimationTime = currentTime; 197 m_lastAnimationTime = currentTime;
194 } 198 }
195 m_startVelocity = m_currentVelocity; 199 m_startVelocity = m_currentVelocity;
196 200
197 double remainingDelta = m_desiredPosition - *m_currentPosition; 201 double remainingDelta = m_desiredPosition - *m_currentPosition;
198 202
199 double attackAreaLeft = 0; 203 double attackAreaLeft = 0;
200 204
201 double deltaTime = m_lastAnimationTime - m_startTime; 205 double deltaTime = m_lastAnimationTime - m_startTime;
206 double attackTimeLeft = max(0., m_attackTime - deltaTime);
202 double timeLeft = m_animationTime - deltaTime; 207 double timeLeft = m_animationTime - deltaTime;
203 if (timeLeft < m_releaseTime) { 208 double minTimeLeft = m_releaseTime + min(parameters->m_repeatMinimumSustainT ime, m_animationTime - m_releaseTime - attackTimeLeft);
204 m_animationTime = deltaTime + m_releaseTime; 209 if (timeLeft < minTimeLeft) {
205 timeLeft = m_releaseTime; 210 m_animationTime = deltaTime + minTimeLeft;
211 timeLeft = minTimeLeft;
206 } 212 }
207 double releaseTimeLeft = std::min(timeLeft, m_releaseTime); 213
208 double attackTimeLeft = std::max(0., m_attackTime - deltaTime); 214 double releaseTimeLeft = min(timeLeft, m_releaseTime);
209 double sustainTimeLeft = std::max(0., timeLeft - releaseTimeLeft - attackTim eLeft); 215 double sustainTimeLeft = max(0., timeLeft - releaseTimeLeft - attackTimeLeft );
210 216
211 if (attackTimeLeft) { 217 if (attackTimeLeft) {
212 double attackSpot = deltaTime / m_attackTime; 218 double attackSpot = deltaTime / m_attackTime;
213 attackAreaLeft = attackTimeLeft / (curveDerivativeAt(m_attackCurve, 1) - curveDerivativeAt(m_attackCurve, attackSpot)); 219 attackAreaLeft = attackTimeLeft / (curveDerivativeAt(m_attackCurve, 1) - curveDerivativeAt(m_attackCurve, attackSpot));
214 } 220 }
215 221
216 double releaseSpot = (m_releaseTime - releaseTimeLeft) / m_releaseTime; 222 double releaseSpot = (m_releaseTime - releaseTimeLeft) / m_releaseTime;
217 double releaseAreaLeft = releaseTimeLeft / (curveDerivativeAt(m_releaseCurv e, 1) - curveDerivativeAt(m_releaseCurve, releaseSpot)); 223 double releaseAreaLeft = releaseTimeLeft / (curveDerivativeAt(m_releaseCurv e, 1) - curveDerivativeAt(m_releaseCurve, releaseSpot));
218 224
219 m_desiredVelocity = remainingDelta / (attackAreaLeft + sustainTimeLeft + rel easeAreaLeft); 225 m_desiredVelocity = remainingDelta / (attackAreaLeft + sustainTimeLeft + rel easeAreaLeft);
(...skipping 62 matching lines...) Expand 10 before | Expand all | Expand 10 after
282 if (!m_scrollableArea->scrollAnimatorEnabled()) 288 if (!m_scrollableArea->scrollAnimatorEnabled())
283 return ScrollAnimator::scroll(orientation, granularity, step, multiplier ); 289 return ScrollAnimator::scroll(orientation, granularity, step, multiplier );
284 290
285 // FIXME: get the type passed in. MouseWheel could also be by line, but shou ld still have different 291 // FIXME: get the type passed in. MouseWheel could also be by line, but shou ld still have different
286 // animation parameters than the keyboard. 292 // animation parameters than the keyboard.
287 Parameters parameters; 293 Parameters parameters;
288 switch (granularity) { 294 switch (granularity) {
289 case ScrollByDocument: 295 case ScrollByDocument:
290 break; 296 break;
291 case ScrollByLine: 297 case ScrollByLine:
292 parameters = Parameters(true, 10 * kTickTime, Quadratic, 3 * kTickTime, Quadratic, 3 * kTickTime); 298 parameters = Parameters(true, 10 * kTickTime, 7 * kTickTime, Quadratic, 3 * kTickTime, Quadratic, 3 * kTickTime);
293 break; 299 break;
294 case ScrollByPage: 300 case ScrollByPage:
295 parameters = Parameters(true, 15 * kTickTime, Quadratic, 5 * kTickTime, Quadratic, 5 * kTickTime); 301 parameters = Parameters(true, 15 * kTickTime, 10 * kTickTime, Quadratic, 5 * kTickTime, Quadratic, 5 * kTickTime);
296 break; 302 break;
297 case ScrollByPixel: 303 case ScrollByPixel:
298 parameters = Parameters(true, 11 * kTickTime, Quadratic, 3 * kTickTime, Quadratic, 3 * kTickTime); 304 parameters = Parameters(true, 11 * kTickTime, 2 * kTickTime, Quadratic, 3 * kTickTime, Quadratic, 3 * kTickTime);
299 break; 305 break;
300 default: 306 default:
301 break; 307 break;
302 } 308 }
303 309
304 // If the individual input setting is disabled, bail. 310 // If the individual input setting is disabled, bail.
305 if (!parameters.m_isEnabled) 311 if (!parameters.m_isEnabled)
306 return ScrollAnimator::scroll(orientation, granularity, step, multiplier ); 312 return ScrollAnimator::scroll(orientation, granularity, step, multiplier );
307 313
308 // This is an animatable scroll. Calculate the scroll delta. 314 // This is an animatable scroll. Calculate the scroll delta.
(...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after
350 356
351 void ScrollAnimatorNone::stopAnimationTimerIfNeeded(PerAxisData* data) 357 void ScrollAnimatorNone::stopAnimationTimerIfNeeded(PerAxisData* data)
352 { 358 {
353 if (data->m_animationTimer.isActive()) 359 if (data->m_animationTimer.isActive())
354 data->m_animationTimer.stop(); 360 data->m_animationTimer.stop();
355 } 361 }
356 362
357 } // namespace WebCore 363 } // namespace WebCore
358 364
359 #endif // ENABLE(SMOOTH_SCROLLING) 365 #endif // ENABLE(SMOOTH_SCROLLING)
OLDNEW
« no previous file with comments | « Source/WebCore/platform/ScrollAnimatorNone.h ('k') | Source/WebKit/chromium/tests/ScrollAnimatorNoneTest.cpp » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698