| OLD | NEW |
| 1 // Copyright 2012 The Chromium Authors. All rights reserved. | 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 | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include <algorithm> | 5 #include <algorithm> |
| 6 | 6 |
| 7 #include "cc/animation/keyframed_animation_curve.h" | 7 #include "cc/animation/keyframed_animation_curve.h" |
| 8 #include "cc/base/time_util.h" |
| 8 #include "ui/gfx/animation/tween.h" | 9 #include "ui/gfx/animation/tween.h" |
| 9 #include "ui/gfx/geometry/box_f.h" | 10 #include "ui/gfx/geometry/box_f.h" |
| 10 | 11 |
| 11 namespace cc { | 12 namespace cc { |
| 12 | 13 |
| 13 namespace { | 14 namespace { |
| 14 | 15 |
| 15 template <class KeyframeType> | 16 template <class KeyframeType> |
| 16 void InsertKeyframe(scoped_ptr<KeyframeType> keyframe, | 17 void InsertKeyframe(scoped_ptr<KeyframeType> keyframe, |
| 17 ScopedPtrVector<KeyframeType>* keyframes) { | 18 ScopedPtrVector<KeyframeType>* keyframes) { |
| 18 // Usually, the keyframes will be added in order, so this loop would be | 19 // Usually, the keyframes will be added in order, so this loop would be |
| 19 // unnecessary and we should skip it if possible. | 20 // unnecessary and we should skip it if possible. |
| 20 if (!keyframes->empty() && keyframe->Time() < keyframes->back()->Time()) { | 21 if (!keyframes->empty() && keyframe->Time() < keyframes->back()->Time()) { |
| 21 for (size_t i = 0; i < keyframes->size(); ++i) { | 22 for (size_t i = 0; i < keyframes->size(); ++i) { |
| 22 if (keyframe->Time() < keyframes->at(i)->Time()) { | 23 if (keyframe->Time() < keyframes->at(i)->Time()) { |
| 23 keyframes->insert(keyframes->begin() + i, keyframe.Pass()); | 24 keyframes->insert(keyframes->begin() + i, keyframe.Pass()); |
| 24 return; | 25 return; |
| 25 } | 26 } |
| 26 } | 27 } |
| 27 } | 28 } |
| 28 | 29 |
| 29 keyframes->push_back(keyframe.Pass()); | 30 keyframes->push_back(keyframe.Pass()); |
| 30 } | 31 } |
| 31 | 32 |
| 32 template <typename KeyframeType> | 33 template <typename KeyframeType> |
| 33 double TransformedAnimationTime( | 34 base::TimeDelta TransformedAnimationTime( |
| 34 const ScopedPtrVector<KeyframeType>& keyframes, | 35 const ScopedPtrVector<KeyframeType>& keyframes, |
| 35 const scoped_ptr<TimingFunction>& timing_function, | 36 const scoped_ptr<TimingFunction>& timing_function, |
| 36 double time) { | 37 base::TimeDelta time) { |
| 37 if (timing_function) { | 38 if (timing_function) { |
| 38 double start_time = keyframes.front()->Time(); | 39 base::TimeDelta start_time = keyframes.front()->Time(); |
| 39 double duration = keyframes.back()->Time() - start_time; | 40 base::TimeDelta duration = |
| 40 double progress = (time - start_time) / duration; | 41 keyframes.back()->Time() - keyframes.front()->Time(); |
| 42 double progress = TimeUtil::Divide(time - start_time, duration); |
| 41 | 43 |
| 42 time = timing_function->GetValue(progress) * duration + start_time; | 44 time = TimeUtil::Scale(duration, timing_function->GetValue(progress)) + |
| 45 start_time; |
| 43 } | 46 } |
| 44 | 47 |
| 45 return time; | 48 return time; |
| 46 } | 49 } |
| 47 | 50 |
| 48 template <typename KeyframeType> | 51 template <typename KeyframeType> |
| 49 size_t GetActiveKeyframe(const ScopedPtrVector<KeyframeType>& keyframes, | 52 size_t GetActiveKeyframe(const ScopedPtrVector<KeyframeType>& keyframes, |
| 50 double time) { | 53 base::TimeDelta time) { |
| 51 DCHECK_GE(keyframes.size(), 2ul); | 54 DCHECK_GE(keyframes.size(), 2ul); |
| 52 size_t i = 0; | 55 size_t i = 0; |
| 53 for (; i < keyframes.size() - 2; ++i) { // Last keyframe is never active. | 56 for (; i < keyframes.size() - 2; ++i) { // Last keyframe is never active. |
| 54 if (time < keyframes[i + 1]->Time()) | 57 if (time < keyframes[i + 1]->Time()) |
| 55 break; | 58 break; |
| 56 } | 59 } |
| 57 | 60 |
| 58 return i; | 61 return i; |
| 59 } | 62 } |
| 60 | 63 |
| 61 template <typename KeyframeType> | 64 template <typename KeyframeType> |
| 62 double TransformedKeyframeProgress( | 65 double TransformedKeyframeProgress( |
| 63 const ScopedPtrVector<KeyframeType>& keyframes, | 66 const ScopedPtrVector<KeyframeType>& keyframes, |
| 64 double time, | 67 base::TimeDelta time, |
| 65 size_t i) { | 68 size_t i) { |
| 66 double progress = (time - keyframes[i]->Time()) / | 69 double progress = |
| 67 (keyframes[i + 1]->Time() - keyframes[i]->Time()); | 70 TimeUtil::Divide(time - keyframes[i]->Time(), |
| 71 keyframes[i + 1]->Time() - keyframes[i]->Time()); |
| 68 | 72 |
| 69 if (keyframes[i]->timing_function()) { | 73 if (keyframes[i]->timing_function()) { |
| 70 progress = keyframes[i]->timing_function()->GetValue(progress); | 74 progress = keyframes[i]->timing_function()->GetValue(progress); |
| 71 } | 75 } |
| 72 | 76 |
| 73 return progress; | 77 return progress; |
| 74 } | 78 } |
| 75 | 79 |
| 76 } // namespace | 80 } // namespace |
| 77 | 81 |
| 78 Keyframe::Keyframe(double time, scoped_ptr<TimingFunction> timing_function) | 82 Keyframe::Keyframe(base::TimeDelta time, |
| 79 : time_(time), | 83 scoped_ptr<TimingFunction> timing_function) |
| 80 timing_function_(timing_function.Pass()) {} | 84 : time_(time), timing_function_(timing_function.Pass()) { |
| 85 } |
| 81 | 86 |
| 82 Keyframe::~Keyframe() {} | 87 Keyframe::~Keyframe() {} |
| 83 | 88 |
| 84 double Keyframe::Time() const { | 89 base::TimeDelta Keyframe::Time() const { |
| 85 return time_; | 90 return time_; |
| 86 } | 91 } |
| 87 | 92 |
| 88 scoped_ptr<ColorKeyframe> ColorKeyframe::Create( | 93 scoped_ptr<ColorKeyframe> ColorKeyframe::Create( |
| 89 double time, | 94 base::TimeDelta time, |
| 90 SkColor value, | 95 SkColor value, |
| 91 scoped_ptr<TimingFunction> timing_function) { | 96 scoped_ptr<TimingFunction> timing_function) { |
| 92 return make_scoped_ptr( | 97 return make_scoped_ptr( |
| 93 new ColorKeyframe(time, value, timing_function.Pass())); | 98 new ColorKeyframe(time, value, timing_function.Pass())); |
| 94 } | 99 } |
| 95 | 100 |
| 96 ColorKeyframe::ColorKeyframe(double time, | 101 ColorKeyframe::ColorKeyframe(base::TimeDelta time, |
| 97 SkColor value, | 102 SkColor value, |
| 98 scoped_ptr<TimingFunction> timing_function) | 103 scoped_ptr<TimingFunction> timing_function) |
| 99 : Keyframe(time, timing_function.Pass()), | 104 : Keyframe(time, timing_function.Pass()), value_(value) { |
| 100 value_(value) {} | 105 } |
| 101 | 106 |
| 102 ColorKeyframe::~ColorKeyframe() {} | 107 ColorKeyframe::~ColorKeyframe() {} |
| 103 | 108 |
| 104 SkColor ColorKeyframe::Value() const { return value_; } | 109 SkColor ColorKeyframe::Value() const { return value_; } |
| 105 | 110 |
| 106 scoped_ptr<ColorKeyframe> ColorKeyframe::Clone() const { | 111 scoped_ptr<ColorKeyframe> ColorKeyframe::Clone() const { |
| 107 scoped_ptr<TimingFunction> func; | 112 scoped_ptr<TimingFunction> func; |
| 108 if (timing_function()) | 113 if (timing_function()) |
| 109 func = timing_function()->Clone(); | 114 func = timing_function()->Clone(); |
| 110 return ColorKeyframe::Create(Time(), Value(), func.Pass()); | 115 return ColorKeyframe::Create(Time(), Value(), func.Pass()); |
| 111 } | 116 } |
| 112 | 117 |
| 113 scoped_ptr<FloatKeyframe> FloatKeyframe::Create( | 118 scoped_ptr<FloatKeyframe> FloatKeyframe::Create( |
| 114 double time, | 119 base::TimeDelta time, |
| 115 float value, | 120 float value, |
| 116 scoped_ptr<TimingFunction> timing_function) { | 121 scoped_ptr<TimingFunction> timing_function) { |
| 117 return make_scoped_ptr( | 122 return make_scoped_ptr( |
| 118 new FloatKeyframe(time, value, timing_function.Pass())); | 123 new FloatKeyframe(time, value, timing_function.Pass())); |
| 119 } | 124 } |
| 120 | 125 |
| 121 FloatKeyframe::FloatKeyframe(double time, | 126 FloatKeyframe::FloatKeyframe(base::TimeDelta time, |
| 122 float value, | 127 float value, |
| 123 scoped_ptr<TimingFunction> timing_function) | 128 scoped_ptr<TimingFunction> timing_function) |
| 124 : Keyframe(time, timing_function.Pass()), | 129 : Keyframe(time, timing_function.Pass()), value_(value) { |
| 125 value_(value) {} | 130 } |
| 126 | 131 |
| 127 FloatKeyframe::~FloatKeyframe() {} | 132 FloatKeyframe::~FloatKeyframe() {} |
| 128 | 133 |
| 129 float FloatKeyframe::Value() const { | 134 float FloatKeyframe::Value() const { |
| 130 return value_; | 135 return value_; |
| 131 } | 136 } |
| 132 | 137 |
| 133 scoped_ptr<FloatKeyframe> FloatKeyframe::Clone() const { | 138 scoped_ptr<FloatKeyframe> FloatKeyframe::Clone() const { |
| 134 scoped_ptr<TimingFunction> func; | 139 scoped_ptr<TimingFunction> func; |
| 135 if (timing_function()) | 140 if (timing_function()) |
| 136 func = timing_function()->Clone(); | 141 func = timing_function()->Clone(); |
| 137 return FloatKeyframe::Create(Time(), Value(), func.Pass()); | 142 return FloatKeyframe::Create(Time(), Value(), func.Pass()); |
| 138 } | 143 } |
| 139 | 144 |
| 140 scoped_ptr<TransformKeyframe> TransformKeyframe::Create( | 145 scoped_ptr<TransformKeyframe> TransformKeyframe::Create( |
| 141 double time, | 146 base::TimeDelta time, |
| 142 const TransformOperations& value, | 147 const TransformOperations& value, |
| 143 scoped_ptr<TimingFunction> timing_function) { | 148 scoped_ptr<TimingFunction> timing_function) { |
| 144 return make_scoped_ptr( | 149 return make_scoped_ptr( |
| 145 new TransformKeyframe(time, value, timing_function.Pass())); | 150 new TransformKeyframe(time, value, timing_function.Pass())); |
| 146 } | 151 } |
| 147 | 152 |
| 148 TransformKeyframe::TransformKeyframe(double time, | 153 TransformKeyframe::TransformKeyframe(base::TimeDelta time, |
| 149 const TransformOperations& value, | 154 const TransformOperations& value, |
| 150 scoped_ptr<TimingFunction> timing_function) | 155 scoped_ptr<TimingFunction> timing_function) |
| 151 : Keyframe(time, timing_function.Pass()), | 156 : Keyframe(time, timing_function.Pass()), value_(value) { |
| 152 value_(value) {} | 157 } |
| 153 | 158 |
| 154 TransformKeyframe::~TransformKeyframe() {} | 159 TransformKeyframe::~TransformKeyframe() {} |
| 155 | 160 |
| 156 const TransformOperations& TransformKeyframe::Value() const { | 161 const TransformOperations& TransformKeyframe::Value() const { |
| 157 return value_; | 162 return value_; |
| 158 } | 163 } |
| 159 | 164 |
| 160 scoped_ptr<TransformKeyframe> TransformKeyframe::Clone() const { | 165 scoped_ptr<TransformKeyframe> TransformKeyframe::Clone() const { |
| 161 scoped_ptr<TimingFunction> func; | 166 scoped_ptr<TimingFunction> func; |
| 162 if (timing_function()) | 167 if (timing_function()) |
| 163 func = timing_function()->Clone(); | 168 func = timing_function()->Clone(); |
| 164 return TransformKeyframe::Create(Time(), Value(), func.Pass()); | 169 return TransformKeyframe::Create(Time(), Value(), func.Pass()); |
| 165 } | 170 } |
| 166 | 171 |
| 167 scoped_ptr<FilterKeyframe> FilterKeyframe::Create( | 172 scoped_ptr<FilterKeyframe> FilterKeyframe::Create( |
| 168 double time, | 173 base::TimeDelta time, |
| 169 const FilterOperations& value, | 174 const FilterOperations& value, |
| 170 scoped_ptr<TimingFunction> timing_function) { | 175 scoped_ptr<TimingFunction> timing_function) { |
| 171 return make_scoped_ptr( | 176 return make_scoped_ptr( |
| 172 new FilterKeyframe(time, value, timing_function.Pass())); | 177 new FilterKeyframe(time, value, timing_function.Pass())); |
| 173 } | 178 } |
| 174 | 179 |
| 175 FilterKeyframe::FilterKeyframe(double time, | 180 FilterKeyframe::FilterKeyframe(base::TimeDelta time, |
| 176 const FilterOperations& value, | 181 const FilterOperations& value, |
| 177 scoped_ptr<TimingFunction> timing_function) | 182 scoped_ptr<TimingFunction> timing_function) |
| 178 : Keyframe(time, timing_function.Pass()), | 183 : Keyframe(time, timing_function.Pass()), value_(value) { |
| 179 value_(value) {} | 184 } |
| 180 | 185 |
| 181 FilterKeyframe::~FilterKeyframe() {} | 186 FilterKeyframe::~FilterKeyframe() {} |
| 182 | 187 |
| 183 const FilterOperations& FilterKeyframe::Value() const { | 188 const FilterOperations& FilterKeyframe::Value() const { |
| 184 return value_; | 189 return value_; |
| 185 } | 190 } |
| 186 | 191 |
| 187 scoped_ptr<FilterKeyframe> FilterKeyframe::Clone() const { | 192 scoped_ptr<FilterKeyframe> FilterKeyframe::Clone() const { |
| 188 scoped_ptr<TimingFunction> func; | 193 scoped_ptr<TimingFunction> func; |
| 189 if (timing_function()) | 194 if (timing_function()) |
| 190 func = timing_function()->Clone(); | 195 func = timing_function()->Clone(); |
| 191 return FilterKeyframe::Create(Time(), Value(), func.Pass()); | 196 return FilterKeyframe::Create(Time(), Value(), func.Pass()); |
| 192 } | 197 } |
| 193 | 198 |
| 194 scoped_ptr<KeyframedColorAnimationCurve> KeyframedColorAnimationCurve:: | 199 scoped_ptr<KeyframedColorAnimationCurve> KeyframedColorAnimationCurve:: |
| 195 Create() { | 200 Create() { |
| 196 return make_scoped_ptr(new KeyframedColorAnimationCurve); | 201 return make_scoped_ptr(new KeyframedColorAnimationCurve); |
| 197 } | 202 } |
| 198 | 203 |
| 199 KeyframedColorAnimationCurve::KeyframedColorAnimationCurve() {} | 204 KeyframedColorAnimationCurve::KeyframedColorAnimationCurve() {} |
| 200 | 205 |
| 201 KeyframedColorAnimationCurve::~KeyframedColorAnimationCurve() {} | 206 KeyframedColorAnimationCurve::~KeyframedColorAnimationCurve() {} |
| 202 | 207 |
| 203 void KeyframedColorAnimationCurve::AddKeyframe( | 208 void KeyframedColorAnimationCurve::AddKeyframe( |
| 204 scoped_ptr<ColorKeyframe> keyframe) { | 209 scoped_ptr<ColorKeyframe> keyframe) { |
| 205 InsertKeyframe(keyframe.Pass(), &keyframes_); | 210 InsertKeyframe(keyframe.Pass(), &keyframes_); |
| 206 } | 211 } |
| 207 | 212 |
| 208 base::TimeDelta KeyframedColorAnimationCurve::Duration() const { | 213 base::TimeDelta KeyframedColorAnimationCurve::Duration() const { |
| 209 return base::TimeDelta::FromSecondsD(keyframes_.back()->Time() - | 214 return keyframes_.back()->Time() - keyframes_.front()->Time(); |
| 210 keyframes_.front()->Time()); | |
| 211 } | 215 } |
| 212 | 216 |
| 213 scoped_ptr<AnimationCurve> KeyframedColorAnimationCurve::Clone() const { | 217 scoped_ptr<AnimationCurve> KeyframedColorAnimationCurve::Clone() const { |
| 214 scoped_ptr<KeyframedColorAnimationCurve> to_return = | 218 scoped_ptr<KeyframedColorAnimationCurve> to_return = |
| 215 KeyframedColorAnimationCurve::Create(); | 219 KeyframedColorAnimationCurve::Create(); |
| 216 for (size_t i = 0; i < keyframes_.size(); ++i) | 220 for (size_t i = 0; i < keyframes_.size(); ++i) |
| 217 to_return->AddKeyframe(keyframes_[i]->Clone()); | 221 to_return->AddKeyframe(keyframes_[i]->Clone()); |
| 218 | 222 |
| 219 if (timing_function_) | 223 if (timing_function_) |
| 220 to_return->SetTimingFunction(timing_function_->Clone()); | 224 to_return->SetTimingFunction(timing_function_->Clone()); |
| 221 | 225 |
| 222 return to_return.Pass(); | 226 return to_return.Pass(); |
| 223 } | 227 } |
| 224 | 228 |
| 225 SkColor KeyframedColorAnimationCurve::GetValue(double t) const { | 229 SkColor KeyframedColorAnimationCurve::GetValue(base::TimeDelta t) const { |
| 226 if (t <= keyframes_.front()->Time()) | 230 if (t <= keyframes_.front()->Time()) |
| 227 return keyframes_.front()->Value(); | 231 return keyframes_.front()->Value(); |
| 228 | 232 |
| 229 if (t >= keyframes_.back()->Time()) | 233 if (t >= keyframes_.back()->Time()) |
| 230 return keyframes_.back()->Value(); | 234 return keyframes_.back()->Value(); |
| 231 | 235 |
| 232 t = TransformedAnimationTime(keyframes_, timing_function_, t); | 236 t = TransformedAnimationTime(keyframes_, timing_function_, t); |
| 233 size_t i = GetActiveKeyframe(keyframes_, t); | 237 size_t i = GetActiveKeyframe(keyframes_, t); |
| 234 double progress = TransformedKeyframeProgress(keyframes_, t, i); | 238 double progress = TransformedKeyframeProgress(keyframes_, t, i); |
| 235 | 239 |
| (...skipping 11 matching lines...) Expand all Loading... |
| 247 KeyframedFloatAnimationCurve::KeyframedFloatAnimationCurve() {} | 251 KeyframedFloatAnimationCurve::KeyframedFloatAnimationCurve() {} |
| 248 | 252 |
| 249 KeyframedFloatAnimationCurve::~KeyframedFloatAnimationCurve() {} | 253 KeyframedFloatAnimationCurve::~KeyframedFloatAnimationCurve() {} |
| 250 | 254 |
| 251 void KeyframedFloatAnimationCurve::AddKeyframe( | 255 void KeyframedFloatAnimationCurve::AddKeyframe( |
| 252 scoped_ptr<FloatKeyframe> keyframe) { | 256 scoped_ptr<FloatKeyframe> keyframe) { |
| 253 InsertKeyframe(keyframe.Pass(), &keyframes_); | 257 InsertKeyframe(keyframe.Pass(), &keyframes_); |
| 254 } | 258 } |
| 255 | 259 |
| 256 base::TimeDelta KeyframedFloatAnimationCurve::Duration() const { | 260 base::TimeDelta KeyframedFloatAnimationCurve::Duration() const { |
| 257 return base::TimeDelta::FromSecondsD(keyframes_.back()->Time() - | 261 return keyframes_.back()->Time() - keyframes_.front()->Time(); |
| 258 keyframes_.front()->Time()); | |
| 259 } | 262 } |
| 260 | 263 |
| 261 scoped_ptr<AnimationCurve> KeyframedFloatAnimationCurve::Clone() const { | 264 scoped_ptr<AnimationCurve> KeyframedFloatAnimationCurve::Clone() const { |
| 262 scoped_ptr<KeyframedFloatAnimationCurve> to_return = | 265 scoped_ptr<KeyframedFloatAnimationCurve> to_return = |
| 263 KeyframedFloatAnimationCurve::Create(); | 266 KeyframedFloatAnimationCurve::Create(); |
| 264 for (size_t i = 0; i < keyframes_.size(); ++i) | 267 for (size_t i = 0; i < keyframes_.size(); ++i) |
| 265 to_return->AddKeyframe(keyframes_[i]->Clone()); | 268 to_return->AddKeyframe(keyframes_[i]->Clone()); |
| 266 | 269 |
| 267 if (timing_function_) | 270 if (timing_function_) |
| 268 to_return->SetTimingFunction(timing_function_->Clone()); | 271 to_return->SetTimingFunction(timing_function_->Clone()); |
| 269 | 272 |
| 270 return to_return.Pass(); | 273 return to_return.Pass(); |
| 271 } | 274 } |
| 272 | 275 |
| 273 float KeyframedFloatAnimationCurve::GetValue(double t) const { | 276 float KeyframedFloatAnimationCurve::GetValue(base::TimeDelta t) const { |
| 274 if (t <= keyframes_.front()->Time()) | 277 if (t <= keyframes_.front()->Time()) |
| 275 return keyframes_.front()->Value(); | 278 return keyframes_.front()->Value(); |
| 276 | 279 |
| 277 if (t >= keyframes_.back()->Time()) | 280 if (t >= keyframes_.back()->Time()) |
| 278 return keyframes_.back()->Value(); | 281 return keyframes_.back()->Value(); |
| 279 | 282 |
| 280 t = TransformedAnimationTime(keyframes_, timing_function_, t); | 283 t = TransformedAnimationTime(keyframes_, timing_function_, t); |
| 281 size_t i = GetActiveKeyframe(keyframes_, t); | 284 size_t i = GetActiveKeyframe(keyframes_, t); |
| 282 double progress = TransformedKeyframeProgress(keyframes_, t, i); | 285 double progress = TransformedKeyframeProgress(keyframes_, t, i); |
| 283 | 286 |
| 284 return keyframes_[i]->Value() + | 287 return keyframes_[i]->Value() + |
| 285 (keyframes_[i+1]->Value() - keyframes_[i]->Value()) * progress; | 288 (keyframes_[i+1]->Value() - keyframes_[i]->Value()) * progress; |
| 286 } | 289 } |
| 287 | 290 |
| 288 scoped_ptr<KeyframedTransformAnimationCurve> KeyframedTransformAnimationCurve:: | 291 scoped_ptr<KeyframedTransformAnimationCurve> KeyframedTransformAnimationCurve:: |
| 289 Create() { | 292 Create() { |
| 290 return make_scoped_ptr(new KeyframedTransformAnimationCurve); | 293 return make_scoped_ptr(new KeyframedTransformAnimationCurve); |
| 291 } | 294 } |
| 292 | 295 |
| 293 KeyframedTransformAnimationCurve::KeyframedTransformAnimationCurve() {} | 296 KeyframedTransformAnimationCurve::KeyframedTransformAnimationCurve() {} |
| 294 | 297 |
| 295 KeyframedTransformAnimationCurve::~KeyframedTransformAnimationCurve() {} | 298 KeyframedTransformAnimationCurve::~KeyframedTransformAnimationCurve() {} |
| 296 | 299 |
| 297 void KeyframedTransformAnimationCurve::AddKeyframe( | 300 void KeyframedTransformAnimationCurve::AddKeyframe( |
| 298 scoped_ptr<TransformKeyframe> keyframe) { | 301 scoped_ptr<TransformKeyframe> keyframe) { |
| 299 InsertKeyframe(keyframe.Pass(), &keyframes_); | 302 InsertKeyframe(keyframe.Pass(), &keyframes_); |
| 300 } | 303 } |
| 301 | 304 |
| 302 base::TimeDelta KeyframedTransformAnimationCurve::Duration() const { | 305 base::TimeDelta KeyframedTransformAnimationCurve::Duration() const { |
| 303 return base::TimeDelta::FromSecondsD(keyframes_.back()->Time() - | 306 return keyframes_.back()->Time() - keyframes_.front()->Time(); |
| 304 keyframes_.front()->Time()); | |
| 305 } | 307 } |
| 306 | 308 |
| 307 scoped_ptr<AnimationCurve> KeyframedTransformAnimationCurve::Clone() const { | 309 scoped_ptr<AnimationCurve> KeyframedTransformAnimationCurve::Clone() const { |
| 308 scoped_ptr<KeyframedTransformAnimationCurve> to_return = | 310 scoped_ptr<KeyframedTransformAnimationCurve> to_return = |
| 309 KeyframedTransformAnimationCurve::Create(); | 311 KeyframedTransformAnimationCurve::Create(); |
| 310 for (size_t i = 0; i < keyframes_.size(); ++i) | 312 for (size_t i = 0; i < keyframes_.size(); ++i) |
| 311 to_return->AddKeyframe(keyframes_[i]->Clone()); | 313 to_return->AddKeyframe(keyframes_[i]->Clone()); |
| 312 | 314 |
| 313 if (timing_function_) | 315 if (timing_function_) |
| 314 to_return->SetTimingFunction(timing_function_->Clone()); | 316 to_return->SetTimingFunction(timing_function_->Clone()); |
| 315 | 317 |
| 316 return to_return.Pass(); | 318 return to_return.Pass(); |
| 317 } | 319 } |
| 318 | 320 |
| 319 gfx::Transform KeyframedTransformAnimationCurve::GetValue(double t) const { | 321 gfx::Transform KeyframedTransformAnimationCurve::GetValue( |
| 322 base::TimeDelta t) const { |
| 320 if (t <= keyframes_.front()->Time()) | 323 if (t <= keyframes_.front()->Time()) |
| 321 return keyframes_.front()->Value().Apply(); | 324 return keyframes_.front()->Value().Apply(); |
| 322 | 325 |
| 323 if (t >= keyframes_.back()->Time()) | 326 if (t >= keyframes_.back()->Time()) |
| 324 return keyframes_.back()->Value().Apply(); | 327 return keyframes_.back()->Value().Apply(); |
| 325 | 328 |
| 326 t = TransformedAnimationTime(keyframes_, timing_function_, t); | 329 t = TransformedAnimationTime(keyframes_, timing_function_, t); |
| 327 size_t i = GetActiveKeyframe(keyframes_, t); | 330 size_t i = GetActiveKeyframe(keyframes_, t); |
| 328 double progress = TransformedKeyframeProgress(keyframes_, t, i); | 331 double progress = TransformedKeyframeProgress(keyframes_, t, i); |
| 329 | 332 |
| (...skipping 75 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 405 KeyframedFilterAnimationCurve::KeyframedFilterAnimationCurve() {} | 408 KeyframedFilterAnimationCurve::KeyframedFilterAnimationCurve() {} |
| 406 | 409 |
| 407 KeyframedFilterAnimationCurve::~KeyframedFilterAnimationCurve() {} | 410 KeyframedFilterAnimationCurve::~KeyframedFilterAnimationCurve() {} |
| 408 | 411 |
| 409 void KeyframedFilterAnimationCurve::AddKeyframe( | 412 void KeyframedFilterAnimationCurve::AddKeyframe( |
| 410 scoped_ptr<FilterKeyframe> keyframe) { | 413 scoped_ptr<FilterKeyframe> keyframe) { |
| 411 InsertKeyframe(keyframe.Pass(), &keyframes_); | 414 InsertKeyframe(keyframe.Pass(), &keyframes_); |
| 412 } | 415 } |
| 413 | 416 |
| 414 base::TimeDelta KeyframedFilterAnimationCurve::Duration() const { | 417 base::TimeDelta KeyframedFilterAnimationCurve::Duration() const { |
| 415 return base::TimeDelta::FromSecondsD(keyframes_.back()->Time() - | 418 return keyframes_.back()->Time() - keyframes_.front()->Time(); |
| 416 keyframes_.front()->Time()); | |
| 417 } | 419 } |
| 418 | 420 |
| 419 scoped_ptr<AnimationCurve> KeyframedFilterAnimationCurve::Clone() const { | 421 scoped_ptr<AnimationCurve> KeyframedFilterAnimationCurve::Clone() const { |
| 420 scoped_ptr<KeyframedFilterAnimationCurve> to_return = | 422 scoped_ptr<KeyframedFilterAnimationCurve> to_return = |
| 421 KeyframedFilterAnimationCurve::Create(); | 423 KeyframedFilterAnimationCurve::Create(); |
| 422 for (size_t i = 0; i < keyframes_.size(); ++i) | 424 for (size_t i = 0; i < keyframes_.size(); ++i) |
| 423 to_return->AddKeyframe(keyframes_[i]->Clone()); | 425 to_return->AddKeyframe(keyframes_[i]->Clone()); |
| 424 | 426 |
| 425 if (timing_function_) | 427 if (timing_function_) |
| 426 to_return->SetTimingFunction(timing_function_->Clone()); | 428 to_return->SetTimingFunction(timing_function_->Clone()); |
| 427 | 429 |
| 428 return to_return.Pass(); | 430 return to_return.Pass(); |
| 429 } | 431 } |
| 430 | 432 |
| 431 FilterOperations KeyframedFilterAnimationCurve::GetValue(double t) const { | 433 FilterOperations KeyframedFilterAnimationCurve::GetValue( |
| 434 base::TimeDelta t) const { |
| 432 if (t <= keyframes_.front()->Time()) | 435 if (t <= keyframes_.front()->Time()) |
| 433 return keyframes_.front()->Value(); | 436 return keyframes_.front()->Value(); |
| 434 | 437 |
| 435 if (t >= keyframes_.back()->Time()) | 438 if (t >= keyframes_.back()->Time()) |
| 436 return keyframes_.back()->Value(); | 439 return keyframes_.back()->Value(); |
| 437 | 440 |
| 438 t = TransformedAnimationTime(keyframes_, timing_function_, t); | 441 t = TransformedAnimationTime(keyframes_, timing_function_, t); |
| 439 size_t i = GetActiveKeyframe(keyframes_, t); | 442 size_t i = GetActiveKeyframe(keyframes_, t); |
| 440 double progress = TransformedKeyframeProgress(keyframes_, t, i); | 443 double progress = TransformedKeyframeProgress(keyframes_, t, i); |
| 441 | 444 |
| 442 return keyframes_[i + 1]->Value().Blend(keyframes_[i]->Value(), progress); | 445 return keyframes_[i + 1]->Value().Blend(keyframes_[i]->Value(), progress); |
| 443 } | 446 } |
| 444 | 447 |
| 445 bool KeyframedFilterAnimationCurve::HasFilterThatMovesPixels() const { | 448 bool KeyframedFilterAnimationCurve::HasFilterThatMovesPixels() const { |
| 446 for (size_t i = 0; i < keyframes_.size(); ++i) { | 449 for (size_t i = 0; i < keyframes_.size(); ++i) { |
| 447 if (keyframes_[i]->Value().HasFilterThatMovesPixels()) { | 450 if (keyframes_[i]->Value().HasFilterThatMovesPixels()) { |
| 448 return true; | 451 return true; |
| 449 } | 452 } |
| 450 } | 453 } |
| 451 return false; | 454 return false; |
| 452 } | 455 } |
| 453 | 456 |
| 454 } // namespace cc | 457 } // namespace cc |
| OLD | NEW |