Index: Source/core/animation/InterpolationFactory.cpp |
diff --git a/Source/core/animation/StringKeyframe.cpp b/Source/core/animation/InterpolationFactory.cpp |
similarity index 70% |
copy from Source/core/animation/StringKeyframe.cpp |
copy to Source/core/animation/InterpolationFactory.cpp |
index 3e4311302a6c4d41bb32bd674e8976be1a2ddb23..0d3c02424deecd5a522311bfd7a15a555187c506 100644 |
--- a/Source/core/animation/StringKeyframe.cpp |
+++ b/Source/core/animation/InterpolationFactory.cpp |
@@ -1,9 +1,9 @@ |
-// Copyright 2014 The Chromium Authors. All rights reserved. |
+// Copyright 2015 The Chromium Authors. All rights reserved. |
// Use of this source code is governed by a BSD-style license that can be |
// found in the LICENSE file. |
#include "config.h" |
-#include "core/animation/StringKeyframe.h" |
+#include "core/animation/InterpolationFactory.h" |
#include "core/animation/ColorStyleInterpolation.h" |
#include "core/animation/ConstantStyleInterpolation.h" |
@@ -18,65 +18,12 @@ |
#include "core/animation/SVGLengthStyleInterpolation.h" |
#include "core/animation/ShadowStyleInterpolation.h" |
#include "core/animation/VisibilityStyleInterpolation.h" |
-#include "core/animation/css/CSSAnimations.h" |
#include "core/css/CSSPropertyMetadata.h" |
#include "core/css/resolver/StyleResolver.h" |
-#include "core/layout/style/LayoutStyle.h" |
namespace blink { |
-StringKeyframe::StringKeyframe(const StringKeyframe& copyFrom) |
- : Keyframe(copyFrom.m_offset, copyFrom.m_composite, copyFrom.m_easing) |
- , m_propertySet(copyFrom.m_propertySet->mutableCopy()) |
-{ |
-} |
- |
-void StringKeyframe::setPropertyValue(CSSPropertyID property, const String& value, StyleSheetContents* styleSheetContents) |
-{ |
- ASSERT(property != CSSPropertyInvalid); |
- if (CSSAnimations::isAllowedAnimation(property)) |
- m_propertySet->setProperty(property, value, false, styleSheetContents); |
-} |
- |
-PropertySet StringKeyframe::properties() const |
-{ |
- // This is not used in time-critical code, so we probably don't need to |
- // worry about caching this result. |
- PropertySet properties; |
- for (unsigned i = 0; i < m_propertySet->propertyCount(); ++i) |
- properties.add(m_propertySet->propertyAt(i).id()); |
- return properties; |
-} |
- |
-PassRefPtrWillBeRawPtr<Keyframe> StringKeyframe::clone() const |
-{ |
- return adoptRefWillBeNoop(new StringKeyframe(*this)); |
-} |
-PassOwnPtrWillBeRawPtr<Keyframe::PropertySpecificKeyframe> StringKeyframe::createPropertySpecificKeyframe(CSSPropertyID property) const |
-{ |
- return adoptPtrWillBeNoop(new PropertySpecificKeyframe(offset(), &easing(), propertyValue(property), composite())); |
-} |
- |
-void StringKeyframe::trace(Visitor* visitor) |
-{ |
- visitor->trace(m_propertySet); |
- Keyframe::trace(visitor); |
-} |
- |
-StringKeyframe::PropertySpecificKeyframe::PropertySpecificKeyframe(double offset, PassRefPtr<TimingFunction> easing, CSSValue* value, AnimationEffect::CompositeOperation op) |
- : Keyframe::PropertySpecificKeyframe(offset, easing, op) |
- , m_value(value) |
-{ } |
- |
-StringKeyframe::PropertySpecificKeyframe::PropertySpecificKeyframe(double offset, PassRefPtr<TimingFunction> easing, CSSValue* value) |
- : Keyframe::PropertySpecificKeyframe(offset, easing, AnimationEffect::CompositeReplace) |
- , m_value(value) |
-{ |
- ASSERT(!isNull(m_offset)); |
-} |
- |
-namespace { |
-InterpolationRange setRange(CSSPropertyID id) |
+static InterpolationRange setRange(CSSPropertyID id) |
{ |
switch (id) { |
case CSSPropertyOrphans: |
@@ -104,13 +51,35 @@ InterpolationRange setRange(CSSPropertyID id) |
} |
} |
-} // namespace |
+static void ensureAnimatableValueCaches( |
+ CSSPropertyID property, |
+ CSSValue& fromCSSValue, |
+ CSSValue& toCSSValue, |
+ RefPtrWillBeRawPtr<AnimatableValue>* fromAnimatableValueCache, |
+ RefPtrWillBeRawPtr<AnimatableValue>* toAnimatableValueCache, |
+ Element* element) |
+{ |
+ if (!*fromAnimatableValueCache) |
+ *fromAnimatableValueCache = StyleResolver::createAnimatableValueSnapshot(*element, property, fromCSSValue); |
+ |
+ RefPtrWillBeRawPtr<AnimatableValue> to = StyleResolver::createAnimatableValueSnapshot(*element, property, toCSSValue); |
+ *toAnimatableValueCache = to; |
+} |
-// FIXME: Refactor this into a generic piece that lives in InterpolationEffect, and a template parameter specific converter. |
-PassRefPtrWillBeRawPtr<Interpolation> StringKeyframe::PropertySpecificKeyframe::maybeCreateInterpolation(CSSPropertyID property, Keyframe::PropertySpecificKeyframe& end, Element* element) const |
+// FIXME: Remove the use of AnimatableValues and Elements here. |
+PassRefPtrWillBeRawPtr<Interpolation> InterpolationFactory::maybeCreateInterpolation( |
+ CSSPropertyID property, |
+ CSSValue* fromCSSValue, |
+ CSSValue* toCSSValue, |
+ AnimationEffect::CompositeOperation fromComposite, |
+ AnimationEffect::CompositeOperation toComposite, |
+ RefPtrWillBeRawPtr<AnimatableValue>* fromAnimatableValueCache, |
+ RefPtrWillBeRawPtr<AnimatableValue>* toAnimatableValueCache, |
+ Element* element) |
{ |
- CSSValue* fromCSSValue = m_value.get(); |
- CSSValue* toCSSValue = toStringPropertySpecificKeyframe(end).value(); |
+ ASSERT(fromCSSValue); |
+ ASSERT(toCSSValue); |
+ |
InterpolationRange range = RangeAll; |
bool fallBackToLegacy = false; |
@@ -119,7 +88,7 @@ PassRefPtrWillBeRawPtr<Interpolation> StringKeyframe::PropertySpecificKeyframe:: |
if (!CSSPropertyMetadata::isAnimatableProperty(property)) { |
if (fromCSSValue == toCSSValue) |
- return ConstantStyleInterpolation::create(fromCSSValue, property); |
+ return ConstantStyleInterpolation::create(fromCSSValue, property, fromComposite, toComposite); |
return nullptr; |
} |
@@ -174,7 +143,7 @@ PassRefPtrWillBeRawPtr<Interpolation> StringKeyframe::PropertySpecificKeyframe:: |
case CSSPropertyWordSpacing: |
case CSSPropertyWebkitColumnRuleWidth: |
if (LengthStyleInterpolation::canCreateFrom(*fromCSSValue) && LengthStyleInterpolation::canCreateFrom(*toCSSValue)) |
- return LengthStyleInterpolation::create(*fromCSSValue, *toCSSValue, property, range); |
+ return LengthStyleInterpolation::create(*fromCSSValue, *toCSSValue, property, range, fromComposite, toComposite); |
// FIXME: Handle keywords e.g. 'none'. |
if (property == CSSPropertyPerspective) |
@@ -204,8 +173,14 @@ PassRefPtrWillBeRawPtr<Interpolation> StringKeyframe::PropertySpecificKeyframe:: |
case CSSPropertyStrokeMiterlimit: |
case CSSPropertyZoom: |
if (DoubleStyleInterpolation::canCreateFrom(*fromCSSValue) && DoubleStyleInterpolation::canCreateFrom(*toCSSValue)) { |
- if (property == CSSPropertyOpacity) |
- StringKeyframe::PropertySpecificKeyframe::ensureAnimatableValueCaches(property, end, element, *fromCSSValue, *toCSSValue); |
+ if (property == CSSPropertyOpacity) { |
+ // FIXME: Remove the use of AnimatableValues and Elements here. |
+ ASSERT(element); |
+ ASSERT(fromAnimatableValueCache); |
+ ASSERT(toAnimatableValueCache); |
+ |
+ ensureAnimatableValueCaches(property, *fromCSSValue, *toCSSValue, fromAnimatableValueCache, toAnimatableValueCache, element); |
+ } |
return DoubleStyleInterpolation::create(*fromCSSValue, *toCSSValue, property, toCSSPrimitiveValue(fromCSSValue)->primitiveType(), setRange(property)); |
} |
break; |
@@ -323,7 +298,7 @@ PassRefPtrWillBeRawPtr<Interpolation> StringKeyframe::PropertySpecificKeyframe:: |
} |
if (fromCSSValue == toCSSValue) |
- return ConstantStyleInterpolation::create(fromCSSValue, property); |
+ return ConstantStyleInterpolation::create(fromCSSValue, property, fromComposite, toComposite); |
if (forceDefaultInterpolation) |
return nullptr; |
@@ -332,22 +307,20 @@ PassRefPtrWillBeRawPtr<Interpolation> StringKeyframe::PropertySpecificKeyframe:: |
|| toCSSValue->isUnsetValue() || toCSSValue->isInheritedValue() || toCSSValue->isInitialValue()) |
fallBackToLegacy = true; |
+ ASSERT(element); |
if (fallBackToLegacy) { |
+ ASSERT(fromAnimatableValueCache); |
+ ASSERT(toAnimatableValueCache); |
+ |
if (DeferredLegacyStyleInterpolation::interpolationRequiresStyleResolve(*fromCSSValue) || DeferredLegacyStyleInterpolation::interpolationRequiresStyleResolve(*toCSSValue)) { |
// FIXME: Handle these cases outside of DeferredLegacyStyleInterpolation. |
return DeferredLegacyStyleInterpolation::create(fromCSSValue, toCSSValue, property); |
} |
- // FIXME: Remove the use of AnimatableValues, RenderStyles and Elements here. |
- // FIXME: Remove this cache |
- ASSERT(element); |
- if (!m_animatableValueCache) |
- m_animatableValueCache = StyleResolver::createAnimatableValueSnapshot(*element, property, *fromCSSValue); |
- |
- RefPtrWillBeRawPtr<AnimatableValue> to = StyleResolver::createAnimatableValueSnapshot(*element, property, *toCSSValue); |
- toStringPropertySpecificKeyframe(end).m_animatableValueCache = to; |
+ // FIXME: Remove the use of AnimatableValues and Elements here. |
+ ensureAnimatableValueCaches(property, *fromCSSValue, *toCSSValue, fromAnimatableValueCache, toAnimatableValueCache, element); |
- return LegacyStyleInterpolation::create(m_animatableValueCache.get(), to.release(), property); |
+ return LegacyStyleInterpolation::create((*fromAnimatableValueCache).get(), (*toAnimatableValueCache).get(), property); |
} |
ASSERT(AnimatableValue::usesDefaultInterpolation( |
@@ -355,36 +328,24 @@ PassRefPtrWillBeRawPtr<Interpolation> StringKeyframe::PropertySpecificKeyframe:: |
StyleResolver::createAnimatableValueSnapshot(*element, property, *toCSSValue).get())); |
return nullptr; |
- |
-} |
-// FIXME: Remove the use of AnimatableValues, RenderStyles and Elements here. |
-// FIXME: Remove this cache |
-void StringKeyframe::PropertySpecificKeyframe::ensureAnimatableValueCaches(CSSPropertyID property, Keyframe::PropertySpecificKeyframe& end, Element* element, CSSValue& fromCSSValue, CSSValue& toCSSValue) const |
-{ |
- ASSERT(element); |
- if (!m_animatableValueCache) |
- m_animatableValueCache = StyleResolver::createAnimatableValueSnapshot(*element, property, fromCSSValue); |
- RefPtrWillBeRawPtr<AnimatableValue> to = StyleResolver::createAnimatableValueSnapshot(*element, property, toCSSValue); |
- toStringPropertySpecificKeyframe(end).m_animatableValueCache = to; |
} |
-PassOwnPtrWillBeRawPtr<Keyframe::PropertySpecificKeyframe> StringKeyframe::PropertySpecificKeyframe::neutralKeyframe(double offset, PassRefPtr<TimingFunction> easing) const |
+PassRefPtrWillBeRawPtr<Interpolation> InterpolationFactory::createConstantInterpolation( |
+ CSSPropertyID property, |
+ CSSValue* value, |
+ AnimationEffect::CompositeOperation fromComposite, |
+ AnimationEffect::CompositeOperation toComposite) |
{ |
- return adoptPtrWillBeNoop(new PropertySpecificKeyframe(offset, easing, 0, AnimationEffect::CompositeAdd)); |
-} |
+ RefPtrWillBeRawPtr<Interpolation> interpolation = InterpolationFactory::maybeCreateInterpolation( |
+ property, |
+ value, |
+ value, |
+ fromComposite, |
+ toComposite); |
-PassOwnPtrWillBeRawPtr<Keyframe::PropertySpecificKeyframe> StringKeyframe::PropertySpecificKeyframe::cloneWithOffset(double offset) const |
-{ |
- Keyframe::PropertySpecificKeyframe* theClone = new PropertySpecificKeyframe(offset, m_easing, m_value.get()); |
- toStringPropertySpecificKeyframe(theClone)->m_animatableValueCache = m_animatableValueCache; |
- return adoptPtrWillBeNoop(theClone); |
-} |
+ ASSERT(interpolation); |
-void StringKeyframe::PropertySpecificKeyframe::trace(Visitor* visitor) |
-{ |
- visitor->trace(m_value); |
- visitor->trace(m_animatableValueCache); |
- Keyframe::PropertySpecificKeyframe::trace(visitor); |
+ return interpolation.release(); |
} |
} |