Index: Source/core/animation/StringKeyframe.cpp |
diff --git a/Source/core/animation/StringKeyframe.cpp b/Source/core/animation/StringKeyframe.cpp |
index 3e4311302a6c4d41bb32bd674e8976be1a2ddb23..0022b6fabfcb76ad4af41fa026884985d9ce0b04 100644 |
--- a/Source/core/animation/StringKeyframe.cpp |
+++ b/Source/core/animation/StringKeyframe.cpp |
@@ -5,19 +5,8 @@ |
#include "config.h" |
#include "core/animation/StringKeyframe.h" |
-#include "core/animation/ColorStyleInterpolation.h" |
-#include "core/animation/ConstantStyleInterpolation.h" |
-#include "core/animation/DeferredLegacyStyleInterpolation.h" |
-#include "core/animation/DoubleStyleInterpolation.h" |
-#include "core/animation/ImageStyleInterpolation.h" |
-#include "core/animation/LegacyStyleInterpolation.h" |
-#include "core/animation/LengthBoxStyleInterpolation.h" |
-#include "core/animation/LengthPairStyleInterpolation.h" |
-#include "core/animation/LengthStyleInterpolation.h" |
-#include "core/animation/ListStyleInterpolation.h" |
-#include "core/animation/SVGLengthStyleInterpolation.h" |
-#include "core/animation/ShadowStyleInterpolation.h" |
-#include "core/animation/VisibilityStyleInterpolation.h" |
+#include "core/animation/InterpolationFactory.h" |
+#include "core/animation/StyleInterpolation.h" |
#include "core/animation/css/CSSAnimations.h" |
#include "core/css/CSSPropertyMetadata.h" |
#include "core/css/resolver/StyleResolver.h" |
@@ -75,297 +64,13 @@ StringKeyframe::PropertySpecificKeyframe::PropertySpecificKeyframe(double offset |
ASSERT(!isNull(m_offset)); |
} |
-namespace { |
-InterpolationRange setRange(CSSPropertyID id) |
-{ |
- switch (id) { |
- case CSSPropertyOrphans: |
- case CSSPropertyWebkitColumnCount: |
- case CSSPropertyWidows: |
- return RangeRoundGreaterThanOrEqualToOne; |
- case CSSPropertyWebkitColumnRuleWidth: |
- case CSSPropertyZIndex: |
- return RangeRound; |
- case CSSPropertyFloodOpacity: |
- case CSSPropertyStopOpacity: |
- case CSSPropertyStrokeOpacity: |
- case CSSPropertyShapeImageThreshold: |
- return RangeZeroToOne; |
- case CSSPropertyFillOpacity: |
- case CSSPropertyOpacity: |
- return RangeOpacityFIXME; |
- case CSSPropertyStrokeMiterlimit: |
- return RangeGreaterThanOrEqualToOne; |
- case CSSPropertyZoom: |
- return RangePositive; |
- default: |
- ASSERT_NOT_REACHED(); |
- return RangeAll; |
- } |
-} |
- |
-} // namespace |
- |
// 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 |
{ |
CSSValue* fromCSSValue = m_value.get(); |
CSSValue* toCSSValue = toStringPropertySpecificKeyframe(end).value(); |
- InterpolationRange range = RangeAll; |
- bool fallBackToLegacy = false; |
- |
- // FIXME: Remove this flag once we can rely on legacy's behaviour being correct. |
- bool forceDefaultInterpolation = false; |
- |
- if (!CSSPropertyMetadata::isAnimatableProperty(property)) { |
- if (fromCSSValue == toCSSValue) |
- return ConstantStyleInterpolation::create(fromCSSValue, property); |
- |
- return nullptr; |
- } |
- |
- // FIXME: Generate this giant switch statement. |
- switch (property) { |
- case CSSPropertyLineHeight: |
- if (LengthStyleInterpolation::canCreateFrom(*fromCSSValue) && LengthStyleInterpolation::canCreateFrom(*toCSSValue)) |
- return LengthStyleInterpolation::create(*fromCSSValue, *toCSSValue, property, RangeNonNegative); |
- |
- if (DoubleStyleInterpolation::canCreateFrom(*fromCSSValue) && DoubleStyleInterpolation::canCreateFrom(*toCSSValue)) |
- return DoubleStyleInterpolation::create(*fromCSSValue, *toCSSValue, property, CSSPrimitiveValue::CSS_NUMBER, RangeNonNegative); |
- |
- break; |
- case CSSPropertyBorderBottomWidth: |
- case CSSPropertyBorderLeftWidth: |
- case CSSPropertyBorderRightWidth: |
- case CSSPropertyBorderTopWidth: |
- case CSSPropertyFlexBasis: |
- case CSSPropertyFontSize: |
- case CSSPropertyHeight: |
- case CSSPropertyMaxHeight: |
- case CSSPropertyMaxWidth: |
- case CSSPropertyMinHeight: |
- case CSSPropertyMinWidth: |
- case CSSPropertyMotionPosition: |
- case CSSPropertyOutlineWidth: |
- case CSSPropertyPaddingBottom: |
- case CSSPropertyPaddingLeft: |
- case CSSPropertyPaddingRight: |
- case CSSPropertyPaddingTop: |
- case CSSPropertyPerspective: |
- case CSSPropertyShapeMargin: |
- case CSSPropertyWebkitBorderHorizontalSpacing: |
- case CSSPropertyWebkitBorderVerticalSpacing: |
- case CSSPropertyWebkitColumnGap: |
- case CSSPropertyWebkitColumnWidth: |
- case CSSPropertyWidth: |
- range = RangeNonNegative; |
- // Fall through |
- case CSSPropertyBottom: |
- case CSSPropertyLeft: |
- case CSSPropertyLetterSpacing: |
- case CSSPropertyMarginBottom: |
- case CSSPropertyMarginLeft: |
- case CSSPropertyMarginRight: |
- case CSSPropertyMarginTop: |
- case CSSPropertyOutlineOffset: |
- case CSSPropertyRight: |
- case CSSPropertyTop: |
- case CSSPropertyVerticalAlign: |
- case CSSPropertyWordSpacing: |
- case CSSPropertyWebkitColumnRuleWidth: |
- if (LengthStyleInterpolation::canCreateFrom(*fromCSSValue) && LengthStyleInterpolation::canCreateFrom(*toCSSValue)) |
- return LengthStyleInterpolation::create(*fromCSSValue, *toCSSValue, property, range); |
- |
- // FIXME: Handle keywords e.g. 'none'. |
- if (property == CSSPropertyPerspective) |
- fallBackToLegacy = true; |
- // FIXME: Handle keywords e.g. 'smaller', 'larger'. |
- if (property == CSSPropertyFontSize) |
- fallBackToLegacy = true; |
- |
- // FIXME: Handle keywords e.g. 'normal' |
- if (property == CSSPropertyLetterSpacing) |
- fallBackToLegacy = true; |
- |
- // FIXME: Handle keywords e.g. 'thick' |
- if (property == CSSPropertyOutlineWidth || CSSPropertyWebkitColumnRuleWidth) |
- fallBackToLegacy = true; |
- break; |
- case CSSPropertyOrphans: |
- case CSSPropertyWidows: |
- case CSSPropertyZIndex: |
- case CSSPropertyWebkitColumnCount: |
- case CSSPropertyShapeImageThreshold: |
- case CSSPropertyFillOpacity: |
- case CSSPropertyFloodOpacity: |
- case CSSPropertyOpacity: |
- case CSSPropertyStopOpacity: |
- case CSSPropertyStrokeOpacity: |
- case CSSPropertyStrokeMiterlimit: |
- case CSSPropertyZoom: |
- if (DoubleStyleInterpolation::canCreateFrom(*fromCSSValue) && DoubleStyleInterpolation::canCreateFrom(*toCSSValue)) { |
- if (property == CSSPropertyOpacity) |
- StringKeyframe::PropertySpecificKeyframe::ensureAnimatableValueCaches(property, end, element, *fromCSSValue, *toCSSValue); |
- return DoubleStyleInterpolation::create(*fromCSSValue, *toCSSValue, property, toCSSPrimitiveValue(fromCSSValue)->primitiveType(), setRange(property)); |
- } |
- break; |
- |
- case CSSPropertyMotionRotation: { |
- RefPtrWillBeRawPtr<Interpolation> interpolation = DoubleStyleInterpolation::maybeCreateFromMotionRotation(*fromCSSValue, *toCSSValue, property); |
- if (interpolation) |
- return interpolation.release(); |
- break; |
- } |
- case CSSPropertyVisibility: |
- if (VisibilityStyleInterpolation::canCreateFrom(*fromCSSValue) && VisibilityStyleInterpolation::canCreateFrom(*toCSSValue) && (VisibilityStyleInterpolation::isVisible(*fromCSSValue) || VisibilityStyleInterpolation::isVisible(*toCSSValue))) |
- return VisibilityStyleInterpolation::create(*fromCSSValue, *toCSSValue, property); |
- |
- break; |
- |
- case CSSPropertyBackgroundColor: |
- case CSSPropertyBorderBottomColor: |
- case CSSPropertyBorderLeftColor: |
- case CSSPropertyBorderRightColor: |
- case CSSPropertyBorderTopColor: |
- case CSSPropertyColor: |
- case CSSPropertyFloodColor: |
- case CSSPropertyLightingColor: |
- case CSSPropertyOutlineColor: |
- case CSSPropertyStopColor: |
- case CSSPropertyTextDecorationColor: |
- case CSSPropertyWebkitColumnRuleColor: |
- case CSSPropertyWebkitTextStrokeColor: |
- { |
- RefPtrWillBeRawPtr<Interpolation> interpolation = ColorStyleInterpolation::maybeCreateFromColor(*fromCSSValue, *toCSSValue, property); |
- if (interpolation) |
- return interpolation.release(); |
- |
- // Current color should use LegacyStyleInterpolation |
- if (ColorStyleInterpolation::shouldUseLegacyStyleInterpolation(*fromCSSValue, *toCSSValue)) |
- fallBackToLegacy = true; |
- |
- break; |
- } |
- |
- case CSSPropertyBorderImageSource: |
- case CSSPropertyListStyleImage: |
- case CSSPropertyWebkitMaskBoxImageSource: |
- if (ImageStyleInterpolation::canCreateFrom(*fromCSSValue) && ImageStyleInterpolation::canCreateFrom(*toCSSValue)) |
- return ImageStyleInterpolation::create(*fromCSSValue, *toCSSValue, property); |
- |
- // FIXME: Handle gradients. |
- fallBackToLegacy = true; |
- break; |
- case CSSPropertyBorderBottomLeftRadius: |
- case CSSPropertyBorderBottomRightRadius: |
- case CSSPropertyBorderTopLeftRadius: |
- case CSSPropertyBorderTopRightRadius: |
- range = RangeNonNegative; |
- // Fall through |
- case CSSPropertyObjectPosition: |
- if (LengthPairStyleInterpolation::canCreateFrom(*fromCSSValue) && LengthPairStyleInterpolation::canCreateFrom(*toCSSValue)) |
- return LengthPairStyleInterpolation::create(*fromCSSValue, *toCSSValue, property, range); |
- break; |
- |
- case CSSPropertyPerspectiveOrigin: |
- case CSSPropertyTransformOrigin: { |
- RefPtrWillBeRawPtr<Interpolation> interpolation = ListStyleInterpolation<LengthStyleInterpolation>::maybeCreateFromList(*fromCSSValue, *toCSSValue, property, range); |
- if (interpolation) |
- return interpolation.release(); |
- break; |
- } |
- case CSSPropertyBoxShadow: |
- case CSSPropertyTextShadow: |
- case CSSPropertyWebkitBoxShadow: { |
- RefPtrWillBeRawPtr<Interpolation> interpolation = ListStyleInterpolation<ShadowStyleInterpolation>::maybeCreateFromList(*fromCSSValue, *toCSSValue, property); |
- if (interpolation) |
- return interpolation.release(); |
- |
- // FIXME: AnimatableShadow incorrectly animates between inset and non-inset values so it will never indicate it needs default interpolation |
- if (ShadowStyleInterpolation::usesDefaultStyleInterpolation(*fromCSSValue, *toCSSValue)) { |
- forceDefaultInterpolation = true; |
- break; |
- } |
- |
- // FIXME: Handle interpolation from/to none, unspecified color values |
- fallBackToLegacy = true; |
- |
- break; |
- |
- } |
- |
- case CSSPropertyClip: |
- case CSSPropertyBorderImageSlice: |
- case CSSPropertyWebkitMaskBoxImageSlice: { |
- RefPtrWillBeRawPtr<Interpolation> interpolation = LengthBoxStyleInterpolation::maybeCreateFrom(fromCSSValue, toCSSValue, property); |
- if (interpolation) |
- return interpolation.release(); |
- break; |
- } |
- |
- case CSSPropertyStrokeWidth: |
- range = RangeNonNegative; |
- // Fall through |
- case CSSPropertyBaselineShift: |
- case CSSPropertyStrokeDashoffset: { |
- RefPtrWillBeRawPtr<Interpolation> interpolation = SVGLengthStyleInterpolation::maybeCreate(*fromCSSValue, *toCSSValue, property, range); |
- if (interpolation) |
- return interpolation.release(); |
- |
- break; |
- } |
- |
- default: |
- // Fall back to LegacyStyleInterpolation. |
- fallBackToLegacy = true; |
- break; |
- } |
- |
- if (fromCSSValue == toCSSValue) |
- return ConstantStyleInterpolation::create(fromCSSValue, property); |
- |
- if (forceDefaultInterpolation) |
- return nullptr; |
- |
- if (fromCSSValue->isUnsetValue() || fromCSSValue->isInheritedValue() || fromCSSValue->isInitialValue() |
- || toCSSValue->isUnsetValue() || toCSSValue->isInheritedValue() || toCSSValue->isInitialValue()) |
- fallBackToLegacy = true; |
- |
- if (fallBackToLegacy) { |
- 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; |
- |
- return LegacyStyleInterpolation::create(m_animatableValueCache.get(), to.release(), property); |
- } |
- |
- ASSERT(AnimatableValue::usesDefaultInterpolation( |
- StyleResolver::createAnimatableValueSnapshot(*element, property, *fromCSSValue).get(), |
- 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; |
+ return InterpolationFactory::maybeCreateInterpolation(property, fromCSSValue, toCSSValue, m_composite, toStringPropertySpecificKeyframe(end).m_composite, &m_animatableValueCache, &toStringPropertySpecificKeyframe(end).m_animatableValueCache, element); |
} |
PassOwnPtrWillBeRawPtr<Keyframe::PropertySpecificKeyframe> StringKeyframe::PropertySpecificKeyframe::neutralKeyframe(double offset, PassRefPtr<TimingFunction> easing) const |