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 #include "core/animation/Interpolation.h" | 8 #include "core/animation/Interpolation.h" |
9 #include "core/animation/PropertyHandle.h" | 9 #include "core/animation/PropertyHandle.h" |
10 | 10 |
(...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
48 return toInterpolableNumber(interpolationValue(*i.get()))->value(); | 48 return toInterpolableNumber(interpolationValue(*i.get()))->value(); |
49 } | 49 } |
50 | 50 |
51 bool interpolateBools(bool a, bool b, double progress) | 51 bool interpolateBools(bool a, bool b, double progress) |
52 { | 52 { |
53 RefPtrWillBeRawPtr<Interpolation> i = SampleInterpolation::create(Interp
olableBool::create(a), InterpolableBool::create(b)); | 53 RefPtrWillBeRawPtr<Interpolation> i = SampleInterpolation::create(Interp
olableBool::create(a), InterpolableBool::create(b)); |
54 i->interpolate(0, progress); | 54 i->interpolate(0, progress); |
55 return toInterpolableBool(interpolationValue(*i.get()))->value(); | 55 return toInterpolableBool(interpolationValue(*i.get()))->value(); |
56 } | 56 } |
57 | 57 |
| 58 void scaleAndAdd(InterpolableValue& base, double scale, const InterpolableVa
lue& add) |
| 59 { |
| 60 base.scaleAndAdd(scale, add); |
| 61 } |
| 62 |
58 PassRefPtrWillBeRawPtr<Interpolation> interpolateLists(PassOwnPtrWillBeRawPt
r<InterpolableList> listA, PassOwnPtrWillBeRawPtr<InterpolableList> listB, doubl
e progress) | 63 PassRefPtrWillBeRawPtr<Interpolation> interpolateLists(PassOwnPtrWillBeRawPt
r<InterpolableList> listA, PassOwnPtrWillBeRawPtr<InterpolableList> listB, doubl
e progress) |
59 { | 64 { |
60 RefPtrWillBeRawPtr<Interpolation> i = SampleInterpolation::create(listA,
listB); | 65 RefPtrWillBeRawPtr<Interpolation> i = SampleInterpolation::create(listA,
listB); |
61 i->interpolate(0, progress); | 66 i->interpolate(0, progress); |
62 return i; | 67 return i; |
63 } | 68 } |
64 | |
65 double addNumbers(double a, double b) | |
66 { | |
67 OwnPtrWillBeRawPtr<InterpolableValue> numA = InterpolableNumber::create(
a); | |
68 OwnPtrWillBeRawPtr<InterpolableValue> numB = InterpolableNumber::create(
b); | |
69 | |
70 OwnPtrWillBeRawPtr<InterpolableValue> resultNumber = InterpolableNumber:
:create(0); | |
71 | |
72 numA->add(*numB, *resultNumber); | |
73 | |
74 return toInterpolableNumber(resultNumber.get())->value(); | |
75 } | |
76 | |
77 bool addBools(bool a, bool b) | |
78 { | |
79 OwnPtrWillBeRawPtr<InterpolableValue> boolA = InterpolableBool::create(a
); | |
80 OwnPtrWillBeRawPtr<InterpolableValue> boolB = InterpolableBool::create(b
); | |
81 | |
82 OwnPtrWillBeRawPtr<InterpolableValue> resultBool = InterpolableBool::cre
ate(false); | |
83 | |
84 boolA->add(*boolB, *resultBool); | |
85 | |
86 return toInterpolableBool(resultBool.get())->value(); | |
87 } | |
88 | |
89 PassOwnPtrWillBeRawPtr<InterpolableList> addLists(PassOwnPtrWillBeRawPtr<Int
erpolableValue> listA, PassOwnPtrWillBeRawPtr<InterpolableValue> listB) | |
90 { | |
91 OwnPtrWillBeRawPtr<InterpolableList> result = InterpolableList::create(t
oInterpolableList(*listA)); | |
92 | |
93 listA->add(*listB, *result); | |
94 | |
95 return result.release(); | |
96 } | |
97 | |
98 double multiplyNumber(double scalar, double n) | |
99 { | |
100 OwnPtrWillBeRawPtr<InterpolableValue> num = InterpolableNumber::create(n
); | |
101 OwnPtrWillBeRawPtr<InterpolableValue> result = InterpolableNumber::creat
e(0); | |
102 | |
103 num->multiply(scalar, *result); | |
104 | |
105 return toInterpolableNumber(result.get())->value(); | |
106 } | |
107 | |
108 PassOwnPtrWillBeRawPtr<InterpolableList> multiplyList(double scalar, PassOwn
PtrWillBeRawPtr<InterpolableValue> list) | |
109 { | |
110 OwnPtrWillBeRawPtr<InterpolableList> result = InterpolableList::create(t
oInterpolableList(*list)); | |
111 | |
112 list->multiply(scalar, *result); | |
113 | |
114 return result.release(); | |
115 } | |
116 }; | 69 }; |
117 | 70 |
118 TEST_F(AnimationInterpolableValueTest, InterpolateNumbers) | 71 TEST_F(AnimationInterpolableValueTest, InterpolateNumbers) |
119 { | 72 { |
120 EXPECT_FLOAT_EQ(126, interpolateNumbers(42, 0, -2)); | 73 EXPECT_FLOAT_EQ(126, interpolateNumbers(42, 0, -2)); |
121 EXPECT_FLOAT_EQ(42, interpolateNumbers(42, 0, 0)); | 74 EXPECT_FLOAT_EQ(42, interpolateNumbers(42, 0, 0)); |
122 EXPECT_FLOAT_EQ(29.4f, interpolateNumbers(42, 0, 0.3)); | 75 EXPECT_FLOAT_EQ(29.4f, interpolateNumbers(42, 0, 0.3)); |
123 EXPECT_FLOAT_EQ(21, interpolateNumbers(42, 0, 0.5)); | 76 EXPECT_FLOAT_EQ(21, interpolateNumbers(42, 0, 0.5)); |
124 EXPECT_FLOAT_EQ(0, interpolateNumbers(42, 0, 1)); | 77 EXPECT_FLOAT_EQ(0, interpolateNumbers(42, 0, 1)); |
125 EXPECT_FLOAT_EQ(-21, interpolateNumbers(42, 0, 1.5)); | 78 EXPECT_FLOAT_EQ(-21, interpolateNumbers(42, 0, 1.5)); |
(...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
170 listB->set(1, subListB.release()); | 123 listB->set(1, subListB.release()); |
171 listB->set(2, InterpolableBool::create(true)); | 124 listB->set(2, InterpolableBool::create(true)); |
172 | 125 |
173 RefPtrWillBeRawPtr<Interpolation> i = interpolateLists(listA.release(), list
B.release(), 0.5); | 126 RefPtrWillBeRawPtr<Interpolation> i = interpolateLists(listA.release(), list
B.release(), 0.5); |
174 InterpolableList* outList = toInterpolableList(interpolationValue(*i.get()))
; | 127 InterpolableList* outList = toInterpolableList(interpolationValue(*i.get()))
; |
175 EXPECT_FLOAT_EQ(50, toInterpolableNumber(outList->get(0))->value()); | 128 EXPECT_FLOAT_EQ(50, toInterpolableNumber(outList->get(0))->value()); |
176 EXPECT_FLOAT_EQ(75, toInterpolableNumber(toInterpolableList(outList->get(1))
->get(0))->value()); | 129 EXPECT_FLOAT_EQ(75, toInterpolableNumber(toInterpolableList(outList->get(1))
->get(0))->value()); |
177 EXPECT_TRUE(toInterpolableBool(outList->get(2))->value()); | 130 EXPECT_TRUE(toInterpolableBool(outList->get(2))->value()); |
178 } | 131 } |
179 | 132 |
180 TEST_F(AnimationInterpolableValueTest, AddNumbers) | 133 TEST_F(AnimationInterpolableValueTest, ScaleAndAddNumbers) |
181 { | 134 { |
182 EXPECT_FLOAT_EQ(42, addNumbers(20, 22)); | 135 OwnPtrWillBeRawPtr<InterpolableNumber> base = InterpolableNumber::create(10)
; |
183 EXPECT_FLOAT_EQ(42, addNumbers(22, 20)); | 136 scaleAndAdd(*base, 2, *InterpolableNumber::create(1)); |
184 EXPECT_FLOAT_EQ(50, addNumbers(0, 50)); | 137 EXPECT_FLOAT_EQ(21, base->value()); |
185 EXPECT_FLOAT_EQ(50, addNumbers(50, 0)); | 138 |
186 EXPECT_FLOAT_EQ(32, addNumbers(42, -10)); | 139 base = InterpolableNumber::create(10); |
187 EXPECT_FLOAT_EQ(32, addNumbers(-10, 42)); | 140 scaleAndAdd(*base, 0, *InterpolableNumber::create(5)); |
188 EXPECT_FLOAT_EQ(-32, addNumbers(-42, 10)); | 141 EXPECT_FLOAT_EQ(5, base->value()); |
189 EXPECT_FLOAT_EQ(-32, addNumbers(10, -42)); | 142 |
| 143 base = InterpolableNumber::create(10); |
| 144 scaleAndAdd(*base, -1, *InterpolableNumber::create(8)); |
| 145 EXPECT_FLOAT_EQ(-2, base->value()); |
190 } | 146 } |
191 | 147 |
192 TEST_F(AnimationInterpolableValueTest, AddBools) | 148 TEST_F(AnimationInterpolableValueTest, ScaleAndAddLists) |
193 { | 149 { |
194 EXPECT_FALSE(addBools(false, false)); | 150 OwnPtrWillBeRawPtr<InterpolableList> baseList = InterpolableList::create(3); |
195 EXPECT_TRUE(addBools(true, false)); | 151 baseList->set(0, InterpolableNumber::create(5)); |
196 EXPECT_TRUE(addBools(false, true)); | 152 baseList->set(1, InterpolableNumber::create(10)); |
197 EXPECT_TRUE(addBools(true, true)); | 153 baseList->set(2, InterpolableNumber::create(15)); |
198 } | 154 OwnPtrWillBeRawPtr<InterpolableList> addList = InterpolableList::create(3); |
199 | 155 addList->set(0, InterpolableNumber::create(1)); |
200 TEST_F(AnimationInterpolableValueTest, AddLists) | 156 addList->set(1, InterpolableNumber::create(2)); |
201 { | 157 addList->set(2, InterpolableNumber::create(3)); |
202 OwnPtrWillBeRawPtr<InterpolableList> listA = InterpolableList::create(3); | 158 scaleAndAdd(*baseList, 2, *addList); |
203 listA->set(0, InterpolableNumber::create(31)); | 159 EXPECT_FLOAT_EQ(11, toInterpolableNumber(baseList->get(0))->value()); |
204 listA->set(1, InterpolableNumber::create(-20)); | 160 EXPECT_FLOAT_EQ(22, toInterpolableNumber(baseList->get(1))->value()); |
205 listA->set(2, InterpolableNumber::create(42)); | 161 EXPECT_FLOAT_EQ(33, toInterpolableNumber(baseList->get(2))->value()); |
206 | |
207 OwnPtrWillBeRawPtr<InterpolableList> listB = InterpolableList::create(3); | |
208 listB->set(0, InterpolableNumber::create(20)); | |
209 listB->set(1, InterpolableNumber::create(43)); | |
210 listB->set(2, InterpolableNumber::create(-60)); | |
211 | |
212 OwnPtrWillBeRawPtr<InterpolableList> result = addLists(listA.release(), list
B.release()); | |
213 EXPECT_FLOAT_EQ(51, toInterpolableNumber(result->get(0))->value()); | |
214 EXPECT_FLOAT_EQ(23, toInterpolableNumber(result->get(1))->value()); | |
215 EXPECT_FLOAT_EQ(-18, toInterpolableNumber(result->get(2))->value()); | |
216 } | |
217 | |
218 TEST_F(AnimationInterpolableValueTest, AddNestedLists) | |
219 { | |
220 OwnPtrWillBeRawPtr<InterpolableList> listA = InterpolableList::create(3); | |
221 listA->set(0, InterpolableNumber::create(19)); | |
222 OwnPtrWillBeRawPtr<InterpolableList> subListA = InterpolableList::create(1); | |
223 subListA->set(0, InterpolableNumber::create(67)); | |
224 listA->set(1, subListA.release()); | |
225 listA->set(2, InterpolableBool::create(false)); | |
226 | |
227 OwnPtrWillBeRawPtr<InterpolableList> listB = InterpolableList::create(3); | |
228 listB->set(0, InterpolableNumber::create(21)); | |
229 OwnPtrWillBeRawPtr<InterpolableList> subListB = InterpolableList::create(1); | |
230 subListB->set(0, InterpolableNumber::create(31)); | |
231 listB->set(1, subListB.release()); | |
232 listB->set(2, InterpolableBool::create(true)); | |
233 | |
234 OwnPtrWillBeRawPtr<InterpolableList> result = addLists(listA.release(), list
B.release()); | |
235 EXPECT_FLOAT_EQ(40, toInterpolableNumber(result->get(0))->value()); | |
236 EXPECT_FLOAT_EQ(98, toInterpolableNumber(toInterpolableList(result->get(1))-
>get(0))->value()); | |
237 EXPECT_TRUE(toInterpolableBool(result->get(2))->value()); | |
238 } | |
239 | |
240 TEST_F(AnimationInterpolableValueTest, NumberScalarMultiplication) | |
241 { | |
242 EXPECT_FLOAT_EQ(42, multiplyNumber(6, 7)); | |
243 EXPECT_FLOAT_EQ(-20, multiplyNumber(-2, 10)); | |
244 EXPECT_FLOAT_EQ(-42, multiplyNumber(21, -2)); | |
245 EXPECT_FLOAT_EQ(20, multiplyNumber(-4, -5)); | |
246 | |
247 EXPECT_FLOAT_EQ(0, multiplyNumber(0, 10)); | |
248 EXPECT_FLOAT_EQ(0, multiplyNumber(10, 0)); | |
249 } | |
250 | |
251 TEST_F(AnimationInterpolableValueTest, ListScalarMultiplication) | |
252 { | |
253 OwnPtrWillBeRawPtr<InterpolableList> listA = InterpolableList::create(3); | |
254 listA->set(0, InterpolableNumber::create(5)); | |
255 OwnPtrWillBeRawPtr<InterpolableList> subListA = InterpolableList::create(2); | |
256 subListA->set(0, InterpolableNumber::create(4)); | |
257 subListA->set(1, InterpolableNumber::create(7)); | |
258 listA->set(1, subListA.release()); | |
259 listA->set(2, InterpolableNumber::create(3)); | |
260 | |
261 OwnPtrWillBeRawPtr<InterpolableList> resultA = multiplyList(6, listA.release
()); | |
262 EXPECT_FLOAT_EQ(30, toInterpolableNumber(resultA->get(0))->value()); | |
263 EXPECT_FLOAT_EQ(24, toInterpolableNumber(toInterpolableList(resultA->get(1))
->get(0))->value()); | |
264 EXPECT_FLOAT_EQ(42, toInterpolableNumber(toInterpolableList(resultA->get(1))
->get(1))->value()); | |
265 EXPECT_FLOAT_EQ(18, toInterpolableNumber(resultA->get(2))->value()); | |
266 | |
267 OwnPtrWillBeRawPtr<InterpolableList> listB = InterpolableList::create(3); | |
268 listB->set(0, InterpolableNumber::create(8)); | |
269 listB->set(1, InterpolableNumber::create(-10)); | |
270 listB->set(2, InterpolableNumber::create(9)); | |
271 | |
272 OwnPtrWillBeRawPtr<InterpolableList> resultB = multiplyList(0, listB.release
()); | |
273 EXPECT_FLOAT_EQ(0, toInterpolableNumber(resultB->get(0))->value()); | |
274 EXPECT_FLOAT_EQ(0, toInterpolableNumber(resultB->get(1))->value()); | |
275 EXPECT_FLOAT_EQ(0, toInterpolableNumber(resultB->get(2))->value()); | |
276 } | 162 } |
277 | 163 |
278 } | 164 } |
OLD | NEW |