• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 // Copyright 2014 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.
4 
5 #include "content/renderer/compositor_bindings/web_animation_impl.h"
6 
7 #include "cc/animation/animation.h"
8 #include "cc/animation/animation_curve.h"
9 #include "cc/animation/animation_id_provider.h"
10 #include "content/renderer/compositor_bindings/web_filter_animation_curve_impl.h"
11 #include "content/renderer/compositor_bindings/web_float_animation_curve_impl.h"
12 #include "content/renderer/compositor_bindings/web_scroll_offset_animation_curve_impl.h"
13 #include "content/renderer/compositor_bindings/web_transform_animation_curve_impl.h"
14 #include "third_party/WebKit/public/platform/WebAnimation.h"
15 #include "third_party/WebKit/public/platform/WebAnimationCurve.h"
16 
17 using cc::Animation;
18 using cc::AnimationIdProvider;
19 
20 using blink::WebAnimation;
21 using blink::WebAnimationCurve;
22 
23 namespace content {
24 
WebAnimationImpl(const WebAnimationCurve & web_curve,TargetProperty target_property,int animation_id,int group_id)25 WebAnimationImpl::WebAnimationImpl(const WebAnimationCurve& web_curve,
26                                    TargetProperty target_property,
27                                    int animation_id,
28                                    int group_id) {
29   if (!animation_id)
30     animation_id = AnimationIdProvider::NextAnimationId();
31   if (!group_id)
32     group_id = AnimationIdProvider::NextGroupId();
33 
34   WebAnimationCurve::AnimationCurveType curve_type = web_curve.type();
35   scoped_ptr<cc::AnimationCurve> curve;
36   switch (curve_type) {
37     case WebAnimationCurve::AnimationCurveTypeFloat: {
38       const WebFloatAnimationCurveImpl* float_curve_impl =
39           static_cast<const WebFloatAnimationCurveImpl*>(&web_curve);
40       curve = float_curve_impl->CloneToAnimationCurve();
41       break;
42     }
43     case WebAnimationCurve::AnimationCurveTypeTransform: {
44       const WebTransformAnimationCurveImpl* transform_curve_impl =
45           static_cast<const WebTransformAnimationCurveImpl*>(&web_curve);
46       curve = transform_curve_impl->CloneToAnimationCurve();
47       break;
48     }
49     case WebAnimationCurve::AnimationCurveTypeFilter: {
50       const WebFilterAnimationCurveImpl* filter_curve_impl =
51           static_cast<const WebFilterAnimationCurveImpl*>(&web_curve);
52       curve = filter_curve_impl->CloneToAnimationCurve();
53       break;
54     }
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();
60       break;
61     }
62 #endif
63   }
64   animation_ = Animation::Create(
65       curve.Pass(),
66       animation_id,
67       group_id,
68       static_cast<cc::Animation::TargetProperty>(target_property));
69 }
70 
~WebAnimationImpl()71 WebAnimationImpl::~WebAnimationImpl() {
72 }
73 
id()74 int WebAnimationImpl::id() {
75   return animation_->id();
76 }
77 
targetProperty() const78 blink::WebAnimation::TargetProperty WebAnimationImpl::targetProperty() const {
79   return static_cast<WebAnimationImpl::TargetProperty>(
80       animation_->target_property());
81 }
82 
iterations() const83 int WebAnimationImpl::iterations() const {
84   return animation_->iterations();
85 }
86 
setIterations(int n)87 void WebAnimationImpl::setIterations(int n) {
88   animation_->set_iterations(n);
89 }
90 
startTime() const91 double WebAnimationImpl::startTime() const {
92   return (animation_->start_time() - base::TimeTicks()).InSecondsF();
93 }
94 
setStartTime(double monotonic_time)95 void WebAnimationImpl::setStartTime(double monotonic_time) {
96   animation_->set_start_time(base::TimeTicks::FromInternalValue(
97       monotonic_time * base::Time::kMicrosecondsPerSecond));
98 }
99 
timeOffset() const100 double WebAnimationImpl::timeOffset() const {
101   return animation_->time_offset().InSecondsF();
102 }
103 
setTimeOffset(double monotonic_time)104 void WebAnimationImpl::setTimeOffset(double monotonic_time) {
105   animation_->set_time_offset(base::TimeDelta::FromSecondsD(monotonic_time));
106 }
107 
108 #if WEB_ANIMATION_SUPPORTS_FULL_DIRECTION
direction() const109 blink::WebAnimation::Direction WebAnimationImpl::direction() const {
110   switch (animation_->direction()) {
111     case cc::Animation::Normal:
112       return DirectionNormal;
113     case cc::Animation::Reverse:
114       return DirectionReverse;
115     case cc::Animation::Alternate:
116       return DirectionAlternate;
117     case cc::Animation::AlternateReverse:
118       return DirectionAlternateReverse;
119     default:
120       NOTREACHED();
121   }
122   return DirectionNormal;
123 }
124 
setDirection(Direction direction)125 void WebAnimationImpl::setDirection(Direction direction) {
126   switch (direction) {
127     case DirectionNormal:
128       animation_->set_direction(cc::Animation::Normal);
129       break;
130     case DirectionReverse:
131       animation_->set_direction(cc::Animation::Reverse);
132       break;
133     case DirectionAlternate:
134       animation_->set_direction(cc::Animation::Alternate);
135       break;
136     case DirectionAlternateReverse:
137       animation_->set_direction(cc::Animation::AlternateReverse);
138       break;
139   }
140 }
141 #else
alternatesDirection() const142 bool WebAnimationImpl::alternatesDirection() const {
143   return animation_->direction() == cc::Animation::Alternate;
144 }
145 
setAlternatesDirection(bool alternates)146 void WebAnimationImpl::setAlternatesDirection(bool alternates) {
147   if (alternates)
148     animation_->set_direction(cc::Animation::Alternate);
149   else
150     animation_->set_direction(cc::Animation::Normal);
151 }
152 #endif
153 
PassAnimation()154 scoped_ptr<cc::Animation> WebAnimationImpl::PassAnimation() {
155   animation_->set_needs_synchronized_start_time(true);
156   return animation_.Pass();
157 }
158 
159 }  // namespace content
160 
161