| 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/ScrollAnimatorCompositorCoordinator.h" | 5 #include "platform/scroll/ScrollAnimatorCompositorCoordinator.h" |
| 6 | 6 |
| 7 #include "cc/animation/scroll_offset_animation_curve.h" | 7 #include "cc/animation/scroll_offset_animation_curve.h" |
| 8 #include "platform/RuntimeEnabledFeatures.h" | 8 #include "platform/RuntimeEnabledFeatures.h" |
| 9 #include "platform/animation/CompositorAnimationHost.h" | 9 #include "platform/animation/CompositorAnimationHost.h" |
| 10 #include "platform/animation/CompositorAnimationPlayer.h" | 10 #include "platform/animation/CompositorAnimationPlayer.h" |
| 11 #include "platform/animation/CompositorAnimationTimeline.h" | 11 #include "platform/animation/CompositorAnimationTimeline.h" |
| 12 #include "platform/graphics/CompositorFactory.h" | 12 #include "platform/graphics/CompositorFactory.h" |
| 13 #include "platform/graphics/GraphicsLayer.h" | 13 #include "platform/graphics/GraphicsLayer.h" |
| 14 #include "platform/scroll/ScrollableArea.h" | 14 #include "platform/scroll/ScrollableArea.h" |
| 15 #include "public/platform/Platform.h" | 15 #include "public/platform/Platform.h" |
| 16 #include "public/platform/WebCompositorSupport.h" | 16 #include "public/platform/WebCompositorSupport.h" |
| 17 | 17 |
| 18 namespace blink { | 18 namespace blink { |
| 19 | 19 |
| 20 ScrollAnimatorCompositorCoordinator::ScrollAnimatorCompositorCoordinator() | 20 ScrollAnimatorCompositorCoordinator::ScrollAnimatorCompositorCoordinator() |
| 21 : m_compositorAnimationAttachedToLayerId(0) | 21 : m_compositorAnimationAttachedToLayerId(0) |
| 22 , m_runState(RunState::Idle) | 22 , m_runState(RunState::Idle) |
| 23 , m_compositorAnimationId(0) | 23 , m_compositorAnimationId(0) |
| 24 , m_compositorAnimationGroupId(0) | 24 , m_compositorAnimationGroupId(0) |
| 25 , m_implOnlyAnimationTakeover(false) |
| 25 { | 26 { |
| 26 ThreadState::current()->registerPreFinalizer(this); | 27 ThreadState::current()->registerPreFinalizer(this); |
| 27 m_compositorPlayer = adoptPtr(CompositorFactory::current().createAnimationPl
ayer()); | 28 m_compositorPlayer = adoptPtr(CompositorFactory::current().createAnimationPl
ayer()); |
| 28 ASSERT(m_compositorPlayer); | 29 ASSERT(m_compositorPlayer); |
| 29 m_compositorPlayer->setAnimationDelegate(this); | 30 m_compositorPlayer->setAnimationDelegate(this); |
| 30 } | 31 } |
| 31 | 32 |
| 32 ScrollAnimatorCompositorCoordinator::~ScrollAnimatorCompositorCoordinator() | 33 ScrollAnimatorCompositorCoordinator::~ScrollAnimatorCompositorCoordinator() |
| 33 { | 34 { |
| 34 } | 35 } |
| 35 | 36 |
| 36 void ScrollAnimatorCompositorCoordinator::dispose() | 37 void ScrollAnimatorCompositorCoordinator::dispose() |
| 37 { | 38 { |
| 38 m_compositorPlayer->setAnimationDelegate(nullptr); | 39 m_compositorPlayer->setAnimationDelegate(nullptr); |
| 39 m_compositorPlayer.clear(); | 40 m_compositorPlayer.clear(); |
| 40 } | 41 } |
| 41 | 42 |
| 42 void ScrollAnimatorCompositorCoordinator::resetAnimationState() | 43 void ScrollAnimatorCompositorCoordinator::resetAnimationState() |
| 43 { | 44 { |
| 44 m_runState = RunState::Idle; | 45 m_runState = RunState::Idle; |
| 45 m_compositorAnimationId = 0; | 46 m_compositorAnimationId = 0; |
| 46 m_compositorAnimationGroupId = 0; | 47 m_compositorAnimationGroupId = 0; |
| 47 } | 48 } |
| 48 | 49 |
| 49 bool ScrollAnimatorCompositorCoordinator::hasAnimationThatRequiresService() cons
t | 50 bool ScrollAnimatorCompositorCoordinator::hasAnimationThatRequiresService() cons
t |
| 50 { | 51 { |
| 51 if (!m_implOnlyAnimationAdjustment.isZero()) | 52 if (hasImplOnlyAnimationUpdate()) |
| 52 return true; | 53 return true; |
| 53 | 54 |
| 54 switch (m_runState) { | 55 switch (m_runState) { |
| 55 case RunState::Idle: | 56 case RunState::Idle: |
| 56 case RunState::RunningOnCompositor: | 57 case RunState::RunningOnCompositor: |
| 57 return false; | 58 return false; |
| 58 case RunState::WaitingToCancelOnCompositorButNewScroll: | 59 case RunState::WaitingToCancelOnCompositorButNewScroll: |
| 59 case RunState::PostAnimationCleanup: | 60 case RunState::PostAnimationCleanup: |
| 60 case RunState::WaitingToSendToCompositor: | 61 case RunState::WaitingToSendToCompositor: |
| 61 case RunState::RunningOnMainThread: | 62 case RunState::RunningOnMainThread: |
| (...skipping 50 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 112 case RunState::WaitingToCancelOnCompositorButNewScroll: | 113 case RunState::WaitingToCancelOnCompositorButNewScroll: |
| 113 case RunState::RunningOnCompositorButNeedsUpdate: | 114 case RunState::RunningOnCompositorButNeedsUpdate: |
| 114 case RunState::RunningOnCompositor: | 115 case RunState::RunningOnCompositor: |
| 115 m_runState = RunState::WaitingToCancelOnCompositor; | 116 m_runState = RunState::WaitingToCancelOnCompositor; |
| 116 | 117 |
| 117 // Get serviced the next time compositor updates are allowed. | 118 // Get serviced the next time compositor updates are allowed. |
| 118 getScrollableArea()->registerForAnimation(); | 119 getScrollableArea()->registerForAnimation(); |
| 119 } | 120 } |
| 120 } | 121 } |
| 121 | 122 |
| 122 void ScrollAnimatorCompositorCoordinator::takeoverCompositorAnimation() | 123 void ScrollAnimatorCompositorCoordinator::takeOverCompositorAnimation() |
| 123 { | 124 { |
| 124 switch (m_runState) { | 125 switch (m_runState) { |
| 125 case RunState::Idle: | 126 case RunState::Idle: |
| 127 takeOverImplOnlyScrollOffsetAnimation(); |
| 128 break; |
| 126 case RunState::WaitingToCancelOnCompositor: | 129 case RunState::WaitingToCancelOnCompositor: |
| 127 case RunState::WaitingToCancelOnCompositorButNewScroll: | 130 case RunState::WaitingToCancelOnCompositorButNewScroll: |
| 128 case RunState::PostAnimationCleanup: | 131 case RunState::PostAnimationCleanup: |
| 129 case RunState::RunningOnCompositorButNeedsTakeover: | 132 case RunState::RunningOnCompositorButNeedsTakeover: |
| 130 case RunState::WaitingToSendToCompositor: | 133 case RunState::WaitingToSendToCompositor: |
| 131 case RunState::RunningOnMainThread: | 134 case RunState::RunningOnMainThread: |
| 132 break; | 135 break; |
| 133 case RunState::RunningOnCompositorButNeedsUpdate: | 136 case RunState::RunningOnCompositorButNeedsUpdate: |
| 134 case RunState::RunningOnCompositor: | 137 case RunState::RunningOnCompositor: |
| 135 // We call abortAnimation that makes changes to the animation running on | 138 // We call abortAnimation that makes changes to the animation running on |
| (...skipping 99 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 235 offset.moveBy(getScrollableArea()->scrollOrigin()); | 238 offset.moveBy(getScrollableArea()->scrollOrigin()); |
| 236 return offset; | 239 return offset; |
| 237 } | 240 } |
| 238 | 241 |
| 239 FloatPoint ScrollAnimatorCompositorCoordinator::blinkOffsetFromCompositorOffset(
FloatPoint offset) | 242 FloatPoint ScrollAnimatorCompositorCoordinator::blinkOffsetFromCompositorOffset(
FloatPoint offset) |
| 240 { | 243 { |
| 241 offset.moveBy(-getScrollableArea()->scrollOrigin()); | 244 offset.moveBy(-getScrollableArea()->scrollOrigin()); |
| 242 return offset; | 245 return offset; |
| 243 } | 246 } |
| 244 | 247 |
| 248 bool ScrollAnimatorCompositorCoordinator::hasImplOnlyAnimationUpdate() const |
| 249 { |
| 250 return !m_implOnlyAnimationAdjustment.isZero() || m_implOnlyAnimationTakeove
r; |
| 251 } |
| 252 |
| 245 void ScrollAnimatorCompositorCoordinator::updateCompositorAnimations() | 253 void ScrollAnimatorCompositorCoordinator::updateCompositorAnimations() |
| 246 { | 254 { |
| 247 if (!getScrollableArea()->scrollAnimatorEnabled() || m_implOnlyAnimationAdju
stment.isZero()) | 255 if (!getScrollableArea()->scrollAnimatorEnabled() || !hasImplOnlyAnimationUp
date()) |
| 248 return; | 256 return; |
| 249 | 257 |
| 250 GraphicsLayer* layer = getScrollableArea()->layerForScrolling(); | 258 GraphicsLayer* layer = getScrollableArea()->layerForScrolling(); |
| 251 CompositorAnimationTimeline* timeline = getScrollableArea()->compositorAnima
tionTimeline(); | 259 CompositorAnimationTimeline* timeline = getScrollableArea()->compositorAnima
tionTimeline(); |
| 252 if (layer && timeline && !timeline->compositorAnimationHost().isNull()) { | 260 if (layer && timeline && !timeline->compositorAnimationHost().isNull()) { |
| 253 CompositorAnimationHost host = timeline->compositorAnimationHost(); | 261 CompositorAnimationHost host = timeline->compositorAnimationHost(); |
| 254 host.updateImplOnlyScrollOffsetAnimation( | 262 int elementId = layer->platformLayer()->id(); |
| 255 gfx::Vector2dF(m_implOnlyAnimationAdjustment.width(), m_implOnlyAnim
ationAdjustment.height()), | 263 if (!m_implOnlyAnimationAdjustment.isZero()) { |
| 256 layer->platformLayer()->id()); | 264 host.adjustImplOnlyScrollOffsetAnimation( |
| 265 elementId, |
| 266 gfx::Vector2dF(m_implOnlyAnimationAdjustment.width(), m_implOnly
AnimationAdjustment.height())); |
| 267 } |
| 268 if (m_implOnlyAnimationTakeover) |
| 269 host.takeOverImplOnlyScrollOffsetAnimation(elementId); |
| 257 } | 270 } |
| 258 m_implOnlyAnimationAdjustment = FloatSize(); | 271 m_implOnlyAnimationAdjustment = FloatSize(); |
| 272 m_implOnlyAnimationTakeover = false; |
| 259 } | 273 } |
| 260 | 274 |
| 261 void ScrollAnimatorCompositorCoordinator::updateImplOnlyScrollOffsetAnimation( | 275 void ScrollAnimatorCompositorCoordinator::adjustImplOnlyScrollOffsetAnimation( |
| 262 const FloatSize& adjustment) | 276 const FloatSize& adjustment) |
| 263 { | 277 { |
| 264 if (!getScrollableArea()->scrollAnimatorEnabled()) | 278 if (!getScrollableArea()->scrollAnimatorEnabled()) |
| 265 return; | 279 return; |
| 266 | 280 |
| 267 m_implOnlyAnimationAdjustment.expand(adjustment.width(), adjustment.height()
); | 281 m_implOnlyAnimationAdjustment.expand(adjustment.width(), adjustment.height()
); |
| 268 | 282 |
| 269 getScrollableArea()->registerForAnimation(); | 283 getScrollableArea()->registerForAnimation(); |
| 270 } | 284 } |
| 271 | 285 |
| 286 void ScrollAnimatorCompositorCoordinator::takeOverImplOnlyScrollOffsetAnimation(
) |
| 287 { |
| 288 if (!getScrollableArea()->scrollAnimatorEnabled()) |
| 289 return; |
| 290 |
| 291 m_implOnlyAnimationTakeover = true; |
| 292 |
| 293 getScrollableArea()->registerForAnimation(); |
| 294 } |
| 295 |
| 272 String ScrollAnimatorCompositorCoordinator::runStateAsText() const | 296 String ScrollAnimatorCompositorCoordinator::runStateAsText() const |
| 273 { | 297 { |
| 274 switch (m_runState) { | 298 switch (m_runState) { |
| 275 case RunState::Idle: | 299 case RunState::Idle: |
| 276 return String("Idle"); | 300 return String("Idle"); |
| 277 case RunState::WaitingToSendToCompositor: | 301 case RunState::WaitingToSendToCompositor: |
| 278 return String("WaitingToSendToCompositor"); | 302 return String("WaitingToSendToCompositor"); |
| 279 case RunState::RunningOnCompositor: | 303 case RunState::RunningOnCompositor: |
| 280 return String("RunningOnCompositor"); | 304 return String("RunningOnCompositor"); |
| 281 case RunState::RunningOnMainThread: | 305 case RunState::RunningOnMainThread: |
| 282 return String("RunningOnMainThread"); | 306 return String("RunningOnMainThread"); |
| 283 case RunState::RunningOnCompositorButNeedsUpdate: | 307 case RunState::RunningOnCompositorButNeedsUpdate: |
| 284 return String("RunningOnCompositorButNeedsUpdate"); | 308 return String("RunningOnCompositorButNeedsUpdate"); |
| 285 case RunState::WaitingToCancelOnCompositor: | 309 case RunState::WaitingToCancelOnCompositor: |
| 286 return String("WaitingToCancelOnCompositor"); | 310 return String("WaitingToCancelOnCompositor"); |
| 287 case RunState::PostAnimationCleanup: | 311 case RunState::PostAnimationCleanup: |
| 288 return String("PostAnimationCleanup"); | 312 return String("PostAnimationCleanup"); |
| 289 case RunState::RunningOnCompositorButNeedsTakeover: | 313 case RunState::RunningOnCompositorButNeedsTakeover: |
| 290 return String("RunningOnCompositorButNeedsTakeover"); | 314 return String("RunningOnCompositorButNeedsTakeover"); |
| 291 case RunState::WaitingToCancelOnCompositorButNewScroll: | 315 case RunState::WaitingToCancelOnCompositorButNewScroll: |
| 292 return String("WaitingToCancelOnCompositorButNewScroll"); | 316 return String("WaitingToCancelOnCompositorButNewScroll"); |
| 293 } | 317 } |
| 294 ASSERT_NOT_REACHED(); | 318 ASSERT_NOT_REACHED(); |
| 295 return String(); | 319 return String(); |
| 296 } | 320 } |
| 297 | 321 |
| 298 } // namespace blink | 322 } // namespace blink |
| OLD | NEW |