OLD | NEW |
---|---|
1 /* | 1 /* |
2 * Copyright (C) 2004, 2005 Nikolas Zimmermann <zimmermann@kde.org> | 2 * Copyright (C) 2004, 2005 Nikolas Zimmermann <zimmermann@kde.org> |
3 * Copyright (C) 2004, 2005 Rob Buis <buis@kde.org> | 3 * Copyright (C) 2004, 2005 Rob Buis <buis@kde.org> |
4 * | 4 * |
5 * This library is free software; you can redistribute it and/or | 5 * This library is free software; you can redistribute it and/or |
6 * modify it under the terms of the GNU Library General Public | 6 * modify it under the terms of the GNU Library General Public |
7 * License as published by the Free Software Foundation; either | 7 * License as published by the Free Software Foundation; either |
8 * version 2 of the License, or (at your option) any later version. | 8 * version 2 of the License, or (at your option) any later version. |
9 * | 9 * |
10 * This library is distributed in the hope that it will be useful, | 10 * This library is distributed in the hope that it will be useful, |
(...skipping 133 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
144 { | 144 { |
145 m_transformType = SVG_TRANSFORM_SKEWY; | 145 m_transformType = SVG_TRANSFORM_SKEWY; |
146 m_angle = angle; | 146 m_angle = angle; |
147 | 147 |
148 m_matrix.makeIdentity(); | 148 m_matrix.makeIdentity(); |
149 m_matrix.skewY(angle); | 149 m_matrix.skewY(angle); |
150 } | 150 } |
151 | 151 |
152 namespace { | 152 namespace { |
153 | 153 |
154 const String& transformTypePrefixForParsing(SVGTransformType type) | 154 const char* transformTypePrefixForParsing(SVGTransformType type) |
155 { | 155 { |
156 switch (type) { | 156 switch (type) { |
157 case SVG_TRANSFORM_UNKNOWN: | 157 case SVG_TRANSFORM_UNKNOWN: |
158 return emptyString(); | 158 return ""; |
159 case SVG_TRANSFORM_MATRIX: { | 159 case SVG_TRANSFORM_MATRIX: |
160 DEFINE_STATIC_LOCAL(String, matrixString, ("matrix(")); | 160 return "matrix("; |
161 return matrixString; | 161 case SVG_TRANSFORM_TRANSLATE: |
162 return "translate("; | |
163 case SVG_TRANSFORM_SCALE: | |
164 return "scale("; | |
165 case SVG_TRANSFORM_ROTATE: | |
166 return "rotate("; | |
167 case SVG_TRANSFORM_SKEWX: | |
168 return "skewX("; | |
169 case SVG_TRANSFORM_SKEWY: | |
170 return "skewY("; | |
162 } | 171 } |
163 case SVG_TRANSFORM_TRANSLATE: { | |
164 DEFINE_STATIC_LOCAL(String, translateString, ("translate(")); | |
165 return translateString; | |
166 } | |
167 case SVG_TRANSFORM_SCALE: { | |
168 DEFINE_STATIC_LOCAL(String, scaleString, ("scale(")); | |
169 return scaleString; | |
170 } | |
171 case SVG_TRANSFORM_ROTATE: { | |
172 DEFINE_STATIC_LOCAL(String, rotateString, ("rotate(")); | |
173 return rotateString; | |
174 } | |
175 case SVG_TRANSFORM_SKEWX: { | |
176 DEFINE_STATIC_LOCAL(String, skewXString, ("skewX(")); | |
177 return skewXString; | |
178 } | |
179 case SVG_TRANSFORM_SKEWY: { | |
180 DEFINE_STATIC_LOCAL(String, skewYString, ("skewY(")); | |
181 return skewYString; | |
182 } | |
183 } | |
184 | |
185 ASSERT_NOT_REACHED(); | 172 ASSERT_NOT_REACHED(); |
186 return emptyString(); | 173 return ""; |
187 } | 174 } |
188 | 175 |
189 } | 176 } |
190 | 177 |
191 String SVGTransform::valueAsString() const | 178 String SVGTransform::valueAsString() const |
192 { | 179 { |
193 const String& prefix = transformTypePrefixForParsing(m_transformType); | 180 double arguments[6]; |
pdr.
2015/12/15 19:26:25
Why store these off in a separate array instead of
fs
2015/12/15 19:42:57
All the append(' ')'s result in quite significant
| |
181 size_t argumentCount = 0; | |
194 switch (m_transformType) { | 182 switch (m_transformType) { |
195 case SVG_TRANSFORM_UNKNOWN: | 183 case SVG_TRANSFORM_UNKNOWN: |
196 return prefix; | 184 return emptyString(); |
197 case SVG_TRANSFORM_MATRIX: { | 185 case SVG_TRANSFORM_MATRIX: { |
198 StringBuilder builder; | 186 arguments[argumentCount++] = m_matrix.a(); |
199 builder.append(prefix + String::number(m_matrix.a()) + ' ' + String::num ber(m_matrix.b()) + ' ' + String::number(m_matrix.c()) + ' ' + | 187 arguments[argumentCount++] = m_matrix.b(); |
200 String::number(m_matrix.d()) + ' ' + String::number(m_mat rix.e()) + ' ' + String::number(m_matrix.f()) + ')'); | 188 arguments[argumentCount++] = m_matrix.c(); |
201 return builder.toString(); | 189 arguments[argumentCount++] = m_matrix.d(); |
190 arguments[argumentCount++] = m_matrix.e(); | |
191 arguments[argumentCount++] = m_matrix.f(); | |
192 break; | |
202 } | 193 } |
203 case SVG_TRANSFORM_TRANSLATE: | 194 case SVG_TRANSFORM_TRANSLATE: { |
204 return prefix + String::number(m_matrix.e()) + ' ' + String::number(m_ma trix.f()) + ')'; | 195 arguments[argumentCount++] = m_matrix.e(); |
205 case SVG_TRANSFORM_SCALE: | 196 arguments[argumentCount++] = m_matrix.f(); |
206 return prefix + String::number(m_matrix.a()) + ' ' + String::number(m_ma trix.d()) + ')'; | 197 break; |
198 } | |
199 case SVG_TRANSFORM_SCALE: { | |
200 arguments[argumentCount++] = m_matrix.a(); | |
201 arguments[argumentCount++] = m_matrix.d(); | |
202 break; | |
203 } | |
207 case SVG_TRANSFORM_ROTATE: { | 204 case SVG_TRANSFORM_ROTATE: { |
205 arguments[argumentCount++] = m_angle; | |
206 | |
208 double angleInRad = deg2rad(m_angle); | 207 double angleInRad = deg2rad(m_angle); |
209 double cosAngle = cos(angleInRad); | 208 double cosAngle = cos(angleInRad); |
210 double sinAngle = sin(angleInRad); | 209 double sinAngle = sin(angleInRad); |
211 float cx = narrowPrecisionToFloat(cosAngle != 1 ? (m_matrix.e() * (1 - c osAngle) - m_matrix.f() * sinAngle) / (1 - cosAngle) / 2 : 0); | 210 float cx = narrowPrecisionToFloat(cosAngle != 1 ? (m_matrix.e() * (1 - c osAngle) - m_matrix.f() * sinAngle) / (1 - cosAngle) / 2 : 0); |
212 float cy = narrowPrecisionToFloat(cosAngle != 1 ? (m_matrix.e() * sinAng le / (1 - cosAngle) + m_matrix.f()) / 2 : 0); | 211 float cy = narrowPrecisionToFloat(cosAngle != 1 ? (m_matrix.e() * sinAng le / (1 - cosAngle) + m_matrix.f()) / 2 : 0); |
213 if (cx || cy) | 212 if (cx || cy) { |
214 return prefix + String::number(m_angle) + ' ' + String::number(cx) + ' ' + String::number(cy) + ')'; | 213 arguments[argumentCount++] = cx; |
215 return prefix + String::number(m_angle) + ')'; | 214 arguments[argumentCount++] = cy; |
215 } | |
216 break; | |
216 } | 217 } |
217 case SVG_TRANSFORM_SKEWX: | 218 case SVG_TRANSFORM_SKEWX: |
218 return prefix + String::number(m_angle) + ')'; | 219 arguments[argumentCount++] = m_angle; |
220 break; | |
219 case SVG_TRANSFORM_SKEWY: | 221 case SVG_TRANSFORM_SKEWY: |
220 return prefix + String::number(m_angle) + ')'; | 222 arguments[argumentCount++] = m_angle; |
223 break; | |
221 } | 224 } |
225 ASSERT(argumentCount <= WTF_ARRAY_LENGTH(arguments)); | |
222 | 226 |
223 ASSERT_NOT_REACHED(); | 227 StringBuilder builder; |
224 return emptyString(); | 228 builder.append(transformTypePrefixForParsing(m_transformType)); |
229 | |
230 for (size_t i = 0; i < argumentCount; ++i) { | |
231 if (i) | |
232 builder.append(' '); | |
233 builder.appendNumber(arguments[i]); | |
234 } | |
235 builder.append(')'); | |
236 return builder.toString(); | |
225 } | 237 } |
226 | 238 |
227 void SVGTransform::add(PassRefPtrWillBeRawPtr<SVGPropertyBase>, SVGElement*) | 239 void SVGTransform::add(PassRefPtrWillBeRawPtr<SVGPropertyBase>, SVGElement*) |
228 { | 240 { |
229 // SVGTransform is not animated by itself. | 241 // SVGTransform is not animated by itself. |
230 ASSERT_NOT_REACHED(); | 242 ASSERT_NOT_REACHED(); |
231 } | 243 } |
232 | 244 |
233 void SVGTransform::calculateAnimatedValue(SVGAnimationElement*, float, unsigned, PassRefPtrWillBeRawPtr<SVGPropertyBase>, PassRefPtrWillBeRawPtr<SVGPropertyBase >, PassRefPtrWillBeRawPtr<SVGPropertyBase>, SVGElement*) | 245 void SVGTransform::calculateAnimatedValue(SVGAnimationElement*, float, unsigned, PassRefPtrWillBeRawPtr<SVGPropertyBase>, PassRefPtrWillBeRawPtr<SVGPropertyBase >, PassRefPtrWillBeRawPtr<SVGPropertyBase>, SVGElement*) |
234 { | 246 { |
235 // SVGTransform is not animated by itself. | 247 // SVGTransform is not animated by itself. |
236 ASSERT_NOT_REACHED(); | 248 ASSERT_NOT_REACHED(); |
237 } | 249 } |
238 | 250 |
239 float SVGTransform::calculateDistance(PassRefPtrWillBeRawPtr<SVGPropertyBase>, S VGElement*) | 251 float SVGTransform::calculateDistance(PassRefPtrWillBeRawPtr<SVGPropertyBase>, S VGElement*) |
240 { | 252 { |
241 // SVGTransform is not animated by itself. | 253 // SVGTransform is not animated by itself. |
242 ASSERT_NOT_REACHED(); | 254 ASSERT_NOT_REACHED(); |
243 | 255 |
244 return -1; | 256 return -1; |
245 } | 257 } |
246 | 258 |
247 } // namespace blink | 259 } // namespace blink |
OLD | NEW |