Index: Source/core/animation/LengthStyleInterpolation.cpp |
diff --git a/Source/core/animation/LengthStyleInterpolation.cpp b/Source/core/animation/LengthStyleInterpolation.cpp |
index 71fc754d557ebd56fd5ddd18e3f0a0cc66405c4b..c242662a55390f4483fcdc42637c8412cd0fb616 100644 |
--- a/Source/core/animation/LengthStyleInterpolation.cpp |
+++ b/Source/core/animation/LengthStyleInterpolation.cpp |
@@ -202,24 +202,23 @@ static CSSPrimitiveValue::UnitType toUnitType(int lengthUnitType) |
return static_cast<CSSPrimitiveValue::UnitType>(CSSPrimitiveValue::lengthUnitTypeToUnitType(static_cast<CSSPrimitiveValue::LengthUnitType>(lengthUnitType))); |
} |
-static PassRefPtrWillBeRawPtr<CSSCalcExpressionNode> constructCalcExpression(PassRefPtrWillBeRawPtr<CSSCalcExpressionNode> previous, const InterpolableList* list, size_t position) |
+static PassRefPtrWillBeRawPtr<CSSCalcExpressionNode> constructCalcExpression(const InterpolableList* list) |
{ |
const InterpolableList* listOfValues = toInterpolableList(list->get(0)); |
const InterpolableList* listOfTypes = toInterpolableList(list->get(1)); |
- while (position != CSSPrimitiveValue::LengthUnitTypeCount) { |
+ RefPtrWillBeRawPtr<CSSCalcExpressionNode> expression; |
+ for (size_t position = 0; position < CSSPrimitiveValue::LengthUnitTypeCount; position++) { |
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(value, toUnitType(position))), CalcAdd); |
- else |
- next = CSSCalcValue::createExpressionNode(CSSPrimitiveValue::create(value, toUnitType(position))); |
- return constructCalcExpression(next, list, position + 1); |
- } |
- position++; |
+ if (!subValueType->value()) |
+ continue; |
+ double value = toInterpolableNumber(listOfValues->get(position))->value(); |
+ RefPtrWillBeRawPtr<CSSCalcExpressionNode> currentTerm = CSSCalcValue::createExpressionNode(CSSPrimitiveValue::create(value, toUnitType(position))); |
+ if (expression) |
+ expression = CSSCalcValue::createExpressionNode(expression.release(), currentTerm.release(), CalcAdd); |
+ else |
+ expression = currentTerm.release(); |
} |
- return previous; |
+ return expression.release(); |
} |
static double clampToRange(double x, ValueRange range) |
@@ -283,7 +282,7 @@ PassRefPtrWillBeRawPtr<CSSPrimitiveValue> LengthStyleInterpolation::fromInterpol |
ASSERT_NOT_REACHED(); |
default: |
ValueRange valueRange = (range == RangeNonNegative) ? ValueRangeNonNegative : ValueRangeAll; |
- return CSSPrimitiveValue::create(CSSCalcValue::create(constructCalcExpression(nullptr, listOfValuesAndTypes, 0), valueRange)); |
+ return CSSPrimitiveValue::create(CSSCalcValue::create(constructCalcExpression(listOfValuesAndTypes), valueRange)); |
} |
} |