| OLD | NEW |
| 1 // Copyright 2014 The Chromium Authors. All rights reserved. | 1 // Copyright 2014 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "platform/scroll/ProgrammaticScrollAnimator.h" | 5 #include "platform/scroll/ProgrammaticScrollAnimator.h" |
| 6 | 6 |
| 7 #include "platform/animation/CompositorAnimation.h" | 7 #include "platform/animation/CompositorAnimation.h" |
| 8 #include "platform/animation/CompositorScrollOffsetAnimationCurve.h" | 8 #include "platform/animation/CompositorScrollOffsetAnimationCurve.h" |
| 9 #include "platform/geometry/IntPoint.h" | 9 #include "platform/geometry/IntPoint.h" |
| 10 #include "platform/graphics/CompositorFactory.h" | 10 #include "platform/graphics/CompositorFactory.h" |
| (...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 49 } | 49 } |
| 50 | 50 |
| 51 void ProgrammaticScrollAnimator::animateToOffset(FloatPoint offset) | 51 void ProgrammaticScrollAnimator::animateToOffset(FloatPoint offset) |
| 52 { | 52 { |
| 53 if (m_runState == RunState::PostAnimationCleanup) | 53 if (m_runState == RunState::PostAnimationCleanup) |
| 54 resetAnimationState(); | 54 resetAnimationState(); |
| 55 | 55 |
| 56 m_startTime = 0.0; | 56 m_startTime = 0.0; |
| 57 m_targetOffset = offset; | 57 m_targetOffset = offset; |
| 58 m_animationCurve = adoptPtr(CompositorFactory::current().createScrollOffsetA
nimationCurve( | 58 m_animationCurve = adoptPtr(CompositorFactory::current().createScrollOffsetA
nimationCurve( |
| 59 m_targetOffset, | 59 compositorOffsetFromBlinkOffset(m_targetOffset), |
| 60 CompositorAnimationCurve::TimingFunctionTypeEaseInOut, | 60 CompositorAnimationCurve::TimingFunctionTypeEaseInOut, |
| 61 CompositorScrollOffsetAnimationCurve::ScrollDurationDeltaBased)); | 61 CompositorScrollOffsetAnimationCurve::ScrollDurationDeltaBased)); |
| 62 | 62 |
| 63 m_scrollableArea->registerForAnimation(); | 63 m_scrollableArea->registerForAnimation(); |
| 64 if (!m_scrollableArea->scheduleAnimation()) { | 64 if (!m_scrollableArea->scheduleAnimation()) { |
| 65 resetAnimationState(); | 65 resetAnimationState(); |
| 66 notifyPositionChanged(IntPoint(offset.x(), offset.y())); | 66 notifyPositionChanged(IntPoint(offset.x(), offset.y())); |
| 67 } | 67 } |
| 68 m_runState = RunState::WaitingToSendToCompositor; | 68 m_runState = RunState::WaitingToSendToCompositor; |
| 69 } | 69 } |
| 70 | 70 |
| 71 void ProgrammaticScrollAnimator::cancelAnimation() | 71 void ProgrammaticScrollAnimator::cancelAnimation() |
| 72 { | 72 { |
| 73 ASSERT(m_runState != RunState::RunningOnCompositorButNeedsUpdate); | 73 ASSERT(m_runState != RunState::RunningOnCompositorButNeedsUpdate); |
| 74 ScrollAnimatorCompositorCoordinator::cancelAnimation(); | 74 ScrollAnimatorCompositorCoordinator::cancelAnimation(); |
| 75 } | 75 } |
| 76 | 76 |
| 77 void ProgrammaticScrollAnimator::tickAnimation(double monotonicTime) | 77 void ProgrammaticScrollAnimator::tickAnimation(double monotonicTime) |
| 78 { | 78 { |
| 79 if (m_runState != RunState::RunningOnMainThread) | 79 if (m_runState != RunState::RunningOnMainThread) |
| 80 return; | 80 return; |
| 81 | 81 |
| 82 if (!m_startTime) | 82 if (!m_startTime) |
| 83 m_startTime = monotonicTime; | 83 m_startTime = monotonicTime; |
| 84 double elapsedTime = monotonicTime - m_startTime; | 84 double elapsedTime = monotonicTime - m_startTime; |
| 85 bool isFinished = (elapsedTime > m_animationCurve->duration()); | 85 bool isFinished = (elapsedTime > m_animationCurve->duration()); |
| 86 FloatPoint offset = m_animationCurve->getValue(elapsedTime); | 86 FloatPoint offset = blinkOffsetFromCompositorOffset(m_animationCurve->getVal
ue(elapsedTime)); |
| 87 notifyPositionChanged(IntPoint(offset.x(), offset.y())); | 87 notifyPositionChanged(IntPoint(offset.x(), offset.y())); |
| 88 | 88 |
| 89 if (isFinished) { | 89 if (isFinished) { |
| 90 m_runState = RunState::PostAnimationCleanup; | 90 m_runState = RunState::PostAnimationCleanup; |
| 91 } else if (!m_scrollableArea->scheduleAnimation()) { | 91 } else if (!m_scrollableArea->scheduleAnimation()) { |
| 92 notifyPositionChanged(IntPoint(m_targetOffset.x(), m_targetOffset.y())); | 92 notifyPositionChanged(IntPoint(m_targetOffset.x(), m_targetOffset.y())); |
| 93 resetAnimationState(); | 93 resetAnimationState(); |
| 94 } | 94 } |
| 95 } | 95 } |
| 96 | 96 |
| (...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 132 if (addAnimation(animation.release())) { | 132 if (addAnimation(animation.release())) { |
| 133 sentToCompositor = true; | 133 sentToCompositor = true; |
| 134 m_runState = RunState::RunningOnCompositor; | 134 m_runState = RunState::RunningOnCompositor; |
| 135 m_compositorAnimationId = animationId; | 135 m_compositorAnimationId = animationId; |
| 136 m_compositorAnimationGroupId = animationGroupId; | 136 m_compositorAnimationGroupId = animationGroupId; |
| 137 } | 137 } |
| 138 } | 138 } |
| 139 | 139 |
| 140 if (!sentToCompositor) { | 140 if (!sentToCompositor) { |
| 141 m_runState = RunState::RunningOnMainThread; | 141 m_runState = RunState::RunningOnMainThread; |
| 142 m_animationCurve->setInitialValue(FloatPoint(m_scrollableArea->scrol
lPosition())); | 142 m_animationCurve->setInitialValue(compositorOffsetFromBlinkOffset( |
| 143 FloatPoint(m_scrollableArea->scrollPosition()))); |
| 143 if (!m_scrollableArea->scheduleAnimation()) { | 144 if (!m_scrollableArea->scheduleAnimation()) { |
| 144 notifyPositionChanged(IntPoint(m_targetOffset.x(), m_targetOffse
t.y())); | 145 notifyPositionChanged(IntPoint(m_targetOffset.x(), m_targetOffse
t.y())); |
| 145 resetAnimationState(); | 146 resetAnimationState(); |
| 146 } | 147 } |
| 147 } | 148 } |
| 148 } | 149 } |
| 149 } | 150 } |
| 150 | 151 |
| 151 void ProgrammaticScrollAnimator::layerForCompositedScrollingDidChange(Compositor
AnimationTimeline* timeline) | 152 void ProgrammaticScrollAnimator::layerForCompositedScrollingDidChange(Compositor
AnimationTimeline* timeline) |
| 152 { | 153 { |
| 153 reattachCompositorPlayerIfNeeded(timeline); | 154 reattachCompositorPlayerIfNeeded(timeline); |
| 154 | 155 |
| 155 // If the composited scrolling layer is lost during a composited animation, | 156 // If the composited scrolling layer is lost during a composited animation, |
| 156 // continue the animation on the main thread. | 157 // continue the animation on the main thread. |
| 157 if (m_runState == RunState::RunningOnCompositor && !m_scrollableArea->layerF
orScrolling()) { | 158 if (m_runState == RunState::RunningOnCompositor && !m_scrollableArea->layerF
orScrolling()) { |
| 158 m_runState = RunState::RunningOnMainThread; | 159 m_runState = RunState::RunningOnMainThread; |
| 159 m_compositorAnimationId = 0; | 160 m_compositorAnimationId = 0; |
| 160 m_compositorAnimationGroupId = 0; | 161 m_compositorAnimationGroupId = 0; |
| 161 m_animationCurve->setInitialValue(FloatPoint(m_scrollableArea->scrollPos
ition())); | 162 m_animationCurve->setInitialValue(compositorOffsetFromBlinkOffset( |
| 163 FloatPoint(m_scrollableArea->scrollPosition()))); |
| 162 m_scrollableArea->registerForAnimation(); | 164 m_scrollableArea->registerForAnimation(); |
| 163 if (!m_scrollableArea->scheduleAnimation()) { | 165 if (!m_scrollableArea->scheduleAnimation()) { |
| 164 resetAnimationState(); | 166 resetAnimationState(); |
| 165 notifyPositionChanged(IntPoint(m_targetOffset.x(), m_targetOffset.y(
))); | 167 notifyPositionChanged(IntPoint(m_targetOffset.x(), m_targetOffset.y(
))); |
| 166 } | 168 } |
| 167 } | 169 } |
| 168 } | 170 } |
| 169 | 171 |
| 170 void ProgrammaticScrollAnimator::notifyCompositorAnimationFinished(int groupId) | 172 void ProgrammaticScrollAnimator::notifyCompositorAnimationFinished(int groupId) |
| 171 { | 173 { |
| 172 ASSERT(m_runState != RunState::RunningOnCompositorButNeedsUpdate); | 174 ASSERT(m_runState != RunState::RunningOnCompositorButNeedsUpdate); |
| 173 ScrollAnimatorCompositorCoordinator::compositorAnimationFinished(groupId); | 175 ScrollAnimatorCompositorCoordinator::compositorAnimationFinished(groupId); |
| 174 } | 176 } |
| 175 | 177 |
| 176 DEFINE_TRACE(ProgrammaticScrollAnimator) | 178 DEFINE_TRACE(ProgrammaticScrollAnimator) |
| 177 { | 179 { |
| 178 visitor->trace(m_scrollableArea); | 180 visitor->trace(m_scrollableArea); |
| 179 ScrollAnimatorCompositorCoordinator::trace(visitor); | 181 ScrollAnimatorCompositorCoordinator::trace(visitor); |
| 180 } | 182 } |
| 181 | 183 |
| 182 } // namespace blink | 184 } // namespace blink |
| OLD | NEW |