OLD | NEW |
1 // Copyright 2015 The Chromium Authors. All rights reserved. | 1 // Copyright 2015 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 "core/animation/InvalidatableInterpolation.h" | 5 #include "core/animation/InvalidatableInterpolation.h" |
6 | 6 |
7 #include "core/animation/InterpolationEnvironment.h" | 7 #include "core/animation/InterpolationEnvironment.h" |
8 #include "core/animation/StringKeyframe.h" | 8 #include "core/animation/StringKeyframe.h" |
9 #include "core/css/resolver/StyleResolverState.h" | 9 #include "core/css/resolver/StyleResolverState.h" |
| 10 #include <memory> |
10 | 11 |
11 namespace blink { | 12 namespace blink { |
12 | 13 |
13 void InvalidatableInterpolation::interpolate(int, double fraction) | 14 void InvalidatableInterpolation::interpolate(int, double fraction) |
14 { | 15 { |
15 if (fraction == m_currentFraction) | 16 if (fraction == m_currentFraction) |
16 return; | 17 return; |
17 | 18 |
18 if (m_currentFraction == 0 || m_currentFraction == 1 || fraction == 0 || fra
ction == 1) | 19 if (m_currentFraction == 0 || m_currentFraction == 1 || fraction == 0 || fra
ction == 1) |
19 clearCache(); | 20 clearCache(); |
20 | 21 |
21 m_currentFraction = fraction; | 22 m_currentFraction = fraction; |
22 if (m_isCached && m_cachedPairConversion) | 23 if (m_isCached && m_cachedPairConversion) |
23 m_cachedPairConversion->interpolateValue(fraction, m_cachedValue); | 24 m_cachedPairConversion->interpolateValue(fraction, m_cachedValue); |
24 // We defer the interpolation to ensureValidInterpolation() if m_cachedPairC
onversion is null. | 25 // We defer the interpolation to ensureValidInterpolation() if m_cachedPairC
onversion is null. |
25 } | 26 } |
26 | 27 |
27 PassOwnPtr<PairwisePrimitiveInterpolation> InvalidatableInterpolation::maybeConv
ertPairwise(const InterpolationEnvironment& environment, const UnderlyingValueOw
ner& underlyingValueOwner) const | 28 std::unique_ptr<PairwisePrimitiveInterpolation> InvalidatableInterpolation::mayb
eConvertPairwise(const InterpolationEnvironment& environment, const UnderlyingVa
lueOwner& underlyingValueOwner) const |
28 { | 29 { |
29 ASSERT(m_currentFraction != 0 && m_currentFraction != 1); | 30 ASSERT(m_currentFraction != 0 && m_currentFraction != 1); |
30 for (const auto& interpolationType : m_interpolationTypes) { | 31 for (const auto& interpolationType : m_interpolationTypes) { |
31 if ((m_startKeyframe->isNeutral() || m_endKeyframe->isNeutral()) && (!un
derlyingValueOwner || underlyingValueOwner.type() != *interpolationType)) | 32 if ((m_startKeyframe->isNeutral() || m_endKeyframe->isNeutral()) && (!un
derlyingValueOwner || underlyingValueOwner.type() != *interpolationType)) |
32 continue; | 33 continue; |
33 ConversionCheckers conversionCheckers; | 34 ConversionCheckers conversionCheckers; |
34 PairwiseInterpolationValue result = interpolationType->maybeConvertPairw
ise(*m_startKeyframe, *m_endKeyframe, environment, underlyingValueOwner.value(),
conversionCheckers); | 35 PairwiseInterpolationValue result = interpolationType->maybeConvertPairw
ise(*m_startKeyframe, *m_endKeyframe, environment, underlyingValueOwner.value(),
conversionCheckers); |
35 addConversionCheckers(*interpolationType, conversionCheckers); | 36 addConversionCheckers(*interpolationType, conversionCheckers); |
36 if (result) { | 37 if (result) { |
37 return PairwisePrimitiveInterpolation::create(*interpolationType, | 38 return PairwisePrimitiveInterpolation::create(*interpolationType, |
38 std::move(result.startInterpolableValue), | 39 std::move(result.startInterpolableValue), |
39 std::move(result.endInterpolableValue), | 40 std::move(result.endInterpolableValue), |
40 result.nonInterpolableValue.release()); | 41 result.nonInterpolableValue.release()); |
41 } | 42 } |
42 } | 43 } |
43 return nullptr; | 44 return nullptr; |
44 } | 45 } |
45 | 46 |
46 PassOwnPtr<TypedInterpolationValue> InvalidatableInterpolation::convertSingleKey
frame(const PropertySpecificKeyframe& keyframe, const InterpolationEnvironment&
environment, const UnderlyingValueOwner& underlyingValueOwner) const | 47 std::unique_ptr<TypedInterpolationValue> InvalidatableInterpolation::convertSing
leKeyframe(const PropertySpecificKeyframe& keyframe, const InterpolationEnvironm
ent& environment, const UnderlyingValueOwner& underlyingValueOwner) const |
47 { | 48 { |
48 if (keyframe.isNeutral() && !underlyingValueOwner) | 49 if (keyframe.isNeutral() && !underlyingValueOwner) |
49 return nullptr; | 50 return nullptr; |
50 for (const auto& interpolationType : m_interpolationTypes) { | 51 for (const auto& interpolationType : m_interpolationTypes) { |
51 if (keyframe.isNeutral() && underlyingValueOwner.type() != *interpolatio
nType) | 52 if (keyframe.isNeutral() && underlyingValueOwner.type() != *interpolatio
nType) |
52 continue; | 53 continue; |
53 ConversionCheckers conversionCheckers; | 54 ConversionCheckers conversionCheckers; |
54 InterpolationValue result = interpolationType->maybeConvertSingle(keyfra
me, environment, underlyingValueOwner.value(), conversionCheckers); | 55 InterpolationValue result = interpolationType->maybeConvertSingle(keyfra
me, environment, underlyingValueOwner.value(), conversionCheckers); |
55 addConversionCheckers(*interpolationType, conversionCheckers); | 56 addConversionCheckers(*interpolationType, conversionCheckers); |
56 if (result) | 57 if (result) |
57 return TypedInterpolationValue::create(*interpolationType, std::move
(result.interpolableValue), result.nonInterpolableValue.release()); | 58 return TypedInterpolationValue::create(*interpolationType, std::move
(result.interpolableValue), result.nonInterpolableValue.release()); |
58 } | 59 } |
59 ASSERT(keyframe.isNeutral()); | 60 ASSERT(keyframe.isNeutral()); |
60 return nullptr; | 61 return nullptr; |
61 } | 62 } |
62 | 63 |
63 void InvalidatableInterpolation::addConversionCheckers(const InterpolationType&
type, ConversionCheckers& conversionCheckers) const | 64 void InvalidatableInterpolation::addConversionCheckers(const InterpolationType&
type, ConversionCheckers& conversionCheckers) const |
64 { | 65 { |
65 for (size_t i = 0; i < conversionCheckers.size(); i++) { | 66 for (size_t i = 0; i < conversionCheckers.size(); i++) { |
66 conversionCheckers[i]->setType(type); | 67 conversionCheckers[i]->setType(type); |
67 m_conversionCheckers.append(std::move(conversionCheckers[i])); | 68 m_conversionCheckers.append(std::move(conversionCheckers[i])); |
68 } | 69 } |
69 } | 70 } |
70 | 71 |
71 PassOwnPtr<TypedInterpolationValue> InvalidatableInterpolation::maybeConvertUnde
rlyingValue(const InterpolationEnvironment& environment) const | 72 std::unique_ptr<TypedInterpolationValue> InvalidatableInterpolation::maybeConver
tUnderlyingValue(const InterpolationEnvironment& environment) const |
72 { | 73 { |
73 for (const auto& interpolationType : m_interpolationTypes) { | 74 for (const auto& interpolationType : m_interpolationTypes) { |
74 InterpolationValue result = interpolationType->maybeConvertUnderlyingVal
ue(environment); | 75 InterpolationValue result = interpolationType->maybeConvertUnderlyingVal
ue(environment); |
75 if (result) | 76 if (result) |
76 return TypedInterpolationValue::create(*interpolationType, std::move
(result.interpolableValue), result.nonInterpolableValue.release()); | 77 return TypedInterpolationValue::create(*interpolationType, std::move
(result.interpolableValue), result.nonInterpolableValue.release()); |
77 } | 78 } |
78 return nullptr; | 79 return nullptr; |
79 } | 80 } |
80 | 81 |
81 bool InvalidatableInterpolation::dependsOnUnderlyingValue() const | 82 bool InvalidatableInterpolation::dependsOnUnderlyingValue() const |
(...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
118 { | 119 { |
119 ASSERT(!std::isnan(m_currentFraction)); | 120 ASSERT(!std::isnan(m_currentFraction)); |
120 if (isCacheValid(environment, underlyingValueOwner)) | 121 if (isCacheValid(environment, underlyingValueOwner)) |
121 return m_cachedValue.get(); | 122 return m_cachedValue.get(); |
122 clearCache(); | 123 clearCache(); |
123 if (m_currentFraction == 0) { | 124 if (m_currentFraction == 0) { |
124 m_cachedValue = convertSingleKeyframe(*m_startKeyframe, environment, und
erlyingValueOwner); | 125 m_cachedValue = convertSingleKeyframe(*m_startKeyframe, environment, und
erlyingValueOwner); |
125 } else if (m_currentFraction == 1) { | 126 } else if (m_currentFraction == 1) { |
126 m_cachedValue = convertSingleKeyframe(*m_endKeyframe, environment, under
lyingValueOwner); | 127 m_cachedValue = convertSingleKeyframe(*m_endKeyframe, environment, under
lyingValueOwner); |
127 } else { | 128 } else { |
128 OwnPtr<PairwisePrimitiveInterpolation> pairwiseConversion = maybeConvert
Pairwise(environment, underlyingValueOwner); | 129 std::unique_ptr<PairwisePrimitiveInterpolation> pairwiseConversion = may
beConvertPairwise(environment, underlyingValueOwner); |
129 if (pairwiseConversion) { | 130 if (pairwiseConversion) { |
130 m_cachedValue = pairwiseConversion->initialValue(); | 131 m_cachedValue = pairwiseConversion->initialValue(); |
131 m_cachedPairConversion = std::move(pairwiseConversion); | 132 m_cachedPairConversion = std::move(pairwiseConversion); |
132 } else { | 133 } else { |
133 m_cachedPairConversion = FlipPrimitiveInterpolation::create( | 134 m_cachedPairConversion = FlipPrimitiveInterpolation::create( |
134 convertSingleKeyframe(*m_startKeyframe, environment, underlyingV
alueOwner), | 135 convertSingleKeyframe(*m_startKeyframe, environment, underlyingV
alueOwner), |
135 convertSingleKeyframe(*m_endKeyframe, environment, underlyingVal
ueOwner)); | 136 convertSingleKeyframe(*m_endKeyframe, environment, underlyingVal
ueOwner)); |
136 } | 137 } |
137 m_cachedPairConversion->interpolateValue(m_currentFraction, m_cachedValu
e); | 138 m_cachedPairConversion->interpolateValue(m_currentFraction, m_cachedValu
e); |
138 } | 139 } |
(...skipping 63 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
202 underlyingValueOwner.set(currentValue); | 203 underlyingValueOwner.set(currentValue); |
203 else | 204 else |
204 currentValue->type().composite(underlyingValueOwner, underlyingFract
ion, currentValue->value(), currentInterpolation.m_currentFraction); | 205 currentValue->type().composite(underlyingValueOwner, underlyingFract
ion, currentValue->value(), currentInterpolation.m_currentFraction); |
205 } | 206 } |
206 | 207 |
207 if (shouldApply && underlyingValueOwner) | 208 if (shouldApply && underlyingValueOwner) |
208 underlyingValueOwner.type().apply(*underlyingValueOwner.value().interpol
ableValue, underlyingValueOwner.value().nonInterpolableValue.get(), environment)
; | 209 underlyingValueOwner.type().apply(*underlyingValueOwner.value().interpol
ableValue, underlyingValueOwner.value().nonInterpolableValue.get(), environment)
; |
209 } | 210 } |
210 | 211 |
211 } // namespace blink | 212 } // namespace blink |
OLD | NEW |