1f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)// Copyright 2014 The Chromium Authors. All rights reserved. 25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file. 45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)#include "cc/blink/web_animation_impl.h" 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 72a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/animation/animation.h" 82a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/animation/animation_curve.h" 92a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/animation/animation_id_provider.h" 1003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)#include "cc/blink/web_filter_animation_curve_impl.h" 1103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)#include "cc/blink/web_float_animation_curve_impl.h" 1203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)#include "cc/blink/web_scroll_offset_animation_curve_impl.h" 1303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)#include "cc/blink/web_transform_animation_curve_impl.h" 1403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)#include "third_party/WebKit/public/platform/WebCompositorAnimationCurve.h" 155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)using cc::Animation; 172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)using cc::AnimationIdProvider; 185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 195f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)using blink::WebCompositorAnimation; 205f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)using blink::WebCompositorAnimationCurve; 215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)namespace cc_blink { 235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 245f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)WebCompositorAnimationImpl::WebCompositorAnimationImpl( 255f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) const WebCompositorAnimationCurve& web_curve, 265f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) TargetProperty target_property, 275f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) int animation_id, 285f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) int group_id) { 292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!animation_id) 302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) animation_id = AnimationIdProvider::NextAnimationId(); 312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!group_id) 322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) group_id = AnimationIdProvider::NextGroupId(); 332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 345f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) WebCompositorAnimationCurve::AnimationCurveType curve_type = web_curve.type(); 352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_ptr<cc::AnimationCurve> curve; 362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) switch (curve_type) { 375f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) case WebCompositorAnimationCurve::AnimationCurveTypeFloat: { 382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const WebFloatAnimationCurveImpl* float_curve_impl = 392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) static_cast<const WebFloatAnimationCurveImpl*>(&web_curve); 402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) curve = float_curve_impl->CloneToAnimationCurve(); 412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) break; 425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 435f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) case WebCompositorAnimationCurve::AnimationCurveTypeTransform: { 442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const WebTransformAnimationCurveImpl* transform_curve_impl = 452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) static_cast<const WebTransformAnimationCurveImpl*>(&web_curve); 462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) curve = transform_curve_impl->CloneToAnimationCurve(); 472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) break; 485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 495f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) case WebCompositorAnimationCurve::AnimationCurveTypeFilter: { 504e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) const WebFilterAnimationCurveImpl* filter_curve_impl = 514e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) static_cast<const WebFilterAnimationCurveImpl*>(&web_curve); 524e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) curve = filter_curve_impl->CloneToAnimationCurve(); 534e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) break; 544e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) } 555f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) case WebCompositorAnimationCurve::AnimationCurveTypeScrollOffset: { 565d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const WebScrollOffsetAnimationCurveImpl* scroll_curve_impl = 575d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) static_cast<const WebScrollOffsetAnimationCurveImpl*>(&web_curve); 585d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) curve = scroll_curve_impl->CloneToAnimationCurve(); 595d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) break; 605d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) animation_ = Animation::Create( 632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) curve.Pass(), 642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) animation_id, 652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) group_id, 662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) static_cast<cc::Animation::TargetProperty>(target_property)); 675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 695f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)WebCompositorAnimationImpl::~WebCompositorAnimationImpl() { 70f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)} 715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 725f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)int WebCompositorAnimationImpl::id() { 73f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) return animation_->id(); 74f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)} 755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 765f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)blink::WebCompositorAnimation::TargetProperty 775f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)WebCompositorAnimationImpl::targetProperty() const { 785f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) return static_cast<WebCompositorAnimationImpl::TargetProperty>( 792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) animation_->target_property()); 805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 826e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)double WebCompositorAnimationImpl::iterations() const { 836e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) return animation_->iterations(); 846e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)} 856e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) 866e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)void WebCompositorAnimationImpl::setIterations(double n) { 876e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) animation_->set_iterations(n); 886e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)} 891320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 901320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccidouble WebCompositorAnimationImpl::iterationStart() const { 911320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return animation_->iteration_start(); 92f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)} 935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 941320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccivoid WebCompositorAnimationImpl::setIterationStart(double iteration_start) { 951320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci animation_->set_iteration_start(iteration_start); 96f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)} 975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 985f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)double WebCompositorAnimationImpl::startTime() const { 99cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) return (animation_->start_time() - base::TimeTicks()).InSecondsF(); 100cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)} 1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1025f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)void WebCompositorAnimationImpl::setStartTime(double monotonic_time) { 103cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) animation_->set_start_time(base::TimeTicks::FromInternalValue( 104cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) monotonic_time * base::Time::kMicrosecondsPerSecond)); 1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1075f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)double WebCompositorAnimationImpl::timeOffset() const { 108cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) return animation_->time_offset().InSecondsF(); 1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1115f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)void WebCompositorAnimationImpl::setTimeOffset(double monotonic_time) { 112cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) animation_->set_time_offset(base::TimeDelta::FromSecondsD(monotonic_time)); 1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1155f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)blink::WebCompositorAnimation::Direction WebCompositorAnimationImpl::direction() 1165f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) const { 117010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) switch (animation_->direction()) { 118010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) case cc::Animation::Normal: 119010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) return DirectionNormal; 120010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) case cc::Animation::Reverse: 121010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) return DirectionReverse; 122010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) case cc::Animation::Alternate: 123010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) return DirectionAlternate; 124010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) case cc::Animation::AlternateReverse: 125010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) return DirectionAlternateReverse; 126010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) default: 127010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) NOTREACHED(); 128010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) } 129010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) return DirectionNormal; 130010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)} 131010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 1325f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)void WebCompositorAnimationImpl::setDirection(Direction direction) { 133010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) switch (direction) { 134010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) case DirectionNormal: 135010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) animation_->set_direction(cc::Animation::Normal); 136010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) break; 137010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) case DirectionReverse: 138010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) animation_->set_direction(cc::Animation::Reverse); 139010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) break; 140010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) case DirectionAlternate: 141010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) animation_->set_direction(cc::Animation::Alternate); 142010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) break; 143010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) case DirectionAlternateReverse: 144010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) animation_->set_direction(cc::Animation::AlternateReverse); 145010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) break; 146010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) } 147010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)} 1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 14903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)double WebCompositorAnimationImpl::playbackRate() const { 15003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) return animation_->playback_rate(); 15103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)} 15203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) 15303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)void WebCompositorAnimationImpl::setPlaybackRate(double playback_rate) { 15403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) animation_->set_playback_rate(playback_rate); 15503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)} 15603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) 1571320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#if WEB_ANIMATION_SUPPORTS_FILL_MODE 1581320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucciblink::WebCompositorAnimation::FillMode WebCompositorAnimationImpl::fillMode() 1591320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci const { 1601320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci switch (animation_->fill_mode()) { 1611320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci case cc::Animation::FillModeNone: 1621320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return FillModeNone; 1631320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci case cc::Animation::FillModeForwards: 1641320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return FillModeForwards; 1651320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci case cc::Animation::FillModeBackwards: 1661320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return FillModeBackwards; 1671320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci case cc::Animation::FillModeBoth: 1681320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return FillModeBoth; 1691320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci default: 1701320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci NOTREACHED(); 1711320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 1721320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return FillModeNone; 1731320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci} 1741320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 1751320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccivoid WebCompositorAnimationImpl::setFillMode(FillMode fill_mode) { 1761320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci switch (fill_mode) { 1771320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci case FillModeNone: 1781320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci animation_->set_fill_mode(cc::Animation::FillModeNone); 1791320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci break; 1801320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci case FillModeForwards: 1811320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci animation_->set_fill_mode(cc::Animation::FillModeForwards); 1821320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci break; 1831320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci case FillModeBackwards: 1841320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci animation_->set_fill_mode(cc::Animation::FillModeBackwards); 1851320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci break; 1861320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci case FillModeBoth: 1871320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci animation_->set_fill_mode(cc::Animation::FillModeBoth); 1881320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci break; 1891320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 1901320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci} 1911320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#endif 1925f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)scoped_ptr<cc::Animation> WebCompositorAnimationImpl::PassAnimation() { 1938bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) animation_->set_needs_synchronized_start_time(true); 1948bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) return animation_.Pass(); 1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 19703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)} // namespace cc_blink 198