| Flutter Impeller |

matrix_unittests.cc
Go to the documentation of this file.
1 // Copyright 2013 The Flutter Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4
5 #include "gtest/gtest.h"
6
7 #include "flutter/impeller/geometry/matrix.h"
8
9 #include "flutter/impeller/geometry/geometry_asserts.h"
10
11 namespace impeller {
12 namespace testing {
13
14 TEST(MatrixTest, Multiply) {
15 Matrix x(0.0, 0.0, 0.0, 1.0, //
16 1.0, 0.0, 0.0, 1.0, //
17 0.0, 1.0, 0.0, 1.0, //
18 1.0, 1.0, 0.0, 1.0);
19 Matrix translate = Matrix::MakeTranslation({10, 20, 0});
20 Matrix result = translate * x;
21 EXPECT_TRUE(MatrixNear(result, Matrix(10.0, 20.0, 0.0, 1.0, //
22 11.0, 20.0, 0.0, 1.0, //
23 10.0, 21.0, 0.0, 1.0, //
24 11.0, 21.0, 0.0, 1.0)));
25 }
26
27 TEST(MatrixTest, HasPerspective2D) {
28 EXPECT_FALSE(Matrix().HasPerspective2D());
29
30 auto test = [](int index, bool expect) {
31 Matrix matrix;
32 EXPECT_FALSE(matrix.HasPerspective2D());
33 matrix.m[index] = 0.5f;
34 EXPECT_EQ(matrix.HasPerspective2D(), expect) << "index: " << index;
35 };
36
37 // clang-format off
38 test( 0, false); test( 1, false); test( 2, false); test( 3, true);
39 test( 4, false); test( 5, false); test( 6, false); test( 7, true);
40 test( 8, false); test( 9, false); test(10, false); test(11, false);
41 test(12, false); test(13, false); test(14, false); test(15, true);
42 // clang-format on
43 }
44
45 TEST(MatrixTest, HasPerspective) {
46 EXPECT_FALSE(Matrix().HasPerspective());
47
48 auto test = [](int index, bool expect) {
49 Matrix matrix;
50 EXPECT_FALSE(matrix.HasPerspective());
51 matrix.m[index] = 0.5f;
52 EXPECT_EQ(matrix.HasPerspective(), expect) << "index: " << index;
53 };
54
55 // clang-format off
56 test( 0, false); test( 1, false); test( 2, false); test( 3, true);
57 test( 4, false); test( 5, false); test( 6, false); test( 7, true);
58 test( 8, false); test( 9, false); test(10, false); test(11, true);
59 test(12, false); test(13, false); test(14, false); test(15, true);
60 // clang-format on
61 }
62
63 TEST(MatrixTest, HasTranslation) {
64 EXPECT_TRUE(Matrix::MakeTranslation({100, 100, 0}).HasTranslation());
65 EXPECT_TRUE(Matrix::MakeTranslation({0, 100, 0}).HasTranslation());
66 EXPECT_TRUE(Matrix::MakeTranslation({100, 0, 0}).HasTranslation());
67 EXPECT_FALSE(Matrix().HasTranslation());
68 }
69
70 TEST(MatrixTest, IsAligned2D) {
71 EXPECT_TRUE(Matrix().IsAligned2D());
72 EXPECT_TRUE(Matrix::MakeScale({1.0f, 1.0f, 2.0f}).IsAligned2D());
73
74 auto test = [](int index, bool expect) {
75 Matrix matrix;
76 EXPECT_TRUE(matrix.IsAligned2D());
77 matrix.m[index] = 0.5f;
78 EXPECT_EQ(matrix.IsAligned2D(), expect) << "index: " << index;
79 };
80
81 // clang-format off
82 test( 0, true); test( 1, false); test( 2, true); test( 3, false);
83 test( 4, false); test( 5, true); test( 6, true); test( 7, false);
84 test( 8, true); test( 9, true); test(10, true); test(11, true);
85 test(12, true); test(13, true); test(14, true); test(15, false);
86 // clang-format on
87
88 // True for quadrant rotations from -250 to +250 full circles
89 for (int i = -1000; i < 1000; i++) {
90 Degrees d = Degrees(i * 90);
91 Matrix matrix = Matrix::MakeRotationZ(Degrees(d));
92 EXPECT_TRUE(matrix.IsAligned2D()) << "degrees: " << d.degrees;
93 }
94
95 // False for half degree rotations from -999.5 to +1000.5 degrees
96 for (int i = -1000; i < 1000; i++) {
97 Degrees d = Degrees(i + 0.5f);
98 Matrix matrix = Matrix::MakeRotationZ(Degrees(d));
99 EXPECT_FALSE(matrix.IsAligned2D()) << "degrees: " << d.degrees;
100 }
101 }
102
103 TEST(MatrixTest, IsAligned) {
104 EXPECT_TRUE(Matrix().IsAligned());
105 EXPECT_TRUE(Matrix::MakeScale({1.0f, 1.0f, 2.0f}).IsAligned());
106
107 // Begin Legacy tests transferred over from geometry_unittests.cc
108 {
109 auto m = Matrix::MakeTranslation({1, 2, 3});
110 bool result = m.IsAligned();
111 ASSERT_TRUE(result);
112 }
113
114 {
115 auto m = Matrix::MakeRotationZ(Degrees{123});
116 bool result = m.IsAligned();
117 ASSERT_FALSE(result);
118 }
119 // End Legacy tests transferred over from geometry_unittests.cc
120
121 auto test = [](int index, bool expect) {
122 Matrix matrix;
123 EXPECT_TRUE(matrix.IsAligned());
124 matrix.m[index] = 0.5f;
125 EXPECT_EQ(matrix.IsAligned(), expect) << "index: " << index;
126 };
127
128 // clang-format off
129 test( 0, true); test( 1, false); test( 2, false); test( 3, false);
130 test( 4, false); test( 5, true); test( 6, false); test( 7, false);
131 test( 8, false); test( 9, false); test(10, true); test(11, false);
132 test(12, true); test(13, true); test(14, true); test(15, false);
133 // clang-format on
134
135 // True for quadrant rotations from -250 to +250 full circles
136 for (int i = -1000; i < 1000; i++) {
137 Degrees d = Degrees(i * 90);
138 Matrix matrix = Matrix::MakeRotationZ(Degrees(d));
139 EXPECT_TRUE(matrix.IsAligned()) << "degrees: " << d.degrees;
140 }
141
142 // False for half degree rotations from -999.5 to +1000.5 degrees
143 for (int i = -1000; i < 1000; i++) {
144 Degrees d = Degrees(i + 0.5f);
145 Matrix matrix = Matrix::MakeRotationZ(Degrees(d));
146 EXPECT_FALSE(matrix.IsAligned()) << "degrees: " << d.degrees;
147 }
148 }
149
150 TEST(MatrixTest, TransformHomogenous) {
151 Matrix matrix = Matrix::MakeColumn(
152 // clang-format off
153 2.0f, 3.0f, 5.0f, 7.0f,
154 11.0f, 13.0f, 17.0f, 19.0f,
155 23.0f, 29.0f, 31.0f, 37.0f,
156 41.0f, 43.0f, 47.0f, 53.0f
157 // clang-format on
158 );
159 EXPECT_EQ(matrix.TransformHomogenous({1.0f, -1.0f}),
160 Vector3(32.0f, 33.0f, 41.0f));
161 }
162
163 } // namespace testing
164 } // namespace impeller
impeller::Matrix::HasPerspective
constexpr bool HasPerspective() const
Definition: matrix.h:330
impeller::Matrix::m
Scalar m[16]
Definition: matrix.h:39
impeller::Matrix::TransformHomogenous
constexpr Vector3 TransformHomogenous(const Point &v) const
Definition: matrix.h:465
impeller::Degrees::degrees
Scalar degrees
Definition: scalar.h:47
geometry_asserts.h
impeller::testing::TEST
TEST(AiksCanvasTest, EmptyCullRect)
Definition: canvas_unittests.cc:18
MatrixNear
inline ::testing::AssertionResult MatrixNear(impeller::Matrix a, impeller::Matrix b)
Definition: geometry_asserts.h:56
impeller::Matrix::MakeTranslation
static constexpr Matrix MakeTranslation(const Vector3 &t)
Definition: matrix.h:95
matrix.h
impeller::Matrix::MakeColumn
static constexpr Matrix MakeColumn(Scalar m0, Scalar m1, Scalar m2, Scalar m3, Scalar m4, Scalar m5, Scalar m6, Scalar m7, Scalar m8, Scalar m9, Scalar m10, Scalar m11, Scalar m12, Scalar m13, Scalar m14, Scalar m15)
Definition: matrix.h:69
impeller::Matrix::MakeRotationZ
static Matrix MakeRotationZ(Radians r)
Definition: matrix.h:213
impeller::Degrees
Definition: scalar.h:46
impeller
Definition: aiks_blend_unittests.cc:18
impeller::Matrix::MakeScale
static constexpr Matrix MakeScale(const Vector3 &s)
Definition: matrix.h:104
impeller::Matrix::IsAligned2D
constexpr bool IsAligned2D(Scalar tolerance=0) const
Definition: matrix.h:336
impeller::Matrix::HasPerspective2D
constexpr bool HasPerspective2D() const
Definition: matrix.h:326
impeller::Matrix
A 4x4 matrix using column-major storage.
Definition: matrix.h:37
impeller::Vector3
Definition: vector.h:20
impeller::Matrix::IsAligned
constexpr bool IsAligned(Scalar tolerance=0) const
Definition: matrix.h:351