OLD | NEW |
1 /* | 1 /* |
2 * Copyright (C) 2013 Google Inc. All rights reserved. | 2 * Copyright (C) 2013 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 28 matching lines...) Expand all Loading... |
39 #include "core/animation/animatable/AnimatableFilterOperations.h" | 39 #include "core/animation/animatable/AnimatableFilterOperations.h" |
40 #include "core/animation/animatable/AnimatableTransform.h" | 40 #include "core/animation/animatable/AnimatableTransform.h" |
41 #include "core/animation/animatable/AnimatableValue.h" | 41 #include "core/animation/animatable/AnimatableValue.h" |
42 #include "core/layout/Layer.h" | 42 #include "core/layout/Layer.h" |
43 #include "core/layout/LayoutObject.h" | 43 #include "core/layout/LayoutObject.h" |
44 #include "core/layout/compositing/CompositedLayerMapping.h" | 44 #include "core/layout/compositing/CompositedLayerMapping.h" |
45 #include "core/rendering/RenderBoxModelObject.h" | 45 #include "core/rendering/RenderBoxModelObject.h" |
46 #include "platform/geometry/FloatBox.h" | 46 #include "platform/geometry/FloatBox.h" |
47 #include "public/platform/Platform.h" | 47 #include "public/platform/Platform.h" |
48 #include "public/platform/WebCompositorAnimation.h" | 48 #include "public/platform/WebCompositorAnimation.h" |
| 49 #include "public/platform/WebCompositorAnimationPlayer.h" |
49 #include "public/platform/WebCompositorSupport.h" | 50 #include "public/platform/WebCompositorSupport.h" |
50 #include "public/platform/WebFilterAnimationCurve.h" | 51 #include "public/platform/WebFilterAnimationCurve.h" |
51 #include "public/platform/WebFilterKeyframe.h" | 52 #include "public/platform/WebFilterKeyframe.h" |
52 #include "public/platform/WebFloatAnimationCurve.h" | 53 #include "public/platform/WebFloatAnimationCurve.h" |
53 #include "public/platform/WebFloatKeyframe.h" | 54 #include "public/platform/WebFloatKeyframe.h" |
54 #include "public/platform/WebTransformAnimationCurve.h" | 55 #include "public/platform/WebTransformAnimationCurve.h" |
55 #include "public/platform/WebTransformKeyframe.h" | 56 #include "public/platform/WebTransformKeyframe.h" |
56 | 57 |
57 #include <algorithm> | 58 #include <algorithm> |
58 #include <cmath> | 59 #include <cmath> |
(...skipping 189 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
248 || (affectsFilter && attachedPlayer->affects(targetElement, CSSPrope
rtyWebkitFilter))) | 249 || (affectsFilter && attachedPlayer->affects(targetElement, CSSPrope
rtyWebkitFilter))) |
249 attachedPlayer->cancelAnimationOnCompositor(); | 250 attachedPlayer->cancelAnimationOnCompositor(); |
250 } | 251 } |
251 } | 252 } |
252 | 253 |
253 bool CompositorAnimations::canStartAnimationOnCompositor(const Element& element) | 254 bool CompositorAnimations::canStartAnimationOnCompositor(const Element& element) |
254 { | 255 { |
255 return element.renderer() && element.renderer()->compositingState() == Paint
sIntoOwnBacking; | 256 return element.renderer() && element.renderer()->compositingState() == Paint
sIntoOwnBacking; |
256 } | 257 } |
257 | 258 |
| 259 #define HEAVISIDE_ANIMATIONS 1 |
| 260 |
258 bool CompositorAnimations::startAnimationOnCompositor(const Element& element, in
t group, double startTime, double timeOffset, const Timing& timing, const Animat
ionPlayer* player, const AnimationEffect& effect, Vector<int>& startedAnimationI
ds, double playerPlaybackRate) | 261 bool CompositorAnimations::startAnimationOnCompositor(const Element& element, in
t group, double startTime, double timeOffset, const Timing& timing, const Animat
ionPlayer* player, const AnimationEffect& effect, Vector<int>& startedAnimationI
ds, double playerPlaybackRate) |
259 { | 262 { |
260 ASSERT(startedAnimationIds.isEmpty()); | 263 ASSERT(startedAnimationIds.isEmpty()); |
261 ASSERT(isCandidateForAnimationOnCompositor(timing, element, player, effect,
playerPlaybackRate)); | 264 ASSERT(isCandidateForAnimationOnCompositor(timing, element, player, effect,
playerPlaybackRate)); |
262 ASSERT(canStartAnimationOnCompositor(element)); | 265 ASSERT(canStartAnimationOnCompositor(element)); |
263 | 266 |
264 const KeyframeEffectModelBase& keyframeEffect = toKeyframeEffectModelBase(ef
fect); | 267 const KeyframeEffectModelBase& keyframeEffect = toKeyframeEffectModelBase(ef
fect); |
265 | 268 |
266 Layer* layer = toRenderBoxModelObject(element.renderer())->layer(); | 269 Layer* layer = toRenderBoxModelObject(element.renderer())->layer(); |
267 ASSERT(layer); | 270 ASSERT(layer); |
268 | 271 |
269 Vector<OwnPtr<WebCompositorAnimation>> animations; | 272 Vector<OwnPtr<WebCompositorAnimation>> animations; |
270 CompositorAnimationsImpl::getAnimationOnCompositor(timing, group, startTime,
timeOffset, keyframeEffect, animations, playerPlaybackRate); | 273 CompositorAnimationsImpl::getAnimationOnCompositor(timing, group, startTime,
timeOffset, keyframeEffect, animations, playerPlaybackRate); |
271 ASSERT(!animations.isEmpty()); | 274 ASSERT(!animations.isEmpty()); |
272 for (auto& animation : animations) { | 275 for (auto& animation : animations) { |
273 int id = animation->id(); | 276 int id = animation->id(); |
| 277 #if HEAVISIDE_ANIMATIONS |
| 278 ASSERT(player); |
| 279 WebCompositorAnimationPlayer* compositorPlayer = player->compositorPlaye
r(); |
| 280 ASSERT(compositorPlayer); |
| 281 compositorPlayer->attachLayer(layer->compositedLayerMapping()->mainGraph
icsLayer()->platformLayer()); |
| 282 compositorPlayer->addAnimation(animation.leakPtr()); |
| 283 #else |
274 if (!layer->compositedLayerMapping()->mainGraphicsLayer()->addAnimation(
animation.release())) { | 284 if (!layer->compositedLayerMapping()->mainGraphicsLayer()->addAnimation(
animation.release())) { |
275 // FIXME: We should know ahead of time whether these animations can
be started. | 285 // FIXME: We should know ahead of time whether these animations can
be started. |
276 for (int startedAnimationId : startedAnimationIds) | 286 for (int startedAnimationId : startedAnimationIds) |
277 cancelAnimationOnCompositor(element, startedAnimationId); | 287 cancelAnimationOnCompositor(element, player, startedAnimationId)
; |
278 startedAnimationIds.clear(); | 288 startedAnimationIds.clear(); |
279 return false; | 289 return false; |
280 } | 290 } |
| 291 #endif |
281 startedAnimationIds.append(id); | 292 startedAnimationIds.append(id); |
282 } | 293 } |
283 ASSERT(!startedAnimationIds.isEmpty()); | 294 ASSERT(!startedAnimationIds.isEmpty()); |
284 return true; | 295 return true; |
285 } | 296 } |
286 | 297 |
287 void CompositorAnimations::cancelAnimationOnCompositor(const Element& element, i
nt id) | 298 void CompositorAnimations::cancelAnimationOnCompositor(const Element& element, c
onst AnimationPlayer* player, int id) |
288 { | 299 { |
289 if (!canStartAnimationOnCompositor(element)) { | 300 if (!canStartAnimationOnCompositor(element)) { |
290 // When an element is being detached, we cancel any associated | 301 // When an element is being detached, we cancel any associated |
291 // AnimationPlayers for CSS animations. But by the time we get | 302 // AnimationPlayers for CSS animations. But by the time we get |
292 // here the mapping will have been removed. | 303 // here the mapping will have been removed. |
293 // FIXME: Defer remove/pause operations until after the | 304 // FIXME: Defer remove/pause operations until after the |
294 // compositing update. | 305 // compositing update. |
295 return; | 306 return; |
296 } | 307 } |
| 308 #if HEAVISIDE_ANIMATIONS |
| 309 ASSERT(player); |
| 310 WebCompositorAnimationPlayer* compositorPlayer = player->compositorPlayer(); |
| 311 ASSERT(compositorPlayer); |
| 312 compositorPlayer->removeAnimation(id); |
| 313 #else |
297 toRenderBoxModelObject(element.renderer())->layer()->compositedLayerMapping(
)->mainGraphicsLayer()->removeAnimation(id); | 314 toRenderBoxModelObject(element.renderer())->layer()->compositedLayerMapping(
)->mainGraphicsLayer()->removeAnimation(id); |
| 315 #endif |
298 } | 316 } |
299 | 317 |
300 void CompositorAnimations::pauseAnimationForTestingOnCompositor(const Element& e
lement, int id, double pauseTime) | 318 void CompositorAnimations::pauseAnimationForTestingOnCompositor(const Element& e
lement, const AnimationPlayer* player, int id, double pauseTime) |
301 { | 319 { |
302 // FIXME: canStartAnimationOnCompositor queries compositingState, which is n
ot necessarily up to date. | 320 // FIXME: canStartAnimationOnCompositor queries compositingState, which is n
ot necessarily up to date. |
303 // https://code.google.com/p/chromium/issues/detail?id=339847 | 321 // https://code.google.com/p/chromium/issues/detail?id=339847 |
304 DisableCompositingQueryAsserts disabler; | 322 DisableCompositingQueryAsserts disabler; |
305 | 323 |
306 if (!canStartAnimationOnCompositor(element)) { | 324 if (!canStartAnimationOnCompositor(element)) { |
307 ASSERT_NOT_REACHED(); | 325 ASSERT_NOT_REACHED(); |
308 return; | 326 return; |
309 } | 327 } |
| 328 #if HEAVISIDE_ANIMATIONS |
| 329 ASSERT(player); |
| 330 WebCompositorAnimationPlayer* compositorPlayer = player->compositorPlayer(); |
| 331 ASSERT(compositorPlayer); |
| 332 compositorPlayer->pauseAnimation(id, pauseTime); |
| 333 #else |
310 toRenderBoxModelObject(element.renderer())->layer()->compositedLayerMapping(
)->mainGraphicsLayer()->pauseAnimation(id, pauseTime); | 334 toRenderBoxModelObject(element.renderer())->layer()->compositedLayerMapping(
)->mainGraphicsLayer()->pauseAnimation(id, pauseTime); |
| 335 #endif |
311 } | 336 } |
312 | 337 |
313 // ----------------------------------------------------------------------- | 338 // ----------------------------------------------------------------------- |
314 // CompositorAnimationsImpl | 339 // CompositorAnimationsImpl |
315 // ----------------------------------------------------------------------- | 340 // ----------------------------------------------------------------------- |
316 | 341 |
317 bool CompositorAnimationsImpl::convertTimingForCompositor(const Timing& timing,
double timeOffset, CompositorTiming& out, double playerPlaybackRate) | 342 bool CompositorAnimationsImpl::convertTimingForCompositor(const Timing& timing,
double timeOffset, CompositorTiming& out, double playerPlaybackRate) |
318 { | 343 { |
319 timing.assertValid(); | 344 timing.assertValid(); |
320 | 345 |
(...skipping 295 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
616 break; | 641 break; |
617 default: | 642 default: |
618 ASSERT_NOT_REACHED(); | 643 ASSERT_NOT_REACHED(); |
619 } | 644 } |
620 animations.append(animation.release()); | 645 animations.append(animation.release()); |
621 } | 646 } |
622 ASSERT(!animations.isEmpty()); | 647 ASSERT(!animations.isEmpty()); |
623 } | 648 } |
624 | 649 |
625 } // namespace blink | 650 } // namespace blink |
OLD | NEW |