void CompositorAnimationsImpl::getAnimationOnCompositor(const Timing& timing, const KeyframeEffectModel& effect, Vector<OwnPtr<blink::WebAnimation> >& animations) { ASSERT(animations.isEmpty()); CompositorTiming compositorTiming; bool timingValid = convertTimingForCompositor(timing, compositorTiming); ASSERT_UNUSED(timingValid, timingValid); RefPtr<TimingFunction> timingFunction = timing.timingFunction; if (compositorTiming.reverse) timingFunction = CompositorAnimationsTimingFunctionReverser::reverse(timingFunction.get()); PropertySet properties = effect.properties(); ASSERT(!properties.isEmpty()); for (PropertySet::iterator it = properties.begin(); it != properties.end(); ++it) { KeyframeVector values; getKeyframeValuesForProperty(&effect, *it, compositorTiming.scaledDuration, compositorTiming.reverse, values); blink::WebAnimation::TargetProperty targetProperty; OwnPtr<blink::WebAnimationCurve> curve; switch (*it) { case CSSPropertyOpacity: { targetProperty = blink::WebAnimation::TargetPropertyOpacity; blink::WebFloatAnimationCurve* floatCurve = blink::Platform::current()->compositorSupport()->createFloatAnimationCurve(); addKeyframesToCurve(*floatCurve, values, *timingFunction.get()); curve = adoptPtr(floatCurve); break; } case CSSPropertyWebkitFilter: { targetProperty = blink::WebAnimation::TargetPropertyFilter; blink::WebFilterAnimationCurve* filterCurve = blink::Platform::current()->compositorSupport()->createFilterAnimationCurve(); addKeyframesToCurve(*filterCurve, values, *timingFunction); curve = adoptPtr(filterCurve); break; } case CSSPropertyWebkitTransform: { targetProperty = blink::WebAnimation::TargetPropertyTransform; blink::WebTransformAnimationCurve* transformCurve = blink::Platform::current()->compositorSupport()->createTransformAnimationCurve(); addKeyframesToCurve(*transformCurve, values, *timingFunction.get()); curve = adoptPtr(transformCurve); break; } default: ASSERT_NOT_REACHED(); continue; } ASSERT(curve.get()); OwnPtr<blink::WebAnimation> animation = adoptPtr(blink::Platform::current()->compositorSupport()->createAnimation(*curve, targetProperty)); animation->setIterations(compositorTiming.adjustedIterationCount); animation->setTimeOffset(compositorTiming.scaledTimeOffset); animation->setAlternatesDirection(compositorTiming.alternate); animations.append(animation.release()); } ASSERT(!animations.isEmpty()); }
void CompositorAnimationsImpl::getAnimationOnCompositor(const Timing& timing, int group, double startTime, double timeOffset, const KeyframeEffectModelBase& effect, Vector<OwnPtr<WebCompositorAnimation>>& animations, double playerPlaybackRate) { ASSERT(animations.isEmpty()); CompositorTiming compositorTiming; bool timingValid = convertTimingForCompositor(timing, timeOffset, compositorTiming, playerPlaybackRate); ASSERT_UNUSED(timingValid, timingValid); PropertySet properties = effect.properties(); ASSERT(!properties.isEmpty()); for (const auto& property : properties) { PropertySpecificKeyframeVector values; getKeyframeValuesForProperty(&effect, property, compositorTiming.scaledDuration, values); WebCompositorAnimation::TargetProperty targetProperty; OwnPtr<WebCompositorAnimationCurve> curve; switch (property) { case CSSPropertyOpacity: { targetProperty = WebCompositorAnimation::TargetPropertyOpacity; WebFloatAnimationCurve* floatCurve = Platform::current()->compositorSupport()->createFloatAnimationCurve(); addKeyframesToCurve(*floatCurve, values, timing); setTimingFunctionOnCurve(*floatCurve, timing.timingFunction.get()); curve = adoptPtr(floatCurve); break; } case CSSPropertyWebkitFilter: { targetProperty = WebCompositorAnimation::TargetPropertyFilter; WebFilterAnimationCurve* filterCurve = Platform::current()->compositorSupport()->createFilterAnimationCurve(); addKeyframesToCurve(*filterCurve, values, timing); setTimingFunctionOnCurve(*filterCurve, timing.timingFunction.get()); curve = adoptPtr(filterCurve); break; } case CSSPropertyTransform: { targetProperty = WebCompositorAnimation::TargetPropertyTransform; WebTransformAnimationCurve* transformCurve = Platform::current()->compositorSupport()->createTransformAnimationCurve(); addKeyframesToCurve(*transformCurve, values, timing); setTimingFunctionOnCurve(*transformCurve, timing.timingFunction.get()); curve = adoptPtr(transformCurve); break; } default: ASSERT_NOT_REACHED(); continue; } ASSERT(curve.get()); OwnPtr<WebCompositorAnimation> animation = adoptPtr(Platform::current()->compositorSupport()->createAnimation(*curve, targetProperty, group, 0)); if (!std::isnan(startTime)) animation->setStartTime(startTime); animation->setIterations(compositorTiming.adjustedIterationCount); animation->setIterationStart(compositorTiming.iterationStart); animation->setTimeOffset(compositorTiming.scaledTimeOffset); switch (compositorTiming.direction) { case Timing::PlaybackDirectionNormal: animation->setDirection(blink::WebCompositorAnimation::DirectionNormal); break; case Timing::PlaybackDirectionReverse: animation->setDirection(blink::WebCompositorAnimation::DirectionReverse); break; case Timing::PlaybackDirectionAlternate: animation->setDirection(blink::WebCompositorAnimation::DirectionAlternate); break; case Timing::PlaybackDirectionAlternateReverse: animation->setDirection(blink::WebCompositorAnimation::DirectionAlternateReverse); break; default: ASSERT_NOT_REACHED(); } animation->setPlaybackRate(compositorTiming.playbackRate); switch (compositorTiming.fillMode) { case Timing::FillModeNone: animation->setFillMode(blink::WebCompositorAnimation::FillModeNone); break; case Timing::FillModeForwards: animation->setFillMode(blink::WebCompositorAnimation::FillModeForwards); break; case Timing::FillModeBackwards: animation->setFillMode(blink::WebCompositorAnimation::FillModeBackwards); break; case Timing::FillModeBoth: animation->setFillMode(blink::WebCompositorAnimation::FillModeBoth); break; default: ASSERT_NOT_REACHED(); } animations.append(animation.release()); } ASSERT(!animations.isEmpty()); }