| OLD | NEW |
| 1 // Copyright 2016 The Chromium Authors. All rights reserved. | 1 // Copyright 2016 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/css/cssom/CSSMatrixComponent.h" | 5 #include "core/css/cssom/CSSMatrixComponent.h" |
| 6 | 6 |
| 7 #include <cmath> | 7 #include <cmath> |
| 8 #include <memory> | 8 #include <memory> |
| 9 #include "core/css/CSSPrimitiveValue.h" | 9 #include "core/css/CSSPrimitiveValue.h" |
| 10 #include "platform/wtf/MathExtras.h" | 10 #include "platform/wtf/MathExtras.h" |
| 11 | 11 |
| 12 namespace blink { | 12 namespace blink { |
| 13 | 13 |
| 14 CSSMatrixComponent* CSSMatrixComponent::Create(DOMMatrixReadOnly* matrix) { |
| 15 return new CSSMatrixComponent(matrix); |
| 16 } |
| 17 |
| 14 CSSFunctionValue* CSSMatrixComponent::ToCSSValue() const { | 18 CSSFunctionValue* CSSMatrixComponent::ToCSSValue() const { |
| 15 CSSFunctionValue* result = | 19 CSSFunctionValue* result = |
| 16 CSSFunctionValue::Create(is2d_ ? CSSValueMatrix : CSSValueMatrix3d); | 20 CSSFunctionValue::Create(is2d_ ? CSSValueMatrix : CSSValueMatrix3d); |
| 17 | 21 |
| 18 if (is2d_) { | 22 if (is2d_) { |
| 19 double values[6] = {a(), b(), c(), d(), e(), f()}; | 23 double values[6] = {matrix()->a(), matrix()->b(), matrix()->c(), |
| 24 matrix()->d(), matrix()->e(), matrix()->f()}; |
| 20 for (double value : values) { | 25 for (double value : values) { |
| 21 result->Append(*CSSPrimitiveValue::Create( | 26 result->Append(*CSSPrimitiveValue::Create( |
| 22 value, CSSPrimitiveValue::UnitType::kNumber)); | 27 value, CSSPrimitiveValue::UnitType::kNumber)); |
| 23 } | 28 } |
| 24 } else { | 29 } else { |
| 25 double values[16] = {m11(), m12(), m13(), m14(), m21(), m22(), | 30 double values[16] = { |
| 26 m23(), m24(), m31(), m32(), m33(), m34(), | 31 matrix()->m11(), matrix()->m12(), matrix()->m13(), matrix()->m14(), |
| 27 m41(), m42(), m43(), m44()}; | 32 matrix()->m21(), matrix()->m22(), matrix()->m23(), matrix()->m24(), |
| 33 matrix()->m31(), matrix()->m32(), matrix()->m33(), matrix()->m34(), |
| 34 matrix()->m41(), matrix()->m42(), matrix()->m43(), matrix()->m44()}; |
| 28 for (double value : values) { | 35 for (double value : values) { |
| 29 result->Append(*CSSPrimitiveValue::Create( | 36 result->Append(*CSSPrimitiveValue::Create( |
| 30 value, CSSPrimitiveValue::UnitType::kNumber)); | 37 value, CSSPrimitiveValue::UnitType::kNumber)); |
| 31 } | 38 } |
| 32 } | 39 } |
| 33 | 40 |
| 34 return result; | 41 return result; |
| 35 } | 42 } |
| 36 | 43 |
| 37 CSSMatrixComponent* CSSMatrixComponent::Perspective(double length) { | 44 CSSMatrixComponent* CSSMatrixComponent::Perspective(double length) { |
| 38 std::unique_ptr<TransformationMatrix> matrix = TransformationMatrix::Create(); | 45 DOMMatrixInit init; |
| 46 DOMMatrix* matrix = DOMMatrix::fromMatrix(init, ASSERT_NO_EXCEPTION); |
| 47 |
| 39 if (length != 0) | 48 if (length != 0) |
| 40 matrix->SetM34(-1 / length); | 49 matrix->setM34(-1 / length); |
| 41 return new CSSMatrixComponent(std::move(matrix), kPerspectiveType); | 50 return new CSSMatrixComponent(matrix, kPerspectiveType); |
| 42 } | 51 } |
| 43 | 52 |
| 44 CSSMatrixComponent* CSSMatrixComponent::Rotate(double angle) { | 53 CSSMatrixComponent* CSSMatrixComponent::Rotate(double angle) { |
| 45 std::unique_ptr<TransformationMatrix> matrix = TransformationMatrix::Create(); | 54 DOMMatrixInit init; |
| 46 matrix->Rotate(angle); | 55 DOMMatrix* matrix = DOMMatrix::fromMatrix(init, ASSERT_NO_EXCEPTION); |
| 47 return new CSSMatrixComponent(std::move(matrix), kRotationType); | 56 |
| 57 matrix->rotateSelf(angle); |
| 58 return new CSSMatrixComponent(matrix, kRotationType); |
| 48 } | 59 } |
| 49 | 60 |
| 50 CSSMatrixComponent* CSSMatrixComponent::Rotate3d(double angle, | 61 CSSMatrixComponent* CSSMatrixComponent::Rotate3d(double angle, |
| 51 double x, | 62 double x, |
| 52 double y, | 63 double y, |
| 53 double z) { | 64 double z) { |
| 54 std::unique_ptr<TransformationMatrix> matrix = TransformationMatrix::Create(); | 65 DOMMatrixInit init; |
| 55 matrix->Rotate3d(x, y, z, angle); | 66 DOMMatrix* matrix = DOMMatrix::fromMatrix(init, ASSERT_NO_EXCEPTION); |
| 56 return new CSSMatrixComponent(std::move(matrix), kRotation3DType); | 67 |
| 68 matrix->rotateAxisAngleSelf(x, y, z, angle); |
| 69 return new CSSMatrixComponent(matrix, kRotation3DType); |
| 57 } | 70 } |
| 58 | 71 |
| 59 CSSMatrixComponent* CSSMatrixComponent::Scale(double x, double y) { | 72 CSSMatrixComponent* CSSMatrixComponent::Scale(double x, double y) { |
| 60 std::unique_ptr<TransformationMatrix> matrix = TransformationMatrix::Create(); | 73 DOMMatrixInit init; |
| 61 matrix->SetM11(x); | 74 DOMMatrix* matrix = DOMMatrix::fromMatrix(init, ASSERT_NO_EXCEPTION); |
| 62 matrix->SetM22(y); | 75 |
| 63 return new CSSMatrixComponent(std::move(matrix), kScaleType); | 76 matrix->setM11(x); |
| 77 matrix->setM22(y); |
| 78 return new CSSMatrixComponent(matrix, kScaleType); |
| 64 } | 79 } |
| 65 | 80 |
| 66 CSSMatrixComponent* CSSMatrixComponent::Scale3d(double x, double y, double z) { | 81 CSSMatrixComponent* CSSMatrixComponent::Scale3d(double x, double y, double z) { |
| 67 std::unique_ptr<TransformationMatrix> matrix = TransformationMatrix::Create(); | 82 DOMMatrixInit init; |
| 68 matrix->SetM11(x); | 83 DOMMatrix* matrix = DOMMatrix::fromMatrix(init, ASSERT_NO_EXCEPTION); |
| 69 matrix->SetM22(y); | 84 |
| 70 matrix->SetM33(z); | 85 matrix->setM11(x); |
| 71 return new CSSMatrixComponent(std::move(matrix), kScale3DType); | 86 matrix->setM22(y); |
| 87 matrix->setM33(z); |
| 88 return new CSSMatrixComponent(matrix, kScale3DType); |
| 72 } | 89 } |
| 73 | 90 |
| 74 CSSMatrixComponent* CSSMatrixComponent::Skew(double ax, double ay) { | 91 CSSMatrixComponent* CSSMatrixComponent::Skew(double ax, double ay) { |
| 75 double tan_ax = std::tan(deg2rad(ax)); | 92 double tan_ax = std::tan(deg2rad(ax)); |
| 76 double tan_ay = std::tan(deg2rad(ay)); | 93 double tan_ay = std::tan(deg2rad(ay)); |
| 77 | 94 |
| 78 std::unique_ptr<TransformationMatrix> matrix = TransformationMatrix::Create(); | 95 DOMMatrixInit init; |
| 79 matrix->SetM12(tan_ay); | 96 DOMMatrix* matrix = DOMMatrix::fromMatrix(init, ASSERT_NO_EXCEPTION); |
| 80 matrix->SetM21(tan_ax); | 97 |
| 81 return new CSSMatrixComponent(std::move(matrix), kSkewType); | 98 matrix->setM12(tan_ay); |
| 99 matrix->setM21(tan_ax); |
| 100 return new CSSMatrixComponent(matrix, kSkewType); |
| 82 } | 101 } |
| 83 | 102 |
| 84 CSSMatrixComponent* CSSMatrixComponent::Translate(double x, double y) { | 103 CSSMatrixComponent* CSSMatrixComponent::Translate(double x, double y) { |
| 85 std::unique_ptr<TransformationMatrix> matrix = TransformationMatrix::Create(); | 104 DOMMatrixInit init; |
| 86 matrix->SetM41(x); | 105 DOMMatrix* matrix = DOMMatrix::fromMatrix(init, ASSERT_NO_EXCEPTION); |
| 87 matrix->SetM42(y); | 106 |
| 88 return new CSSMatrixComponent(std::move(matrix), kTranslationType); | 107 matrix->setM41(x); |
| 108 matrix->setM42(y); |
| 109 return new CSSMatrixComponent(matrix, kTranslationType); |
| 89 } | 110 } |
| 90 | 111 |
| 91 CSSMatrixComponent* CSSMatrixComponent::Translate3d(double x, | 112 CSSMatrixComponent* CSSMatrixComponent::Translate3d(double x, |
| 92 double y, | 113 double y, |
| 93 double z) { | 114 double z) { |
| 94 std::unique_ptr<TransformationMatrix> matrix = TransformationMatrix::Create(); | 115 DOMMatrixInit init; |
| 95 matrix->SetM41(x); | 116 DOMMatrix* matrix = DOMMatrix::fromMatrix(init, ASSERT_NO_EXCEPTION); |
| 96 matrix->SetM42(y); | 117 |
| 97 matrix->SetM43(z); | 118 matrix->setM41(x); |
| 98 return new CSSMatrixComponent(std::move(matrix), kTranslation3DType); | 119 matrix->setM42(y); |
| 120 matrix->setM43(z); |
| 121 return new CSSMatrixComponent(matrix, kTranslation3DType); |
| 122 } |
| 123 |
| 124 CSSMatrixComponent::CSSMatrixComponent(DOMMatrixReadOnly* matrix) |
| 125 : CSSTransformComponent() { |
| 126 matrix_ = DOMMatrix::Create(matrix); |
| 127 is2d_ = matrix->is2D(); |
| 128 } |
| 129 |
| 130 CSSMatrixComponent::CSSMatrixComponent(DOMMatrixReadOnly* matrix, |
| 131 TransformComponentType from_type) |
| 132 : CSSTransformComponent() { |
| 133 matrix_ = DOMMatrix::Create(matrix); |
| 134 is2d_ = Is2DComponentType(from_type); |
| 99 } | 135 } |
| 100 | 136 |
| 101 } // namespace blink | 137 } // namespace blink |
| OLD | NEW |