1*c8dee2aaSAndroid Build Coastguard Worker /*
2*c8dee2aaSAndroid Build Coastguard Worker * Copyright 2021 Google Inc.
3*c8dee2aaSAndroid Build Coastguard Worker *
4*c8dee2aaSAndroid Build Coastguard Worker * Use of this source code is governed by a BSD-style license that can be
5*c8dee2aaSAndroid Build Coastguard Worker * found in the LICENSE file.
6*c8dee2aaSAndroid Build Coastguard Worker */
7*c8dee2aaSAndroid Build Coastguard Worker
8*c8dee2aaSAndroid Build Coastguard Worker #include "src/gpu/graphite/geom/Rect.h"
9*c8dee2aaSAndroid Build Coastguard Worker #include "tests/Test.h"
10*c8dee2aaSAndroid Build Coastguard Worker
11*c8dee2aaSAndroid Build Coastguard Worker namespace skgpu::graphite {
12*c8dee2aaSAndroid Build Coastguard Worker
13*c8dee2aaSAndroid Build Coastguard Worker #define CHECK(A) REPORTER_ASSERT(reporter, A)
14*c8dee2aaSAndroid Build Coastguard Worker
DEF_GRAPHITE_TEST(skgpu_Rect,reporter,CtsEnforcement::kApiLevel_V)15*c8dee2aaSAndroid Build Coastguard Worker DEF_GRAPHITE_TEST(skgpu_Rect, reporter, CtsEnforcement::kApiLevel_V) {
16*c8dee2aaSAndroid Build Coastguard Worker using float2 = skvx::float2;
17*c8dee2aaSAndroid Build Coastguard Worker using float4 = skvx::float4;
18*c8dee2aaSAndroid Build Coastguard Worker
19*c8dee2aaSAndroid Build Coastguard Worker const SkRect skRect = SkRect::MakeLTRB(1,-3,4,0);
20*c8dee2aaSAndroid Build Coastguard Worker const Rect rect = skRect;
21*c8dee2aaSAndroid Build Coastguard Worker CHECK(rect == rect);
22*c8dee2aaSAndroid Build Coastguard Worker CHECK(rect == skRect); // promotes 'skRect' to a Rect for ==
23*c8dee2aaSAndroid Build Coastguard Worker CHECK(rect.asSkRect() == skRect); // converts 'rect' to SkRect for ==
24*c8dee2aaSAndroid Build Coastguard Worker
25*c8dee2aaSAndroid Build Coastguard Worker for (const float l : {0,1,2}) {
26*c8dee2aaSAndroid Build Coastguard Worker for (const float t : {-4,-3,-2}) {
27*c8dee2aaSAndroid Build Coastguard Worker for (const float r : {3,4,5}) {
28*c8dee2aaSAndroid Build Coastguard Worker for (const float b : {-1,0,1}) {
29*c8dee2aaSAndroid Build Coastguard Worker const Rect rect2(l,t,r,b);
30*c8dee2aaSAndroid Build Coastguard Worker const SkRect skRect2{l,t,r,b};
31*c8dee2aaSAndroid Build Coastguard Worker
32*c8dee2aaSAndroid Build Coastguard Worker CHECK(rect2 == rect2);
33*c8dee2aaSAndroid Build Coastguard Worker CHECK(rect2 == Rect(float2(l,t), float2(r,b)));
34*c8dee2aaSAndroid Build Coastguard Worker CHECK(rect2 == Rect(skRect2));
35*c8dee2aaSAndroid Build Coastguard Worker CHECK(rect2.asSkRect() == skRect2);
36*c8dee2aaSAndroid Build Coastguard Worker
37*c8dee2aaSAndroid Build Coastguard Worker CHECK((rect2 == rect) == (rect == rect2));
38*c8dee2aaSAndroid Build Coastguard Worker CHECK((rect2 != rect) == (rect != rect2));
39*c8dee2aaSAndroid Build Coastguard Worker CHECK((rect != rect2) == !(rect == rect2));
40*c8dee2aaSAndroid Build Coastguard Worker
41*c8dee2aaSAndroid Build Coastguard Worker CHECK(rect2 == Rect::XYWH(l, t, r - l, b - t));
42*c8dee2aaSAndroid Build Coastguard Worker CHECK(rect2 == Rect::XYWH(float2(l, t), float2(r - l, b - t)));
43*c8dee2aaSAndroid Build Coastguard Worker if (l == 0 && t == 0) {
44*c8dee2aaSAndroid Build Coastguard Worker CHECK(rect2 == Rect::WH(r - l, b - t));
45*c8dee2aaSAndroid Build Coastguard Worker CHECK(rect2 == Rect::WH(float2(r - l, b - t)));
46*c8dee2aaSAndroid Build Coastguard Worker }
47*c8dee2aaSAndroid Build Coastguard Worker CHECK(rect2 == Rect::FromVals(rect2.vals()));
48*c8dee2aaSAndroid Build Coastguard Worker
49*c8dee2aaSAndroid Build Coastguard Worker CHECK(rect2.x() == l);
50*c8dee2aaSAndroid Build Coastguard Worker CHECK(rect2.y() == t);
51*c8dee2aaSAndroid Build Coastguard Worker CHECK(rect2.left() == l);
52*c8dee2aaSAndroid Build Coastguard Worker CHECK(rect2.top() == t);
53*c8dee2aaSAndroid Build Coastguard Worker CHECK(rect2.right() == r);
54*c8dee2aaSAndroid Build Coastguard Worker CHECK(rect2.bot() == b);
55*c8dee2aaSAndroid Build Coastguard Worker CHECK(all(rect2.topLeft() == float2(l,t)));
56*c8dee2aaSAndroid Build Coastguard Worker CHECK(all(rect2.botRight() == float2(r,b)));
57*c8dee2aaSAndroid Build Coastguard Worker CHECK(all(rect2.ltrb() == float4(l,t,r,b)));
58*c8dee2aaSAndroid Build Coastguard Worker CHECK(all(rect2.vals() == float4(l,t,-r,-b)));
59*c8dee2aaSAndroid Build Coastguard Worker
60*c8dee2aaSAndroid Build Coastguard Worker Rect setTest(-99,-99,99,99);
61*c8dee2aaSAndroid Build Coastguard Worker CHECK(setTest != rect2);
62*c8dee2aaSAndroid Build Coastguard Worker setTest.setLeft(l);
63*c8dee2aaSAndroid Build Coastguard Worker setTest.setTop(t);
64*c8dee2aaSAndroid Build Coastguard Worker setTest.setRight(r);
65*c8dee2aaSAndroid Build Coastguard Worker setTest.setBot(b);
66*c8dee2aaSAndroid Build Coastguard Worker CHECK(setTest == rect2);
67*c8dee2aaSAndroid Build Coastguard Worker
68*c8dee2aaSAndroid Build Coastguard Worker setTest = Rect(-99,-99,99,99);
69*c8dee2aaSAndroid Build Coastguard Worker CHECK(setTest != rect2);
70*c8dee2aaSAndroid Build Coastguard Worker setTest.setTopLeft({l,t});
71*c8dee2aaSAndroid Build Coastguard Worker setTest.setBotRight({r,b});
72*c8dee2aaSAndroid Build Coastguard Worker CHECK(setTest == rect2);
73*c8dee2aaSAndroid Build Coastguard Worker
74*c8dee2aaSAndroid Build Coastguard Worker for (int i = 0; i < 4; ++i) {
75*c8dee2aaSAndroid Build Coastguard Worker Rect rnan = rect2;
76*c8dee2aaSAndroid Build Coastguard Worker CHECK(!rnan.isEmptyNegativeOrNaN());
77*c8dee2aaSAndroid Build Coastguard Worker rnan.vals()[i] = std::numeric_limits<float>::quiet_NaN();
78*c8dee2aaSAndroid Build Coastguard Worker CHECK(rnan.isEmptyNegativeOrNaN());
79*c8dee2aaSAndroid Build Coastguard Worker }
80*c8dee2aaSAndroid Build Coastguard Worker
81*c8dee2aaSAndroid Build Coastguard Worker CHECK(all(rect2.size() == float2(skRect2.width(), skRect2.height())));
82*c8dee2aaSAndroid Build Coastguard Worker CHECK(all(rect2.center() == float2(skRect2.centerX(), skRect2.centerY())));
83*c8dee2aaSAndroid Build Coastguard Worker CHECK(rect2.area() == skRect2.height() * skRect2.width());
84*c8dee2aaSAndroid Build Coastguard Worker
85*c8dee2aaSAndroid Build Coastguard Worker CHECK(rect.intersects(rect2) == rect2.intersects(rect));
86*c8dee2aaSAndroid Build Coastguard Worker CHECK(rect.intersects(rect2) == skRect.intersects(skRect2));
87*c8dee2aaSAndroid Build Coastguard Worker CHECK(rect.contains(rect2) == skRect.contains(skRect2));
88*c8dee2aaSAndroid Build Coastguard Worker CHECK(rect2.contains(rect) == skRect2.contains(skRect));
89*c8dee2aaSAndroid Build Coastguard Worker
90*c8dee2aaSAndroid Build Coastguard Worker CHECK(rect2.makeRoundIn() == SkRect::Make(skRect2.roundIn()));
91*c8dee2aaSAndroid Build Coastguard Worker CHECK(rect2.makeRoundOut() == SkRect::Make(skRect2.roundOut()));
92*c8dee2aaSAndroid Build Coastguard Worker CHECK(rect2.makeInset(.5f) == skRect2.makeInset(.5f, .5f));
93*c8dee2aaSAndroid Build Coastguard Worker CHECK(rect2.makeInset({.5f, -.25f}) == skRect2.makeInset(.5f, -.25f));
94*c8dee2aaSAndroid Build Coastguard Worker CHECK(rect2.makeOutset(.5f) == skRect2.makeOutset(.5f, .5f));
95*c8dee2aaSAndroid Build Coastguard Worker CHECK(rect2.makeOutset({.5f, -.25f}) == skRect2.makeOutset(.5f, -.25f));
96*c8dee2aaSAndroid Build Coastguard Worker CHECK(rect2.makeOffset({.5f, -.25f}) == skRect2.makeOffset(.5f, -.25f));
97*c8dee2aaSAndroid Build Coastguard Worker
98*c8dee2aaSAndroid Build Coastguard Worker SkRect skJoin = skRect;
99*c8dee2aaSAndroid Build Coastguard Worker skJoin.join(skRect2);
100*c8dee2aaSAndroid Build Coastguard Worker CHECK(rect.makeJoin(rect2) == skJoin);
101*c8dee2aaSAndroid Build Coastguard Worker CHECK(rect.makeJoin(rect2) == rect2.makeJoin(rect));
102*c8dee2aaSAndroid Build Coastguard Worker
103*c8dee2aaSAndroid Build Coastguard Worker CHECK(rect.intersects(rect2) == !rect.makeIntersect(rect2).isEmptyNegativeOrNaN());
104*c8dee2aaSAndroid Build Coastguard Worker CHECK(rect.makeIntersect(rect2) == rect2.makeIntersect(rect));
105*c8dee2aaSAndroid Build Coastguard Worker if (rect.intersects(rect2)) {
106*c8dee2aaSAndroid Build Coastguard Worker CHECK(skRect.intersects(skRect2));
107*c8dee2aaSAndroid Build Coastguard Worker SkRect skIsect;
108*c8dee2aaSAndroid Build Coastguard Worker CHECK(skIsect.intersect(skRect, skRect2));
109*c8dee2aaSAndroid Build Coastguard Worker CHECK(rect.makeIntersect(rect2) == Rect(skIsect));
110*c8dee2aaSAndroid Build Coastguard Worker }
111*c8dee2aaSAndroid Build Coastguard Worker
112*c8dee2aaSAndroid Build Coastguard Worker const Rect rect3{r,b,l,t}; // intentionally out of order
113*c8dee2aaSAndroid Build Coastguard Worker const SkRect skRect3{r,b,l,t};
114*c8dee2aaSAndroid Build Coastguard Worker CHECK(rect3.isEmptyNegativeOrNaN());
115*c8dee2aaSAndroid Build Coastguard Worker CHECK(skRect3.isEmpty());
116*c8dee2aaSAndroid Build Coastguard Worker CHECK(rect3.makeSorted() == skRect3.makeSorted());
117*c8dee2aaSAndroid Build Coastguard Worker CHECK(rect3.makeSorted() == rect2);
118*c8dee2aaSAndroid Build Coastguard Worker }}}}
119*c8dee2aaSAndroid Build Coastguard Worker }
120*c8dee2aaSAndroid Build Coastguard Worker
121*c8dee2aaSAndroid Build Coastguard Worker } // namespace skgpu::graphite
122