Chromium Code Reviews| 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 "ui/gfx/animation/tween.h" | 8 #include "ui/gfx/animation/tween.h" |
| 9 #include "ui/gfx/box_f.h" | 9 #include "ui/gfx/box_f.h" |
| 10 | 10 |
| 11 namespace cc { | 11 namespace cc { |
| 12 | 12 |
| 13 namespace { | 13 namespace { |
| 14 | 14 |
| 15 template <class Keyframe> | 15 template <class Keyframe> |
| 16 void InsertKeyframe(scoped_ptr<Keyframe> keyframe, | 16 void InsertKeyframe(scoped_ptr<Keyframe> keyframe, |
| 17 ScopedPtrVector<Keyframe>& keyframes) { | 17 ScopedPtrVector<Keyframe>* keyframes) { |
| 18 // Usually, the keyframes will be added in order, so this loop would be | 18 // Usually, the keyframes will be added in order, so this loop would be |
| 19 // unnecessary and we should skip it if possible. | 19 // unnecessary and we should skip it if possible. |
| 20 if (!keyframes.empty() && keyframe->Time() < keyframes.back()->Time()) { | 20 if (!keyframes->empty() && keyframe->Time() < keyframes->back()->Time()) { |
| 21 for (size_t i = 0; i < keyframes.size(); ++i) { | 21 for (size_t i = 0; i < keyframes->size(); ++i) { |
| 22 if (keyframe->Time() < keyframes[i]->Time()) { | 22 if (keyframe->Time() < keyframes->at(i)->Time()) { |
| 23 keyframes.insert(keyframes.begin() + i, keyframe.Pass()); | 23 keyframes->insert(keyframes->begin() + i, keyframe.Pass()); |
| 24 return; | 24 return; |
| 25 } | 25 } |
| 26 } | 26 } |
| 27 } | 27 } |
| 28 | 28 |
| 29 keyframes.push_back(keyframe.Pass()); | 29 keyframes->push_back(keyframe.Pass()); |
| 30 } | 30 } |
| 31 | 31 |
| 32 template <class Keyframes> | 32 template <class Keyframes> |
| 33 float GetProgress(double t, size_t i, const Keyframes& keyframes) { | 33 float GetProgress(double t, size_t i, const Keyframes& keyframes) { |
| 34 float progress = | 34 float progress = |
| 35 static_cast<float>((t - keyframes[i]->Time()) / | 35 static_cast<float>((t - keyframes[i]->Time()) / |
| 36 (keyframes[i + 1]->Time() - keyframes[i]->Time())); | 36 (keyframes[i + 1]->Time() - keyframes[i]->Time())); |
| 37 | 37 |
| 38 if (keyframes[i]->timing_function()) | 38 if (keyframes[i]->timing_function()) |
| 39 progress = keyframes[i]->timing_function()->GetValue(progress); | 39 progress = keyframes[i]->timing_function()->GetValue(progress); |
| (...skipping 122 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 162 Create() { | 162 Create() { |
| 163 return make_scoped_ptr(new KeyframedColorAnimationCurve); | 163 return make_scoped_ptr(new KeyframedColorAnimationCurve); |
| 164 } | 164 } |
| 165 | 165 |
| 166 KeyframedColorAnimationCurve::KeyframedColorAnimationCurve() {} | 166 KeyframedColorAnimationCurve::KeyframedColorAnimationCurve() {} |
| 167 | 167 |
| 168 KeyframedColorAnimationCurve::~KeyframedColorAnimationCurve() {} | 168 KeyframedColorAnimationCurve::~KeyframedColorAnimationCurve() {} |
| 169 | 169 |
| 170 void KeyframedColorAnimationCurve::AddKeyframe( | 170 void KeyframedColorAnimationCurve::AddKeyframe( |
| 171 scoped_ptr<ColorKeyframe> keyframe) { | 171 scoped_ptr<ColorKeyframe> keyframe) { |
| 172 InsertKeyframe(keyframe.Pass(), keyframes_); | 172 InsertKeyframe(keyframe.Pass(), &keyframes_); |
| 173 } | 173 } |
| 174 | 174 |
| 175 double KeyframedColorAnimationCurve::Duration() const { | 175 double KeyframedColorAnimationCurve::Duration() const { |
| 176 return keyframes_.back()->Time() - keyframes_.front()->Time(); | 176 return keyframes_.back()->Time() - keyframes_.front()->Time(); |
| 177 } | 177 } |
| 178 | 178 |
| 179 scoped_ptr<AnimationCurve> KeyframedColorAnimationCurve::Clone() const { | 179 scoped_ptr<AnimationCurve> KeyframedColorAnimationCurve::Clone() const { |
| 180 scoped_ptr<KeyframedColorAnimationCurve> to_return( | 180 scoped_ptr<KeyframedColorAnimationCurve> to_return = |
| 181 KeyframedColorAnimationCurve::Create()); | 181 KeyframedColorAnimationCurve::Create(); |
| 182 for (size_t i = 0; i < keyframes_.size(); ++i) | 182 for (size_t i = 0; i < keyframes_.size(); ++i) |
| 183 to_return->AddKeyframe(keyframes_[i]->Clone()); | 183 to_return->AddKeyframe(keyframes_[i]->Clone()); |
| 184 return to_return.PassAs<AnimationCurve>(); | 184 return to_return.Pass(); |
| 185 } | 185 } |
| 186 | 186 |
| 187 SkColor KeyframedColorAnimationCurve::GetValue(double t) const { | 187 SkColor KeyframedColorAnimationCurve::GetValue(double t) const { |
| 188 if (t <= keyframes_.front()->Time()) | 188 if (t <= keyframes_.front()->Time()) |
| 189 return keyframes_.front()->Value(); | 189 return keyframes_.front()->Value(); |
| 190 | 190 |
| 191 if (t >= keyframes_.back()->Time()) | 191 if (t >= keyframes_.back()->Time()) |
| 192 return keyframes_.back()->Value(); | 192 return keyframes_.back()->Value(); |
| 193 | 193 |
| 194 size_t i = 0; | 194 size_t i = 0; |
| (...skipping 14 matching lines...) Expand all Loading... | |
| 209 Create() { | 209 Create() { |
| 210 return make_scoped_ptr(new KeyframedFloatAnimationCurve); | 210 return make_scoped_ptr(new KeyframedFloatAnimationCurve); |
| 211 } | 211 } |
| 212 | 212 |
| 213 KeyframedFloatAnimationCurve::KeyframedFloatAnimationCurve() {} | 213 KeyframedFloatAnimationCurve::KeyframedFloatAnimationCurve() {} |
| 214 | 214 |
| 215 KeyframedFloatAnimationCurve::~KeyframedFloatAnimationCurve() {} | 215 KeyframedFloatAnimationCurve::~KeyframedFloatAnimationCurve() {} |
| 216 | 216 |
| 217 void KeyframedFloatAnimationCurve::AddKeyframe( | 217 void KeyframedFloatAnimationCurve::AddKeyframe( |
| 218 scoped_ptr<FloatKeyframe> keyframe) { | 218 scoped_ptr<FloatKeyframe> keyframe) { |
| 219 InsertKeyframe(keyframe.Pass(), keyframes_); | 219 InsertKeyframe(keyframe.Pass(), &keyframes_); |
| 220 } | 220 } |
| 221 | 221 |
| 222 double KeyframedFloatAnimationCurve::Duration() const { | 222 double KeyframedFloatAnimationCurve::Duration() const { |
| 223 return keyframes_.back()->Time() - keyframes_.front()->Time(); | 223 return keyframes_.back()->Time() - keyframes_.front()->Time(); |
| 224 } | 224 } |
| 225 | 225 |
| 226 scoped_ptr<AnimationCurve> KeyframedFloatAnimationCurve::Clone() const { | 226 scoped_ptr<AnimationCurve> KeyframedFloatAnimationCurve::Clone() const { |
| 227 scoped_ptr<KeyframedFloatAnimationCurve> to_return( | 227 scoped_ptr<KeyframedFloatAnimationCurve> to_return = |
| 228 KeyframedFloatAnimationCurve::Create()); | 228 KeyframedFloatAnimationCurve::Create(); |
| 229 for (size_t i = 0; i < keyframes_.size(); ++i) | 229 for (size_t i = 0; i < keyframes_.size(); ++i) |
| 230 to_return->AddKeyframe(keyframes_[i]->Clone()); | 230 to_return->AddKeyframe(keyframes_[i]->Clone()); |
| 231 return to_return.PassAs<AnimationCurve>(); | 231 return to_return.Pass(); |
| 232 } | 232 } |
| 233 | 233 |
| 234 float KeyframedFloatAnimationCurve::GetValue(double t) const { | 234 float KeyframedFloatAnimationCurve::GetValue(double t) const { |
| 235 if (t <= keyframes_.front()->Time()) | 235 if (t <= keyframes_.front()->Time()) |
| 236 return keyframes_.front()->Value(); | 236 return keyframes_.front()->Value(); |
| 237 | 237 |
| 238 if (t >= keyframes_.back()->Time()) | 238 if (t >= keyframes_.back()->Time()) |
| 239 return keyframes_.back()->Value(); | 239 return keyframes_.back()->Value(); |
| 240 | 240 |
| 241 size_t i = 0; | 241 size_t i = 0; |
| (...skipping 12 matching lines...) Expand all Loading... | |
| 254 Create() { | 254 Create() { |
| 255 return make_scoped_ptr(new KeyframedTransformAnimationCurve); | 255 return make_scoped_ptr(new KeyframedTransformAnimationCurve); |
| 256 } | 256 } |
| 257 | 257 |
| 258 KeyframedTransformAnimationCurve::KeyframedTransformAnimationCurve() {} | 258 KeyframedTransformAnimationCurve::KeyframedTransformAnimationCurve() {} |
| 259 | 259 |
| 260 KeyframedTransformAnimationCurve::~KeyframedTransformAnimationCurve() {} | 260 KeyframedTransformAnimationCurve::~KeyframedTransformAnimationCurve() {} |
| 261 | 261 |
| 262 void KeyframedTransformAnimationCurve::AddKeyframe( | 262 void KeyframedTransformAnimationCurve::AddKeyframe( |
| 263 scoped_ptr<TransformKeyframe> keyframe) { | 263 scoped_ptr<TransformKeyframe> keyframe) { |
| 264 InsertKeyframe(keyframe.Pass(), keyframes_); | 264 InsertKeyframe(keyframe.Pass(), &keyframes_); |
| 265 } | 265 } |
| 266 | 266 |
| 267 double KeyframedTransformAnimationCurve::Duration() const { | 267 double KeyframedTransformAnimationCurve::Duration() const { |
| 268 return keyframes_.back()->Time() - keyframes_.front()->Time(); | 268 return keyframes_.back()->Time() - keyframes_.front()->Time(); |
| 269 } | 269 } |
| 270 | 270 |
| 271 scoped_ptr<AnimationCurve> KeyframedTransformAnimationCurve::Clone() const { | 271 scoped_ptr<AnimationCurve> KeyframedTransformAnimationCurve::Clone() const { |
| 272 scoped_ptr<KeyframedTransformAnimationCurve> to_return( | 272 scoped_ptr<KeyframedTransformAnimationCurve> to_return = |
|
vmpstr
2014/09/26 16:44:23
Are we not allowing this type of constructor eithe
danakj
2014/09/26 16:56:44
No, it's fine, I just think following matching ()
| |
| 273 KeyframedTransformAnimationCurve::Create()); | 273 KeyframedTransformAnimationCurve::Create(); |
| 274 for (size_t i = 0; i < keyframes_.size(); ++i) | 274 for (size_t i = 0; i < keyframes_.size(); ++i) |
| 275 to_return->AddKeyframe(keyframes_[i]->Clone()); | 275 to_return->AddKeyframe(keyframes_[i]->Clone()); |
| 276 return to_return.PassAs<AnimationCurve>(); | 276 return to_return.Pass(); |
| 277 } | 277 } |
| 278 | 278 |
| 279 // Assumes that (*keyframes).front()->Time() < t < (*keyframes).back()-Time(). | 279 // Assumes that (*keyframes).front()->Time() < t < (*keyframes).back()-Time(). |
| 280 template<typename ValueType, typename KeyframeType> | 280 template<typename ValueType, typename KeyframeType> |
| 281 static ValueType GetCurveValue(const ScopedPtrVector<KeyframeType>* keyframes, | 281 static ValueType GetCurveValue(const ScopedPtrVector<KeyframeType>* keyframes, |
| 282 double t) { | 282 double t) { |
| 283 size_t i = 0; | 283 size_t i = 0; |
| 284 for (; i < keyframes->size() - 1; ++i) { | 284 for (; i < keyframes->size() - 1; ++i) { |
| 285 if (t < (*keyframes)[i+1]->Time()) | 285 if (t < (*keyframes)[i+1]->Time()) |
| 286 break; | 286 break; |
| (...skipping 82 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 369 Create() { | 369 Create() { |
| 370 return make_scoped_ptr(new KeyframedFilterAnimationCurve); | 370 return make_scoped_ptr(new KeyframedFilterAnimationCurve); |
| 371 } | 371 } |
| 372 | 372 |
| 373 KeyframedFilterAnimationCurve::KeyframedFilterAnimationCurve() {} | 373 KeyframedFilterAnimationCurve::KeyframedFilterAnimationCurve() {} |
| 374 | 374 |
| 375 KeyframedFilterAnimationCurve::~KeyframedFilterAnimationCurve() {} | 375 KeyframedFilterAnimationCurve::~KeyframedFilterAnimationCurve() {} |
| 376 | 376 |
| 377 void KeyframedFilterAnimationCurve::AddKeyframe( | 377 void KeyframedFilterAnimationCurve::AddKeyframe( |
| 378 scoped_ptr<FilterKeyframe> keyframe) { | 378 scoped_ptr<FilterKeyframe> keyframe) { |
| 379 InsertKeyframe(keyframe.Pass(), keyframes_); | 379 InsertKeyframe(keyframe.Pass(), &keyframes_); |
| 380 } | 380 } |
| 381 | 381 |
| 382 double KeyframedFilterAnimationCurve::Duration() const { | 382 double KeyframedFilterAnimationCurve::Duration() const { |
| 383 return keyframes_.back()->Time() - keyframes_.front()->Time(); | 383 return keyframes_.back()->Time() - keyframes_.front()->Time(); |
| 384 } | 384 } |
| 385 | 385 |
| 386 scoped_ptr<AnimationCurve> KeyframedFilterAnimationCurve::Clone() const { | 386 scoped_ptr<AnimationCurve> KeyframedFilterAnimationCurve::Clone() const { |
| 387 scoped_ptr<KeyframedFilterAnimationCurve> to_return( | 387 scoped_ptr<KeyframedFilterAnimationCurve> to_return = |
| 388 KeyframedFilterAnimationCurve::Create()); | 388 KeyframedFilterAnimationCurve::Create(); |
| 389 for (size_t i = 0; i < keyframes_.size(); ++i) | 389 for (size_t i = 0; i < keyframes_.size(); ++i) |
| 390 to_return->AddKeyframe(keyframes_[i]->Clone()); | 390 to_return->AddKeyframe(keyframes_[i]->Clone()); |
| 391 return to_return.PassAs<AnimationCurve>(); | 391 return to_return.Pass(); |
| 392 } | 392 } |
| 393 | 393 |
| 394 FilterOperations KeyframedFilterAnimationCurve::GetValue(double t) const { | 394 FilterOperations KeyframedFilterAnimationCurve::GetValue(double t) const { |
| 395 if (t <= keyframes_.front()->Time()) | 395 if (t <= keyframes_.front()->Time()) |
| 396 return keyframes_.front()->Value(); | 396 return keyframes_.front()->Value(); |
| 397 | 397 |
| 398 if (t >= keyframes_.back()->Time()) | 398 if (t >= keyframes_.back()->Time()) |
| 399 return keyframes_.back()->Value(); | 399 return keyframes_.back()->Value(); |
| 400 | 400 |
| 401 return GetCurveValue<FilterOperations, FilterKeyframe>(&keyframes_, t); | 401 return GetCurveValue<FilterOperations, FilterKeyframe>(&keyframes_, t); |
| 402 } | 402 } |
| 403 | 403 |
| 404 bool KeyframedFilterAnimationCurve::HasFilterThatMovesPixels() const { | 404 bool KeyframedFilterAnimationCurve::HasFilterThatMovesPixels() const { |
| 405 for (size_t i = 0; i < keyframes_.size(); ++i) { | 405 for (size_t i = 0; i < keyframes_.size(); ++i) { |
| 406 if (keyframes_[i]->Value().HasFilterThatMovesPixels()) { | 406 if (keyframes_[i]->Value().HasFilterThatMovesPixels()) { |
| 407 return true; | 407 return true; |
| 408 } | 408 } |
| 409 } | 409 } |
| 410 return false; | 410 return false; |
| 411 } | 411 } |
| 412 | 412 |
| 413 } // namespace cc | 413 } // namespace cc |
| OLD | NEW |