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

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

Issue 2097383002: Added support of calc() for SVGLength (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Rebased Created 4 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
Index: third_party/WebKit/Source/core/animation/SVGLengthInterpolationType.cpp
diff --git a/third_party/WebKit/Source/core/animation/SVGLengthInterpolationType.cpp b/third_party/WebKit/Source/core/animation/SVGLengthInterpolationType.cpp
index 29b6bf2e67ec83eb4032dca12989053576860714..0af8dfbbe66ab763a0ba2bf500885c4d0e795cc7 100644
--- a/third_party/WebKit/Source/core/animation/SVGLengthInterpolationType.cpp
+++ b/third_party/WebKit/Source/core/animation/SVGLengthInterpolationType.cpp
@@ -14,88 +14,10 @@
namespace blink {
-namespace {
-
-enum LengthInterpolatedUnit {
- LengthInterpolatedNumber,
- LengthInterpolatedPercentage,
- LengthInterpolatedEMS,
- LengthInterpolatedEXS,
- LengthInterpolatedREMS,
- LengthInterpolatedCHS,
- LengthInterpolatedViewportWidth,
- LengthInterpolatedViewportHeight,
- LengthInterpolatedViewportMin,
- LengthInterpolatedViewportMax,
-};
-
-static const CSSPrimitiveValue::UnitType unitTypes[] = {
- CSSPrimitiveValue::UnitType::UserUnits,
- CSSPrimitiveValue::UnitType::Percentage,
- CSSPrimitiveValue::UnitType::Ems,
- CSSPrimitiveValue::UnitType::Exs,
- CSSPrimitiveValue::UnitType::Rems,
- CSSPrimitiveValue::UnitType::Chs,
- CSSPrimitiveValue::UnitType::ViewportWidth,
- CSSPrimitiveValue::UnitType::ViewportHeight,
- CSSPrimitiveValue::UnitType::ViewportMin,
- CSSPrimitiveValue::UnitType::ViewportMax,
-};
-
-const size_t numLengthInterpolatedUnits = WTF_ARRAY_LENGTH(unitTypes);
-
-LengthInterpolatedUnit convertToInterpolatedUnit(CSSPrimitiveValue::UnitType unitType, double& value)
-{
- switch (unitType) {
- case CSSPrimitiveValue::UnitType::Unknown:
- default:
- NOTREACHED();
- case CSSPrimitiveValue::UnitType::Pixels:
- case CSSPrimitiveValue::UnitType::Number:
- case CSSPrimitiveValue::UnitType::UserUnits:
- return LengthInterpolatedNumber;
- case CSSPrimitiveValue::UnitType::Percentage:
- return LengthInterpolatedPercentage;
- case CSSPrimitiveValue::UnitType::Ems:
- return LengthInterpolatedEMS;
- case CSSPrimitiveValue::UnitType::Exs:
- return LengthInterpolatedEXS;
- case CSSPrimitiveValue::UnitType::Centimeters:
- value *= cssPixelsPerCentimeter;
- return LengthInterpolatedNumber;
- case CSSPrimitiveValue::UnitType::Millimeters:
- value *= cssPixelsPerMillimeter;
- return LengthInterpolatedNumber;
- case CSSPrimitiveValue::UnitType::Inches:
- value *= cssPixelsPerInch;
- return LengthInterpolatedNumber;
- case CSSPrimitiveValue::UnitType::Points:
- value *= cssPixelsPerPoint;
- return LengthInterpolatedNumber;
- case CSSPrimitiveValue::UnitType::Picas:
- value *= cssPixelsPerPica;
- return LengthInterpolatedNumber;
- case CSSPrimitiveValue::UnitType::Rems:
- return LengthInterpolatedREMS;
- case CSSPrimitiveValue::UnitType::Chs:
- return LengthInterpolatedCHS;
- case CSSPrimitiveValue::UnitType::ViewportWidth:
- return LengthInterpolatedViewportWidth;
- case CSSPrimitiveValue::UnitType::ViewportHeight:
- return LengthInterpolatedViewportHeight;
- case CSSPrimitiveValue::UnitType::ViewportMin:
- return LengthInterpolatedViewportMin;
- case CSSPrimitiveValue::UnitType::ViewportMax:
- return LengthInterpolatedViewportMax;
- }
-}
-
-} // namespace
-
std::unique_ptr<InterpolableValue> SVGLengthInterpolationType::neutralInterpolableValue()
{
- std::unique_ptr<InterpolableList> listOfValues = InterpolableList::create(numLengthInterpolatedUnits);
- for (size_t i = 0; i < numLengthInterpolatedUnits; ++i)
+ std::unique_ptr<InterpolableList> listOfValues = InterpolableList::create(CSSPrimitiveValue::LengthUnitTypeCount);
+ for (size_t i = 0; i < CSSPrimitiveValue::LengthUnitTypeCount; ++i)
listOfValues->set(i, InterpolableNumber::create(0));
return std::move(listOfValues);
@@ -103,15 +25,14 @@ std::unique_ptr<InterpolableValue> SVGLengthInterpolationType::neutralInterpolab
InterpolationValue SVGLengthInterpolationType::convertSVGLength(const SVGLength& length)
{
- double value = length.valueInSpecifiedUnits();
- LengthInterpolatedUnit unitType = convertToInterpolatedUnit(length.typeWithCalcResolved(), value);
+ const CSSPrimitiveValue* primitiveValue = length.asCSSPrimitiveValue();
- double values[numLengthInterpolatedUnits] = { };
- values[unitType] = value;
+ CSSLengthArray lengthArray;
+ primitiveValue->accumulateLengthArray(lengthArray);
- std::unique_ptr<InterpolableList> listOfValues = InterpolableList::create(numLengthInterpolatedUnits);
- for (size_t i = 0; i < numLengthInterpolatedUnits; ++i)
- listOfValues->set(i, InterpolableNumber::create(values[i]));
+ std::unique_ptr<InterpolableList> listOfValues = InterpolableList::create(CSSPrimitiveValue::LengthUnitTypeCount);
+ for (size_t i = 0; i < CSSPrimitiveValue::LengthUnitTypeCount; ++i)
+ listOfValues->set(i, InterpolableNumber::create(lengthArray.values[i]));
return InterpolationValue(std::move(listOfValues));
}
@@ -124,7 +45,7 @@ SVGLength* SVGLengthInterpolationType::resolveInterpolableSVGLength(const Interp
CSSPrimitiveValue::UnitType unitType = CSSPrimitiveValue::UnitType::UserUnits;
unsigned unitTypeCount = 0;
// We optimise for the common case where only one unit type is involved.
- for (size_t i = 0; i < numLengthInterpolatedUnits; i++) {
+ for (size_t i = 0; i < CSSPrimitiveValue::LengthUnitTypeCount; i++) {
double entry = toInterpolableNumber(listOfValues.get(i))->value();
if (!entry)
continue;
@@ -133,7 +54,7 @@ SVGLength* SVGLengthInterpolationType::resolveInterpolableSVGLength(const Interp
break;
value = entry;
- unitType = unitTypes[i];
+ unitType = CSSPrimitiveValue::lengthUnitTypeToUnitType(static_cast<CSSPrimitiveValue::LengthUnitType>(i));
}
if (unitTypeCount > 1) {
@@ -141,10 +62,10 @@ SVGLength* SVGLengthInterpolationType::resolveInterpolableSVGLength(const Interp
unitType = CSSPrimitiveValue::UnitType::UserUnits;
// SVGLength does not support calc expressions, so we convert to canonical units.
- for (size_t i = 0; i < numLengthInterpolatedUnits; i++) {
+ for (size_t i = 0; i < CSSPrimitiveValue::LengthUnitTypeCount; i++) {
double entry = toInterpolableNumber(listOfValues.get(i))->value();
if (entry)
- value += lengthContext.convertValueToUserUnits(entry, unitMode, unitTypes[i]);
+ value += lengthContext.convertValueToUserUnits(entry, unitMode, CSSPrimitiveValue::lengthUnitTypeToUnitType(static_cast<CSSPrimitiveValue::LengthUnitType>(i)));
}
}

Powered by Google App Engine
This is Rietveld 408576698