Index: third_party/WebKit/Source/core/animation/InvalidatableStyleInterpolation.cpp |
diff --git a/third_party/WebKit/Source/core/animation/InvalidatableStyleInterpolation.cpp b/third_party/WebKit/Source/core/animation/InvalidatableStyleInterpolation.cpp |
index 599539f18cbad4d9f40ec985df18fbbddd916ccf..11d5be21003d4722552b1bb22e8d9a7181d62e2a 100644 |
--- a/third_party/WebKit/Source/core/animation/InvalidatableStyleInterpolation.cpp |
+++ b/third_party/WebKit/Source/core/animation/InvalidatableStyleInterpolation.cpp |
@@ -5,6 +5,7 @@ |
#include "config.h" |
#include "core/animation/InvalidatableStyleInterpolation.h" |
+#include "core/animation/InterpolationEnvironment.h" |
#include "core/animation/StringKeyframe.h" |
#include "core/css/resolver/StyleResolverState.h" |
@@ -24,13 +25,13 @@ void InvalidatableStyleInterpolation::interpolate(int, double fraction) |
// We defer the interpolation to ensureValidInterpolation() if m_cachedPairConversion is null. |
} |
-PassOwnPtr<PairwisePrimitiveInterpolation> InvalidatableStyleInterpolation::maybeConvertPairwise(const StyleResolverState* state, const UnderlyingValue& underlyingValue) const |
+PassOwnPtr<PairwisePrimitiveInterpolation> InvalidatableStyleInterpolation::maybeConvertPairwise(const InterpolationEnvironment* environment, const UnderlyingValue& underlyingValue) const |
{ |
ASSERT(m_currentFraction != 0 && m_currentFraction != 1); |
for (const auto& interpolationType : m_interpolationTypes) { |
if ((m_startKeyframe->isNeutral() || m_endKeyframe->isNeutral()) && (!underlyingValue || underlyingValue->type() != *interpolationType)) |
continue; |
- OwnPtr<PairwisePrimitiveInterpolation> pairwiseConversion = interpolationType->maybeConvertPairwise(*m_startKeyframe, *m_endKeyframe, state, underlyingValue, m_conversionCheckers); |
+ OwnPtr<PairwisePrimitiveInterpolation> pairwiseConversion = interpolationType->maybeConvertPairwise(*m_startKeyframe, *m_endKeyframe, environment, underlyingValue, m_conversionCheckers); |
if (pairwiseConversion) { |
ASSERT(pairwiseConversion->type() == *interpolationType); |
return pairwiseConversion.release(); |
@@ -39,14 +40,14 @@ PassOwnPtr<PairwisePrimitiveInterpolation> InvalidatableStyleInterpolation::mayb |
return nullptr; |
} |
-PassOwnPtr<InterpolationValue> InvalidatableStyleInterpolation::convertSingleKeyframe(const CSSPropertySpecificKeyframe& keyframe, const StyleResolverState& state, const UnderlyingValue& underlyingValue) const |
+PassOwnPtr<InterpolationValue> InvalidatableStyleInterpolation::convertSingleKeyframe(const PropertySpecificKeyframe& keyframe, const InterpolationEnvironment& environment, const UnderlyingValue& underlyingValue) const |
{ |
if (keyframe.isNeutral() && !underlyingValue) |
return nullptr; |
for (const auto& interpolationType : m_interpolationTypes) { |
if (keyframe.isNeutral() && underlyingValue->type() != *interpolationType) |
continue; |
- OwnPtr<InterpolationValue> result = interpolationType->maybeConvertSingle(keyframe, &state, underlyingValue, m_conversionCheckers); |
+ OwnPtr<InterpolationValue> result = interpolationType->maybeConvertSingle(keyframe, &environment, underlyingValue, m_conversionCheckers); |
if (result) { |
ASSERT(result->type() == *interpolationType); |
return result.release(); |
@@ -56,10 +57,10 @@ PassOwnPtr<InterpolationValue> InvalidatableStyleInterpolation::convertSingleKey |
return nullptr; |
} |
-PassOwnPtr<InterpolationValue> InvalidatableStyleInterpolation::maybeConvertUnderlyingValue(const StyleResolverState& state) const |
+PassOwnPtr<InterpolationValue> InvalidatableStyleInterpolation::maybeConvertUnderlyingValue(const InterpolationEnvironment& environment) const |
{ |
for (const auto& interpolationType : m_interpolationTypes) { |
- OwnPtr<InterpolationValue> result = interpolationType->maybeConvertUnderlyingValue(state); |
+ OwnPtr<InterpolationValue> result = interpolationType->maybeConvertUnderlyingValue(environment); |
if (result) |
return result.release(); |
} |
@@ -84,7 +85,7 @@ void InvalidatableStyleInterpolation::clearCache() const |
m_cachedValue.clear(); |
} |
-bool InvalidatableStyleInterpolation::isCacheValid(const StyleResolverState& state, const UnderlyingValue& underlyingValue) const |
+bool InvalidatableStyleInterpolation::isCacheValid(const InterpolationEnvironment& environment, const UnderlyingValue& underlyingValue) const |
{ |
if (!m_isCached) |
return false; |
@@ -96,31 +97,31 @@ bool InvalidatableStyleInterpolation::isCacheValid(const StyleResolverState& sta |
return false; |
} |
for (const auto& checker : m_conversionCheckers) { |
- if (!checker->isValid(state, underlyingValue)) |
+ if (!checker->isValid(environment, underlyingValue)) |
return false; |
} |
return true; |
} |
-const InterpolationValue* InvalidatableStyleInterpolation::ensureValidInterpolation(const StyleResolverState& state, const UnderlyingValue& underlyingValue) const |
+const InterpolationValue* InvalidatableStyleInterpolation::ensureValidInterpolation(const InterpolationEnvironment& environment, const UnderlyingValue& underlyingValue) const |
{ |
ASSERT(!std::isnan(m_currentFraction)); |
- if (isCacheValid(state, underlyingValue)) |
+ if (isCacheValid(environment, underlyingValue)) |
return m_cachedValue.get(); |
clearCache(); |
if (m_currentFraction == 0) { |
- m_cachedValue = convertSingleKeyframe(*m_startKeyframe, state, underlyingValue); |
+ m_cachedValue = convertSingleKeyframe(*m_startKeyframe, environment, underlyingValue); |
} else if (m_currentFraction == 1) { |
- m_cachedValue = convertSingleKeyframe(*m_endKeyframe, state, underlyingValue); |
+ m_cachedValue = convertSingleKeyframe(*m_endKeyframe, environment, underlyingValue); |
} else { |
- OwnPtr<PairwisePrimitiveInterpolation> pairwiseConversion = maybeConvertPairwise(&state, underlyingValue); |
+ OwnPtr<PairwisePrimitiveInterpolation> pairwiseConversion = maybeConvertPairwise(&environment, underlyingValue); |
if (pairwiseConversion) { |
m_cachedValue = pairwiseConversion->initialValue(); |
m_cachedPairConversion = pairwiseConversion.release(); |
} else { |
m_cachedPairConversion = FlipPrimitiveInterpolation::create( |
- convertSingleKeyframe(*m_startKeyframe, state, underlyingValue), |
- convertSingleKeyframe(*m_endKeyframe, state, underlyingValue)); |
+ convertSingleKeyframe(*m_startKeyframe, environment, underlyingValue), |
+ convertSingleKeyframe(*m_endKeyframe, environment, underlyingValue)); |
} |
m_cachedPairConversion->interpolateValue(m_currentFraction, m_cachedValue); |
} |
@@ -128,13 +129,17 @@ const InterpolationValue* InvalidatableStyleInterpolation::ensureValidInterpolat |
return m_cachedValue.get(); |
} |
-void InvalidatableStyleInterpolation::setFlagIfInheritUsed(StyleResolverState& state) const |
+void InvalidatableStyleInterpolation::setFlagIfInheritUsed(InterpolationEnvironment& environment) const |
{ |
- if (!state.parentStyle()) |
+ if (!property().isCSSProperty()) |
return; |
- if ((m_startKeyframe->value() && m_startKeyframe->value()->isInheritedValue()) |
- || (m_endKeyframe->value() && m_endKeyframe->value()->isInheritedValue())) { |
- state.parentStyle()->setHasExplicitlyInheritedProperties(); |
+ if (!environment.state().parentStyle()) |
+ return; |
+ const CSSValue* startValue = toCSSPropertySpecificKeyframe(m_startKeyframe)->value(); |
+ const CSSValue* endValue = toCSSPropertySpecificKeyframe(m_endKeyframe)->value(); |
+ if ((startValue && startValue->isInheritedValue()) |
+ || (endValue && endValue->isInheritedValue())) { |
+ environment.state().parentStyle()->setHasExplicitlyInheritedProperties(); |
} |
} |
@@ -147,7 +152,7 @@ double InvalidatableStyleInterpolation::underlyingFraction() const |
return m_cachedPairConversion->interpolateUnderlyingFraction(m_startKeyframe->underlyingFraction(), m_endKeyframe->underlyingFraction(), m_currentFraction); |
} |
-void InvalidatableStyleInterpolation::applyStack(const ActiveInterpolations& interpolations, StyleResolverState& state) |
+void InvalidatableStyleInterpolation::applyStack(const ActiveInterpolations& interpolations, InterpolationEnvironment& environment) |
{ |
ASSERT(!interpolations.isEmpty()); |
size_t startingIndex = 0; |
@@ -156,14 +161,14 @@ void InvalidatableStyleInterpolation::applyStack(const ActiveInterpolations& int |
UnderlyingValue underlyingValue; |
const InvalidatableStyleInterpolation& firstInterpolation = toInvalidatableStyleInterpolation(*interpolations.at(startingIndex)); |
if (firstInterpolation.dependsOnUnderlyingValue()) { |
- underlyingValue.set(firstInterpolation.maybeConvertUnderlyingValue(state)); |
+ underlyingValue.set(firstInterpolation.maybeConvertUnderlyingValue(environment)); |
} else { |
- const InterpolationValue* firstValue = firstInterpolation.ensureValidInterpolation(state, UnderlyingValue()); |
+ const InterpolationValue* firstValue = firstInterpolation.ensureValidInterpolation(environment, UnderlyingValue()); |
// Fast path for replace interpolations that are the only one to apply. |
if (interpolations.size() == 1) { |
if (firstValue) { |
- firstInterpolation.setFlagIfInheritUsed(state); |
- firstValue->type().apply(firstValue->interpolableValue(), firstValue->nonInterpolableValue(), state); |
+ firstInterpolation.setFlagIfInheritUsed(environment); |
+ firstValue->type().apply(firstValue->interpolableValue(), firstValue->nonInterpolableValue(), environment); |
} |
return; |
} |
@@ -176,11 +181,11 @@ void InvalidatableStyleInterpolation::applyStack(const ActiveInterpolations& int |
for (size_t i = startingIndex; i < interpolations.size(); i++) { |
const InvalidatableStyleInterpolation& currentInterpolation = toInvalidatableStyleInterpolation(*interpolations.at(i)); |
ASSERT(currentInterpolation.dependsOnUnderlyingValue()); |
- const InterpolationValue* currentValue = currentInterpolation.ensureValidInterpolation(state, underlyingValue); |
+ const InterpolationValue* currentValue = currentInterpolation.ensureValidInterpolation(environment, underlyingValue); |
if (!currentValue) |
continue; |
shouldApply = true; |
- currentInterpolation.setFlagIfInheritUsed(state); |
+ currentInterpolation.setFlagIfInheritUsed(environment); |
double underlyingFraction = currentInterpolation.underlyingFraction(); |
if (underlyingFraction == 0 || !underlyingValue || underlyingValue->type() != currentValue->type()) |
underlyingValue.set(currentValue); |
@@ -189,7 +194,7 @@ void InvalidatableStyleInterpolation::applyStack(const ActiveInterpolations& int |
} |
if (shouldApply && underlyingValue) |
- underlyingValue->type().apply(underlyingValue->interpolableValue(), underlyingValue->nonInterpolableValue(), state); |
+ underlyingValue->type().apply(underlyingValue->interpolableValue(), underlyingValue->nonInterpolableValue(), environment); |
} |
} // namespace blink |