| Index: third_party/WebKit/Source/core/svg/SVGLength.cpp
|
| diff --git a/third_party/WebKit/Source/core/svg/SVGLength.cpp b/third_party/WebKit/Source/core/svg/SVGLength.cpp
|
| index b3c29143acc73b1f878c105add5ef1a1f7b1e6e6..cc559a15873b30a131bf77a9f403700afe6864b3 100644
|
| --- a/third_party/WebKit/Source/core/svg/SVGLength.cpp
|
| +++ b/third_party/WebKit/Source/core/svg/SVGLength.cpp
|
| @@ -73,10 +73,18 @@ bool SVGLength::operator==(const SVGLength& other) const
|
|
|
| float SVGLength::value(const SVGLengthContext& context) const
|
| {
|
| + if (isCalculated())
|
| + return context.resolveValue(*asCSSPrimitiveValue(), unitMode());
|
| +
|
| return context.convertValueToUserUnits(
|
| m_value->getFloatValue(), unitMode(), m_value->typeWithCalcResolved());
|
| }
|
|
|
| +void SVGLength::setValueAsNumber(float value)
|
| +{
|
| + m_value = CSSPrimitiveValue::create(value, CSSPrimitiveValue::UnitType::UserUnits);
|
| +}
|
| +
|
| void SVGLength::setValue(float value, const SVGLengthContext& context)
|
| {
|
| m_value = CSSPrimitiveValue::create(
|
| @@ -84,9 +92,15 @@ void SVGLength::setValue(float value, const SVGLengthContext& context)
|
| m_value->typeWithCalcResolved());
|
| }
|
|
|
| -bool isSupportedCSSUnitType(CSSPrimitiveValue::UnitType type)
|
| +static bool isCalcCSSUnitType(CSSPrimitiveValue::UnitType type)
|
| {
|
| - return (CSSPrimitiveValue::isLength(type) || type == CSSPrimitiveValue::UnitType::Number || type == CSSPrimitiveValue::UnitType::Percentage)
|
| + return type >= CSSPrimitiveValue::UnitType::Calc && type <= CSSPrimitiveValue::UnitType::CalcPercentageWithLengthAndNumber;
|
| +}
|
| +
|
| +static bool isSupportedCSSUnitType(CSSPrimitiveValue::UnitType type)
|
| +{
|
| + return (CSSPrimitiveValue::isLength(type) || type == CSSPrimitiveValue::UnitType::Number
|
| + || type == CSSPrimitiveValue::UnitType::Percentage || isCalcCSSUnitType(type))
|
| && type != CSSPrimitiveValue::UnitType::QuirkyEms;
|
| }
|
|
|
| @@ -139,8 +153,7 @@ SVGParsingError SVGLength::setValueAsString(const String& string)
|
| return SVGParseStatus::ExpectedLength;
|
|
|
| const CSSPrimitiveValue* newValue = toCSSPrimitiveValue(parsed);
|
| - // TODO(fs): Enable calc for SVG lengths
|
| - if (newValue->isCalculated() || !isSupportedCSSUnitType(newValue->typeWithCalcResolved()))
|
| + if (!isSupportedCSSUnitType(newValue->typeWithCalcResolved()))
|
| return SVGParseStatus::ExpectedLength;
|
|
|
| m_value = newValue;
|
| @@ -246,7 +259,15 @@ void SVGLength::calculateAnimatedValue(SVGAnimationElement* animationElement,
|
|
|
| ASSERT(unitMode() == lengthModeForAnimatedLengthAttribute(animationElement->attributeName()));
|
|
|
| - CSSPrimitiveValue::UnitType newUnit = percentage < 0.5 ? fromLength->typeWithCalcResolved() : toLength->typeWithCalcResolved();
|
| + // TODO(shanmuga.m): Construct a calc() expression if the units fall in different categories.
|
| + CSSPrimitiveValue::UnitType newUnit = CSSPrimitiveValue::UnitType::UserUnits;
|
| + if (percentage < 0.5) {
|
| + if (!fromLength->isCalculated())
|
| + newUnit = fromLength->typeWithCalcResolved();
|
| + } else {
|
| + if (!toLength->isCalculated())
|
| + newUnit = toLength->typeWithCalcResolved();
|
| + }
|
| animatedNumber = lengthContext.convertValueFromUserUnits(animatedNumber, unitMode(), newUnit);
|
| m_value = CSSPrimitiveValue::create(animatedNumber, newUnit);
|
| }
|
|
|