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

Side by Side Diff: third_party/WebKit/Source/core/animation/LengthSVGInterpolation.cpp

Issue 1421533006: Make SVGLength wrap a CSSPrimitiveValue. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Review comments addressed Created 5 years, 1 month 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 unified diff | Download patch
OLDNEW
1 // Copyright 2015 The Chromium Authors. All rights reserved. 1 // Copyright 2015 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "config.h" 5 #include "config.h"
6 #include "core/animation/LengthSVGInterpolation.h" 6 #include "core/animation/LengthSVGInterpolation.h"
7 7
8 #include "core/css/CSSHelper.h" 8 #include "core/css/CSSHelper.h"
9 #include "core/svg/SVGAnimatedLength.h" 9 #include "core/svg/SVGAnimatedLength.h"
10 #include "core/svg/SVGAnimatedLengthList.h" 10 #include "core/svg/SVGAnimatedLengthList.h"
(...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after
53 53
54 enum LengthInterpolatedUnit { 54 enum LengthInterpolatedUnit {
55 LengthInterpolatedNumber, 55 LengthInterpolatedNumber,
56 LengthInterpolatedPercentage, 56 LengthInterpolatedPercentage,
57 LengthInterpolatedEMS, 57 LengthInterpolatedEMS,
58 LengthInterpolatedEXS, 58 LengthInterpolatedEXS,
59 LengthInterpolatedREMS, 59 LengthInterpolatedREMS,
60 LengthInterpolatedCHS, 60 LengthInterpolatedCHS,
61 }; 61 };
62 62
63 static const SVGLengthType unitTypes[] = { LengthTypeNumber, LengthTypePercentag e, LengthTypeEMS, LengthTypeEXS, LengthTypeREMS, LengthTypeCHS }; 63 static const CSSPrimitiveValue::UnitType unitTypes[] = {
64 CSSPrimitiveValue::UnitType::Number,
65 CSSPrimitiveValue::UnitType::Percentage,
66 CSSPrimitiveValue::UnitType::Ems,
67 CSSPrimitiveValue::UnitType::Exs,
68 CSSPrimitiveValue::UnitType::Rems,
69 CSSPrimitiveValue::UnitType::Chs };
fs 2015/10/30 19:50:00 Nit: }; on next line
64 70
65 const size_t numLengthInterpolatedUnits = WTF_ARRAY_LENGTH(unitTypes); 71 const size_t numLengthInterpolatedUnits = WTF_ARRAY_LENGTH(unitTypes);
66 72
67 LengthInterpolatedUnit convertToInterpolatedUnit(SVGLengthType lengthType, doubl e& value) 73 LengthInterpolatedUnit convertToInterpolatedUnit(CSSPrimitiveValue::UnitType uni tType, double& value)
68 { 74 {
69 switch (lengthType) { 75 switch (unitType) {
70 case LengthTypeUnknown: 76 case CSSPrimitiveValue::UnitType::Unknown:
71 default: 77 default:
72 ASSERT_NOT_REACHED(); 78 ASSERT_NOT_REACHED();
73 case LengthTypePX: 79 case CSSPrimitiveValue::UnitType::Pixels:
74 case LengthTypeNumber: 80 case CSSPrimitiveValue::UnitType::Number:
75 return LengthInterpolatedNumber; 81 return LengthInterpolatedNumber;
76 case LengthTypePercentage: 82 case CSSPrimitiveValue::UnitType::Percentage:
77 return LengthInterpolatedPercentage; 83 return LengthInterpolatedPercentage;
78 case LengthTypeEMS: 84 case CSSPrimitiveValue::UnitType::Ems:
79 return LengthInterpolatedEMS; 85 return LengthInterpolatedEMS;
80 case LengthTypeEXS: 86 case CSSPrimitiveValue::UnitType::Exs:
81 return LengthInterpolatedEXS; 87 return LengthInterpolatedEXS;
82 case LengthTypeCM: 88 case CSSPrimitiveValue::UnitType::Centimeters:
83 value *= cssPixelsPerCentimeter; 89 value *= cssPixelsPerCentimeter;
84 return LengthInterpolatedNumber; 90 return LengthInterpolatedNumber;
85 case LengthTypeMM: 91 case CSSPrimitiveValue::UnitType::Millimeters:
86 value *= cssPixelsPerMillimeter; 92 value *= cssPixelsPerMillimeter;
87 return LengthInterpolatedNumber; 93 return LengthInterpolatedNumber;
88 case LengthTypeIN: 94 case CSSPrimitiveValue::UnitType::Inches:
89 value *= cssPixelsPerInch; 95 value *= cssPixelsPerInch;
90 return LengthInterpolatedNumber; 96 return LengthInterpolatedNumber;
91 case LengthTypePT: 97 case CSSPrimitiveValue::UnitType::Points:
92 value *= cssPixelsPerPoint; 98 value *= cssPixelsPerPoint;
93 return LengthInterpolatedNumber; 99 return LengthInterpolatedNumber;
94 case LengthTypePC: 100 case CSSPrimitiveValue::UnitType::Picas:
95 value *= cssPixelsPerPica; 101 value *= cssPixelsPerPica;
96 return LengthInterpolatedNumber; 102 return LengthInterpolatedNumber;
97 case LengthTypeREMS: 103 case CSSPrimitiveValue::UnitType::UserUnits:
104 return LengthInterpolatedNumber;
105 case CSSPrimitiveValue::UnitType::Rems:
98 return LengthInterpolatedREMS; 106 return LengthInterpolatedREMS;
99 case LengthTypeCHS: 107 case CSSPrimitiveValue::UnitType::Chs:
100 return LengthInterpolatedCHS; 108 return LengthInterpolatedCHS;
101 } 109 }
102 } 110 }
103 111
104 } // namespace 112 } // namespace
105 113
106 PassOwnPtr<InterpolableValue> LengthSVGInterpolation::toInterpolableValue(SVGLen gth* length, const SVGAnimatedPropertyBase* attribute, NonInterpolableType* ptrM odeData) 114 PassOwnPtr<InterpolableValue> LengthSVGInterpolation::toInterpolableValue(SVGLen gth* length, const SVGAnimatedPropertyBase* attribute, NonInterpolableType* ptrM odeData)
107 { 115 {
108 if (ptrModeData) 116 if (ptrModeData)
109 populateModeData(attribute, ptrModeData); 117 populateModeData(attribute, ptrModeData);
110 118
111 double value = length->valueInSpecifiedUnits(); 119 double value = length->valueInSpecifiedUnits();
112 LengthInterpolatedUnit unitType = convertToInterpolatedUnit(length->unitType (), value); 120 LengthInterpolatedUnit unitType = convertToInterpolatedUnit(length->typeWith CalcResolved(), value);
113 121
114 double values[numLengthInterpolatedUnits] = { }; 122 double values[numLengthInterpolatedUnits] = { };
115 values[unitType] = value; 123 values[unitType] = value;
116 124
117 OwnPtr<InterpolableList> listOfValues = InterpolableList::create(numLengthIn terpolatedUnits); 125 OwnPtr<InterpolableList> listOfValues = InterpolableList::create(numLengthIn terpolatedUnits);
118 for (size_t i = 0; i < numLengthInterpolatedUnits; ++i) 126 for (size_t i = 0; i < numLengthInterpolatedUnits; ++i)
119 listOfValues->set(i, InterpolableNumber::create(values[i])); 127 listOfValues->set(i, InterpolableNumber::create(values[i]));
120 return listOfValues.release(); 128 return listOfValues.release();
121 } 129 }
122 130
123 PassRefPtrWillBeRawPtr<SVGLength> LengthSVGInterpolation::fromInterpolableValue( const InterpolableValue& interpolableValue, const NonInterpolableType& modeData, const SVGElement* element) 131 PassRefPtrWillBeRawPtr<SVGLength> LengthSVGInterpolation::fromInterpolableValue( const InterpolableValue& interpolableValue, const NonInterpolableType& modeData, const SVGElement* element)
124 { 132 {
125 const InterpolableList& listOfValues = toInterpolableList(interpolableValue) ; 133 const InterpolableList& listOfValues = toInterpolableList(interpolableValue) ;
126 ASSERT(element); 134 ASSERT(element);
127 135
128 double value = 0; 136 double value = 0;
129 SVGLengthType lengthType = LengthTypeNumber; 137 CSSPrimitiveValue::UnitType unitType = CSSPrimitiveValue::UnitType::Number;
130 unsigned unitTypeCount = 0; 138 unsigned unitTypeCount = 0;
131 // We optimise for the common case where only one unit type is involved. 139 // We optimise for the common case where only one unit type is involved.
132 for (size_t i = 0; i < numLengthInterpolatedUnits; i++) { 140 for (size_t i = 0; i < numLengthInterpolatedUnits; i++) {
133 double entry = toInterpolableNumber(listOfValues.get(i))->value(); 141 double entry = toInterpolableNumber(listOfValues.get(i))->value();
134 if (!entry) 142 if (!entry)
135 continue; 143 continue;
136 unitTypeCount++; 144 unitTypeCount++;
137 if (unitTypeCount > 1) 145 if (unitTypeCount > 1)
138 break; 146 break;
139 147
140 value = entry; 148 value = entry;
141 lengthType = unitTypes[i]; 149 unitType = unitTypes[i];
142 } 150 }
143 151
144 if (unitTypeCount > 1) { 152 if (unitTypeCount > 1) {
145 value = 0; 153 value = 0;
146 lengthType = LengthTypeNumber; 154 unitType = CSSPrimitiveValue::UnitType::Number;
147 155
148 // SVGLength does not support calc expressions, so we convert to canonic al units. 156 // SVGLength does not support calc expressions, so we convert to canonic al units.
149 SVGLengthContext lengthContext(element); 157 SVGLengthContext lengthContext(element);
150 for (size_t i = 0; i < numLengthInterpolatedUnits; i++) { 158 for (size_t i = 0; i < numLengthInterpolatedUnits; i++) {
151 double entry = toInterpolableNumber(listOfValues.get(i))->value(); 159 double entry = toInterpolableNumber(listOfValues.get(i))->value();
152 if (entry) 160 if (entry)
153 value += lengthContext.convertValueToUserUnits(entry, modeData.u nitMode, unitTypes[i]); 161 value += lengthContext.convertValueToUserUnits(entry, modeData.u nitMode, unitTypes[i]);
154 } 162 }
155 } 163 }
156 164
157 if (modeData.negativeValuesMode == ForbidNegativeLengths && value < 0) 165 if (modeData.negativeValuesMode == ForbidNegativeLengths && value < 0)
158 value = 0; 166 value = 0;
159 167
160 RefPtrWillBeRawPtr<SVGLength> result = SVGLength::create(modeData.unitMode); // defaults to the length 0 168 RefPtrWillBeRawPtr<SVGLength> result = SVGLength::create(modeData.unitMode); // defaults to the length 0
161 result->setUnitType(lengthType); 169 result->newValueSpecifiedUnits(unitType, value);
162 result->setValueInSpecifiedUnits(value);
163 return result.release(); 170 return result.release();
164 } 171 }
165 172
166 PassRefPtrWillBeRawPtr<SVGPropertyBase> LengthSVGInterpolation::interpolatedValu e(SVGElement& targetElement) const 173 PassRefPtrWillBeRawPtr<SVGPropertyBase> LengthSVGInterpolation::interpolatedValu e(SVGElement& targetElement) const
167 { 174 {
168 return fromInterpolableValue(*m_cachedValue, m_modeData, &targetElement); 175 return fromInterpolableValue(*m_cachedValue, m_modeData, &targetElement);
169 } 176 }
170 177
171 } 178 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698