OLD | NEW |
1 // Copyright 2014 The Chromium Authors. All rights reserved. | 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 | 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 "config.h" | 5 #include "config.h" |
6 #include "core/animation/InterpolableValue.h" | 6 #include "core/animation/InterpolableValue.h" |
7 | 7 |
8 namespace blink { | 8 namespace blink { |
9 | 9 |
10 DEFINE_EMPTY_DESTRUCTOR_WILL_BE_REMOVED(InterpolableValue); | 10 DEFINE_EMPTY_DESTRUCTOR_WILL_BE_REMOVED(InterpolableValue); |
11 | 11 |
12 PassOwnPtrWillBeRawPtr<InterpolableValue> InterpolableNumber::interpolate(const
InterpolableValue &to, const double progress) const | 12 void InterpolableNumber::interpolate(const InterpolableValue &to, const double p
rogress, InterpolableValue& result) const |
13 { | 13 { |
14 const InterpolableNumber& toNumber = toInterpolableNumber(to); | 14 const InterpolableNumber& toNumber = toInterpolableNumber(to); |
15 if (!progress) | 15 InterpolableNumber& resultNumber = toInterpolableNumber(result); |
16 return create(m_value); | 16 |
17 if (progress == 1) | 17 if (progress == 0) |
18 return create(toNumber.m_value); | 18 resultNumber.m_value = m_value; |
19 return create(m_value * (1 - progress) + toNumber.m_value * progress); | 19 else if (progress == 1) |
| 20 resultNumber.m_value = toNumber.m_value; |
| 21 else |
| 22 resultNumber.m_value = m_value * (1 - progress) + toNumber.m_value * pro
gress; |
20 } | 23 } |
21 | 24 |
22 PassOwnPtrWillBeRawPtr<InterpolableValue> InterpolableBool::interpolate(const In
terpolableValue &to, const double progress) const | 25 void InterpolableBool::interpolate(const InterpolableValue &to, const double pro
gress, InterpolableValue& result) const |
23 { | 26 { |
24 if (progress < 0.5) { | 27 const InterpolableBool& toBool = toInterpolableBool(to); |
25 return clone(); | 28 InterpolableBool& resultBool = toInterpolableBool(result); |
26 } | 29 |
27 return to.clone(); | 30 if (progress < 0.5) |
| 31 resultBool.m_value = m_value; |
| 32 else |
| 33 resultBool.m_value = toBool.m_value; |
28 } | 34 } |
29 | 35 |
30 PassOwnPtrWillBeRawPtr<InterpolableValue> InterpolableList::interpolate(const In
terpolableValue &to, const double progress) const | 36 void InterpolableList::interpolate(const InterpolableValue& to, const double pro
gress, InterpolableValue& result) const |
31 { | 37 { |
32 const InterpolableList& toList = toInterpolableList(to); | 38 const InterpolableList& toList = toInterpolableList(to); |
| 39 InterpolableList& resultList = toInterpolableList(result); |
| 40 |
33 ASSERT(toList.m_size == m_size); | 41 ASSERT(toList.m_size == m_size); |
| 42 ASSERT(resultList.m_size == m_size); |
34 | 43 |
35 if (!progress) { | |
36 return create(*this); | |
37 } | |
38 if (progress == 1) { | |
39 return InterpolableList::create(toList); | |
40 } | |
41 | |
42 OwnPtrWillBeRawPtr<InterpolableList> result = create(m_size); | |
43 for (size_t i = 0; i < m_size; i++) { | 44 for (size_t i = 0; i < m_size; i++) { |
44 ASSERT(m_values[i]); | 45 ASSERT(m_values[i]); |
45 ASSERT(toList.m_values[i]); | 46 ASSERT(toList.m_values[i]); |
46 result->set(i, m_values[i]->interpolate(*(toList.m_values[i]), progress)
); | 47 m_values[i]->interpolate(*(toList.m_values[i]), progress, *(resultList.m
_values[i])); |
47 } | 48 } |
48 return result.release(); | |
49 } | 49 } |
50 | 50 |
51 void InterpolableList::trace(Visitor* visitor) | 51 void InterpolableList::trace(Visitor* visitor) |
52 { | 52 { |
53 #if ENABLE_OILPAN | 53 #if ENABLE_OILPAN |
54 visitor->trace(m_values); | 54 visitor->trace(m_values); |
55 #endif | 55 #endif |
56 InterpolableValue::trace(visitor); | 56 InterpolableValue::trace(visitor); |
57 } | 57 } |
58 | 58 |
59 PassOwnPtrWillBeRawPtr<InterpolableValue> InterpolableAnimatableValue::interpola
te(const InterpolableValue &other, const double percentage) const | 59 void InterpolableAnimatableValue::interpolate(const InterpolableValue& to, const
double progress, InterpolableValue& result) const |
60 { | 60 { |
61 const InterpolableAnimatableValue& otherValue = toInterpolableAnimatableValu
e(other); | 61 const InterpolableAnimatableValue& toValue = toInterpolableAnimatableValue(t
o); |
62 if (!percentage) | 62 InterpolableAnimatableValue& resultValue = toInterpolableAnimatableValue(res
ult); |
63 return create(m_value); | 63 if (progress == 0) |
64 if (percentage == 1) | 64 resultValue.m_value = m_value; |
65 return create(otherValue.m_value); | 65 if (progress == 1) |
66 return create(AnimatableValue::interpolate(m_value.get(), otherValue.m_value
.get(), percentage)); | 66 resultValue.m_value = toValue.m_value; |
| 67 resultValue.m_value = AnimatableValue::interpolate(m_value.get(), toValue.m_
value.get(), progress); |
67 } | 68 } |
68 | 69 |
69 void InterpolableAnimatableValue::trace(Visitor* visitor) | 70 void InterpolableAnimatableValue::trace(Visitor* visitor) |
70 { | 71 { |
71 visitor->trace(m_value); | 72 visitor->trace(m_value); |
72 InterpolableValue::trace(visitor); | 73 InterpolableValue::trace(visitor); |
73 } | 74 } |
74 | 75 |
75 } | 76 } |
OLD | NEW |