Changeset 92639 in webkit
- Timestamp:
- Aug 8, 2011 3:01:15 PM (13 years ago)
- Location:
- trunk/Source
- Files:
-
- 5 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/Source/WebCore/ChangeLog
r92638 r92639 1 2011-08-08 Scott Byer <scottbyer@chromium.org> 2 3 Scroll animator changes to nail the framerate 4 https://bugs.webkit.org/show_bug.cgi?id=65645 5 6 Reviewed by James Robinson. 7 8 Partial test in ScrollAnimatorNoneTest::Enabled. 9 10 * platform/ScrollAnimatorNone.cpp: 11 (WebCore::ScrollAnimatorNone::PerAxisData::PerAxisData): 12 (WebCore::ScrollAnimatorNone::PerAxisData::updateDataFromParameters): 13 (WebCore::ScrollAnimatorNone::PerAxisData::animateScroll): 14 (WebCore::ScrollAnimatorNone::ScrollAnimatorNone): 15 (WebCore::ScrollAnimatorNone::~ScrollAnimatorNone): 16 (WebCore::ScrollAnimatorNone::scroll): 17 (WebCore::ScrollAnimatorNone::scrollToOffsetWithoutAnimation): 18 (WebCore::ScrollAnimatorNone::animationTimerFired): 19 (WebCore::ScrollAnimatorNone::stopAnimationTimerIfNeeded): 20 * platform/ScrollAnimatorNone.h: 21 1 22 2011-08-08 Emil A Eklund <eae@chromium.org> 2 23 -
trunk/Source/WebCore/platform/ScrollAnimatorNone.cpp
r92002 r92639 49 49 namespace WebCore { 50 50 51 static double kTickTime = .0166; 52 53 // This is used to set the timer delay - it needs to be slightly smaller than the tick count to leave some overhead. 54 static double kAnimationTimerDelay = 0.015; 51 static double kFrameRate = 60; 52 static double kTickTime = 1 / kFrameRate; 53 static double kMinimumTimerInterval = .001; 55 54 56 55 PassOwnPtr<ScrollAnimator> ScrollAnimator::create(ScrollableArea* scrollableArea) … … 132 131 ScrollAnimatorNone::PerAxisData::PerAxisData(ScrollAnimatorNone* parent, float* currentPosition) 133 132 : m_currentPosition(currentPosition) 134 , m_animationTimer(parent, &ScrollAnimatorNone::animationTimerFired)135 133 { 136 134 reset(); … … 195 193 m_startTime = currentTime - kTickTime / 2; 196 194 m_startPosition = *m_currentPosition; 197 m_lastAnimationTime = currentTime;195 m_lastAnimationTime = m_startTime; 198 196 } 199 197 m_startVelocity = m_currentVelocity; … … 241 239 bool ScrollAnimatorNone::PerAxisData::animateScroll(double currentTime) 242 240 { 243 // Get the current time; grabbing the current time once helps keep a consistent heartbeat.244 241 double lastScrollInterval = currentTime - m_lastAnimationTime; 242 if (lastScrollInterval < kMinimumTimerInterval) 243 return true; 244 245 245 m_lastAnimationTime = currentTime; 246 246 … … 275 275 , m_horizontalData(this, &m_currentPosX) 276 276 , m_verticalData(this, &m_currentPosY) 277 , m_animationTimer(this, &ScrollAnimatorNone::animationTimerFired) 277 278 { 278 279 } … … 280 281 ScrollAnimatorNone::~ScrollAnimatorNone() 281 282 { 282 stopAnimationTimerIfNeeded(&m_horizontalData); 283 stopAnimationTimerIfNeeded(&m_verticalData); 283 stopAnimationTimerIfNeeded(); 284 284 } 285 285 … … 312 312 return ScrollAnimator::scroll(orientation, granularity, step, multiplier); 313 313 314 // This is an animatable scroll. Calculate the scroll delta. 315 PerAxisData* data = (orientation == VerticalScrollbar) ? &m_verticalData : &m_horizontalData; 316 314 // This is an animatable scroll. Set the animation in motion using the appropriate parameters. 317 315 float scrollableSize = static_cast<float>(m_scrollableArea->scrollSize(orientation)); 318 bool result = data->updateDataFromParameters(orientation, step, multiplier, scrollableSize, WTF::currentTime(), ¶meters); 319 if (!data->m_animationTimer.isActive()) {320 result &= data->animateScroll(WTF::currentTime());321 if (result)322 data->m_animationTimer.startOneShot(kAnimationTimerDelay);323 }324 notityPositionChanged();325 return result;316 317 PerAxisData& data = (orientation == VerticalScrollbar) ? m_verticalData : m_horizontalData; 318 bool needToScroll = data.updateDataFromParameters(orientation, step, multiplier, scrollableSize, WTF::monotonicallyIncreasingTime(), ¶meters); 319 if (needToScroll && !m_animationTimer.isActive()) { 320 m_startTime = data.m_startTime; 321 animationTimerFired(&m_animationTimer); 322 } 323 return needToScroll; 326 324 } 327 325 328 326 void ScrollAnimatorNone::scrollToOffsetWithoutAnimation(const FloatPoint& offset) 329 327 { 330 stopAnimationTimerIfNeeded(&m_horizontalData); 331 stopAnimationTimerIfNeeded(&m_verticalData); 328 stopAnimationTimerIfNeeded(); 332 329 333 330 m_horizontalData.reset(); … … 344 341 void ScrollAnimatorNone::animationTimerFired(Timer<ScrollAnimatorNone>* timer) 345 342 { 346 double currentTime = WTF::currentTime(); 347 if ((timer == &m_horizontalData.m_animationTimer) ? 348 m_horizontalData.animateScroll(currentTime) : 349 m_verticalData.animateScroll(currentTime)) 350 { 351 double delta = WTF::currentTime() - currentTime; 352 timer->startOneShot(kAnimationTimerDelay - delta); 343 double currentTime = WTF::monotonicallyIncreasingTime(); 344 double deltaToNextFrame = ceil((currentTime - m_startTime) * kFrameRate) / kFrameRate - (currentTime - m_startTime); 345 346 bool continueAnimation = false; 347 if (m_horizontalData.m_startTime && m_horizontalData.animateScroll(currentTime + deltaToNextFrame)) 348 continueAnimation = true; 349 if (m_verticalData.m_startTime && m_verticalData.animateScroll(currentTime + deltaToNextFrame)) 350 continueAnimation = true; 351 if (continueAnimation) { 352 double nextTimerInterval = max(kMinimumTimerInterval, deltaToNextFrame); 353 timer->startOneShot(nextTimerInterval); 353 354 } 354 355 notityPositionChanged(); 355 356 } 356 357 357 void ScrollAnimatorNone::stopAnimationTimerIfNeeded( PerAxisData* data)358 { 359 if ( data->m_animationTimer.isActive())360 data->m_animationTimer.stop();358 void ScrollAnimatorNone::stopAnimationTimerIfNeeded() 359 { 360 if (m_animationTimer.isActive()) 361 m_animationTimer.stop(); 361 362 } 362 363 -
trunk/Source/WebCore/platform/ScrollAnimatorNone.h
r92002 r92639 113 113 114 114 ScrollbarOrientation m_orientation; 115 Timer<ScrollAnimatorNone> m_animationTimer;116 115 }; 117 116 118 117 void animationTimerFired(Timer<ScrollAnimatorNone>*); 119 void stopAnimationTimerIfNeeded( PerAxisData*);118 void stopAnimationTimerIfNeeded(); 120 119 121 120 PerAxisData m_horizontalData; 122 121 PerAxisData m_verticalData; 122 123 double m_startTime; 124 Timer<ScrollAnimatorNone> m_animationTimer; 123 125 }; 124 126 -
trunk/Source/WebKit/chromium/ChangeLog
r92619 r92639 1 2011-08-08 Scott Byer <scottbyer@chromium.org> 2 3 Scroll animator changes to nail the framerate 4 https://bugs.webkit.org/show_bug.cgi?id=65645 5 6 Reviewed by James Robinson. 7 8 * tests/ScrollAnimatorNoneTest.cpp: 9 (TEST): 10 1 11 2011-08-08 Dmitry Lomov <dslomov@google.com> 2 12 -
trunk/Source/WebKit/chromium/tests/ScrollAnimatorNoneTest.cpp
r92002 r92639 80 80 void reset() 81 81 { 82 stopAnimationTimerIfNeeded(&m_horizontalData); 83 stopAnimationTimerIfNeeded(&m_verticalData); 82 stopAnimationTimerIfNeeded(); 84 83 m_currentPosX = 0; 85 84 m_currentPosY = 0; … … 94 93 { 95 94 MockScrollableArea scrollableArea(true); 96 MockScrollAnimatorNone scrollAnimator Chromium(&scrollableArea);95 MockScrollAnimatorNone scrollAnimatorNone(&scrollableArea); 97 96 98 97 EXPECT_CALL(scrollableArea, scrollSize(_)).Times(AtLeast(1)).WillRepeatedly(Return(1000)); 99 EXPECT_CALL(scrollableArea, setScrollOffset(_)).Times( AtLeast(1));100 101 scrollAnimator Chromium.scroll(HorizontalScrollbar, ScrollByLine, 100, 1);102 EXPECT_NE(100, scrollAnimator Chromium.currentX());103 EXPECT_NE(0, scrollAnimator Chromium.currentX());104 EXPECT_EQ(0, scrollAnimator Chromium.currentY());105 scrollAnimator Chromium.reset();106 107 scrollAnimator Chromium.scroll(HorizontalScrollbar, ScrollByPage, 100, 1);108 EXPECT_NE(100, scrollAnimator Chromium.currentX());109 EXPECT_NE(0, scrollAnimator Chromium.currentX());110 EXPECT_EQ(0, scrollAnimator Chromium.currentY());111 scrollAnimator Chromium.reset();112 113 scrollAnimator Chromium.scroll(HorizontalScrollbar, ScrollByPixel, 4, 25);114 EXPECT_NE(100, scrollAnimator Chromium.currentX());115 EXPECT_NE(0, scrollAnimator Chromium.currentX());116 EXPECT_EQ(0, scrollAnimator Chromium.currentY());117 scrollAnimator Chromium.reset();98 EXPECT_CALL(scrollableArea, setScrollOffset(_)).Times(3); 99 100 scrollAnimatorNone.scroll(HorizontalScrollbar, ScrollByLine, 100, 1); 101 EXPECT_NE(100, scrollAnimatorNone.currentX()); 102 EXPECT_NE(0, scrollAnimatorNone.currentX()); 103 EXPECT_EQ(0, scrollAnimatorNone.currentY()); 104 scrollAnimatorNone.reset(); 105 106 scrollAnimatorNone.scroll(HorizontalScrollbar, ScrollByPage, 100, 1); 107 EXPECT_NE(100, scrollAnimatorNone.currentX()); 108 EXPECT_NE(0, scrollAnimatorNone.currentX()); 109 EXPECT_EQ(0, scrollAnimatorNone.currentY()); 110 scrollAnimatorNone.reset(); 111 112 scrollAnimatorNone.scroll(HorizontalScrollbar, ScrollByPixel, 4, 25); 113 EXPECT_NE(100, scrollAnimatorNone.currentX()); 114 EXPECT_NE(0, scrollAnimatorNone.currentX()); 115 EXPECT_EQ(0, scrollAnimatorNone.currentY()); 116 scrollAnimatorNone.reset(); 118 117 } 119 118 … … 121 120 { 122 121 MockScrollableArea scrollableArea(false); 123 MockScrollAnimatorNone scrollAnimator Chromium(&scrollableArea);122 MockScrollAnimatorNone scrollAnimatorNone(&scrollableArea); 124 123 125 124 EXPECT_CALL(scrollableArea, scrollSize(_)).Times(AtLeast(1)).WillRepeatedly(Return(1000)); 126 EXPECT_CALL(scrollableArea, setScrollOffset(_)).Times( AtLeast(1));127 128 scrollAnimator Chromium.scroll(HorizontalScrollbar, ScrollByLine, 100, 1);129 EXPECT_EQ(100, scrollAnimator Chromium.currentX());130 EXPECT_EQ(0, scrollAnimator Chromium.currentY());131 scrollAnimator Chromium.reset();132 133 scrollAnimator Chromium.scroll(HorizontalScrollbar, ScrollByPage, 100, 1);134 EXPECT_EQ(100, scrollAnimator Chromium.currentX());135 EXPECT_EQ(0, scrollAnimator Chromium.currentY());136 scrollAnimator Chromium.reset();137 138 scrollAnimator Chromium.scroll(HorizontalScrollbar, ScrollByDocument, 100, 1);139 EXPECT_EQ(100, scrollAnimator Chromium.currentX());140 EXPECT_EQ(0, scrollAnimator Chromium.currentY());141 scrollAnimator Chromium.reset();142 143 scrollAnimator Chromium.scroll(HorizontalScrollbar, ScrollByPixel, 100, 1);144 EXPECT_EQ(100, scrollAnimator Chromium.currentX());145 EXPECT_EQ(0, scrollAnimator Chromium.currentY());146 scrollAnimator Chromium.reset();125 EXPECT_CALL(scrollableArea, setScrollOffset(_)).Times(4); 126 127 scrollAnimatorNone.scroll(HorizontalScrollbar, ScrollByLine, 100, 1); 128 EXPECT_EQ(100, scrollAnimatorNone.currentX()); 129 EXPECT_EQ(0, scrollAnimatorNone.currentY()); 130 scrollAnimatorNone.reset(); 131 132 scrollAnimatorNone.scroll(HorizontalScrollbar, ScrollByPage, 100, 1); 133 EXPECT_EQ(100, scrollAnimatorNone.currentX()); 134 EXPECT_EQ(0, scrollAnimatorNone.currentY()); 135 scrollAnimatorNone.reset(); 136 137 scrollAnimatorNone.scroll(HorizontalScrollbar, ScrollByDocument, 100, 1); 138 EXPECT_EQ(100, scrollAnimatorNone.currentX()); 139 EXPECT_EQ(0, scrollAnimatorNone.currentY()); 140 scrollAnimatorNone.reset(); 141 142 scrollAnimatorNone.scroll(HorizontalScrollbar, ScrollByPixel, 100, 1); 143 EXPECT_EQ(100, scrollAnimatorNone.currentX()); 144 EXPECT_EQ(0, scrollAnimatorNone.currentY()); 145 scrollAnimatorNone.reset(); 147 146 } 148 147
Note: See TracChangeset
for help on using the changeset viewer.