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 25 matching lines...) Expand all Loading... |
36 #include "core/animation/animatable/AnimatableDouble.h" | 36 #include "core/animation/animatable/AnimatableDouble.h" |
37 #include "core/animation/animatable/AnimatableFilterOperations.h" | 37 #include "core/animation/animatable/AnimatableFilterOperations.h" |
38 #include "core/animation/animatable/AnimatableTransform.h" | 38 #include "core/animation/animatable/AnimatableTransform.h" |
39 #include "core/animation/animatable/AnimatableValue.h" | 39 #include "core/animation/animatable/AnimatableValue.h" |
40 #include "core/rendering/RenderBoxModelObject.h" | 40 #include "core/rendering/RenderBoxModelObject.h" |
41 #include "core/rendering/RenderLayer.h" | 41 #include "core/rendering/RenderLayer.h" |
42 #include "core/rendering/RenderObject.h" | 42 #include "core/rendering/RenderObject.h" |
43 #include "core/rendering/compositing/CompositedLayerMapping.h" | 43 #include "core/rendering/compositing/CompositedLayerMapping.h" |
44 #include "platform/geometry/FloatBox.h" | 44 #include "platform/geometry/FloatBox.h" |
45 #include "public/platform/Platform.h" | 45 #include "public/platform/Platform.h" |
46 #include "public/platform/WebAnimation.h" | 46 #include "public/platform/WebCompositorAnimation.h" |
47 #include "public/platform/WebCompositorSupport.h" | 47 #include "public/platform/WebCompositorSupport.h" |
48 #include "public/platform/WebFilterAnimationCurve.h" | 48 #include "public/platform/WebFilterAnimationCurve.h" |
49 #include "public/platform/WebFilterKeyframe.h" | 49 #include "public/platform/WebFilterKeyframe.h" |
50 #include "public/platform/WebFloatAnimationCurve.h" | 50 #include "public/platform/WebFloatAnimationCurve.h" |
51 #include "public/platform/WebFloatKeyframe.h" | 51 #include "public/platform/WebFloatKeyframe.h" |
52 #include "public/platform/WebTransformAnimationCurve.h" | 52 #include "public/platform/WebTransformAnimationCurve.h" |
53 #include "public/platform/WebTransformKeyframe.h" | 53 #include "public/platform/WebTransformKeyframe.h" |
54 | 54 |
55 #include <algorithm> | 55 #include <algorithm> |
56 #include <cmath> | 56 #include <cmath> |
(...skipping 193 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
250 { | 250 { |
251 ASSERT(startedAnimationIds.isEmpty()); | 251 ASSERT(startedAnimationIds.isEmpty()); |
252 ASSERT(isCandidateForAnimationOnCompositor(timing, effect)); | 252 ASSERT(isCandidateForAnimationOnCompositor(timing, effect)); |
253 ASSERT(canStartAnimationOnCompositor(element)); | 253 ASSERT(canStartAnimationOnCompositor(element)); |
254 | 254 |
255 const KeyframeEffectModelBase& keyframeEffect = toKeyframeEffectModelBase(ef
fect); | 255 const KeyframeEffectModelBase& keyframeEffect = toKeyframeEffectModelBase(ef
fect); |
256 | 256 |
257 RenderLayer* layer = toRenderBoxModelObject(element.renderer())->layer(); | 257 RenderLayer* layer = toRenderBoxModelObject(element.renderer())->layer(); |
258 ASSERT(layer); | 258 ASSERT(layer); |
259 | 259 |
260 Vector<OwnPtr<blink::WebAnimation> > animations; | 260 Vector<OwnPtr<WebCompositorAnimation> > animations; |
261 CompositorAnimationsImpl::getAnimationOnCompositor(timing, startTime, keyfra
meEffect, animations); | 261 CompositorAnimationsImpl::getAnimationOnCompositor(timing, startTime, keyfra
meEffect, animations); |
262 ASSERT(!animations.isEmpty()); | 262 ASSERT(!animations.isEmpty()); |
263 for (size_t i = 0; i < animations.size(); ++i) { | 263 for (size_t i = 0; i < animations.size(); ++i) { |
264 int id = animations[i]->id(); | 264 int id = animations[i]->id(); |
265 if (!layer->compositedLayerMapping()->mainGraphicsLayer()->addAnimation(
animations[i].release())) { | 265 if (!layer->compositedLayerMapping()->mainGraphicsLayer()->addAnimation(
animations[i].release())) { |
266 // FIXME: We should know ahead of time whether these animations can
be started. | 266 // FIXME: We should know ahead of time whether these animations can
be started. |
267 for (size_t j = 0; j < startedAnimationIds.size(); ++j) | 267 for (size_t j = 0; j < startedAnimationIds.size(); ++j) |
268 cancelAnimationOnCompositor(element, startedAnimationIds[j]); | 268 cancelAnimationOnCompositor(element, startedAnimationIds[j]); |
269 startedAnimationIds.clear(); | 269 startedAnimationIds.clear(); |
270 return false; | 270 return false; |
(...skipping 88 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
359 template<typename PlatformAnimationCurveType, typename PlatformAnimationKeyframe
Type> | 359 template<typename PlatformAnimationCurveType, typename PlatformAnimationKeyframe
Type> |
360 void addKeyframeWithTimingFunction(PlatformAnimationCurveType& curve, const Plat
formAnimationKeyframeType& keyframe, const TimingFunction* timingFunction) | 360 void addKeyframeWithTimingFunction(PlatformAnimationCurveType& curve, const Plat
formAnimationKeyframeType& keyframe, const TimingFunction* timingFunction) |
361 { | 361 { |
362 if (!timingFunction) { | 362 if (!timingFunction) { |
363 curve.add(keyframe); | 363 curve.add(keyframe); |
364 return; | 364 return; |
365 } | 365 } |
366 | 366 |
367 switch (timingFunction->type()) { | 367 switch (timingFunction->type()) { |
368 case TimingFunction::LinearFunction: | 368 case TimingFunction::LinearFunction: |
369 curve.add(keyframe, blink::WebAnimationCurve::TimingFunctionTypeLinear); | 369 curve.add(keyframe, WebCompositorAnimationCurve::TimingFunctionTypeLinea
r); |
370 return; | 370 return; |
371 | 371 |
372 case TimingFunction::CubicBezierFunction: { | 372 case TimingFunction::CubicBezierFunction: { |
373 const CubicBezierTimingFunction* cubic = toCubicBezierTimingFunction(tim
ingFunction); | 373 const CubicBezierTimingFunction* cubic = toCubicBezierTimingFunction(tim
ingFunction); |
374 | 374 |
375 if (cubic->subType() == CubicBezierTimingFunction::Custom) { | 375 if (cubic->subType() == CubicBezierTimingFunction::Custom) { |
376 curve.add(keyframe, cubic->x1(), cubic->y1(), cubic->x2(), cubic->y2
()); | 376 curve.add(keyframe, cubic->x1(), cubic->y1(), cubic->x2(), cubic->y2
()); |
377 } else { | 377 } else { |
378 | 378 |
379 blink::WebAnimationCurve::TimingFunctionType easeType; | 379 WebCompositorAnimationCurve::TimingFunctionType easeType; |
380 switch (cubic->subType()) { | 380 switch (cubic->subType()) { |
381 case CubicBezierTimingFunction::Ease: | 381 case CubicBezierTimingFunction::Ease: |
382 easeType = blink::WebAnimationCurve::TimingFunctionTypeEase; | 382 easeType = WebCompositorAnimationCurve::TimingFunctionTypeEase; |
383 break; | 383 break; |
384 case CubicBezierTimingFunction::EaseIn: | 384 case CubicBezierTimingFunction::EaseIn: |
385 easeType = blink::WebAnimationCurve::TimingFunctionTypeEaseIn; | 385 easeType = WebCompositorAnimationCurve::TimingFunctionTypeEaseIn
; |
386 break; | 386 break; |
387 case CubicBezierTimingFunction::EaseOut: | 387 case CubicBezierTimingFunction::EaseOut: |
388 easeType = blink::WebAnimationCurve::TimingFunctionTypeEaseOut; | 388 easeType = WebCompositorAnimationCurve::TimingFunctionTypeEaseOu
t; |
389 break; | 389 break; |
390 case CubicBezierTimingFunction::EaseInOut: | 390 case CubicBezierTimingFunction::EaseInOut: |
391 easeType = blink::WebAnimationCurve::TimingFunctionTypeEaseInOut
; | 391 easeType = WebCompositorAnimationCurve::TimingFunctionTypeEaseIn
Out; |
392 break; | 392 break; |
393 | 393 |
394 // Custom Bezier are handled seperately. | 394 // Custom Bezier are handled seperately. |
395 case CubicBezierTimingFunction::Custom: | 395 case CubicBezierTimingFunction::Custom: |
396 default: | 396 default: |
397 ASSERT_NOT_REACHED(); | 397 ASSERT_NOT_REACHED(); |
398 return; | 398 return; |
399 } | 399 } |
400 | 400 |
401 curve.add(keyframe, easeType); | 401 curve.add(keyframe, easeType); |
402 } | 402 } |
403 return; | 403 return; |
404 } | 404 } |
405 | 405 |
406 case TimingFunction::StepsFunction: | 406 case TimingFunction::StepsFunction: |
407 default: | 407 default: |
408 ASSERT_NOT_REACHED(); | 408 ASSERT_NOT_REACHED(); |
409 return; | 409 return; |
410 } | 410 } |
411 } | 411 } |
412 | 412 |
413 } // namespace anoymous | 413 } // namespace anoymous |
414 | 414 |
415 void CompositorAnimationsImpl::addKeyframesToCurve(blink::WebAnimationCurve& cur
ve, const PropertySpecificKeyframeVector& keyframes, bool reverse) | 415 void CompositorAnimationsImpl::addKeyframesToCurve(WebCompositorAnimationCurve&
curve, const PropertySpecificKeyframeVector& keyframes, bool reverse) |
416 { | 416 { |
417 for (size_t i = 0; i < keyframes.size(); i++) { | 417 for (size_t i = 0; i < keyframes.size(); i++) { |
418 RefPtr<TimingFunction> reversedTimingFunction; | 418 RefPtr<TimingFunction> reversedTimingFunction; |
419 const TimingFunction* keyframeTimingFunction = 0; | 419 const TimingFunction* keyframeTimingFunction = 0; |
420 if (i < keyframes.size() - 1) { // Ignore timing function of last frame. | 420 if (i < keyframes.size() - 1) { // Ignore timing function of last frame. |
421 if (reverse) { | 421 if (reverse) { |
422 reversedTimingFunction = CompositorAnimationsTimingFunctionRever
ser::reverse(keyframes[i + 1]->easing()); | 422 reversedTimingFunction = CompositorAnimationsTimingFunctionRever
ser::reverse(keyframes[i + 1]->easing()); |
423 keyframeTimingFunction = reversedTimingFunction.get(); | 423 keyframeTimingFunction = reversedTimingFunction.get(); |
424 } else { | 424 } else { |
425 keyframeTimingFunction = keyframes[i]->easing(); | 425 keyframeTimingFunction = keyframes[i]->easing(); |
426 } | 426 } |
427 } | 427 } |
428 | 428 |
429 // FIXME: This relies on StringKeyframes being eagerly evaluated, which
will | 429 // FIXME: This relies on StringKeyframes being eagerly evaluated, which
will |
430 // not happen eventually. Instead we should extract the CSSValue here | 430 // not happen eventually. Instead we should extract the CSSValue here |
431 // and convert using another set of toAnimatableXXXOperations functions. | 431 // and convert using another set of toAnimatableXXXOperations functions. |
432 const AnimatableValue* value = keyframes[i]->getAnimatableValue().get(); | 432 const AnimatableValue* value = keyframes[i]->getAnimatableValue().get(); |
433 | 433 |
434 switch (curve.type()) { | 434 switch (curve.type()) { |
435 case blink::WebAnimationCurve::AnimationCurveTypeFilter: { | 435 case WebCompositorAnimationCurve::AnimationCurveTypeFilter: { |
436 OwnPtr<blink::WebFilterOperations> ops = adoptPtr(blink::Platform::c
urrent()->compositorSupport()->createFilterOperations()); | 436 OwnPtr<WebFilterOperations> ops = adoptPtr(Platform::current()->comp
ositorSupport()->createFilterOperations()); |
437 toWebFilterOperations(toAnimatableFilterOperations(value)->operation
s(), ops.get()); | 437 toWebFilterOperations(toAnimatableFilterOperations(value)->operation
s(), ops.get()); |
438 | 438 |
439 blink::WebFilterKeyframe filterKeyframe(keyframes[i]->offset(), ops.
release()); | 439 WebFilterKeyframe filterKeyframe(keyframes[i]->offset(), ops.release
()); |
440 blink::WebFilterAnimationCurve* filterCurve = static_cast<blink::Web
FilterAnimationCurve*>(&curve); | 440 WebFilterAnimationCurve* filterCurve = static_cast<WebFilterAnimatio
nCurve*>(&curve); |
441 addKeyframeWithTimingFunction(*filterCurve, filterKeyframe, keyframe
TimingFunction); | 441 addKeyframeWithTimingFunction(*filterCurve, filterKeyframe, keyframe
TimingFunction); |
442 break; | 442 break; |
443 } | 443 } |
444 case blink::WebAnimationCurve::AnimationCurveTypeFloat: { | 444 case WebCompositorAnimationCurve::AnimationCurveTypeFloat: { |
445 blink::WebFloatKeyframe floatKeyframe(keyframes[i]->offset(), toAnim
atableDouble(value)->toDouble()); | 445 WebFloatKeyframe floatKeyframe(keyframes[i]->offset(), toAnimatableD
ouble(value)->toDouble()); |
446 blink::WebFloatAnimationCurve* floatCurve = static_cast<blink::WebFl
oatAnimationCurve*>(&curve); | 446 WebFloatAnimationCurve* floatCurve = static_cast<WebFloatAnimationCu
rve*>(&curve); |
447 addKeyframeWithTimingFunction(*floatCurve, floatKeyframe, keyframeTi
mingFunction); | 447 addKeyframeWithTimingFunction(*floatCurve, floatKeyframe, keyframeTi
mingFunction); |
448 break; | 448 break; |
449 } | 449 } |
450 case blink::WebAnimationCurve::AnimationCurveTypeTransform: { | 450 case WebCompositorAnimationCurve::AnimationCurveTypeTransform: { |
451 OwnPtr<blink::WebTransformOperations> ops = adoptPtr(blink::Platform
::current()->compositorSupport()->createTransformOperations()); | 451 OwnPtr<WebTransformOperations> ops = adoptPtr(Platform::current()->c
ompositorSupport()->createTransformOperations()); |
452 toWebTransformOperations(toAnimatableTransform(value)->transformOper
ations(), ops.get()); | 452 toWebTransformOperations(toAnimatableTransform(value)->transformOper
ations(), ops.get()); |
453 | 453 |
454 blink::WebTransformKeyframe transformKeyframe(keyframes[i]->offset()
, ops.release()); | 454 WebTransformKeyframe transformKeyframe(keyframes[i]->offset(), ops.r
elease()); |
455 blink::WebTransformAnimationCurve* transformCurve = static_cast<blin
k::WebTransformAnimationCurve*>(&curve); | 455 WebTransformAnimationCurve* transformCurve = static_cast<WebTransfor
mAnimationCurve*>(&curve); |
456 addKeyframeWithTimingFunction(*transformCurve, transformKeyframe, ke
yframeTimingFunction); | 456 addKeyframeWithTimingFunction(*transformCurve, transformKeyframe, ke
yframeTimingFunction); |
457 break; | 457 break; |
458 } | 458 } |
459 default: | 459 default: |
460 ASSERT_NOT_REACHED(); | 460 ASSERT_NOT_REACHED(); |
461 } | 461 } |
462 } | 462 } |
463 } | 463 } |
464 | 464 |
465 void CompositorAnimationsImpl::getAnimationOnCompositor(const Timing& timing, do
uble startTime, const KeyframeEffectModelBase& effect, Vector<OwnPtr<blink::WebA
nimation> >& animations) | 465 void CompositorAnimationsImpl::getAnimationOnCompositor(const Timing& timing, do
uble startTime, const KeyframeEffectModelBase& effect, Vector<OwnPtr<WebComposit
orAnimation> >& animations) |
466 { | 466 { |
467 ASSERT(animations.isEmpty()); | 467 ASSERT(animations.isEmpty()); |
468 CompositorTiming compositorTiming; | 468 CompositorTiming compositorTiming; |
469 bool timingValid = convertTimingForCompositor(timing, compositorTiming); | 469 bool timingValid = convertTimingForCompositor(timing, compositorTiming); |
470 ASSERT_UNUSED(timingValid, timingValid); | 470 ASSERT_UNUSED(timingValid, timingValid); |
471 | 471 |
472 PropertySet properties = effect.properties(); | 472 PropertySet properties = effect.properties(); |
473 ASSERT(!properties.isEmpty()); | 473 ASSERT(!properties.isEmpty()); |
474 for (PropertySet::iterator it = properties.begin(); it != properties.end();
++it) { | 474 for (PropertySet::iterator it = properties.begin(); it != properties.end();
++it) { |
475 | 475 |
476 PropertySpecificKeyframeVector values; | 476 PropertySpecificKeyframeVector values; |
477 getKeyframeValuesForProperty(&effect, *it, compositorTiming.scaledDurati
on, compositorTiming.reverse, values); | 477 getKeyframeValuesForProperty(&effect, *it, compositorTiming.scaledDurati
on, compositorTiming.reverse, values); |
478 | 478 |
479 blink::WebAnimation::TargetProperty targetProperty; | 479 WebCompositorAnimation::TargetProperty targetProperty; |
480 OwnPtr<blink::WebAnimationCurve> curve; | 480 OwnPtr<WebCompositorAnimationCurve> curve; |
481 switch (*it) { | 481 switch (*it) { |
482 case CSSPropertyOpacity: { | 482 case CSSPropertyOpacity: { |
483 targetProperty = blink::WebAnimation::TargetPropertyOpacity; | 483 targetProperty = WebCompositorAnimation::TargetPropertyOpacity; |
484 | 484 |
485 blink::WebFloatAnimationCurve* floatCurve = blink::Platform::current
()->compositorSupport()->createFloatAnimationCurve(); | 485 WebFloatAnimationCurve* floatCurve = Platform::current()->compositor
Support()->createFloatAnimationCurve(); |
486 addKeyframesToCurve(*floatCurve, values, compositorTiming.reverse); | 486 addKeyframesToCurve(*floatCurve, values, compositorTiming.reverse); |
487 curve = adoptPtr(floatCurve); | 487 curve = adoptPtr(floatCurve); |
488 break; | 488 break; |
489 } | 489 } |
490 case CSSPropertyWebkitFilter: { | 490 case CSSPropertyWebkitFilter: { |
491 targetProperty = blink::WebAnimation::TargetPropertyFilter; | 491 targetProperty = WebCompositorAnimation::TargetPropertyFilter; |
492 blink::WebFilterAnimationCurve* filterCurve = blink::Platform::curre
nt()->compositorSupport()->createFilterAnimationCurve(); | 492 WebFilterAnimationCurve* filterCurve = Platform::current()->composit
orSupport()->createFilterAnimationCurve(); |
493 addKeyframesToCurve(*filterCurve, values, compositorTiming.reverse); | 493 addKeyframesToCurve(*filterCurve, values, compositorTiming.reverse); |
494 curve = adoptPtr(filterCurve); | 494 curve = adoptPtr(filterCurve); |
495 break; | 495 break; |
496 } | 496 } |
497 case CSSPropertyTransform: { | 497 case CSSPropertyTransform: { |
498 targetProperty = blink::WebAnimation::TargetPropertyTransform; | 498 targetProperty = WebCompositorAnimation::TargetPropertyTransform; |
499 blink::WebTransformAnimationCurve* transformCurve = blink::Platform:
:current()->compositorSupport()->createTransformAnimationCurve(); | 499 WebTransformAnimationCurve* transformCurve = Platform::current()->co
mpositorSupport()->createTransformAnimationCurve(); |
500 addKeyframesToCurve(*transformCurve, values, compositorTiming.revers
e); | 500 addKeyframesToCurve(*transformCurve, values, compositorTiming.revers
e); |
501 curve = adoptPtr(transformCurve); | 501 curve = adoptPtr(transformCurve); |
502 break; | 502 break; |
503 } | 503 } |
504 default: | 504 default: |
505 ASSERT_NOT_REACHED(); | 505 ASSERT_NOT_REACHED(); |
506 continue; | 506 continue; |
507 } | 507 } |
508 ASSERT(curve.get()); | 508 ASSERT(curve.get()); |
509 | 509 |
510 OwnPtr<blink::WebAnimation> animation = adoptPtr(blink::Platform::curren
t()->compositorSupport()->createAnimation(*curve, targetProperty)); | 510 OwnPtr<WebCompositorAnimation> animation = adoptPtr(Platform::current()-
>compositorSupport()->createAnimation(*curve, targetProperty)); |
511 | 511 |
512 if (!std::isnan(startTime)) | 512 if (!std::isnan(startTime)) |
513 animation->setStartTime(startTime); | 513 animation->setStartTime(startTime); |
514 | 514 |
515 animation->setIterations(compositorTiming.adjustedIterationCount); | 515 animation->setIterations(compositorTiming.adjustedIterationCount); |
516 animation->setTimeOffset(compositorTiming.scaledTimeOffset); | 516 animation->setTimeOffset(compositorTiming.scaledTimeOffset); |
517 animation->setAlternatesDirection(compositorTiming.alternate); | 517 animation->setAlternatesDirection(compositorTiming.alternate); |
518 | 518 |
519 animations.append(animation.release()); | 519 animations.append(animation.release()); |
520 } | 520 } |
521 ASSERT(!animations.isEmpty()); | 521 ASSERT(!animations.isEmpty()); |
522 } | 522 } |
523 | 523 |
524 } // namespace blink | 524 } // namespace blink |
OLD | NEW |