1*635a8641SAndroid Build Coastguard Worker // Copyright (c) 2012 The Chromium Authors. All rights reserved.
2*635a8641SAndroid Build Coastguard Worker // Use of this source code is governed by a BSD-style license that can be
3*635a8641SAndroid Build Coastguard Worker // found in the LICENSE file.
4*635a8641SAndroid Build Coastguard Worker
5*635a8641SAndroid Build Coastguard Worker #include <stddef.h>
6*635a8641SAndroid Build Coastguard Worker
7*635a8641SAndroid Build Coastguard Worker #include "base/macros.h"
8*635a8641SAndroid Build Coastguard Worker #include "build/build_config.h"
9*635a8641SAndroid Build Coastguard Worker #include "testing/gtest/include/gtest/gtest.h"
10*635a8641SAndroid Build Coastguard Worker #include "ui/gfx/geometry/quad_f.h"
11*635a8641SAndroid Build Coastguard Worker #include "ui/gfx/geometry/rect_f.h"
12*635a8641SAndroid Build Coastguard Worker
13*635a8641SAndroid Build Coastguard Worker namespace gfx {
14*635a8641SAndroid Build Coastguard Worker
TEST(QuadTest,Construction)15*635a8641SAndroid Build Coastguard Worker TEST(QuadTest, Construction) {
16*635a8641SAndroid Build Coastguard Worker // Verify constructors.
17*635a8641SAndroid Build Coastguard Worker PointF a(1, 1);
18*635a8641SAndroid Build Coastguard Worker PointF b(2, 1);
19*635a8641SAndroid Build Coastguard Worker PointF c(2, 2);
20*635a8641SAndroid Build Coastguard Worker PointF d(1, 2);
21*635a8641SAndroid Build Coastguard Worker PointF e;
22*635a8641SAndroid Build Coastguard Worker QuadF q1;
23*635a8641SAndroid Build Coastguard Worker QuadF q2(e, e, e, e);
24*635a8641SAndroid Build Coastguard Worker QuadF q3(a, b, c, d);
25*635a8641SAndroid Build Coastguard Worker QuadF q4(BoundingRect(a, c));
26*635a8641SAndroid Build Coastguard Worker EXPECT_EQ(q1, q2);
27*635a8641SAndroid Build Coastguard Worker EXPECT_EQ(q3, q4);
28*635a8641SAndroid Build Coastguard Worker
29*635a8641SAndroid Build Coastguard Worker // Verify getters.
30*635a8641SAndroid Build Coastguard Worker EXPECT_EQ(q3.p1(), a);
31*635a8641SAndroid Build Coastguard Worker EXPECT_EQ(q3.p2(), b);
32*635a8641SAndroid Build Coastguard Worker EXPECT_EQ(q3.p3(), c);
33*635a8641SAndroid Build Coastguard Worker EXPECT_EQ(q3.p4(), d);
34*635a8641SAndroid Build Coastguard Worker
35*635a8641SAndroid Build Coastguard Worker // Verify setters.
36*635a8641SAndroid Build Coastguard Worker q3.set_p1(b);
37*635a8641SAndroid Build Coastguard Worker q3.set_p2(c);
38*635a8641SAndroid Build Coastguard Worker q3.set_p3(d);
39*635a8641SAndroid Build Coastguard Worker q3.set_p4(a);
40*635a8641SAndroid Build Coastguard Worker EXPECT_EQ(q3.p1(), b);
41*635a8641SAndroid Build Coastguard Worker EXPECT_EQ(q3.p2(), c);
42*635a8641SAndroid Build Coastguard Worker EXPECT_EQ(q3.p3(), d);
43*635a8641SAndroid Build Coastguard Worker EXPECT_EQ(q3.p4(), a);
44*635a8641SAndroid Build Coastguard Worker
45*635a8641SAndroid Build Coastguard Worker // Verify operator=(Rect)
46*635a8641SAndroid Build Coastguard Worker EXPECT_NE(q1, q4);
47*635a8641SAndroid Build Coastguard Worker q1 = BoundingRect(a, c);
48*635a8641SAndroid Build Coastguard Worker EXPECT_EQ(q1, q4);
49*635a8641SAndroid Build Coastguard Worker
50*635a8641SAndroid Build Coastguard Worker // Verify operator=(Quad)
51*635a8641SAndroid Build Coastguard Worker EXPECT_NE(q1, q3);
52*635a8641SAndroid Build Coastguard Worker q1 = q3;
53*635a8641SAndroid Build Coastguard Worker EXPECT_EQ(q1, q3);
54*635a8641SAndroid Build Coastguard Worker }
55*635a8641SAndroid Build Coastguard Worker
TEST(QuadTest,AddingVectors)56*635a8641SAndroid Build Coastguard Worker TEST(QuadTest, AddingVectors) {
57*635a8641SAndroid Build Coastguard Worker PointF a(1, 1);
58*635a8641SAndroid Build Coastguard Worker PointF b(2, 1);
59*635a8641SAndroid Build Coastguard Worker PointF c(2, 2);
60*635a8641SAndroid Build Coastguard Worker PointF d(1, 2);
61*635a8641SAndroid Build Coastguard Worker Vector2dF v(3.5f, -2.5f);
62*635a8641SAndroid Build Coastguard Worker
63*635a8641SAndroid Build Coastguard Worker QuadF q1(a, b, c, d);
64*635a8641SAndroid Build Coastguard Worker QuadF added = q1 + v;
65*635a8641SAndroid Build Coastguard Worker q1 += v;
66*635a8641SAndroid Build Coastguard Worker QuadF expected1(PointF(4.5f, -1.5f),
67*635a8641SAndroid Build Coastguard Worker PointF(5.5f, -1.5f),
68*635a8641SAndroid Build Coastguard Worker PointF(5.5f, -0.5f),
69*635a8641SAndroid Build Coastguard Worker PointF(4.5f, -0.5f));
70*635a8641SAndroid Build Coastguard Worker EXPECT_EQ(expected1, added);
71*635a8641SAndroid Build Coastguard Worker EXPECT_EQ(expected1, q1);
72*635a8641SAndroid Build Coastguard Worker
73*635a8641SAndroid Build Coastguard Worker QuadF q2(a, b, c, d);
74*635a8641SAndroid Build Coastguard Worker QuadF subtracted = q2 - v;
75*635a8641SAndroid Build Coastguard Worker q2 -= v;
76*635a8641SAndroid Build Coastguard Worker QuadF expected2(PointF(-2.5f, 3.5f),
77*635a8641SAndroid Build Coastguard Worker PointF(-1.5f, 3.5f),
78*635a8641SAndroid Build Coastguard Worker PointF(-1.5f, 4.5f),
79*635a8641SAndroid Build Coastguard Worker PointF(-2.5f, 4.5f));
80*635a8641SAndroid Build Coastguard Worker EXPECT_EQ(expected2, subtracted);
81*635a8641SAndroid Build Coastguard Worker EXPECT_EQ(expected2, q2);
82*635a8641SAndroid Build Coastguard Worker
83*635a8641SAndroid Build Coastguard Worker QuadF q3(a, b, c, d);
84*635a8641SAndroid Build Coastguard Worker q3 += v;
85*635a8641SAndroid Build Coastguard Worker q3 -= v;
86*635a8641SAndroid Build Coastguard Worker EXPECT_EQ(QuadF(a, b, c, d), q3);
87*635a8641SAndroid Build Coastguard Worker EXPECT_EQ(q3, (q3 + v - v));
88*635a8641SAndroid Build Coastguard Worker }
89*635a8641SAndroid Build Coastguard Worker
TEST(QuadTest,IsRectilinear)90*635a8641SAndroid Build Coastguard Worker TEST(QuadTest, IsRectilinear) {
91*635a8641SAndroid Build Coastguard Worker PointF a(1, 1);
92*635a8641SAndroid Build Coastguard Worker PointF b(2, 1);
93*635a8641SAndroid Build Coastguard Worker PointF c(2, 2);
94*635a8641SAndroid Build Coastguard Worker PointF d(1, 2);
95*635a8641SAndroid Build Coastguard Worker Vector2dF v(3.5f, -2.5f);
96*635a8641SAndroid Build Coastguard Worker
97*635a8641SAndroid Build Coastguard Worker EXPECT_TRUE(QuadF().IsRectilinear());
98*635a8641SAndroid Build Coastguard Worker EXPECT_TRUE(QuadF(a, b, c, d).IsRectilinear());
99*635a8641SAndroid Build Coastguard Worker EXPECT_TRUE((QuadF(a, b, c, d) + v).IsRectilinear());
100*635a8641SAndroid Build Coastguard Worker
101*635a8641SAndroid Build Coastguard Worker float epsilon = std::numeric_limits<float>::epsilon();
102*635a8641SAndroid Build Coastguard Worker PointF a2(1 + epsilon / 2, 1 + epsilon / 2);
103*635a8641SAndroid Build Coastguard Worker PointF b2(2 + epsilon / 2, 1 + epsilon / 2);
104*635a8641SAndroid Build Coastguard Worker PointF c2(2 + epsilon / 2, 2 + epsilon / 2);
105*635a8641SAndroid Build Coastguard Worker PointF d2(1 + epsilon / 2, 2 + epsilon / 2);
106*635a8641SAndroid Build Coastguard Worker EXPECT_TRUE(QuadF(a2, b, c, d).IsRectilinear());
107*635a8641SAndroid Build Coastguard Worker EXPECT_TRUE((QuadF(a2, b, c, d) + v).IsRectilinear());
108*635a8641SAndroid Build Coastguard Worker EXPECT_TRUE(QuadF(a, b2, c, d).IsRectilinear());
109*635a8641SAndroid Build Coastguard Worker EXPECT_TRUE((QuadF(a, b2, c, d) + v).IsRectilinear());
110*635a8641SAndroid Build Coastguard Worker EXPECT_TRUE(QuadF(a, b, c2, d).IsRectilinear());
111*635a8641SAndroid Build Coastguard Worker EXPECT_TRUE((QuadF(a, b, c2, d) + v).IsRectilinear());
112*635a8641SAndroid Build Coastguard Worker EXPECT_TRUE(QuadF(a, b, c, d2).IsRectilinear());
113*635a8641SAndroid Build Coastguard Worker EXPECT_TRUE((QuadF(a, b, c, d2) + v).IsRectilinear());
114*635a8641SAndroid Build Coastguard Worker
115*635a8641SAndroid Build Coastguard Worker struct {
116*635a8641SAndroid Build Coastguard Worker PointF a_off, b_off, c_off, d_off;
117*635a8641SAndroid Build Coastguard Worker } tests[] = {
118*635a8641SAndroid Build Coastguard Worker {
119*635a8641SAndroid Build Coastguard Worker PointF(1, 1.00001f),
120*635a8641SAndroid Build Coastguard Worker PointF(2, 1.00001f),
121*635a8641SAndroid Build Coastguard Worker PointF(2, 2.00001f),
122*635a8641SAndroid Build Coastguard Worker PointF(1, 2.00001f)
123*635a8641SAndroid Build Coastguard Worker },
124*635a8641SAndroid Build Coastguard Worker {
125*635a8641SAndroid Build Coastguard Worker PointF(1.00001f, 1),
126*635a8641SAndroid Build Coastguard Worker PointF(2.00001f, 1),
127*635a8641SAndroid Build Coastguard Worker PointF(2.00001f, 2),
128*635a8641SAndroid Build Coastguard Worker PointF(1.00001f, 2)
129*635a8641SAndroid Build Coastguard Worker },
130*635a8641SAndroid Build Coastguard Worker {
131*635a8641SAndroid Build Coastguard Worker PointF(1.00001f, 1.00001f),
132*635a8641SAndroid Build Coastguard Worker PointF(2.00001f, 1.00001f),
133*635a8641SAndroid Build Coastguard Worker PointF(2.00001f, 2.00001f),
134*635a8641SAndroid Build Coastguard Worker PointF(1.00001f, 2.00001f)
135*635a8641SAndroid Build Coastguard Worker },
136*635a8641SAndroid Build Coastguard Worker {
137*635a8641SAndroid Build Coastguard Worker PointF(1, 0.99999f),
138*635a8641SAndroid Build Coastguard Worker PointF(2, 0.99999f),
139*635a8641SAndroid Build Coastguard Worker PointF(2, 1.99999f),
140*635a8641SAndroid Build Coastguard Worker PointF(1, 1.99999f)
141*635a8641SAndroid Build Coastguard Worker },
142*635a8641SAndroid Build Coastguard Worker {
143*635a8641SAndroid Build Coastguard Worker PointF(0.99999f, 1),
144*635a8641SAndroid Build Coastguard Worker PointF(1.99999f, 1),
145*635a8641SAndroid Build Coastguard Worker PointF(1.99999f, 2),
146*635a8641SAndroid Build Coastguard Worker PointF(0.99999f, 2)
147*635a8641SAndroid Build Coastguard Worker },
148*635a8641SAndroid Build Coastguard Worker {
149*635a8641SAndroid Build Coastguard Worker PointF(0.99999f, 0.99999f),
150*635a8641SAndroid Build Coastguard Worker PointF(1.99999f, 0.99999f),
151*635a8641SAndroid Build Coastguard Worker PointF(1.99999f, 1.99999f),
152*635a8641SAndroid Build Coastguard Worker PointF(0.99999f, 1.99999f)
153*635a8641SAndroid Build Coastguard Worker }
154*635a8641SAndroid Build Coastguard Worker };
155*635a8641SAndroid Build Coastguard Worker
156*635a8641SAndroid Build Coastguard Worker for (size_t i = 0; i < arraysize(tests); ++i) {
157*635a8641SAndroid Build Coastguard Worker PointF a_off = tests[i].a_off;
158*635a8641SAndroid Build Coastguard Worker PointF b_off = tests[i].b_off;
159*635a8641SAndroid Build Coastguard Worker PointF c_off = tests[i].c_off;
160*635a8641SAndroid Build Coastguard Worker PointF d_off = tests[i].d_off;
161*635a8641SAndroid Build Coastguard Worker
162*635a8641SAndroid Build Coastguard Worker EXPECT_FALSE(QuadF(a_off, b, c, d).IsRectilinear());
163*635a8641SAndroid Build Coastguard Worker EXPECT_FALSE((QuadF(a_off, b, c, d) + v).IsRectilinear());
164*635a8641SAndroid Build Coastguard Worker EXPECT_FALSE(QuadF(a, b_off, c, d).IsRectilinear());
165*635a8641SAndroid Build Coastguard Worker EXPECT_FALSE((QuadF(a, b_off, c, d) + v).IsRectilinear());
166*635a8641SAndroid Build Coastguard Worker EXPECT_FALSE(QuadF(a, b, c_off, d).IsRectilinear());
167*635a8641SAndroid Build Coastguard Worker EXPECT_FALSE((QuadF(a, b, c_off, d) + v).IsRectilinear());
168*635a8641SAndroid Build Coastguard Worker EXPECT_FALSE(QuadF(a, b, c, d_off).IsRectilinear());
169*635a8641SAndroid Build Coastguard Worker EXPECT_FALSE((QuadF(a, b, c, d_off) + v).IsRectilinear());
170*635a8641SAndroid Build Coastguard Worker EXPECT_FALSE(QuadF(a_off, b, c_off, d).IsRectilinear());
171*635a8641SAndroid Build Coastguard Worker EXPECT_FALSE((QuadF(a_off, b, c_off, d) + v).IsRectilinear());
172*635a8641SAndroid Build Coastguard Worker EXPECT_FALSE(QuadF(a, b_off, c, d_off).IsRectilinear());
173*635a8641SAndroid Build Coastguard Worker EXPECT_FALSE((QuadF(a, b_off, c, d_off) + v).IsRectilinear());
174*635a8641SAndroid Build Coastguard Worker EXPECT_FALSE(QuadF(a, b_off, c_off, d_off).IsRectilinear());
175*635a8641SAndroid Build Coastguard Worker EXPECT_FALSE((QuadF(a, b_off, c_off, d_off) + v).IsRectilinear());
176*635a8641SAndroid Build Coastguard Worker EXPECT_FALSE(QuadF(a_off, b, c_off, d_off).IsRectilinear());
177*635a8641SAndroid Build Coastguard Worker EXPECT_FALSE((QuadF(a_off, b, c_off, d_off) + v).IsRectilinear());
178*635a8641SAndroid Build Coastguard Worker EXPECT_FALSE(QuadF(a_off, b_off, c, d_off).IsRectilinear());
179*635a8641SAndroid Build Coastguard Worker EXPECT_FALSE((QuadF(a_off, b_off, c, d_off) + v).IsRectilinear());
180*635a8641SAndroid Build Coastguard Worker EXPECT_FALSE(QuadF(a_off, b_off, c_off, d).IsRectilinear());
181*635a8641SAndroid Build Coastguard Worker EXPECT_FALSE((QuadF(a_off, b_off, c_off, d) + v).IsRectilinear());
182*635a8641SAndroid Build Coastguard Worker EXPECT_TRUE(QuadF(a_off, b_off, c_off, d_off).IsRectilinear());
183*635a8641SAndroid Build Coastguard Worker EXPECT_TRUE((QuadF(a_off, b_off, c_off, d_off) + v).IsRectilinear());
184*635a8641SAndroid Build Coastguard Worker }
185*635a8641SAndroid Build Coastguard Worker }
186*635a8641SAndroid Build Coastguard Worker
TEST(QuadTest,IsCounterClockwise)187*635a8641SAndroid Build Coastguard Worker TEST(QuadTest, IsCounterClockwise) {
188*635a8641SAndroid Build Coastguard Worker PointF a1(1, 1);
189*635a8641SAndroid Build Coastguard Worker PointF b1(2, 1);
190*635a8641SAndroid Build Coastguard Worker PointF c1(2, 2);
191*635a8641SAndroid Build Coastguard Worker PointF d1(1, 2);
192*635a8641SAndroid Build Coastguard Worker EXPECT_FALSE(QuadF(a1, b1, c1, d1).IsCounterClockwise());
193*635a8641SAndroid Build Coastguard Worker EXPECT_FALSE(QuadF(b1, c1, d1, a1).IsCounterClockwise());
194*635a8641SAndroid Build Coastguard Worker EXPECT_TRUE(QuadF(a1, d1, c1, b1).IsCounterClockwise());
195*635a8641SAndroid Build Coastguard Worker EXPECT_TRUE(QuadF(c1, b1, a1, d1).IsCounterClockwise());
196*635a8641SAndroid Build Coastguard Worker
197*635a8641SAndroid Build Coastguard Worker // Slightly more complicated quads should work just as easily.
198*635a8641SAndroid Build Coastguard Worker PointF a2(1.3f, 1.4f);
199*635a8641SAndroid Build Coastguard Worker PointF b2(-0.7f, 4.9f);
200*635a8641SAndroid Build Coastguard Worker PointF c2(1.8f, 6.2f);
201*635a8641SAndroid Build Coastguard Worker PointF d2(2.1f, 1.6f);
202*635a8641SAndroid Build Coastguard Worker EXPECT_TRUE(QuadF(a2, b2, c2, d2).IsCounterClockwise());
203*635a8641SAndroid Build Coastguard Worker EXPECT_TRUE(QuadF(b2, c2, d2, a2).IsCounterClockwise());
204*635a8641SAndroid Build Coastguard Worker EXPECT_FALSE(QuadF(a2, d2, c2, b2).IsCounterClockwise());
205*635a8641SAndroid Build Coastguard Worker EXPECT_FALSE(QuadF(c2, b2, a2, d2).IsCounterClockwise());
206*635a8641SAndroid Build Coastguard Worker
207*635a8641SAndroid Build Coastguard Worker // Quads with 3 collinear points should work correctly, too.
208*635a8641SAndroid Build Coastguard Worker PointF a3(0, 0);
209*635a8641SAndroid Build Coastguard Worker PointF b3(1, 0);
210*635a8641SAndroid Build Coastguard Worker PointF c3(2, 0);
211*635a8641SAndroid Build Coastguard Worker PointF d3(1, 1);
212*635a8641SAndroid Build Coastguard Worker EXPECT_FALSE(QuadF(a3, b3, c3, d3).IsCounterClockwise());
213*635a8641SAndroid Build Coastguard Worker EXPECT_FALSE(QuadF(b3, c3, d3, a3).IsCounterClockwise());
214*635a8641SAndroid Build Coastguard Worker EXPECT_TRUE(QuadF(a3, d3, c3, b3).IsCounterClockwise());
215*635a8641SAndroid Build Coastguard Worker // The next expectation in particular would fail for an implementation
216*635a8641SAndroid Build Coastguard Worker // that incorrectly uses only a cross product of the first 3 vertices.
217*635a8641SAndroid Build Coastguard Worker EXPECT_TRUE(QuadF(c3, b3, a3, d3).IsCounterClockwise());
218*635a8641SAndroid Build Coastguard Worker
219*635a8641SAndroid Build Coastguard Worker // Non-convex quads should work correctly, too.
220*635a8641SAndroid Build Coastguard Worker PointF a4(0, 0);
221*635a8641SAndroid Build Coastguard Worker PointF b4(1, 1);
222*635a8641SAndroid Build Coastguard Worker PointF c4(2, 0);
223*635a8641SAndroid Build Coastguard Worker PointF d4(1, 3);
224*635a8641SAndroid Build Coastguard Worker EXPECT_FALSE(QuadF(a4, b4, c4, d4).IsCounterClockwise());
225*635a8641SAndroid Build Coastguard Worker EXPECT_FALSE(QuadF(b4, c4, d4, a4).IsCounterClockwise());
226*635a8641SAndroid Build Coastguard Worker EXPECT_TRUE(QuadF(a4, d4, c4, b4).IsCounterClockwise());
227*635a8641SAndroid Build Coastguard Worker EXPECT_TRUE(QuadF(c4, b4, a4, d4).IsCounterClockwise());
228*635a8641SAndroid Build Coastguard Worker
229*635a8641SAndroid Build Coastguard Worker // A quad with huge coordinates should not fail this check due to
230*635a8641SAndroid Build Coastguard Worker // single-precision overflow.
231*635a8641SAndroid Build Coastguard Worker PointF a5(1e30f, 1e30f);
232*635a8641SAndroid Build Coastguard Worker PointF b5(1e35f, 1e30f);
233*635a8641SAndroid Build Coastguard Worker PointF c5(1e35f, 1e35f);
234*635a8641SAndroid Build Coastguard Worker PointF d5(1e30f, 1e35f);
235*635a8641SAndroid Build Coastguard Worker EXPECT_FALSE(QuadF(a5, b5, c5, d5).IsCounterClockwise());
236*635a8641SAndroid Build Coastguard Worker EXPECT_FALSE(QuadF(b5, c5, d5, a5).IsCounterClockwise());
237*635a8641SAndroid Build Coastguard Worker EXPECT_TRUE(QuadF(a5, d5, c5, b5).IsCounterClockwise());
238*635a8641SAndroid Build Coastguard Worker EXPECT_TRUE(QuadF(c5, b5, a5, d5).IsCounterClockwise());
239*635a8641SAndroid Build Coastguard Worker }
240*635a8641SAndroid Build Coastguard Worker
TEST(QuadTest,BoundingBox)241*635a8641SAndroid Build Coastguard Worker TEST(QuadTest, BoundingBox) {
242*635a8641SAndroid Build Coastguard Worker RectF r(3.2f, 5.4f, 7.007f, 12.01f);
243*635a8641SAndroid Build Coastguard Worker EXPECT_EQ(r, QuadF(r).BoundingBox());
244*635a8641SAndroid Build Coastguard Worker
245*635a8641SAndroid Build Coastguard Worker PointF a(1.3f, 1.4f);
246*635a8641SAndroid Build Coastguard Worker PointF b(-0.7f, 4.9f);
247*635a8641SAndroid Build Coastguard Worker PointF c(1.8f, 6.2f);
248*635a8641SAndroid Build Coastguard Worker PointF d(2.1f, 1.6f);
249*635a8641SAndroid Build Coastguard Worker float left = -0.7f;
250*635a8641SAndroid Build Coastguard Worker float top = 1.4f;
251*635a8641SAndroid Build Coastguard Worker float right = 2.1f;
252*635a8641SAndroid Build Coastguard Worker float bottom = 6.2f;
253*635a8641SAndroid Build Coastguard Worker EXPECT_EQ(RectF(left, top, right - left, bottom - top),
254*635a8641SAndroid Build Coastguard Worker QuadF(a, b, c, d).BoundingBox());
255*635a8641SAndroid Build Coastguard Worker }
256*635a8641SAndroid Build Coastguard Worker
TEST(QuadTest,ContainsPoint)257*635a8641SAndroid Build Coastguard Worker TEST(QuadTest, ContainsPoint) {
258*635a8641SAndroid Build Coastguard Worker PointF a(1.3f, 1.4f);
259*635a8641SAndroid Build Coastguard Worker PointF b(-0.8f, 4.4f);
260*635a8641SAndroid Build Coastguard Worker PointF c(1.8f, 6.1f);
261*635a8641SAndroid Build Coastguard Worker PointF d(2.1f, 1.6f);
262*635a8641SAndroid Build Coastguard Worker
263*635a8641SAndroid Build Coastguard Worker Vector2dF epsilon_x(2 * std::numeric_limits<float>::epsilon(), 0);
264*635a8641SAndroid Build Coastguard Worker Vector2dF epsilon_y(0, 2 * std::numeric_limits<float>::epsilon());
265*635a8641SAndroid Build Coastguard Worker
266*635a8641SAndroid Build Coastguard Worker Vector2dF ac_center = c - a;
267*635a8641SAndroid Build Coastguard Worker ac_center.Scale(0.5f);
268*635a8641SAndroid Build Coastguard Worker Vector2dF bd_center = d - b;
269*635a8641SAndroid Build Coastguard Worker bd_center.Scale(0.5f);
270*635a8641SAndroid Build Coastguard Worker
271*635a8641SAndroid Build Coastguard Worker EXPECT_TRUE(QuadF(a, b, c, d).Contains(a + ac_center));
272*635a8641SAndroid Build Coastguard Worker EXPECT_TRUE(QuadF(a, b, c, d).Contains(b + bd_center));
273*635a8641SAndroid Build Coastguard Worker EXPECT_TRUE(QuadF(a, b, c, d).Contains(c - ac_center));
274*635a8641SAndroid Build Coastguard Worker EXPECT_TRUE(QuadF(a, b, c, d).Contains(d - bd_center));
275*635a8641SAndroid Build Coastguard Worker EXPECT_FALSE(QuadF(a, b, c, d).Contains(a - ac_center));
276*635a8641SAndroid Build Coastguard Worker EXPECT_FALSE(QuadF(a, b, c, d).Contains(b - bd_center));
277*635a8641SAndroid Build Coastguard Worker EXPECT_FALSE(QuadF(a, b, c, d).Contains(c + ac_center));
278*635a8641SAndroid Build Coastguard Worker EXPECT_FALSE(QuadF(a, b, c, d).Contains(d + bd_center));
279*635a8641SAndroid Build Coastguard Worker
280*635a8641SAndroid Build Coastguard Worker EXPECT_TRUE(QuadF(a, b, c, d).Contains(a));
281*635a8641SAndroid Build Coastguard Worker EXPECT_FALSE(QuadF(a, b, c, d).Contains(a - epsilon_x));
282*635a8641SAndroid Build Coastguard Worker EXPECT_FALSE(QuadF(a, b, c, d).Contains(a - epsilon_y));
283*635a8641SAndroid Build Coastguard Worker EXPECT_FALSE(QuadF(a, b, c, d).Contains(a + epsilon_x));
284*635a8641SAndroid Build Coastguard Worker EXPECT_TRUE(QuadF(a, b, c, d).Contains(a + epsilon_y));
285*635a8641SAndroid Build Coastguard Worker
286*635a8641SAndroid Build Coastguard Worker EXPECT_TRUE(QuadF(a, b, c, d).Contains(b));
287*635a8641SAndroid Build Coastguard Worker EXPECT_FALSE(QuadF(a, b, c, d).Contains(b - epsilon_x));
288*635a8641SAndroid Build Coastguard Worker EXPECT_FALSE(QuadF(a, b, c, d).Contains(b - epsilon_y));
289*635a8641SAndroid Build Coastguard Worker EXPECT_TRUE(QuadF(a, b, c, d).Contains(b + epsilon_x));
290*635a8641SAndroid Build Coastguard Worker EXPECT_FALSE(QuadF(a, b, c, d).Contains(b + epsilon_y));
291*635a8641SAndroid Build Coastguard Worker
292*635a8641SAndroid Build Coastguard Worker EXPECT_TRUE(QuadF(a, b, c, d).Contains(c));
293*635a8641SAndroid Build Coastguard Worker EXPECT_FALSE(QuadF(a, b, c, d).Contains(c - epsilon_x));
294*635a8641SAndroid Build Coastguard Worker EXPECT_TRUE(QuadF(a, b, c, d).Contains(c - epsilon_y));
295*635a8641SAndroid Build Coastguard Worker EXPECT_FALSE(QuadF(a, b, c, d).Contains(c + epsilon_x));
296*635a8641SAndroid Build Coastguard Worker EXPECT_FALSE(QuadF(a, b, c, d).Contains(c + epsilon_y));
297*635a8641SAndroid Build Coastguard Worker
298*635a8641SAndroid Build Coastguard Worker EXPECT_TRUE(QuadF(a, b, c, d).Contains(d));
299*635a8641SAndroid Build Coastguard Worker EXPECT_TRUE(QuadF(a, b, c, d).Contains(d - epsilon_x));
300*635a8641SAndroid Build Coastguard Worker EXPECT_FALSE(QuadF(a, b, c, d).Contains(d - epsilon_y));
301*635a8641SAndroid Build Coastguard Worker EXPECT_FALSE(QuadF(a, b, c, d).Contains(d + epsilon_x));
302*635a8641SAndroid Build Coastguard Worker EXPECT_FALSE(QuadF(a, b, c, d).Contains(d + epsilon_y));
303*635a8641SAndroid Build Coastguard Worker
304*635a8641SAndroid Build Coastguard Worker // Test a simple square.
305*635a8641SAndroid Build Coastguard Worker PointF s1(-1, -1);
306*635a8641SAndroid Build Coastguard Worker PointF s2(1, -1);
307*635a8641SAndroid Build Coastguard Worker PointF s3(1, 1);
308*635a8641SAndroid Build Coastguard Worker PointF s4(-1, 1);
309*635a8641SAndroid Build Coastguard Worker // Top edge.
310*635a8641SAndroid Build Coastguard Worker EXPECT_FALSE(QuadF(s1, s2, s3, s4).Contains(PointF(-1.1f, -1.0f)));
311*635a8641SAndroid Build Coastguard Worker EXPECT_TRUE(QuadF(s1, s2, s3, s4).Contains(PointF(-1.0f, -1.0f)));
312*635a8641SAndroid Build Coastguard Worker EXPECT_TRUE(QuadF(s1, s2, s3, s4).Contains(PointF(0.0f, -1.0f)));
313*635a8641SAndroid Build Coastguard Worker EXPECT_TRUE(QuadF(s1, s2, s3, s4).Contains(PointF(1.0f, -1.0f)));
314*635a8641SAndroid Build Coastguard Worker EXPECT_FALSE(QuadF(s1, s2, s3, s4).Contains(PointF(1.1f, -1.0f)));
315*635a8641SAndroid Build Coastguard Worker // Bottom edge.
316*635a8641SAndroid Build Coastguard Worker EXPECT_FALSE(QuadF(s1, s2, s3, s4).Contains(PointF(-1.1f, 1.0f)));
317*635a8641SAndroid Build Coastguard Worker EXPECT_TRUE(QuadF(s1, s2, s3, s4).Contains(PointF(-1.0f, 1.0f)));
318*635a8641SAndroid Build Coastguard Worker EXPECT_TRUE(QuadF(s1, s2, s3, s4).Contains(PointF(0.0f, 1.0f)));
319*635a8641SAndroid Build Coastguard Worker EXPECT_TRUE(QuadF(s1, s2, s3, s4).Contains(PointF(1.0f, 1.0f)));
320*635a8641SAndroid Build Coastguard Worker EXPECT_FALSE(QuadF(s1, s2, s3, s4).Contains(PointF(1.1f, 1.0f)));
321*635a8641SAndroid Build Coastguard Worker // Left edge.
322*635a8641SAndroid Build Coastguard Worker EXPECT_FALSE(QuadF(s1, s2, s3, s4).Contains(PointF(-1.0f, -1.1f)));
323*635a8641SAndroid Build Coastguard Worker EXPECT_TRUE(QuadF(s1, s2, s3, s4).Contains(PointF(-1.0f, -1.0f)));
324*635a8641SAndroid Build Coastguard Worker EXPECT_TRUE(QuadF(s1, s2, s3, s4).Contains(PointF(-1.0f, 0.0f)));
325*635a8641SAndroid Build Coastguard Worker EXPECT_TRUE(QuadF(s1, s2, s3, s4).Contains(PointF(-1.0f, 1.0f)));
326*635a8641SAndroid Build Coastguard Worker EXPECT_FALSE(QuadF(s1, s2, s3, s4).Contains(PointF(-1.0f, 1.1f)));
327*635a8641SAndroid Build Coastguard Worker // Right edge.
328*635a8641SAndroid Build Coastguard Worker EXPECT_FALSE(QuadF(s1, s2, s3, s4).Contains(PointF(1.0f, -1.1f)));
329*635a8641SAndroid Build Coastguard Worker EXPECT_TRUE(QuadF(s1, s2, s3, s4).Contains(PointF(1.0f, -1.0f)));
330*635a8641SAndroid Build Coastguard Worker EXPECT_TRUE(QuadF(s1, s2, s3, s4).Contains(PointF(1.0f, 0.0f)));
331*635a8641SAndroid Build Coastguard Worker EXPECT_TRUE(QuadF(s1, s2, s3, s4).Contains(PointF(1.0f, 1.0f)));
332*635a8641SAndroid Build Coastguard Worker EXPECT_FALSE(QuadF(s1, s2, s3, s4).Contains(PointF(1.0f, 1.1f)));
333*635a8641SAndroid Build Coastguard Worker // Centered inside.
334*635a8641SAndroid Build Coastguard Worker EXPECT_TRUE(QuadF(s1, s2, s3, s4).Contains(PointF(0, 0)));
335*635a8641SAndroid Build Coastguard Worker // Centered outside.
336*635a8641SAndroid Build Coastguard Worker EXPECT_FALSE(QuadF(s1, s2, s3, s4).Contains(PointF(-1.1f, 0)));
337*635a8641SAndroid Build Coastguard Worker EXPECT_FALSE(QuadF(s1, s2, s3, s4).Contains(PointF(1.1f, 0)));
338*635a8641SAndroid Build Coastguard Worker EXPECT_FALSE(QuadF(s1, s2, s3, s4).Contains(PointF(0, -1.1f)));
339*635a8641SAndroid Build Coastguard Worker EXPECT_FALSE(QuadF(s1, s2, s3, s4).Contains(PointF(0, 1.1f)));
340*635a8641SAndroid Build Coastguard Worker }
341*635a8641SAndroid Build Coastguard Worker
TEST(QuadTest,Scale)342*635a8641SAndroid Build Coastguard Worker TEST(QuadTest, Scale) {
343*635a8641SAndroid Build Coastguard Worker PointF a(1.3f, 1.4f);
344*635a8641SAndroid Build Coastguard Worker PointF b(-0.8f, 4.4f);
345*635a8641SAndroid Build Coastguard Worker PointF c(1.8f, 6.1f);
346*635a8641SAndroid Build Coastguard Worker PointF d(2.1f, 1.6f);
347*635a8641SAndroid Build Coastguard Worker QuadF q1(a, b, c, d);
348*635a8641SAndroid Build Coastguard Worker q1.Scale(1.5f);
349*635a8641SAndroid Build Coastguard Worker
350*635a8641SAndroid Build Coastguard Worker PointF a_scaled = ScalePoint(a, 1.5f);
351*635a8641SAndroid Build Coastguard Worker PointF b_scaled = ScalePoint(b, 1.5f);
352*635a8641SAndroid Build Coastguard Worker PointF c_scaled = ScalePoint(c, 1.5f);
353*635a8641SAndroid Build Coastguard Worker PointF d_scaled = ScalePoint(d, 1.5f);
354*635a8641SAndroid Build Coastguard Worker EXPECT_EQ(q1, QuadF(a_scaled, b_scaled, c_scaled, d_scaled));
355*635a8641SAndroid Build Coastguard Worker
356*635a8641SAndroid Build Coastguard Worker QuadF q2;
357*635a8641SAndroid Build Coastguard Worker q2.Scale(1.5f);
358*635a8641SAndroid Build Coastguard Worker EXPECT_EQ(q2, q2);
359*635a8641SAndroid Build Coastguard Worker }
360*635a8641SAndroid Build Coastguard Worker
361*635a8641SAndroid Build Coastguard Worker } // namespace gfx
362