1 // Copyright 2012 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
5 #include "webkit/renderer/compositor_bindings/web_animation_impl.h"
7 #include "cc/animation/animation.h"
8 #include "cc/animation/animation_curve.h"
9 #include "cc/animation/animation_id_provider.h"
10 #include "third_party/WebKit/public/platform/WebAnimation.h"
11 #include "third_party/WebKit/public/platform/WebAnimationCurve.h"
12 #include "webkit/renderer/compositor_bindings/web_filter_animation_curve_impl.h"
13 #include "webkit/renderer/compositor_bindings/web_float_animation_curve_impl.h"
14 #include "webkit/renderer/compositor_bindings/web_scroll_offset_animation_curve_impl.h"
15 #include "webkit/renderer/compositor_bindings/web_transform_animation_curve_impl.h"
18 using cc::AnimationIdProvider;
20 using blink::WebAnimation;
21 using blink::WebAnimationCurve;
25 WebAnimationImpl::WebAnimationImpl(const WebAnimationCurve& web_curve,
26 TargetProperty target_property,
30 animation_id = AnimationIdProvider::NextAnimationId();
32 group_id = AnimationIdProvider::NextGroupId();
34 WebAnimationCurve::AnimationCurveType curve_type = web_curve.type();
35 scoped_ptr<cc::AnimationCurve> curve;
37 case WebAnimationCurve::AnimationCurveTypeFloat: {
38 const WebFloatAnimationCurveImpl* float_curve_impl =
39 static_cast<const WebFloatAnimationCurveImpl*>(&web_curve);
40 curve = float_curve_impl->CloneToAnimationCurve();
43 case WebAnimationCurve::AnimationCurveTypeTransform: {
44 const WebTransformAnimationCurveImpl* transform_curve_impl =
45 static_cast<const WebTransformAnimationCurveImpl*>(&web_curve);
46 curve = transform_curve_impl->CloneToAnimationCurve();
49 case WebAnimationCurve::AnimationCurveTypeFilter: {
50 const WebFilterAnimationCurveImpl* filter_curve_impl =
51 static_cast<const WebFilterAnimationCurveImpl*>(&web_curve);
52 curve = filter_curve_impl->CloneToAnimationCurve();
55 #if WEB_SCROLL_OFFSET_ANIMATION_CURVE_IS_DEFINED
56 case WebAnimationCurve::AnimationCurveTypeScrollOffset: {
57 const WebScrollOffsetAnimationCurveImpl* scroll_curve_impl =
58 static_cast<const WebScrollOffsetAnimationCurveImpl*>(&web_curve);
59 curve = scroll_curve_impl->CloneToAnimationCurve();
64 animation_ = Animation::Create(
68 static_cast<cc::Animation::TargetProperty>(target_property));
71 WebAnimationImpl::~WebAnimationImpl() {}
73 int WebAnimationImpl::id() { return animation_->id(); }
75 blink::WebAnimation::TargetProperty WebAnimationImpl::targetProperty() const {
76 return static_cast<WebAnimationImpl::TargetProperty>(
77 animation_->target_property());
80 int WebAnimationImpl::iterations() const { return animation_->iterations(); }
82 void WebAnimationImpl::setIterations(int n) { animation_->set_iterations(n); }
84 double WebAnimationImpl::startTime() const { return animation_->start_time(); }
86 void WebAnimationImpl::setStartTime(double monotonic_time) {
87 animation_->set_start_time(monotonic_time);
90 double WebAnimationImpl::timeOffset() const {
91 return animation_->time_offset();
94 void WebAnimationImpl::setTimeOffset(double monotonic_time) {
95 animation_->set_time_offset(monotonic_time);
98 #if WEB_ANIMATION_SUPPORTS_FULL_DIRECTION
99 blink::WebAnimation::Direction WebAnimationImpl::direction() const {
100 switch (animation_->direction()) {
101 case cc::Animation::Normal:
102 return DirectionNormal;
103 case cc::Animation::Reverse:
104 return DirectionReverse;
105 case cc::Animation::Alternate:
106 return DirectionAlternate;
107 case cc::Animation::AlternateReverse:
108 return DirectionAlternateReverse;
112 return DirectionNormal;
115 void WebAnimationImpl::setDirection(Direction direction) {
117 case DirectionNormal:
118 animation_->set_direction(cc::Animation::Normal);
120 case DirectionReverse:
121 animation_->set_direction(cc::Animation::Reverse);
123 case DirectionAlternate:
124 animation_->set_direction(cc::Animation::Alternate);
126 case DirectionAlternateReverse:
127 animation_->set_direction(cc::Animation::AlternateReverse);
132 bool WebAnimationImpl::alternatesDirection() const {
133 return animation_->direction() == cc::Animation::Alternate;
136 void WebAnimationImpl::setAlternatesDirection(bool alternates) {
138 animation_->set_direction(cc::Animation::Alternate);
140 animation_->set_direction(cc::Animation::Normal);
144 scoped_ptr<cc::Animation> WebAnimationImpl::PassAnimation() {
145 animation_->set_needs_synchronized_start_time(true);
146 return animation_.Pass();
149 #define COMPILE_ASSERT_MATCHING_ENUMS(webkit_name, cc_name) \
150 COMPILE_ASSERT(static_cast<int>(webkit_name) == static_cast<int>(cc_name), \
153 COMPILE_ASSERT_MATCHING_ENUMS(
154 WebAnimation::TargetPropertyTransform, Animation::Transform);
155 COMPILE_ASSERT_MATCHING_ENUMS(
156 WebAnimation::TargetPropertyOpacity, Animation::Opacity);
157 COMPILE_ASSERT_MATCHING_ENUMS(
158 WebAnimation::TargetPropertyFilter, Animation::Filter);
159 #if WEB_SCROLL_OFFSET_ANIMATION_CURVE_IS_DEFINED
160 COMPILE_ASSERT_MATCHING_ENUMS(
161 WebAnimation::TargetPropertyScrollOffset, Animation::ScrollOffset);
164 } // namespace webkit