Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(163)

Side by Side Diff: cc/keyframed_animation_curve.cc

Issue 12822004: Part 3 of cc/ directory shuffles: animation (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Created 7 years, 9 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « cc/keyframed_animation_curve.h ('k') | cc/keyframed_animation_curve_unittest.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
(Empty)
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.
4
5 #include "cc/keyframed_animation_curve.h"
6
7 namespace cc {
8
9 namespace {
10
11 template <class Keyframe>
12 void InsertKeyframe(scoped_ptr<Keyframe> keyframe,
13 ScopedPtrVector<Keyframe>& keyframes) {
14 // Usually, the keyframes will be added in order, so this loop would be
15 // unnecessary and we should skip it if possible.
16 if (!keyframes.empty() && keyframe->Time() < keyframes.back()->Time()) {
17 for (size_t i = 0; i < keyframes.size(); ++i) {
18 if (keyframe->Time() < keyframes[i]->Time()) {
19 keyframes.insert(keyframes.begin() + i, keyframe.Pass());
20 return;
21 }
22 }
23 }
24
25 keyframes.push_back(keyframe.Pass());
26 }
27
28 scoped_ptr<TimingFunction> CloneTimingFunction(
29 const TimingFunction* timing_function) {
30 DCHECK(timing_function);
31 scoped_ptr<AnimationCurve> curve(timing_function->Clone());
32 return scoped_ptr<TimingFunction>(
33 static_cast<TimingFunction*>(curve.release()));
34 }
35
36 } // namespace
37
38 Keyframe::Keyframe(double time, scoped_ptr<TimingFunction> timing_function)
39 : time_(time),
40 timing_function_(timing_function.Pass()) {}
41
42 Keyframe::~Keyframe() {}
43
44 double Keyframe::Time() const {
45 return time_;
46 }
47
48 scoped_ptr<FloatKeyframe> FloatKeyframe::Create(
49 double time,
50 float value,
51 scoped_ptr<TimingFunction> timing_function) {
52 return make_scoped_ptr(
53 new FloatKeyframe(time, value, timing_function.Pass()));
54 }
55
56 FloatKeyframe::FloatKeyframe(double time,
57 float value,
58 scoped_ptr<TimingFunction> timing_function)
59 : Keyframe(time, timing_function.Pass()),
60 value_(value) {}
61
62 FloatKeyframe::~FloatKeyframe() {}
63
64 float FloatKeyframe::Value() const {
65 return value_;
66 }
67
68 scoped_ptr<FloatKeyframe> FloatKeyframe::Clone() const {
69 scoped_ptr<TimingFunction> func;
70 if (timing_function())
71 func = CloneTimingFunction(timing_function());
72 return FloatKeyframe::Create(Time(), Value(), func.Pass());
73 }
74
75 scoped_ptr<TransformKeyframe> TransformKeyframe::Create(
76 double time,
77 const TransformOperations& value,
78 scoped_ptr<TimingFunction> timing_function) {
79 return make_scoped_ptr(
80 new TransformKeyframe(time, value, timing_function.Pass()));
81 }
82
83 TransformKeyframe::TransformKeyframe(double time,
84 const TransformOperations& value,
85 scoped_ptr<TimingFunction> timing_function)
86 : Keyframe(time, timing_function.Pass()),
87 value_(value) {}
88
89 TransformKeyframe::~TransformKeyframe() {}
90
91 const TransformOperations& TransformKeyframe::Value() const {
92 return value_;
93 }
94
95 scoped_ptr<TransformKeyframe> TransformKeyframe::Clone() const {
96 scoped_ptr<TimingFunction> func;
97 if (timing_function())
98 func = CloneTimingFunction(timing_function());
99 return TransformKeyframe::Create(Time(), Value(), func.Pass());
100 }
101
102 scoped_ptr<KeyframedFloatAnimationCurve> KeyframedFloatAnimationCurve::
103 Create() {
104 return make_scoped_ptr(new KeyframedFloatAnimationCurve);
105 }
106
107 KeyframedFloatAnimationCurve::KeyframedFloatAnimationCurve() {}
108
109 KeyframedFloatAnimationCurve::~KeyframedFloatAnimationCurve() {}
110
111 void KeyframedFloatAnimationCurve::AddKeyframe(
112 scoped_ptr<FloatKeyframe> keyframe) {
113 InsertKeyframe(keyframe.Pass(), keyframes_);
114 }
115
116 double KeyframedFloatAnimationCurve::Duration() const {
117 return keyframes_.back()->Time() - keyframes_.front()->Time();
118 }
119
120 scoped_ptr<AnimationCurve> KeyframedFloatAnimationCurve::Clone() const {
121 scoped_ptr<KeyframedFloatAnimationCurve> to_return(
122 KeyframedFloatAnimationCurve::Create());
123 for (size_t i = 0; i < keyframes_.size(); ++i)
124 to_return->AddKeyframe(keyframes_[i]->Clone());
125 return to_return.PassAs<AnimationCurve>();
126 }
127
128 float KeyframedFloatAnimationCurve::GetValue(double t) const {
129 if (t <= keyframes_.front()->Time())
130 return keyframes_.front()->Value();
131
132 if (t >= keyframes_.back()->Time())
133 return keyframes_.back()->Value();
134
135 size_t i = 0;
136 for (; i < keyframes_.size() - 1; ++i) {
137 if (t < keyframes_[i+1]->Time())
138 break;
139 }
140
141 float progress =
142 static_cast<float>((t - keyframes_[i]->Time()) /
143 (keyframes_[i+1]->Time() - keyframes_[i]->Time()));
144
145 if (keyframes_[i]->timing_function())
146 progress = keyframes_[i]->timing_function()->GetValue(progress);
147
148 return keyframes_[i]->Value() +
149 (keyframes_[i+1]->Value() - keyframes_[i]->Value()) * progress;
150 }
151
152 scoped_ptr<KeyframedTransformAnimationCurve> KeyframedTransformAnimationCurve::
153 Create() {
154 return make_scoped_ptr(new KeyframedTransformAnimationCurve);
155 }
156
157 KeyframedTransformAnimationCurve::KeyframedTransformAnimationCurve() {}
158
159 KeyframedTransformAnimationCurve::~KeyframedTransformAnimationCurve() {}
160
161 void KeyframedTransformAnimationCurve::AddKeyframe(
162 scoped_ptr<TransformKeyframe> keyframe) {
163 InsertKeyframe(keyframe.Pass(), keyframes_);
164 }
165
166 double KeyframedTransformAnimationCurve::Duration() const {
167 return keyframes_.back()->Time() - keyframes_.front()->Time();
168 }
169
170 scoped_ptr<AnimationCurve> KeyframedTransformAnimationCurve::Clone() const {
171 scoped_ptr<KeyframedTransformAnimationCurve> to_return(
172 KeyframedTransformAnimationCurve::Create());
173 for (size_t i = 0; i < keyframes_.size(); ++i)
174 to_return->AddKeyframe(keyframes_[i]->Clone());
175 return to_return.PassAs<AnimationCurve>();
176 }
177
178 gfx::Transform KeyframedTransformAnimationCurve::GetValue(double t) const {
179 if (t <= keyframes_.front()->Time())
180 return keyframes_.front()->Value().Apply();
181
182 if (t >= keyframes_.back()->Time())
183 return keyframes_.back()->Value().Apply();
184
185 size_t i = 0;
186 for (; i < keyframes_.size() - 1; ++i) {
187 if (t < keyframes_[i+1]->Time())
188 break;
189 }
190
191 double progress = (t - keyframes_[i]->Time()) /
192 (keyframes_[i+1]->Time() - keyframes_[i]->Time());
193
194 if (keyframes_[i]->timing_function())
195 progress = keyframes_[i]->timing_function()->GetValue(progress);
196
197 return keyframes_[i+1]->Value().Blend(keyframes_[i]->Value(), progress);
198 }
199
200 } // namespace cc
OLDNEW
« no previous file with comments | « cc/keyframed_animation_curve.h ('k') | cc/keyframed_animation_curve_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698