Index: third_party/WebKit/Source/core/animation/CSSTranslateInterpolationType.cpp |
diff --git a/third_party/WebKit/Source/core/animation/CSSTranslateInterpolationType.cpp b/third_party/WebKit/Source/core/animation/CSSTranslateInterpolationType.cpp |
new file mode 100644 |
index 0000000000000000000000000000000000000000..7b743825c742be072220376859ff333c020709fa |
--- /dev/null |
+++ b/third_party/WebKit/Source/core/animation/CSSTranslateInterpolationType.cpp |
@@ -0,0 +1,133 @@ |
+// Copyright 2016 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 "core/animation/CSSTranslateInterpolationType.h" |
+ |
+#include "core/animation/CSSLengthInterpolationType.h" |
+#include "core/css/CSSValueList.h" |
+#include "core/css/resolver/StyleResolverState.h" |
+#include "platform/transforms/TranslateTransformOperation.h" |
+ |
+namespace blink { |
+ |
+namespace { |
+ |
+class ParentTranslateChecker : public InterpolationType::ConversionChecker { |
+public: |
+ ~ParentTranslateChecker() {} |
+ |
+ static PassOwnPtr<ParentTranslateChecker> create(PassRefPtr<TranslateTransformOperation> parentTranslate) |
+ { |
+ return adoptPtr(new ParentTranslateChecker(parentTranslate)); |
+ } |
+ |
+ bool isValid(const InterpolationEnvironment& environment, const InterpolationValue& underlying) const final |
+ { |
+ const TransformOperation* parentTranslate = environment.state().parentStyle()->translate(); |
+ if (m_parentTranslate == parentTranslate) |
+ return true; |
+ if (!m_parentTranslate || !parentTranslate) |
+ return false; |
+ return *m_parentTranslate == *parentTranslate; |
+ } |
+ |
+private: |
+ ParentTranslateChecker(PassRefPtr<TranslateTransformOperation> parentTranslate) |
+ : m_parentTranslate(parentTranslate) |
+ { } |
+ |
+ RefPtr<TransformOperation> m_parentTranslate; |
+}; |
+ |
+enum TranslateComponentIndex { |
+ TranslateX, |
+ TranslateY, |
+ TranslateZ, |
+ TranslateComponentIndexCount, |
+}; |
+ |
+InterpolationValue createNeutralValue() |
+{ |
+ OwnPtr<InterpolableList> result = InterpolableList::create(TranslateComponentIndexCount); |
+ result->set(TranslateX, CSSLengthInterpolationType::createNeutralInterpolableValue()); |
+ result->set(TranslateY, CSSLengthInterpolationType::createNeutralInterpolableValue()); |
+ result->set(TranslateZ, CSSLengthInterpolationType::createNeutralInterpolableValue()); |
+ return InterpolationValue(result.release()); |
+} |
+ |
+InterpolationValue convertTranslateOperation(const TranslateTransformOperation* translate, double zoom) |
+{ |
+ if (!translate) |
+ return createNeutralValue(); |
+ |
+ OwnPtr<InterpolableList> result = InterpolableList::create(TranslateComponentIndexCount); |
+ result->set(TranslateX, CSSLengthInterpolationType::maybeConvertLength(translate->x(), zoom).interpolableValue.release()); |
+ result->set(TranslateY, CSSLengthInterpolationType::maybeConvertLength(translate->y(), zoom).interpolableValue.release()); |
+ result->set(TranslateZ, CSSLengthInterpolationType::maybeConvertLength(Length(translate->z(), Fixed), zoom).interpolableValue.release()); |
+ return InterpolationValue(result.release()); |
+} |
+ |
+} // namespace |
+ |
+InterpolationValue CSSTranslateInterpolationType::maybeConvertNeutral(const InterpolationValue& underlying, ConversionCheckers&) const |
+{ |
+ return createNeutralValue(); |
+} |
+ |
+InterpolationValue CSSTranslateInterpolationType::maybeConvertInitial() const |
+{ |
+ return createNeutralValue(); |
+} |
+ |
+InterpolationValue CSSTranslateInterpolationType::maybeConvertInherit(const StyleResolverState& state, ConversionCheckers& conversionCheckers) const |
+{ |
+ TranslateTransformOperation* parentTranslate = state.parentStyle()->translate(); |
+ conversionCheckers.append(ParentTranslateChecker::create(parentTranslate)); |
+ return convertTranslateOperation(parentTranslate, state.parentStyle()->effectiveZoom()); |
+} |
+ |
+InterpolationValue CSSTranslateInterpolationType::maybeConvertValue(const CSSValue& value, const StyleResolverState&, ConversionCheckers&) const |
+{ |
+ if (!value.isBaseValueList()) |
+ return nullptr; |
+ |
+ const CSSValueList& list = toCSSValueList(value); |
+ if (list.length() < 1 || list.length() > 3) |
+ return nullptr; |
+ |
+ OwnPtr<InterpolableList> result = InterpolableList::create(TranslateComponentIndexCount); |
+ for (size_t i = 0; i < TranslateComponentIndexCount; i++) { |
+ InterpolationValue component = nullptr; |
+ if (i < list.length()) { |
+ component = CSSLengthInterpolationType::maybeConvertCSSValue(*list.item(i)); |
+ if (!component) |
+ return nullptr; |
+ } else { |
+ component = InterpolationValue(CSSLengthInterpolationType::createNeutralInterpolableValue()); |
+ } |
+ result->set(i, component.interpolableValue.release()); |
+ } |
+ return InterpolationValue(result.release()); |
+} |
+ |
+InterpolationValue CSSTranslateInterpolationType::maybeConvertUnderlyingValue(const InterpolationEnvironment& environment) const |
+{ |
+ return convertTranslateOperation(environment.state().style()->translate(), environment.state().style()->effectiveZoom()); |
+} |
+ |
+void CSSTranslateInterpolationType::apply(const InterpolableValue& interpolableValue, const NonInterpolableValue*, InterpolationEnvironment& environment) const |
+{ |
+ const InterpolableList& list = toInterpolableList(interpolableValue); |
+ const CSSToLengthConversionData& conversionData = environment.state().cssToLengthConversionData(); |
+ Length x = CSSLengthInterpolationType::resolveInterpolableLength(*list.get(TranslateX), nullptr, conversionData, ValueRangeAll); |
+ Length y = CSSLengthInterpolationType::resolveInterpolableLength(*list.get(TranslateY), nullptr, conversionData, ValueRangeAll); |
+ float z = CSSLengthInterpolationType::resolveInterpolableLength(*list.get(TranslateZ), nullptr, conversionData, ValueRangeAll).pixels(); |
+ |
+ RefPtr<TranslateTransformOperation> result = nullptr; |
+ if (!x.isZero() || !y.isZero() || z != 0) |
+ result = TranslateTransformOperation::create(x, y, z, TransformOperation::Translate3D); |
+ environment.state().style()->setTranslate(result.release()); |
+} |
+ |
+} // namespace blink |