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

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

Issue 1162453002: [svg2] Make SVGLength wrap a CSSPrimitiveValue (Closed) Base URL: svn://svn.chromium.org/blink/trunk
Patch Set: review fixes Created 5 years, 6 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 unified diff | Download patch | Annotate | Revision Log
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[] = { CSSPrimitiveValue::CSS_ NUMBER, CSSPrimitiveValue::CSS_PERCENTAGE, CSSPrimitiveValue::CSS_EMS, CSSPrimit iveValue::CSS_EXS, CSSPrimitiveValue::CSS_REMS, CSSPrimitiveValue::CSS_CHS };
64 64
65 const size_t numLengthInterpolatedUnits = WTF_ARRAY_LENGTH(unitTypes); 65 const size_t numLengthInterpolatedUnits = WTF_ARRAY_LENGTH(unitTypes);
66 66
67 LengthInterpolatedUnit convertToInterpolatedUnit(SVGLengthType lengthType, doubl e& value) 67 LengthInterpolatedUnit convertToInterpolatedUnit(CSSPrimitiveValue::UnitType uni tType, double& value)
68 { 68 {
69 switch (lengthType) { 69 switch (unitType) {
70 case LengthTypeUnknown: 70 case CSSPrimitiveValue::CSS_UNKNOWN:
71 default: 71 default:
72 ASSERT_NOT_REACHED(); 72 ASSERT_NOT_REACHED();
73 case LengthTypePX: 73 case CSSPrimitiveValue::CSS_PX:
74 case LengthTypeNumber: 74 case CSSPrimitiveValue::CSS_NUMBER:
75 return LengthInterpolatedNumber; 75 return LengthInterpolatedNumber;
76 case LengthTypePercentage: 76 case CSSPrimitiveValue::CSS_PERCENTAGE:
77 return LengthInterpolatedPercentage; 77 return LengthInterpolatedPercentage;
78 case LengthTypeEMS: 78 case CSSPrimitiveValue::CSS_EMS:
79 return LengthInterpolatedEMS; 79 return LengthInterpolatedEMS;
80 case LengthTypeEXS: 80 case CSSPrimitiveValue::CSS_EXS:
81 return LengthInterpolatedEXS; 81 return LengthInterpolatedEXS;
82 case LengthTypeCM: 82 case CSSPrimitiveValue::CSS_CM:
83 value *= cssPixelsPerCentimeter; 83 value *= cssPixelsPerCentimeter;
84 return LengthInterpolatedNumber; 84 return LengthInterpolatedNumber;
85 case LengthTypeMM: 85 case CSSPrimitiveValue::CSS_MM:
86 value *= cssPixelsPerMillimeter; 86 value *= cssPixelsPerMillimeter;
87 return LengthInterpolatedNumber; 87 return LengthInterpolatedNumber;
88 case LengthTypeIN: 88 case CSSPrimitiveValue::CSS_IN:
89 value *= cssPixelsPerInch; 89 value *= cssPixelsPerInch;
90 return LengthInterpolatedNumber; 90 return LengthInterpolatedNumber;
91 case LengthTypePT: 91 case CSSPrimitiveValue::CSS_PT:
92 value *= cssPixelsPerPoint; 92 value *= cssPixelsPerPoint;
93 return LengthInterpolatedNumber; 93 return LengthInterpolatedNumber;
94 case LengthTypePC: 94 case CSSPrimitiveValue::CSS_PC:
95 value *= cssPixelsPerPica; 95 value *= cssPixelsPerPica;
96 return LengthInterpolatedNumber; 96 return LengthInterpolatedNumber;
97 case LengthTypeREMS: 97 case CSSPrimitiveValue::CSS_REMS:
98 return LengthInterpolatedREMS; 98 return LengthInterpolatedREMS;
99 case LengthTypeCHS: 99 case CSSPrimitiveValue::CSS_CHS:
100 return LengthInterpolatedCHS; 100 return LengthInterpolatedCHS;
101 } 101 }
102 } 102 }
103 103
104 } // namespace 104 } // namespace
105 105
106 PassOwnPtrWillBeRawPtr<InterpolableValue> LengthSVGInterpolation::toInterpolable Value(SVGLength* length, const SVGAnimatedPropertyBase* attribute, NonInterpolab leType* ptrModeData) 106 PassOwnPtrWillBeRawPtr<InterpolableValue> LengthSVGInterpolation::toInterpolable Value(SVGLength* length, const SVGAnimatedPropertyBase* attribute, NonInterpolab leType* ptrModeData)
107 { 107 {
108 if (ptrModeData) 108 if (ptrModeData)
109 populateModeData(attribute, ptrModeData); 109 populateModeData(attribute, ptrModeData);
110 110
111 double value = length->valueInSpecifiedUnits(); 111 double value = length->valueInSpecifiedUnits();
112 LengthInterpolatedUnit unitType = convertToInterpolatedUnit(length->unitType (), value); 112 LengthInterpolatedUnit unitType = convertToInterpolatedUnit(length->primitiv eType(), value);
113 113
114 double values[numLengthInterpolatedUnits] = { }; 114 double values[numLengthInterpolatedUnits] = { };
115 values[unitType] = value; 115 values[unitType] = value;
116 116
117 OwnPtrWillBeRawPtr<InterpolableList> listOfValues = InterpolableList::create (numLengthInterpolatedUnits); 117 OwnPtrWillBeRawPtr<InterpolableList> listOfValues = InterpolableList::create (numLengthInterpolatedUnits);
118 for (size_t i = 0; i < numLengthInterpolatedUnits; ++i) 118 for (size_t i = 0; i < numLengthInterpolatedUnits; ++i)
119 listOfValues->set(i, InterpolableNumber::create(values[i])); 119 listOfValues->set(i, InterpolableNumber::create(values[i]));
120 return listOfValues.release(); 120 return listOfValues.release();
121 } 121 }
122 122
123 PassRefPtrWillBeRawPtr<SVGLength> LengthSVGInterpolation::fromInterpolableValue( const InterpolableValue& interpolableValue, const NonInterpolableType& modeData, const SVGElement* element) 123 PassRefPtrWillBeRawPtr<SVGLength> LengthSVGInterpolation::fromInterpolableValue( const InterpolableValue& interpolableValue, const NonInterpolableType& modeData, const SVGElement* element)
124 { 124 {
125 const InterpolableList& listOfValues = toInterpolableList(interpolableValue) ; 125 const InterpolableList& listOfValues = toInterpolableList(interpolableValue) ;
126 ASSERT(element); 126 ASSERT(element);
127 127
128 double value = 0; 128 double value = 0;
129 SVGLengthType lengthType = LengthTypeNumber; 129 CSSPrimitiveValue::UnitType unitType = CSSPrimitiveValue::CSS_NUMBER;
130 unsigned unitTypeCount = 0; 130 unsigned unitTypeCount = 0;
131 // We optimise for the common case where only one unit type is involved. 131 // We optimise for the common case where only one unit type is involved.
132 for (size_t i = 0; i < numLengthInterpolatedUnits; i++) { 132 for (size_t i = 0; i < numLengthInterpolatedUnits; i++) {
133 double entry = toInterpolableNumber(listOfValues.get(i))->value(); 133 double entry = toInterpolableNumber(listOfValues.get(i))->value();
134 if (!entry) 134 if (!entry)
135 continue; 135 continue;
136 unitTypeCount++; 136 unitTypeCount++;
137 if (unitTypeCount > 1) 137 if (unitTypeCount > 1)
138 break; 138 break;
139 139
140 value = entry; 140 value = entry;
141 lengthType = unitTypes[i]; 141 unitType = unitTypes[i];
142 } 142 }
143 143
144 if (unitTypeCount > 1) { 144 if (unitTypeCount > 1) {
145 value = 0; 145 value = 0;
146 lengthType = LengthTypeNumber; 146 unitType = CSSPrimitiveValue::CSS_NUMBER;
147 147
148 // SVGLength does not support calc expressions, so we convert to canonic al units. 148 // SVGLength does not support calc expressions, so we convert to canonic al units.
149 SVGLengthContext lengthContext(element); 149 SVGLengthContext lengthContext(element);
150 for (size_t i = 0; i < numLengthInterpolatedUnits; i++) { 150 for (size_t i = 0; i < numLengthInterpolatedUnits; i++) {
151 double entry = toInterpolableNumber(listOfValues.get(i))->value(); 151 double entry = toInterpolableNumber(listOfValues.get(i))->value();
152 if (entry) 152 if (entry)
153 value += lengthContext.convertValueToUserUnits(entry, modeData.u nitMode, unitTypes[i]); 153 value += lengthContext.convertValueToUserUnits(entry, modeData.u nitMode, unitTypes[i]);
154 } 154 }
155 } 155 }
156 156
157 if (modeData.negativeValuesMode == ForbidNegativeLengths && value < 0) 157 if (modeData.negativeValuesMode == ForbidNegativeLengths && value < 0)
158 value = 0; 158 value = 0;
159 159
160 RefPtrWillBeRawPtr<SVGLength> result = SVGLength::create(modeData.unitMode); // defaults to the length 0 160 RefPtrWillBeRawPtr<SVGLength> result = SVGLength::create(modeData.unitMode); // defaults to the length 0
161 result->setUnitType(lengthType); 161 result->newValueSpecifiedUnits(unitType, value);
162 result->setValueInSpecifiedUnits(value);
163 return result.release(); 162 return result.release();
164 } 163 }
165 164
166 PassRefPtrWillBeRawPtr<SVGPropertyBase> LengthSVGInterpolation::interpolatedValu e(SVGElement& targetElement) const 165 PassRefPtrWillBeRawPtr<SVGPropertyBase> LengthSVGInterpolation::interpolatedValu e(SVGElement& targetElement) const
167 { 166 {
168 return fromInterpolableValue(*m_cachedValue, m_modeData, &targetElement); 167 return fromInterpolableValue(*m_cachedValue, m_modeData, &targetElement);
169 } 168 }
170 169
171 } 170 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698