Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 // Copyright 2014 The Chromium Authors. All rights reserved. | 1 // Copyright 2014 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 "core/dom/DOMMatrix.h" | 5 #include "core/dom/DOMMatrix.h" |
| 6 | 6 |
| 7 #include "core/css/CSSIdentifierValue.h" | |
| 8 #include "core/css/CSSToLengthConversionData.h" | |
| 9 #include "core/css/CSSValueList.h" | |
| 10 #include "core/css/parser/CSSParser.h" | |
| 11 #include "core/css/resolver/TransformBuilder.h" | |
| 12 #include "core/layout/api/LayoutViewItem.h" | |
| 13 #include "core/style/ComputedStyle.h" | |
| 14 | |
| 15 namespace blink { | 7 namespace blink { |
| 16 | 8 |
| 17 DOMMatrix* DOMMatrix::create(ExceptionState& exceptionState) { | 9 DOMMatrix* DOMMatrix::create(ExceptionState& exceptionState) { |
| 18 return new DOMMatrix(TransformationMatrix()); | 10 return new DOMMatrix(TransformationMatrix()); |
| 19 } | 11 } |
| 20 | 12 |
| 21 DOMMatrix* DOMMatrix::create(DOMMatrixReadOnly* other, | 13 DOMMatrix* DOMMatrix::create(DOMMatrixReadOnly* other, |
| 22 ExceptionState& exceptionState) { | 14 ExceptionState& exceptionState) { |
| 23 return new DOMMatrix(other->matrix(), other->is2D()); | 15 return new DOMMatrix(other->matrix(), other->is2D()); |
| 24 } | 16 } |
| 25 | 17 |
| 26 DOMMatrix* DOMMatrix::create(const SkMatrix44& matrix, | 18 DOMMatrix* DOMMatrix::create(const SkMatrix44& matrix, |
| 27 ExceptionState& exceptionState) { | 19 ExceptionState& exceptionState) { |
| 28 TransformationMatrix transformationMatrix(matrix); | 20 TransformationMatrix transformationMatrix(matrix); |
| 29 return new DOMMatrix(transformationMatrix, transformationMatrix.isAffine()); | 21 return new DOMMatrix(transformationMatrix, transformationMatrix.isAffine()); |
| 30 } | 22 } |
| 31 | 23 |
| 24 DOMMatrix* DOMMatrix::create(const String& transformList, | |
| 25 ExceptionState& exceptionState) { | |
| 26 DOMMatrix* matrix = new DOMMatrix(TransformationMatrix()); | |
| 27 matrix->setMatrixValueFromString(transformList, exceptionState); | |
| 28 return matrix; | |
| 29 } | |
| 30 | |
| 32 DOMMatrix* DOMMatrix::create(Vector<double> sequence, | 31 DOMMatrix* DOMMatrix::create(Vector<double> sequence, |
| 33 ExceptionState& exceptionState) { | 32 ExceptionState& exceptionState) { |
| 34 if (sequence.size() != 6 && sequence.size() != 16) { | 33 if (sequence.size() != 6 && sequence.size() != 16) { |
| 35 exceptionState.throwTypeError( | 34 exceptionState.throwTypeError( |
| 36 "The sequence must contain 6 elements for a 2D matrix or 16 elements " | 35 "The sequence must contain 6 elements for a 2D matrix or 16 elements " |
| 37 "for a 3D matrix."); | 36 "for a 3D matrix."); |
| 38 return nullptr; | 37 return nullptr; |
| 39 } | 38 } |
| 40 return new DOMMatrix(sequence, sequence.size()); | 39 return new DOMMatrix(sequence, sequence.size()); |
| 41 } | 40 } |
| (...skipping 212 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 254 m_matrix = TransformationMatrix::create(m_matrix->inverse()); | 253 m_matrix = TransformationMatrix::create(m_matrix->inverse()); |
| 255 } else { | 254 } else { |
| 256 setNAN(); | 255 setNAN(); |
| 257 setIs2D(false); | 256 setIs2D(false); |
| 258 } | 257 } |
| 259 return this; | 258 return this; |
| 260 } | 259 } |
| 261 | 260 |
| 262 DOMMatrix* DOMMatrix::setMatrixValue(const String& inputString, | 261 DOMMatrix* DOMMatrix::setMatrixValue(const String& inputString, |
| 263 ExceptionState& exceptionState) { | 262 ExceptionState& exceptionState) { |
| 264 DEFINE_STATIC_LOCAL(String, identityMatrix2D, ("matrix(1, 0, 0, 1, 0, 0)")); | 263 DOMMatrixReadOnly::setMatrixValueFromString(inputString, exceptionState); |
|
zino
2016/11/30 14:41:28
nit: I think you can just call setMatrixValueFromS
Hwanseung Lee
2016/11/30 14:46:18
Done.
| |
| 265 String string = inputString; | |
| 266 if (string.isEmpty()) | |
| 267 string = identityMatrix2D; | |
| 268 | |
| 269 const CSSValue* value = | |
| 270 CSSParser::parseSingleValue(CSSPropertyTransform, string); | |
| 271 | |
| 272 if (!value || value->isCSSWideKeyword()) { | |
| 273 exceptionState.throwDOMException(SyntaxError, | |
| 274 "Failed to parse '" + inputString + "'."); | |
| 275 return nullptr; | |
| 276 } | |
| 277 | |
| 278 if (value->isIdentifierValue()) { | |
| 279 DCHECK(toCSSIdentifierValue(value)->getValueID() == CSSValueNone); | |
| 280 m_matrix->makeIdentity(); | |
| 281 m_is2D = true; | |
| 282 return this; | |
| 283 } | |
| 284 | |
| 285 if (TransformBuilder::hasRelativeLengths(toCSSValueList(*value))) { | |
| 286 exceptionState.throwDOMException(SyntaxError, | |
| 287 "Relative lengths not supported."); | |
| 288 return nullptr; | |
| 289 } | |
| 290 | |
| 291 const ComputedStyle& initialStyle = ComputedStyle::initialStyle(); | |
| 292 TransformOperations operations = TransformBuilder::createTransformOperations( | |
| 293 *value, CSSToLengthConversionData(&initialStyle, &initialStyle, | |
| 294 LayoutViewItem(nullptr), 1.0f)); | |
| 295 | |
| 296 if (operations.dependsOnBoxSize()) { | |
| 297 exceptionState.throwDOMException(SyntaxError, | |
| 298 "The transformation depends on the box " | |
| 299 "size, which is not supported."); | |
| 300 return nullptr; | |
| 301 } | |
| 302 | |
| 303 m_matrix->makeIdentity(); | |
| 304 operations.apply(FloatSize(0, 0), *m_matrix); | |
| 305 | |
| 306 m_is2D = !operations.has3DOperation(); | |
| 307 | |
| 308 return this; | 264 return this; |
| 309 } | 265 } |
| 310 | 266 |
| 311 } // namespace blink | 267 } // namespace blink |
| OLD | NEW |