Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(9)

Unified Diff: third_party/WebKit/Source/core/animation/CSSTranslateInterpolationType.cpp

Issue 1644883002: Add additive animation support for CSS property translate (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@_propertyInterpolationTypesMapping
Patch Set: Rebased Created 4 years, 10 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
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

Powered by Google App Engine
This is Rietveld 408576698