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

Side by Side Diff: Source/platform/scroll/ProgrammaticScrollAnimator.cpp

Issue 1254963011: Revert of Animations: Port ProgrammaticScrollAnimator to use compositor timelines (Closed) Base URL: https://chromium.googlesource.com/chromium/blink.git@linkhigh
Patch Set: Created 5 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 // 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 "config.h" 5 #include "config.h"
6 #include "platform/scroll/ProgrammaticScrollAnimator.h" 6 #include "platform/scroll/ProgrammaticScrollAnimator.h"
7 7
8 #include "platform/RuntimeEnabledFeatures.h"
9 #include "platform/geometry/IntPoint.h" 8 #include "platform/geometry/IntPoint.h"
10 #include "platform/graphics/GraphicsLayer.h" 9 #include "platform/graphics/GraphicsLayer.h"
11 #include "platform/scroll/ScrollableArea.h" 10 #include "platform/scroll/ScrollableArea.h"
12 #include "public/platform/Platform.h" 11 #include "public/platform/Platform.h"
13 #include "public/platform/WebCompositorAnimation.h" 12 #include "public/platform/WebCompositorAnimation.h"
14 #include "public/platform/WebCompositorAnimationPlayer.h"
15 #include "public/platform/WebCompositorAnimationTimeline.h"
16 #include "public/platform/WebCompositorSupport.h" 13 #include "public/platform/WebCompositorSupport.h"
17 #include "public/platform/WebScrollOffsetAnimationCurve.h" 14 #include "public/platform/WebScrollOffsetAnimationCurve.h"
18 15
19 namespace blink { 16 namespace blink {
20 17
21 PassOwnPtr<ProgrammaticScrollAnimator> ProgrammaticScrollAnimator::create(Scroll ableArea* scrollableArea) 18 PassOwnPtr<ProgrammaticScrollAnimator> ProgrammaticScrollAnimator::create(Scroll ableArea* scrollableArea)
22 { 19 {
23 return adoptPtr(new ProgrammaticScrollAnimator(scrollableArea)); 20 return adoptPtr(new ProgrammaticScrollAnimator(scrollableArea));
24 } 21 }
25 22
26 ProgrammaticScrollAnimator::ProgrammaticScrollAnimator(ScrollableArea* scrollabl eArea) 23 ProgrammaticScrollAnimator::ProgrammaticScrollAnimator(ScrollableArea* scrollabl eArea)
27 : m_compositorAnimationAttachedToLayerId(0) 24 : m_scrollableArea(scrollableArea)
28 , m_scrollableArea(scrollableArea)
29 , m_startTime(0.0) 25 , m_startTime(0.0)
30 , m_runState(RunState::Idle) 26 , m_runState(RunState::Idle)
31 , m_compositorAnimationId(0) 27 , m_compositorAnimationId(0)
32 , m_compositorAnimationGroupId(0) 28 , m_compositorAnimationGroupId(0)
33 { 29 {
34 if (RuntimeEnabledFeatures::compositorAnimationTimelinesEnabled()) {
35 ASSERT(Platform::current()->compositorSupport());
36 m_compositorPlayer = adoptPtr(Platform::current()->compositorSupport()-> createAnimationPlayer());
37 ASSERT(m_compositorPlayer);
38 m_compositorPlayer->setAnimationDelegate(this);
39 }
40 } 30 }
41 31
42 ProgrammaticScrollAnimator::~ProgrammaticScrollAnimator() 32 ProgrammaticScrollAnimator::~ProgrammaticScrollAnimator()
43 { 33 {
44 if (m_compositorPlayer) {
45 m_compositorPlayer->setAnimationDelegate(nullptr);
46 m_compositorPlayer.clear();
47 }
48 } 34 }
49 35
50 void ProgrammaticScrollAnimator::resetAnimationState() 36 void ProgrammaticScrollAnimator::resetAnimationState()
51 { 37 {
52 m_animationCurve.clear(); 38 m_animationCurve.clear();
53 m_startTime = 0.0; 39 m_startTime = 0.0;
54 m_runState = RunState::Idle; 40 m_runState = RunState::Idle;
55 m_compositorAnimationId = 0; 41 m_compositorAnimationId = 0;
56 m_compositorAnimationGroupId = 0; 42 m_compositorAnimationGroupId = 0;
57 } 43 }
(...skipping 85 matching lines...) Expand 10 before | Expand all | Expand 10 after
143 } 129 }
144 130
145 void ProgrammaticScrollAnimator::updateCompositorAnimations() 131 void ProgrammaticScrollAnimator::updateCompositorAnimations()
146 { 132 {
147 if (m_compositorAnimationId && m_runState != RunState::RunningOnCompositor) { 133 if (m_compositorAnimationId && m_runState != RunState::RunningOnCompositor) {
148 // If the current run state is WaitingToSendToCompositor but we have a 134 // If the current run state is WaitingToSendToCompositor but we have a
149 // non-zero compositor animation id, there's a currently running 135 // non-zero compositor animation id, there's a currently running
150 // compositor animation that needs to be removed here before the new 136 // compositor animation that needs to be removed here before the new
151 // animation is added below. 137 // animation is added below.
152 ASSERT(m_runState == RunState::WaitingToCancelOnCompositor || m_runState == RunState::WaitingToSendToCompositor); 138 ASSERT(m_runState == RunState::WaitingToCancelOnCompositor || m_runState == RunState::WaitingToSendToCompositor);
153 139 if (GraphicsLayer* layer = m_scrollableArea->layerForScrolling())
154 if (m_compositorPlayer) { 140 layer->removeAnimation(m_compositorAnimationId);
155 if (m_compositorPlayer->isLayerAttached())
156 m_compositorPlayer->removeAnimation(m_compositorAnimationId);
157 } else {
158 if (GraphicsLayer* layer = m_scrollableArea->layerForScrolling())
159 layer->removeAnimation(m_compositorAnimationId);
160 }
161
162 m_compositorAnimationId = 0; 141 m_compositorAnimationId = 0;
163 m_compositorAnimationGroupId = 0; 142 m_compositorAnimationGroupId = 0;
164 if (m_runState == RunState::WaitingToCancelOnCompositor) { 143 if (m_runState == RunState::WaitingToCancelOnCompositor) {
165 resetAnimationState(); 144 resetAnimationState();
166 return; 145 return;
167 } 146 }
168 } 147 }
169 148
170 if (m_runState == RunState::WaitingToSendToCompositor) { 149 if (m_runState == RunState::WaitingToSendToCompositor) {
171 bool sentToCompositor = false; 150 bool sentToCompositor = false;
172 151
173 if (GraphicsLayer* layer = m_scrollableArea->layerForScrolling()) { 152 if (GraphicsLayer* layer = m_scrollableArea->layerForScrolling()) {
174 if (!layer->platformLayer()->shouldScrollOnMainThread()) { 153 if (!layer->platformLayer()->shouldScrollOnMainThread()) {
175 OwnPtr<WebCompositorAnimation> animation = adoptPtr(Platform::cu rrent()->compositorSupport()->createAnimation(*m_animationCurve, WebCompositorAn imation::TargetPropertyScrollOffset)); 154 OwnPtr<WebCompositorAnimation> animation = adoptPtr(Platform::cu rrent()->compositorSupport()->createAnimation(*m_animationCurve, WebCompositorAn imation::TargetPropertyScrollOffset));
176 155
177 int animationId = animation->id(); 156 int animationId = animation->id();
178 int animationGroupId = animation->group(); 157 int animationGroupId = animation->group();
179 158 if (m_scrollableArea->layerForScrolling()->addAnimation(animatio n.release())) {
180 bool animationAdded = false;
181 if (m_compositorPlayer) {
182 if (m_compositorPlayer->isLayerAttached()) {
183 m_compositorPlayer->addAnimation(animation.leakPtr());
184 animationAdded = true;
185 }
186 } else {
187 animationAdded = m_scrollableArea->layerForScrolling()->addA nimation(animation.release());
188 }
189
190 if (animationAdded) {
191 sentToCompositor = true; 159 sentToCompositor = true;
192 m_runState = RunState::RunningOnCompositor; 160 m_runState = RunState::RunningOnCompositor;
193 m_compositorAnimationId = animationId; 161 m_compositorAnimationId = animationId;
194 m_compositorAnimationGroupId = animationGroupId; 162 m_compositorAnimationGroupId = animationGroupId;
195 } 163 }
196 } 164 }
197 } 165 }
198 166
199 if (!sentToCompositor) { 167 if (!sentToCompositor) {
200 m_runState = RunState::RunningOnMainThread; 168 m_runState = RunState::RunningOnMainThread;
201 if (!m_scrollableArea->scheduleAnimation()) { 169 if (!m_scrollableArea->scheduleAnimation()) {
202 notifyPositionChanged(IntPoint(m_targetOffset.x(), m_targetOffse t.y())); 170 notifyPositionChanged(IntPoint(m_targetOffset.x(), m_targetOffse t.y()));
203 resetAnimationState(); 171 resetAnimationState();
204 } 172 }
205 } 173 }
206 } 174 }
207 } 175 }
208 176
209 void ProgrammaticScrollAnimator::reattachCompositorPlayerIfNeeded(WebCompositorA nimationTimeline* timeline) 177 void ProgrammaticScrollAnimator::layerForCompositedScrollingDidChange()
210 { 178 {
211 int compositorAnimationAttachedToLayerId = 0;
212 if (m_scrollableArea->layerForScrolling())
213 compositorAnimationAttachedToLayerId = m_scrollableArea->layerForScrolli ng()->platformLayer()->id();
214
215 if (compositorAnimationAttachedToLayerId != m_compositorAnimationAttachedToL ayerId) {
216 if (m_compositorPlayer && timeline) {
217 // Detach from old layer (if any).
218 if (m_compositorAnimationAttachedToLayerId) {
219 ASSERT(m_compositorPlayer->isLayerAttached());
220 m_compositorPlayer->detachLayer();
221 timeline->playerDestroyed(*this);
222 }
223 // Attach to new layer (if any).
224 if (compositorAnimationAttachedToLayerId) {
225 ASSERT(m_scrollableArea->layerForScrolling());
226 timeline->playerAttached(*this);
227 m_compositorPlayer->attachLayer(m_scrollableArea->layerForScroll ing()->platformLayer());
228 }
229 m_compositorAnimationAttachedToLayerId = compositorAnimationAttached ToLayerId;
230 }
231 }
232 }
233
234 void ProgrammaticScrollAnimator::layerForCompositedScrollingDidChange(WebComposi torAnimationTimeline* timeline)
235 {
236 reattachCompositorPlayerIfNeeded(timeline);
237
238 // If the composited scrolling layer is lost during a composited animation, 179 // If the composited scrolling layer is lost during a composited animation,
239 // continue the animation on the main thread. 180 // continue the animation on the main thread.
240 if (m_runState == RunState::RunningOnCompositor && !m_scrollableArea->layerF orScrolling()) { 181 if (m_runState == RunState::RunningOnCompositor && !m_scrollableArea->layerF orScrolling()) {
241 m_runState = RunState::RunningOnMainThread; 182 m_runState = RunState::RunningOnMainThread;
242 m_compositorAnimationId = 0; 183 m_compositorAnimationId = 0;
243 m_compositorAnimationGroupId = 0; 184 m_compositorAnimationGroupId = 0;
244 m_animationCurve->setInitialValue(FloatPoint(m_scrollableArea->scrollPos ition())); 185 m_animationCurve->setInitialValue(FloatPoint(m_scrollableArea->scrollPos ition()));
245 m_scrollableArea->registerForAnimation(); 186 m_scrollableArea->registerForAnimation();
246 if (!m_scrollableArea->scheduleAnimation()) { 187 if (!m_scrollableArea->scheduleAnimation()) {
247 resetAnimationState(); 188 resetAnimationState();
(...skipping 16 matching lines...) Expand all
264 ASSERT_NOT_REACHED(); 205 ASSERT_NOT_REACHED();
265 break; 206 break;
266 case RunState::WaitingToSendToCompositor: 207 case RunState::WaitingToSendToCompositor:
267 break; 208 break;
268 case RunState::RunningOnCompositor: 209 case RunState::RunningOnCompositor:
269 case RunState::WaitingToCancelOnCompositor: 210 case RunState::WaitingToCancelOnCompositor:
270 resetAnimationState(); 211 resetAnimationState();
271 } 212 }
272 } 213 }
273 214
274 void ProgrammaticScrollAnimator::notifyAnimationStarted(double monotonicTime, in t group)
275 {
276 }
277
278 void ProgrammaticScrollAnimator::notifyAnimationFinished(double monotonicTime, i nt group)
279 {
280 notifyCompositorAnimationFinished(group);
281 }
282
283 WebCompositorAnimationPlayer* ProgrammaticScrollAnimator::compositorPlayer() con st
284 {
285 return m_compositorPlayer.get();
286 }
287
288 } // namespace blink 215 } // namespace blink
OLDNEW
« no previous file with comments | « Source/platform/scroll/ProgrammaticScrollAnimator.h ('k') | Source/platform/scroll/ScrollableArea.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698