| 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 127 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 138 if (m_runState == RunState::PostAnimationCleanup) | 138 if (m_runState == RunState::PostAnimationCleanup) |
| 139 resetAnimationState(); | 139 resetAnimationState(); |
| 140 | 140 |
| 141 if (m_animationCurve && m_runState != RunState::WaitingToCancelOnCompositor)
{ | 141 if (m_animationCurve && m_runState != RunState::WaitingToCancelOnCompositor)
{ |
| 142 if ((targetPos - m_targetOffset).isZero()) | 142 if ((targetPos - m_targetOffset).isZero()) |
| 143 return true; | 143 return true; |
| 144 | 144 |
| 145 m_targetOffset = targetPos; | 145 m_targetOffset = targetPos; |
| 146 ASSERT(m_runState == RunState::RunningOnMainThread | 146 ASSERT(m_runState == RunState::RunningOnMainThread |
| 147 || m_runState == RunState::RunningOnCompositor | 147 || m_runState == RunState::RunningOnCompositor |
| 148 || m_runState == RunState::RunningOnCompositorButNeedsUpdate); | 148 || m_runState == RunState::RunningOnCompositorButNeedsUpdate |
| 149 || m_runState == RunState::RunningOnCompositorButNeedsTakeover); |
| 149 | 150 |
| 150 if (m_runState == RunState::RunningOnCompositor | 151 // Running on the main thread, simply update the target offset instead |
| 151 || m_runState == RunState::RunningOnCompositorButNeedsUpdate) { | 152 // of sending to the compositor. |
| 152 if (registerAndScheduleAnimation()) | 153 if (m_runState == RunState::RunningOnMainThread) { |
| 153 m_runState = RunState::RunningOnCompositorButNeedsUpdate; | 154 m_animationCurve->updateTarget(m_timeFunction() - m_startTime, targe
tPos); |
| 154 return true; | 155 return true; |
| 155 } | 156 } |
| 156 | 157 |
| 157 // Running on the main thread, simply update the target offset instead | 158 if (registerAndScheduleAnimation()) |
| 158 // of sending to the compositor. | 159 m_runState = RunState::RunningOnCompositorButNeedsUpdate; |
| 159 m_animationCurve->updateTarget(m_timeFunction() - m_startTime, targetPos
); | |
| 160 return true; | 160 return true; |
| 161 } | 161 } |
| 162 | 162 |
| 163 if ((targetPos - currentPosition()).isZero()) | 163 if ((targetPos - currentPosition()).isZero()) |
| 164 return false; | 164 return false; |
| 165 | 165 |
| 166 m_targetOffset = targetPos; | 166 m_targetOffset = targetPos; |
| 167 m_startTime = m_timeFunction(); | 167 m_startTime = m_timeFunction(); |
| 168 | 168 |
| 169 if (registerAndScheduleAnimation()) | 169 if (registerAndScheduleAnimation()) |
| (...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 209 | 209 |
| 210 void ScrollAnimator::postAnimationCleanupAndReset() | 210 void ScrollAnimator::postAnimationCleanupAndReset() |
| 211 { | 211 { |
| 212 // Remove the temporary main thread scrolling reason that was added while | 212 // Remove the temporary main thread scrolling reason that was added while |
| 213 // main thread had scheduled an animation. | 213 // main thread had scheduled an animation. |
| 214 removeMainThreadScrollingReason(); | 214 removeMainThreadScrollingReason(); |
| 215 | 215 |
| 216 resetAnimationState(); | 216 resetAnimationState(); |
| 217 } | 217 } |
| 218 | 218 |
| 219 bool ScrollAnimator::sendAnimationToCompositor() |
| 220 { |
| 221 if (m_scrollableArea->shouldScrollOnMainThread()) |
| 222 return false; |
| 223 |
| 224 OwnPtr<CompositorAnimation> animation = adoptPtr( |
| 225 CompositorFactory::current().createAnimation( |
| 226 *m_animationCurve, |
| 227 CompositorTargetProperty::SCROLL_OFFSET)); |
| 228 // Being here means that either there is an animation that needs |
| 229 // to be sent to the compositor, or an animation that needs to |
| 230 // be updated (a new scroll event before the previous animation |
| 231 // is finished). In either case, the start time is when the |
| 232 // first animation was initiated. This re-targets the animation |
| 233 // using the current time on main thread. |
| 234 animation->setStartTime(m_startTime); |
| 235 |
| 236 int animationId = animation->id(); |
| 237 int animationGroupId = animation->group(); |
| 238 |
| 239 bool sentToCompositor = addAnimation(animation.release()); |
| 240 if (sentToCompositor) { |
| 241 m_runState = RunState::RunningOnCompositor; |
| 242 m_compositorAnimationId = animationId; |
| 243 m_compositorAnimationGroupId = animationGroupId; |
| 244 } |
| 245 |
| 246 return sentToCompositor; |
| 247 } |
| 248 |
| 219 void ScrollAnimator::updateCompositorAnimations() | 249 void ScrollAnimator::updateCompositorAnimations() |
| 220 { | 250 { |
| 221 if (m_runState == RunState::PostAnimationCleanup) { | 251 if (m_runState == RunState::PostAnimationCleanup) { |
| 222 postAnimationCleanupAndReset(); | 252 postAnimationCleanupAndReset(); |
| 223 return; | 253 return; |
| 224 } | 254 } |
| 225 | 255 |
| 226 if (m_compositorAnimationId && m_runState != RunState::RunningOnCompositor | 256 if (m_compositorAnimationId && m_runState != RunState::RunningOnCompositor |
| 227 && m_runState != RunState::RunningOnCompositorButNeedsUpdate) { | 257 && m_runState != RunState::RunningOnCompositorButNeedsUpdate) { |
| 228 // If the current run state is WaitingToSendToCompositor but we have a | 258 // If the current run state is WaitingToSendToCompositor but we have a |
| 229 // non-zero compositor animation id, there's a currently running | 259 // non-zero compositor animation id, there's a currently running |
| 230 // compositor animation that needs to be removed here before the new | 260 // compositor animation that needs to be removed here before the new |
| 231 // animation is added below. | 261 // animation is added below. |
| 232 ASSERT(m_runState == RunState::WaitingToCancelOnCompositor | 262 ASSERT(m_runState == RunState::WaitingToCancelOnCompositor |
| 233 || m_runState == RunState::WaitingToSendToCompositor); | 263 || m_runState == RunState::WaitingToSendToCompositor |
| 264 || m_runState == RunState::RunningOnCompositorButNeedsTakeover); |
| 234 | 265 |
| 235 abortAnimation(); | 266 if (m_runState == RunState::RunningOnCompositorButNeedsTakeover) { |
| 267 // The animation is already aborted when the call to |
| 268 // ::takeoverCompositorAnimation is made. |
| 269 m_runState = RunState::WaitingToSendToCompositor; |
| 270 } else { |
| 271 abortAnimation(); |
| 272 } |
| 236 | 273 |
| 237 m_compositorAnimationId = 0; | 274 m_compositorAnimationId = 0; |
| 238 m_compositorAnimationGroupId = 0; | 275 m_compositorAnimationGroupId = 0; |
| 239 if (m_runState == RunState::WaitingToCancelOnCompositor) { | 276 if (m_runState == RunState::WaitingToCancelOnCompositor) { |
| 240 postAnimationCleanupAndReset(); | 277 postAnimationCleanupAndReset(); |
| 241 return; | 278 return; |
| 242 } | 279 } |
| 243 } | 280 } |
| 244 | 281 |
| 245 if (m_runState == RunState::WaitingToSendToCompositor | 282 if (m_runState == RunState::WaitingToSendToCompositor |
| (...skipping 14 matching lines...) Expand all Loading... |
| 260 if (!m_animationCurve) { | 297 if (!m_animationCurve) { |
| 261 m_animationCurve = adoptPtr(CompositorFactory::current().createScrol
lOffsetAnimationCurve( | 298 m_animationCurve = adoptPtr(CompositorFactory::current().createScrol
lOffsetAnimationCurve( |
| 262 m_targetOffset, | 299 m_targetOffset, |
| 263 CompositorAnimationCurve::TimingFunctionTypeEaseInOut, | 300 CompositorAnimationCurve::TimingFunctionTypeEaseInOut, |
| 264 m_lastGranularity == ScrollByPixel ? | 301 m_lastGranularity == ScrollByPixel ? |
| 265 CompositorScrollOffsetAnimationCurve::ScrollDurationInverseD
elta : | 302 CompositorScrollOffsetAnimationCurve::ScrollDurationInverseD
elta : |
| 266 CompositorScrollOffsetAnimationCurve::ScrollDurationConstant
)); | 303 CompositorScrollOffsetAnimationCurve::ScrollDurationConstant
)); |
| 267 m_animationCurve->setInitialValue(currentPosition()); | 304 m_animationCurve->setInitialValue(currentPosition()); |
| 268 } | 305 } |
| 269 | 306 |
| 270 bool sentToCompositor = false; | |
| 271 if (!m_scrollableArea->shouldScrollOnMainThread()) { | |
| 272 OwnPtr<CompositorAnimation> animation = adoptPtr( | |
| 273 CompositorFactory::current().createAnimation( | |
| 274 *m_animationCurve, | |
| 275 CompositorTargetProperty::SCROLL_OFFSET)); | |
| 276 // Being here means that either there is an animation that needs | |
| 277 // to be sent to the compositor, or an animation that needs to | |
| 278 // be updated (a new scroll event before the previous animation | |
| 279 // is finished). In either case, the start time is when the | |
| 280 // first animation was initiated. This re-targets the animation | |
| 281 // using the current time on main thread. | |
| 282 animation->setStartTime(m_startTime); | |
| 283 | |
| 284 int animationId = animation->id(); | |
| 285 int animationGroupId = animation->group(); | |
| 286 | |
| 287 sentToCompositor = addAnimation(animation.release()); | |
| 288 if (sentToCompositor) { | |
| 289 m_runState = RunState::RunningOnCompositor; | |
| 290 m_compositorAnimationId = animationId; | |
| 291 m_compositorAnimationGroupId = animationGroupId; | |
| 292 } | |
| 293 } | |
| 294 | |
| 295 bool runningOnMainThread = false; | 307 bool runningOnMainThread = false; |
| 308 bool sentToCompositor = sendAnimationToCompositor(); |
| 296 if (!sentToCompositor) { | 309 if (!sentToCompositor) { |
| 297 runningOnMainThread = registerAndScheduleAnimation(); | 310 runningOnMainThread = registerAndScheduleAnimation(); |
| 298 if (runningOnMainThread) | 311 if (runningOnMainThread) |
| 299 m_runState = RunState::RunningOnMainThread; | 312 m_runState = RunState::RunningOnMainThread; |
| 300 } | 313 } |
| 301 | 314 |
| 302 // Main thread should deal with the scroll animations it started. | 315 // Main thread should deal with the scroll animations it started. |
| 303 if (sentToCompositor || runningOnMainThread) | 316 if (sentToCompositor || runningOnMainThread) |
| 304 addMainThreadScrollingReason(); | 317 addMainThreadScrollingReason(); |
| 305 else | 318 else |
| (...skipping 49 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 355 std::move(scrollOffsetAnimationCurve))); | 368 std::move(scrollOffsetAnimationCurve))); |
| 356 m_startTime = animationStartTime; | 369 m_startTime = animationStartTime; |
| 357 } | 370 } |
| 358 } | 371 } |
| 359 | 372 |
| 360 void ScrollAnimator::cancelAnimation() | 373 void ScrollAnimator::cancelAnimation() |
| 361 { | 374 { |
| 362 ScrollAnimatorCompositorCoordinator::cancelAnimation(); | 375 ScrollAnimatorCompositorCoordinator::cancelAnimation(); |
| 363 } | 376 } |
| 364 | 377 |
| 378 void ScrollAnimator::takeoverCompositorAnimation() |
| 379 { |
| 380 if (m_runState == RunState::RunningOnCompositor |
| 381 || m_runState == RunState::RunningOnCompositorButNeedsUpdate) |
| 382 removeMainThreadScrollingReason(); |
| 383 |
| 384 ScrollAnimatorCompositorCoordinator::takeoverCompositorAnimation(); |
| 385 } |
| 386 |
| 365 void ScrollAnimator::layerForCompositedScrollingDidChange( | 387 void ScrollAnimator::layerForCompositedScrollingDidChange( |
| 366 CompositorAnimationTimeline* timeline) | 388 CompositorAnimationTimeline* timeline) |
| 367 { | 389 { |
| 368 if (reattachCompositorPlayerIfNeeded(timeline) && m_animationCurve) | 390 if (reattachCompositorPlayerIfNeeded(timeline) && m_animationCurve) |
| 369 addMainThreadScrollingReason(); | 391 addMainThreadScrollingReason(); |
| 370 } | 392 } |
| 371 | 393 |
| 372 bool ScrollAnimator::registerAndScheduleAnimation() | 394 bool ScrollAnimator::registerAndScheduleAnimation() |
| 373 { | 395 { |
| 374 scrollableArea()->registerForAnimation(); | 396 scrollableArea()->registerForAnimation(); |
| 375 if (!m_scrollableArea->scheduleAnimation()) { | 397 if (!m_scrollableArea->scheduleAnimation()) { |
| 376 scrollToOffsetWithoutAnimation(m_targetOffset); | 398 scrollToOffsetWithoutAnimation(m_targetOffset); |
| 377 resetAnimationState(); | 399 resetAnimationState(); |
| 378 return false; | 400 return false; |
| 379 } | 401 } |
| 380 return true; | 402 return true; |
| 381 } | 403 } |
| 382 | 404 |
| 383 DEFINE_TRACE(ScrollAnimator) | 405 DEFINE_TRACE(ScrollAnimator) |
| 384 { | 406 { |
| 385 ScrollAnimatorBase::trace(visitor); | 407 ScrollAnimatorBase::trace(visitor); |
| 386 } | 408 } |
| 387 | 409 |
| 388 } // namespace blink | 410 } // namespace blink |
| OLD | NEW |