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

Unified Diff: Source/core/animation/LengthInterpolationType.cpp

Issue 1215563002: Implement left property animation on InvalidatableStyleInterpolation (Closed) Base URL: svn://svn.chromium.org/blink/trunk
Patch Set: Make Windows not crash Created 5 years, 5 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
« no previous file with comments | « Source/core/animation/LengthInterpolationType.h ('k') | Source/core/animation/LengthPropertyFunctions.h » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: Source/core/animation/LengthInterpolationType.cpp
diff --git a/Source/core/animation/LengthInterpolationType.cpp b/Source/core/animation/LengthInterpolationType.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..b122c93ed18b60ccd72b3316b717264b59b7d309
--- /dev/null
+++ b/Source/core/animation/LengthInterpolationType.cpp
@@ -0,0 +1,170 @@
+// 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/LengthInterpolationType.h"
+
+#include "core/animation/LengthPropertyFunctions.h"
+#include "core/animation/LengthStyleInterpolation.h"
+#include "core/css/resolver/StyleResolverState.h"
+
+namespace blink {
+
+LengthInterpolationType::LengthInterpolationType(CSSPropertyID property)
+ : InterpolationType(property)
+ , m_valueRange(LengthPropertyFunctions::valueRange(property))
+{ }
+
+static PassOwnPtrWillBeRawPtr<InterpolableList> createNeutralValue()
+{
+ OwnPtrWillBeRawPtr<InterpolableList> listOfValuesAndTypes = InterpolableList::create(2);
+ const size_t length = CSSPrimitiveValue::LengthUnitTypeCount;
+ OwnPtrWillBeRawPtr<InterpolableList> listOfValues = InterpolableList::create(length);
+ // TODO(alancutter): Use a NonInterpolableValue to represent the list of types.
+ OwnPtrWillBeRawPtr<InterpolableList> listOfTypes = InterpolableList::create(length);
+ for (size_t i = 0; i < length; i++) {
+ listOfValues->set(i, InterpolableNumber::create(0));
+ listOfTypes->set(i, InterpolableNumber::create(0));
+ }
+ listOfValuesAndTypes->set(0, listOfValues.release());
+ listOfValuesAndTypes->set(1, listOfTypes.release());
+ return listOfValuesAndTypes.release();
+}
+
+PassOwnPtrWillBeRawPtr<InterpolationValue> LengthInterpolationType::maybeConvertLength(const Length& length) const
+{
+ if (!length.isSpecified())
+ return nullptr;
+
+ PixelsAndPercent pixelsAndPercent = length.pixelsAndPercent();
+ OwnPtrWillBeRawPtr<InterpolableList> valuesAndTypes = createNeutralValue();
+
+ InterpolableList& values = toInterpolableList(*valuesAndTypes->get(0));
+ values.set(CSSPrimitiveValue::UnitTypePixels, InterpolableNumber::create(pixelsAndPercent.pixels));
+ values.set(CSSPrimitiveValue::UnitTypePercentage, InterpolableNumber::create(pixelsAndPercent.percent));
+
+ InterpolableList& types = toInterpolableList(*valuesAndTypes->get(1));
+ types.set(CSSPrimitiveValue::UnitTypePixels, InterpolableNumber::create(1));
+ types.set(CSSPrimitiveValue::UnitTypePercentage, InterpolableNumber::create(1));
+
+ return InterpolationValue::create(*this, valuesAndTypes.release());
+}
+
+class ParentLengthChecker : public InterpolationType::ConversionChecker {
+public:
+ static PassOwnPtrWillBeRawPtr<ParentLengthChecker> create(CSSPropertyID property, const Length& length)
+ {
+ return adoptPtrWillBeNoop(new ParentLengthChecker(property, length));
+ }
+
+private:
+ ParentLengthChecker(CSSPropertyID property, const Length& length)
+ : m_property(property)
+ , m_length(length)
+ { }
+
+ bool isValid(const StyleResolverState& state) const final
+ {
+ Length parentLength;
+ if (!LengthPropertyFunctions::getLength(m_property, *state.parentStyle(), parentLength))
+ return true;
+ return parentLength == m_length;
+ }
+
+ DEFINE_INLINE_VIRTUAL_TRACE()
+ {
+ ConversionChecker::trace(visitor);
+ }
+
+ const CSSPropertyID m_property;
+ const Length m_length;
+};
+
+PassOwnPtrWillBeRawPtr<InterpolationValue> LengthInterpolationType::maybeConvertNeutral() const
+{
+ return InterpolationValue::create(*this, createNeutralValue());
+}
+
+PassOwnPtrWillBeRawPtr<InterpolationValue> LengthInterpolationType::maybeConvertInitial() const
+{
+ Length initialLength;
+ if (!LengthPropertyFunctions::getInitialLength(m_property, initialLength))
+ return nullptr;
+ return maybeConvertLength(initialLength);
+}
+
+PassOwnPtrWillBeRawPtr<InterpolationValue> LengthInterpolationType::maybeConvertInherit(const StyleResolverState* state, ConversionCheckers& conversionCheckers) const
+{
+ if (!state)
+ return nullptr;
+ Length inheritedLength;
+ if (!LengthPropertyFunctions::getLength(m_property, *state->parentStyle(), inheritedLength))
+ return nullptr;
+ conversionCheckers.append(ParentLengthChecker::create(m_property, inheritedLength));
+ return maybeConvertLength(inheritedLength);
+}
+
+PassOwnPtrWillBeRawPtr<InterpolationValue> LengthInterpolationType::maybeConvertValue(const CSSValue& value, const StyleResolverState* state, ConversionCheckers& conversionCheckers) const
+{
+ if (!value.isPrimitiveValue())
+ return nullptr;
+
+ const CSSPrimitiveValue& primitiveValue = toCSSPrimitiveValue(value);
+
+ OwnPtrWillBeRawPtr<InterpolableList> listOfValuesAndTypes = InterpolableList::create(2);
+ OwnPtrWillBeRawPtr<InterpolableList> listOfValues = InterpolableList::create(CSSPrimitiveValue::LengthUnitTypeCount);
+ OwnPtrWillBeRawPtr<InterpolableList> listOfTypes = InterpolableList::create(CSSPrimitiveValue::LengthUnitTypeCount);
+
+ CSSLengthArray arrayOfValues;
+ CSSLengthTypeArray arrayOfTypes;
+ for (size_t i = 0; i < CSSPrimitiveValue::LengthUnitTypeCount; i++)
+ arrayOfValues.append(0);
+ arrayOfTypes.ensureSize(CSSPrimitiveValue::LengthUnitTypeCount);
+
+ if (primitiveValue.isValueID()) {
+ CSSValueID valueID = primitiveValue.getValueID();
+ double pixels;
+ if (!LengthPropertyFunctions::getPixelsForKeyword(m_property, valueID, pixels))
+ return nullptr;
+ arrayOfTypes.set(CSSPrimitiveValue::UnitTypePixels);
+ arrayOfValues[CSSPrimitiveValue::UnitTypePixels] = pixels;
+ } else {
+ if (!primitiveValue.isCalculated() && !primitiveValue.isCalculatedPercentageWithLength()) {
+ CSSPrimitiveValue::LengthUnitType type;
+ // Only returns true if the type is a primitive length unit.
+ if (!CSSPrimitiveValue::unitTypeToLengthUnitType(primitiveValue.primitiveType(), type))
+ return nullptr;
+ }
+ primitiveValue.accumulateLengthArray(arrayOfValues, arrayOfTypes);
+ }
+
+ for (size_t i = 0; i < CSSPrimitiveValue::LengthUnitTypeCount; i++) {
+ listOfValues->set(i, InterpolableNumber::create(arrayOfValues.at(i)));
+ listOfTypes->set(i, InterpolableNumber::create(arrayOfTypes.get(i)));
+ }
+
+ listOfValuesAndTypes->set(0, listOfValues.release());
+ listOfValuesAndTypes->set(1, listOfTypes.release());
+
+ return InterpolationValue::create(*this, listOfValuesAndTypes.release());
+}
+
+PassOwnPtrWillBeRawPtr<InterpolationValue> LengthInterpolationType::maybeConvertUnderlyingValue(const StyleResolverState& state) const
+{
+ Length underlyingLength;
+ if (!LengthPropertyFunctions::getLength(m_property, *state.style(), underlyingLength))
+ return nullptr;
+ return maybeConvertLength(underlyingLength);
+}
+
+void LengthInterpolationType::apply(const InterpolableValue& interpolableValue, const NonInterpolableValue*, StyleResolverState& state) const
+{
+ // TODO(alancutter): Make all length interpolation functions operate on ValueRanges instead of InterpolationRanges.
+ InterpolationRange range = m_valueRange == ValueRangeNonNegative ? RangeNonNegative : RangeAll;
+ // TODO(alancutter): Set arbitrary property Lengths on ComputedStyle without using cross compilation unit member function getters (Windows runtime doesn't like it).
+ ASSERT(m_property == CSSPropertyLeft);
+ LengthStyleInterpolation::applyInterpolableValue(m_property, interpolableValue, range, state, &ComputedStyle::setLeft);
+}
+
+} // namespace blink
« no previous file with comments | « Source/core/animation/LengthInterpolationType.h ('k') | Source/core/animation/LengthPropertyFunctions.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698