OLD | NEW |
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 49 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
60 } | 60 } |
61 | 61 |
62 ScrollAnimator::ScrollAnimator(ScrollableArea* scrollableArea, | 62 ScrollAnimator::ScrollAnimator(ScrollableArea* scrollableArea, |
63 WTF::TimeFunction timeFunction) | 63 WTF::TimeFunction timeFunction) |
64 : ScrollAnimatorBase(scrollableArea), | 64 : ScrollAnimatorBase(scrollableArea), |
65 m_timeFunction(timeFunction), | 65 m_timeFunction(timeFunction), |
66 m_lastGranularity(ScrollByPixel) {} | 66 m_lastGranularity(ScrollByPixel) {} |
67 | 67 |
68 ScrollAnimator::~ScrollAnimator() {} | 68 ScrollAnimator::~ScrollAnimator() {} |
69 | 69 |
70 FloatPoint ScrollAnimator::desiredTargetPosition() const { | 70 ScrollOffset ScrollAnimator::desiredTargetOffset() const { |
71 if (m_runState == RunState::WaitingToCancelOnCompositor) | 71 if (m_runState == RunState::WaitingToCancelOnCompositor) |
72 return currentPosition(); | 72 return currentOffset(); |
73 return (m_animationCurve || m_runState == RunState::WaitingToSendToCompositor) | 73 return (m_animationCurve || m_runState == RunState::WaitingToSendToCompositor) |
74 ? m_targetOffset | 74 ? m_targetOffset |
75 : currentPosition(); | 75 : currentOffset(); |
76 } | 76 } |
77 | 77 |
78 bool ScrollAnimator::hasRunningAnimation() const { | 78 bool ScrollAnimator::hasRunningAnimation() const { |
79 return m_runState != RunState::PostAnimationCleanup && | 79 return m_runState != RunState::PostAnimationCleanup && |
80 (m_animationCurve || | 80 (m_animationCurve || |
81 m_runState == RunState::WaitingToSendToCompositor); | 81 m_runState == RunState::WaitingToSendToCompositor); |
82 } | 82 } |
83 | 83 |
84 FloatSize ScrollAnimator::computeDeltaToConsume(const FloatSize& delta) const { | 84 ScrollOffset ScrollAnimator::computeDeltaToConsume( |
85 FloatPoint pos = desiredTargetPosition(); | 85 const ScrollOffset& delta) const { |
86 FloatPoint newPos = | 86 ScrollOffset pos = desiredTargetOffset(); |
87 toFloatPoint(m_scrollableArea->clampScrollPosition(pos + delta)); | 87 ScrollOffset newPos = m_scrollableArea->clampScrollOffset(pos + delta); |
88 return newPos - pos; | 88 return newPos - pos; |
89 } | 89 } |
90 | 90 |
91 void ScrollAnimator::resetAnimationState() { | 91 void ScrollAnimator::resetAnimationState() { |
92 ScrollAnimatorCompositorCoordinator::resetAnimationState(); | 92 ScrollAnimatorCompositorCoordinator::resetAnimationState(); |
93 if (m_animationCurve) | 93 if (m_animationCurve) |
94 m_animationCurve.reset(); | 94 m_animationCurve.reset(); |
95 m_startTime = 0.0; | 95 m_startTime = 0.0; |
96 } | 96 } |
97 | 97 |
98 ScrollResult ScrollAnimator::userScroll(ScrollGranularity granularity, | 98 ScrollResult ScrollAnimator::userScroll(ScrollGranularity granularity, |
99 const FloatSize& delta) { | 99 const ScrollOffset& delta) { |
100 if (!m_scrollableArea->scrollAnimatorEnabled()) | 100 if (!m_scrollableArea->scrollAnimatorEnabled()) |
101 return ScrollAnimatorBase::userScroll(granularity, delta); | 101 return ScrollAnimatorBase::userScroll(granularity, delta); |
102 | 102 |
103 TRACE_EVENT0("blink", "ScrollAnimator::scroll"); | 103 TRACE_EVENT0("blink", "ScrollAnimator::scroll"); |
104 | 104 |
105 if (granularity == ScrollByPrecisePixel) { | 105 if (granularity == ScrollByPrecisePixel) { |
106 // Cancel scroll animation because asked to instant scroll. | 106 // Cancel scroll animation because asked to instant scroll. |
107 if (hasRunningAnimation()) | 107 if (hasRunningAnimation()) |
108 cancelAnimation(); | 108 cancelAnimation(); |
109 return ScrollAnimatorBase::userScroll(granularity, delta); | 109 return ScrollAnimatorBase::userScroll(granularity, delta); |
110 } | 110 } |
111 | 111 |
112 bool needsPostAnimationCleanup = m_runState == RunState::PostAnimationCleanup; | 112 bool needsPostAnimationCleanup = m_runState == RunState::PostAnimationCleanup; |
113 if (m_runState == RunState::PostAnimationCleanup) | 113 if (m_runState == RunState::PostAnimationCleanup) |
114 resetAnimationState(); | 114 resetAnimationState(); |
115 | 115 |
116 FloatSize consumedDelta = computeDeltaToConsume(delta); | 116 ScrollOffset consumedDelta = computeDeltaToConsume(delta); |
117 FloatPoint targetPos = desiredTargetPosition(); | 117 ScrollOffset targetOffset = desiredTargetOffset(); |
118 targetPos.move(consumedDelta); | 118 targetOffset += consumedDelta; |
119 | 119 |
120 if (willAnimateToOffset(targetPos)) { | 120 if (willAnimateToOffset(targetOffset)) { |
121 m_lastGranularity = granularity; | 121 m_lastGranularity = granularity; |
122 // Report unused delta only if there is no animation running. See | 122 // Report unused delta only if there is no animation running. See |
123 // comment below regarding scroll latching. | 123 // comment below regarding scroll latching. |
124 // TODO(bokan): Need to standardize how ScrollAnimators report | 124 // TODO(bokan): Need to standardize how ScrollAnimators report |
125 // unusedDelta. This differs from ScrollAnimatorMac currently. | 125 // unusedDelta. This differs from ScrollAnimatorMac currently. |
126 return ScrollResult(true, true, 0, 0); | 126 return ScrollResult(true, true, 0, 0); |
127 } | 127 } |
128 | 128 |
129 // If the run state when this method was called was PostAnimationCleanup and | 129 // If the run state when this method was called was PostAnimationCleanup and |
130 // we're not starting an animation, stay in PostAnimationCleanup state so | 130 // we're not starting an animation, stay in PostAnimationCleanup state so |
131 // that the main thread scrolling reason can be removed. | 131 // that the main thread scrolling reason can be removed. |
132 if (needsPostAnimationCleanup) | 132 if (needsPostAnimationCleanup) |
133 m_runState = RunState::PostAnimationCleanup; | 133 m_runState = RunState::PostAnimationCleanup; |
134 | 134 |
135 // Report unused delta only if there is no animation and we are not | 135 // Report unused delta only if there is no animation and we are not |
136 // starting one. This ensures we latch for the duration of the | 136 // starting one. This ensures we latch for the duration of the |
137 // animation rather than animating multiple scrollers at the same time. | 137 // animation rather than animating multiple scrollers at the same time. |
138 return ScrollResult(false, false, delta.width(), delta.height()); | 138 return ScrollResult(false, false, delta.width(), delta.height()); |
139 } | 139 } |
140 | 140 |
141 bool ScrollAnimator::willAnimateToOffset(const FloatPoint& targetPos) { | 141 bool ScrollAnimator::willAnimateToOffset(const ScrollOffset& targetOffset) { |
142 if (m_runState == RunState::PostAnimationCleanup) | 142 if (m_runState == RunState::PostAnimationCleanup) |
143 resetAnimationState(); | 143 resetAnimationState(); |
144 | 144 |
145 if (m_runState == RunState::WaitingToCancelOnCompositor || | 145 if (m_runState == RunState::WaitingToCancelOnCompositor || |
146 m_runState == RunState::WaitingToCancelOnCompositorButNewScroll) { | 146 m_runState == RunState::WaitingToCancelOnCompositorButNewScroll) { |
147 ASSERT(m_animationCurve); | 147 ASSERT(m_animationCurve); |
148 m_targetOffset = targetPos; | 148 m_targetOffset = targetOffset; |
149 if (registerAndScheduleAnimation()) | 149 if (registerAndScheduleAnimation()) |
150 m_runState = RunState::WaitingToCancelOnCompositorButNewScroll; | 150 m_runState = RunState::WaitingToCancelOnCompositorButNewScroll; |
151 return true; | 151 return true; |
152 } | 152 } |
153 | 153 |
154 if (m_animationCurve) { | 154 if (m_animationCurve) { |
155 if ((targetPos - m_targetOffset).isZero()) | 155 if ((targetOffset - m_targetOffset).isZero()) |
156 return true; | 156 return true; |
157 | 157 |
158 m_targetOffset = targetPos; | 158 m_targetOffset = targetOffset; |
159 ASSERT(m_runState == RunState::RunningOnMainThread || | 159 ASSERT(m_runState == RunState::RunningOnMainThread || |
160 m_runState == RunState::RunningOnCompositor || | 160 m_runState == RunState::RunningOnCompositor || |
161 m_runState == RunState::RunningOnCompositorButNeedsUpdate || | 161 m_runState == RunState::RunningOnCompositorButNeedsUpdate || |
162 m_runState == RunState::RunningOnCompositorButNeedsTakeover); | 162 m_runState == RunState::RunningOnCompositorButNeedsTakeover); |
163 | 163 |
164 // Running on the main thread, simply update the target offset instead | 164 // Running on the main thread, simply update the target offset instead |
165 // of sending to the compositor. | 165 // of sending to the compositor. |
166 if (m_runState == RunState::RunningOnMainThread) { | 166 if (m_runState == RunState::RunningOnMainThread) { |
167 m_animationCurve->updateTarget( | 167 m_animationCurve->updateTarget( |
168 m_timeFunction() - m_startTime, | 168 m_timeFunction() - m_startTime, |
169 compositorOffsetFromBlinkOffset(targetPos)); | 169 compositorOffsetFromBlinkOffset(targetOffset)); |
170 return true; | 170 return true; |
171 } | 171 } |
172 | 172 |
173 if (registerAndScheduleAnimation()) | 173 if (registerAndScheduleAnimation()) |
174 m_runState = RunState::RunningOnCompositorButNeedsUpdate; | 174 m_runState = RunState::RunningOnCompositorButNeedsUpdate; |
175 return true; | 175 return true; |
176 } | 176 } |
177 | 177 |
178 if ((targetPos - currentPosition()).isZero()) | 178 if ((targetOffset - currentOffset()).isZero()) |
179 return false; | 179 return false; |
180 | 180 |
181 m_targetOffset = targetPos; | 181 m_targetOffset = targetOffset; |
182 m_startTime = m_timeFunction(); | 182 m_startTime = m_timeFunction(); |
183 | 183 |
184 if (registerAndScheduleAnimation()) | 184 if (registerAndScheduleAnimation()) |
185 m_runState = RunState::WaitingToSendToCompositor; | 185 m_runState = RunState::WaitingToSendToCompositor; |
186 | 186 |
187 return true; | 187 return true; |
188 } | 188 } |
189 | 189 |
190 void ScrollAnimator::adjustAnimationAndSetScrollPosition( | 190 void ScrollAnimator::adjustAnimationAndSetScrollOffset( |
191 const DoublePoint& position, | 191 const ScrollOffset& offset, |
192 ScrollType scrollType) { | 192 ScrollType scrollType) { |
193 IntSize adjustment = | 193 IntSize adjustment = |
194 roundedIntPoint(position) - | 194 roundedIntSize(offset) - roundedIntSize(m_scrollableArea->scrollOffset()); |
195 roundedIntPoint(m_scrollableArea->scrollPositionDouble()); | 195 scrollOffsetChanged(offset, scrollType); |
196 | |
197 scrollPositionChanged(position, scrollType); | |
198 | 196 |
199 if (m_runState == RunState::Idle) { | 197 if (m_runState == RunState::Idle) { |
200 adjustImplOnlyScrollOffsetAnimation(adjustment); | 198 adjustImplOnlyScrollOffsetAnimation(adjustment); |
201 } else if (hasRunningAnimation()) { | 199 } else if (hasRunningAnimation()) { |
202 m_targetOffset += toFloatSize(adjustment); | 200 m_targetOffset += ScrollOffset(adjustment); |
203 if (m_animationCurve) { | 201 if (m_animationCurve) { |
204 m_animationCurve->applyAdjustment(adjustment); | 202 m_animationCurve->applyAdjustment(adjustment); |
205 if (m_runState != RunState::RunningOnMainThread && | 203 if (m_runState != RunState::RunningOnMainThread && |
206 registerAndScheduleAnimation()) | 204 registerAndScheduleAnimation()) |
207 m_runState = RunState::RunningOnCompositorButNeedsAdjustment; | 205 m_runState = RunState::RunningOnCompositorButNeedsAdjustment; |
208 } | 206 } |
209 } | 207 } |
210 } | 208 } |
211 | 209 |
212 void ScrollAnimator::scrollToOffsetWithoutAnimation(const FloatPoint& offset) { | 210 void ScrollAnimator::scrollToOffsetWithoutAnimation( |
213 m_currentPos = offset; | 211 const ScrollOffset& offset) { |
| 212 m_currentOffset = offset; |
214 | 213 |
215 resetAnimationState(); | 214 resetAnimationState(); |
216 notifyPositionChanged(); | 215 notifyOffsetChanged(); |
217 } | 216 } |
218 | 217 |
219 void ScrollAnimator::tickAnimation(double monotonicTime) { | 218 void ScrollAnimator::tickAnimation(double monotonicTime) { |
220 if (m_runState != RunState::RunningOnMainThread) | 219 if (m_runState != RunState::RunningOnMainThread) |
221 return; | 220 return; |
222 | 221 |
223 TRACE_EVENT0("blink", "ScrollAnimator::tickAnimation"); | 222 TRACE_EVENT0("blink", "ScrollAnimator::tickAnimation"); |
224 double elapsedTime = monotonicTime - m_startTime; | 223 double elapsedTime = monotonicTime - m_startTime; |
225 | 224 |
226 bool isFinished = (elapsedTime > m_animationCurve->duration()); | 225 bool isFinished = (elapsedTime > m_animationCurve->duration()); |
227 FloatPoint offset = blinkOffsetFromCompositorOffset( | 226 ScrollOffset offset = blinkOffsetFromCompositorOffset( |
228 isFinished ? m_animationCurve->targetValue() | 227 isFinished ? m_animationCurve->targetValue() |
229 : m_animationCurve->getValue(elapsedTime)); | 228 : m_animationCurve->getValue(elapsedTime)); |
230 | 229 |
231 offset = FloatPoint(m_scrollableArea->clampScrollPosition(offset)); | 230 offset = m_scrollableArea->clampScrollOffset(offset); |
232 | 231 |
233 m_currentPos = offset; | 232 m_currentOffset = offset; |
234 | 233 |
235 if (isFinished) | 234 if (isFinished) |
236 m_runState = RunState::PostAnimationCleanup; | 235 m_runState = RunState::PostAnimationCleanup; |
237 else | 236 else |
238 getScrollableArea()->scheduleAnimation(); | 237 getScrollableArea()->scheduleAnimation(); |
239 | 238 |
240 TRACE_EVENT0("blink", "ScrollAnimator::notifyPositionChanged"); | 239 TRACE_EVENT0("blink", "ScrollAnimator::notifyOffsetChanged"); |
241 notifyPositionChanged(); | 240 notifyOffsetChanged(); |
242 } | 241 } |
243 | 242 |
244 void ScrollAnimator::postAnimationCleanupAndReset() { | 243 void ScrollAnimator::postAnimationCleanupAndReset() { |
245 // Remove the temporary main thread scrolling reason that was added while | 244 // Remove the temporary main thread scrolling reason that was added while |
246 // main thread had scheduled an animation. | 245 // main thread had scheduled an animation. |
247 removeMainThreadScrollingReason(); | 246 removeMainThreadScrollingReason(); |
248 | 247 |
249 resetAnimationState(); | 248 resetAnimationState(); |
250 } | 249 } |
251 | 250 |
(...skipping 25 matching lines...) Expand all Loading... |
277 } | 276 } |
278 | 277 |
279 void ScrollAnimator::createAnimationCurve() { | 278 void ScrollAnimator::createAnimationCurve() { |
280 DCHECK(!m_animationCurve); | 279 DCHECK(!m_animationCurve); |
281 m_animationCurve = CompositorScrollOffsetAnimationCurve::create( | 280 m_animationCurve = CompositorScrollOffsetAnimationCurve::create( |
282 compositorOffsetFromBlinkOffset(m_targetOffset), | 281 compositorOffsetFromBlinkOffset(m_targetOffset), |
283 m_lastGranularity == ScrollByPixel | 282 m_lastGranularity == ScrollByPixel |
284 ? CompositorScrollOffsetAnimationCurve::ScrollDurationInverseDelta | 283 ? CompositorScrollOffsetAnimationCurve::ScrollDurationInverseDelta |
285 : CompositorScrollOffsetAnimationCurve::ScrollDurationConstant); | 284 : CompositorScrollOffsetAnimationCurve::ScrollDurationConstant); |
286 m_animationCurve->setInitialValue( | 285 m_animationCurve->setInitialValue( |
287 compositorOffsetFromBlinkOffset(currentPosition())); | 286 compositorOffsetFromBlinkOffset(currentOffset())); |
288 } | 287 } |
289 | 288 |
290 void ScrollAnimator::updateCompositorAnimations() { | 289 void ScrollAnimator::updateCompositorAnimations() { |
291 ScrollAnimatorCompositorCoordinator::updateCompositorAnimations(); | 290 ScrollAnimatorCompositorCoordinator::updateCompositorAnimations(); |
292 | 291 |
293 if (m_runState == RunState::PostAnimationCleanup) { | 292 if (m_runState == RunState::PostAnimationCleanup) { |
294 postAnimationCleanupAndReset(); | 293 postAnimationCleanupAndReset(); |
295 return; | 294 return; |
296 } | 295 } |
297 | 296 |
(...skipping 24 matching lines...) Expand all Loading... |
322 | 321 |
323 if (m_runState != RunState::RunningOnCompositorButNeedsAdjustment) { | 322 if (m_runState != RunState::RunningOnCompositorButNeedsAdjustment) { |
324 // When in RunningOnCompositorButNeedsAdjustment, the call to | 323 // When in RunningOnCompositorButNeedsAdjustment, the call to |
325 // ::adjustScrollOffsetAnimation should have made the necessary | 324 // ::adjustScrollOffsetAnimation should have made the necessary |
326 // adjustment to the curve. | 325 // adjustment to the curve. |
327 m_animationCurve->updateTarget( | 326 m_animationCurve->updateTarget( |
328 m_timeFunction() - m_startTime, | 327 m_timeFunction() - m_startTime, |
329 compositorOffsetFromBlinkOffset(m_targetOffset)); | 328 compositorOffsetFromBlinkOffset(m_targetOffset)); |
330 } | 329 } |
331 | 330 |
332 if (m_runState == RunState::WaitingToCancelOnCompositorButNewScroll) | 331 if (m_runState == RunState::WaitingToCancelOnCompositorButNewScroll) { |
333 m_animationCurve->setInitialValue( | 332 m_animationCurve->setInitialValue( |
334 compositorOffsetFromBlinkOffset(currentPosition())); | 333 compositorOffsetFromBlinkOffset(currentOffset())); |
| 334 } |
335 | 335 |
336 m_runState = RunState::WaitingToSendToCompositor; | 336 m_runState = RunState::WaitingToSendToCompositor; |
337 } | 337 } |
338 | 338 |
339 if (m_runState == RunState::WaitingToSendToCompositor) { | 339 if (m_runState == RunState::WaitingToSendToCompositor) { |
340 if (!m_compositorAnimationAttachedToElementId) | 340 if (!m_compositorAnimationAttachedToElementId) |
341 reattachCompositorPlayerIfNeeded( | 341 reattachCompositorPlayerIfNeeded( |
342 getScrollableArea()->compositorAnimationTimeline()); | 342 getScrollableArea()->compositorAnimationTimeline()); |
343 | 343 |
344 if (!m_animationCurve) | 344 if (!m_animationCurve) |
(...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
390 double monotonicTime, | 390 double monotonicTime, |
391 double animationStartTime, | 391 double animationStartTime, |
392 std::unique_ptr<cc::AnimationCurve> curve) { | 392 std::unique_ptr<cc::AnimationCurve> curve) { |
393 // If there is already an animation running and the compositor asks to take | 393 // If there is already an animation running and the compositor asks to take |
394 // over an animation, do nothing to avoid judder. | 394 // over an animation, do nothing to avoid judder. |
395 if (hasRunningAnimation()) | 395 if (hasRunningAnimation()) |
396 return; | 396 return; |
397 | 397 |
398 cc::ScrollOffsetAnimationCurve* scrollOffsetAnimationCurve = | 398 cc::ScrollOffsetAnimationCurve* scrollOffsetAnimationCurve = |
399 curve->ToScrollOffsetAnimationCurve(); | 399 curve->ToScrollOffsetAnimationCurve(); |
400 FloatPoint targetValue(scrollOffsetAnimationCurve->target_value().x(), | 400 ScrollOffset targetValue(scrollOffsetAnimationCurve->target_value().x(), |
401 scrollOffsetAnimationCurve->target_value().y()); | 401 scrollOffsetAnimationCurve->target_value().y()); |
402 if (willAnimateToOffset(targetValue)) { | 402 if (willAnimateToOffset(targetValue)) { |
403 m_animationCurve = CompositorScrollOffsetAnimationCurve::create( | 403 m_animationCurve = CompositorScrollOffsetAnimationCurve::create( |
404 std::move(scrollOffsetAnimationCurve)); | 404 std::move(scrollOffsetAnimationCurve)); |
405 m_startTime = animationStartTime; | 405 m_startTime = animationStartTime; |
406 } | 406 } |
407 } | 407 } |
408 | 408 |
409 void ScrollAnimator::cancelAnimation() { | 409 void ScrollAnimator::cancelAnimation() { |
410 ScrollAnimatorCompositorCoordinator::cancelAnimation(); | 410 ScrollAnimatorCompositorCoordinator::cancelAnimation(); |
411 } | 411 } |
(...skipping 20 matching lines...) Expand all Loading... |
432 return false; | 432 return false; |
433 } | 433 } |
434 return true; | 434 return true; |
435 } | 435 } |
436 | 436 |
437 DEFINE_TRACE(ScrollAnimator) { | 437 DEFINE_TRACE(ScrollAnimator) { |
438 ScrollAnimatorBase::trace(visitor); | 438 ScrollAnimatorBase::trace(visitor); |
439 } | 439 } |
440 | 440 |
441 } // namespace blink | 441 } // namespace blink |
OLD | NEW |