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

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

Issue 813233002: Animation: Fix loss of type information when interpolating value of 0 (Closed) Base URL: https://chromium.googlesource.com/chromium/blink.git@master
Patch Set: Fix second accumulateLength method Created 6 years 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: Source/core/animation/LengthStyleInterpolation.cpp
diff --git a/Source/core/animation/LengthStyleInterpolation.cpp b/Source/core/animation/LengthStyleInterpolation.cpp
index 8d4996ed1979ebe80e13873e416c5ce50defcf8e..a58d6e0cccdc44b106697354629ddb037b5a9256 100644
--- a/Source/core/animation/LengthStyleInterpolation.cpp
+++ b/Source/core/animation/LengthStyleInterpolation.cpp
@@ -26,18 +26,29 @@ bool LengthStyleInterpolation::canCreateFrom(const CSSValue& value)
PassOwnPtrWillBeRawPtr<InterpolableValue> LengthStyleInterpolation::lengthToInterpolableValue(const CSSValue& value)
{
- OwnPtrWillBeRawPtr<InterpolableList> result = InterpolableList::create(CSSPrimitiveValue::LengthUnitTypeCount);
+ OwnPtrWillBeRawPtr<InterpolableList> listOfValuesAndTypes = InterpolableList::create(2);
+ OwnPtrWillBeRawPtr<InterpolableList> listOfValues = InterpolableList::create(CSSPrimitiveValue::LengthUnitTypeCount);
+ OwnPtrWillBeRawPtr<InterpolableList> listOfTypes = InterpolableList::create(CSSPrimitiveValue::LengthUnitTypeCount);
+
const CSSPrimitiveValue& primitive = toCSSPrimitiveValue(value);
- CSSLengthArray array;
+ CSSLengthArray arrayOfValues;
+ CSSPrimitiveValue::CSSLengthTypeArray arrayOfTypes;
for (size_t i = 0; i < CSSPrimitiveValue::LengthUnitTypeCount; i++)
- array.append(0);
- primitive.accumulateLengthArray(array);
+ arrayOfValues.append(0);
- for (size_t i = 0; i < CSSPrimitiveValue::LengthUnitTypeCount; i++)
- result->set(i, InterpolableNumber::create(array.at(i)));
+ arrayOfTypes.ensureSize(CSSPrimitiveValue::LengthUnitTypeCount);
+ primitive.accumulateLengthArray(arrayOfValues, arrayOfTypes);
- return result.release();
+ 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 listOfValuesAndTypes.release();
}
namespace {
@@ -49,14 +60,17 @@ static CSSPrimitiveValue::UnitType toUnitType(int lengthUnitType)
static PassRefPtrWillBeRawPtr<CSSCalcExpressionNode> constructCalcExpression(PassRefPtrWillBeRawPtr<CSSCalcExpressionNode> previous, const InterpolableList* list, size_t position)
{
+ const InterpolableList* listOfValues = toInterpolableList(list->get(0));
+ const InterpolableList* listOfTypes = toInterpolableList(list->get(1));
while (position != CSSPrimitiveValue::LengthUnitTypeCount) {
- const InterpolableNumber *subValue = toInterpolableNumber(list->get(position));
- if (subValue->value()) {
+ const InterpolableNumber *subValueType = toInterpolableNumber(listOfTypes->get(position));
+ if (subValueType->value()) {
RefPtrWillBeRawPtr<CSSCalcExpressionNode> next;
+ double value = toInterpolableNumber(listOfValues->get(position))->value();
if (previous)
- next = CSSCalcValue::createExpressionNode(previous, CSSCalcValue::createExpressionNode(CSSPrimitiveValue::create(subValue->value(), toUnitType(position))), CalcAdd);
+ next = CSSCalcValue::createExpressionNode(previous, CSSCalcValue::createExpressionNode(CSSPrimitiveValue::create(value, toUnitType(position))), CalcAdd);
else
- next = CSSCalcValue::createExpressionNode(CSSPrimitiveValue::create(subValue->value(), toUnitType(position)));
+ next = CSSCalcValue::createExpressionNode(CSSPrimitiveValue::create(value, toUnitType(position)));
return constructCalcExpression(next, list, position + 1);
}
position++;
@@ -68,23 +82,25 @@ static PassRefPtrWillBeRawPtr<CSSCalcExpressionNode> constructCalcExpression(Pas
PassRefPtrWillBeRawPtr<CSSValue> LengthStyleInterpolation::interpolableValueToLength(const InterpolableValue* value, ValueRange range)
{
- const InterpolableList* listValue = toInterpolableList(value);
- unsigned unitCount = 0;
+ const InterpolableList* listOfValuesAndTypes = toInterpolableList(value);
+ const InterpolableList* listOfValues = toInterpolableList(listOfValuesAndTypes->get(0));
+ const InterpolableList* listOfTypes = toInterpolableList(listOfValuesAndTypes->get(1));
+ unsigned unitTypeCount = 0;
for (size_t i = 0; i < CSSPrimitiveValue::LengthUnitTypeCount; i++) {
- const InterpolableNumber* subValue = toInterpolableNumber(listValue->get(i));
- if (subValue->value()) {
- unitCount++;
+ const InterpolableNumber* subType = toInterpolableNumber(listOfTypes->get(i));
+ if (subType->value()) {
+ unitTypeCount++;
}
}
- switch (unitCount) {
+ switch (unitTypeCount) {
case 0:
- return CSSPrimitiveValue::create(0, CSSPrimitiveValue::CSS_PX);
+ ASSERT_NOT_REACHED();
case 1:
for (size_t i = 0; i < CSSPrimitiveValue::LengthUnitTypeCount; i++) {
- const InterpolableNumber* subValue = toInterpolableNumber(listValue->get(i));
- double value = subValue->value();
- if (value) {
+ const InterpolableNumber *subValueType = toInterpolableNumber(listOfTypes->get(i));
+ if (subValueType->value()) {
+ double value = toInterpolableNumber(listOfValues->get(i))->value();
if (range == ValueRangeNonNegative && value < 0)
value = 0;
return CSSPrimitiveValue::create(value, toUnitType(i));
@@ -92,7 +108,7 @@ PassRefPtrWillBeRawPtr<CSSValue> LengthStyleInterpolation::interpolableValueToLe
}
ASSERT_NOT_REACHED();
default:
- return CSSPrimitiveValue::create(CSSCalcValue::create(constructCalcExpression(nullptr, listValue, 0), range));
+ return CSSPrimitiveValue::create(CSSCalcValue::create(constructCalcExpression(nullptr, listOfValuesAndTypes, 0), range));
}
}
« no previous file with comments | « Source/core/animation/LengthPoint3DStyleInterpolationTest.cpp ('k') | Source/core/animation/LengthStyleInterpolationTest.cpp » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698