xref: /aosp_15_r20/external/skia/tests/graphite/RectTest.cpp (revision c8dee2aa9b3f27cf6c858bd81872bdeb2c07ed17)
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