xref: /aosp_15_r20/external/skia/tests/PathOpsDRectTest.cpp (revision c8dee2aa9b3f27cf6c858bd81872bdeb2c07ed17)
1*c8dee2aaSAndroid Build Coastguard Worker /*
2*c8dee2aaSAndroid Build Coastguard Worker  * Copyright 2012 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 #include "include/core/SkTypes.h"
8*c8dee2aaSAndroid Build Coastguard Worker #include "src/pathops/SkPathOpsCubic.h"
9*c8dee2aaSAndroid Build Coastguard Worker #include "src/pathops/SkPathOpsPoint.h"
10*c8dee2aaSAndroid Build Coastguard Worker #include "src/pathops/SkPathOpsQuad.h"
11*c8dee2aaSAndroid Build Coastguard Worker #include "src/pathops/SkPathOpsRect.h"
12*c8dee2aaSAndroid Build Coastguard Worker #include "tests/PathOpsTestCommon.h"
13*c8dee2aaSAndroid Build Coastguard Worker #include "tests/Test.h"
14*c8dee2aaSAndroid Build Coastguard Worker 
15*c8dee2aaSAndroid Build Coastguard Worker #include <array>
16*c8dee2aaSAndroid Build Coastguard Worker #include <cstddef>
17*c8dee2aaSAndroid Build Coastguard Worker 
18*c8dee2aaSAndroid Build Coastguard Worker static const QuadPts quadTests[] = {
19*c8dee2aaSAndroid Build Coastguard Worker     {{{1, 1}, {2, 1}, {0, 2}}},
20*c8dee2aaSAndroid Build Coastguard Worker     {{{0, 0}, {1, 1}, {3, 1}}},
21*c8dee2aaSAndroid Build Coastguard Worker     {{{2, 0}, {1, 1}, {2, 2}}},
22*c8dee2aaSAndroid Build Coastguard Worker     {{{4, 0}, {0, 1}, {4, 2}}},
23*c8dee2aaSAndroid Build Coastguard Worker     {{{0, 0}, {0, 1}, {1, 1}}},
24*c8dee2aaSAndroid Build Coastguard Worker };
25*c8dee2aaSAndroid Build Coastguard Worker 
26*c8dee2aaSAndroid Build Coastguard Worker static const CubicPts cubicTests[] = {
27*c8dee2aaSAndroid Build Coastguard Worker     {{{2, 0}, {3, 1}, {2, 2}, {1, 1}}},
28*c8dee2aaSAndroid Build Coastguard Worker     {{{3, 1}, {2, 2}, {1, 1}, {2, 0}}},
29*c8dee2aaSAndroid Build Coastguard Worker     {{{3, 0}, {2, 1}, {3, 2}, {1, 1}}},
30*c8dee2aaSAndroid Build Coastguard Worker };
31*c8dee2aaSAndroid Build Coastguard Worker 
32*c8dee2aaSAndroid Build Coastguard Worker static const size_t quadTests_count = std::size(quadTests);
33*c8dee2aaSAndroid Build Coastguard Worker static const size_t cubicTests_count = std::size(cubicTests);
34*c8dee2aaSAndroid Build Coastguard Worker 
setRawBounds(const SkDQuad & quad,SkDRect * rect)35*c8dee2aaSAndroid Build Coastguard Worker static void setRawBounds(const SkDQuad& quad, SkDRect* rect) {
36*c8dee2aaSAndroid Build Coastguard Worker     rect->set(quad[0]);
37*c8dee2aaSAndroid Build Coastguard Worker     rect->add(quad[1]);
38*c8dee2aaSAndroid Build Coastguard Worker     rect->add(quad[2]);
39*c8dee2aaSAndroid Build Coastguard Worker }
40*c8dee2aaSAndroid Build Coastguard Worker 
setRawBounds(const SkDCubic & cubic,SkDRect * rect)41*c8dee2aaSAndroid Build Coastguard Worker static void setRawBounds(const SkDCubic& cubic, SkDRect* rect) {
42*c8dee2aaSAndroid Build Coastguard Worker     rect->set(cubic[0]);
43*c8dee2aaSAndroid Build Coastguard Worker     rect->add(cubic[1]);
44*c8dee2aaSAndroid Build Coastguard Worker     rect->add(cubic[2]);
45*c8dee2aaSAndroid Build Coastguard Worker     rect->add(cubic[3]);
46*c8dee2aaSAndroid Build Coastguard Worker }
47*c8dee2aaSAndroid Build Coastguard Worker 
DEF_TEST(PathOpsDRect,reporter)48*c8dee2aaSAndroid Build Coastguard Worker DEF_TEST(PathOpsDRect, reporter) {
49*c8dee2aaSAndroid Build Coastguard Worker     size_t index;
50*c8dee2aaSAndroid Build Coastguard Worker     SkDRect rect, rect2;
51*c8dee2aaSAndroid Build Coastguard Worker     for (index = 0; index < quadTests_count; ++index) {
52*c8dee2aaSAndroid Build Coastguard Worker         const QuadPts& q = quadTests[index];
53*c8dee2aaSAndroid Build Coastguard Worker         SkDQuad quad;
54*c8dee2aaSAndroid Build Coastguard Worker         quad.debugSet(q.fPts);
55*c8dee2aaSAndroid Build Coastguard Worker         SkASSERT(ValidQuad(quad));
56*c8dee2aaSAndroid Build Coastguard Worker         setRawBounds(quad, &rect);
57*c8dee2aaSAndroid Build Coastguard Worker         rect2.setBounds(quad);
58*c8dee2aaSAndroid Build Coastguard Worker         REPORTER_ASSERT(reporter, rect.intersects(rect2));
59*c8dee2aaSAndroid Build Coastguard Worker         // FIXME: add a recursive box subdivision method to verify that tight bounds is correct
60*c8dee2aaSAndroid Build Coastguard Worker         SkDPoint leftTop = {rect2.fLeft, rect2.fTop};
61*c8dee2aaSAndroid Build Coastguard Worker         REPORTER_ASSERT(reporter, rect.contains(leftTop));
62*c8dee2aaSAndroid Build Coastguard Worker         SkDPoint rightBottom = {rect2.fRight, rect2.fBottom};
63*c8dee2aaSAndroid Build Coastguard Worker         REPORTER_ASSERT(reporter, rect.contains(rightBottom));
64*c8dee2aaSAndroid Build Coastguard Worker     }
65*c8dee2aaSAndroid Build Coastguard Worker     for (index = 0; index < cubicTests_count; ++index) {
66*c8dee2aaSAndroid Build Coastguard Worker         const CubicPts& c = cubicTests[index];
67*c8dee2aaSAndroid Build Coastguard Worker         SkDCubic cubic;
68*c8dee2aaSAndroid Build Coastguard Worker         cubic.debugSet(c.fPts);
69*c8dee2aaSAndroid Build Coastguard Worker         SkASSERT(ValidCubic(cubic));
70*c8dee2aaSAndroid Build Coastguard Worker         setRawBounds(cubic, &rect);
71*c8dee2aaSAndroid Build Coastguard Worker         rect2.setBounds(cubic);
72*c8dee2aaSAndroid Build Coastguard Worker         REPORTER_ASSERT(reporter, rect.intersects(rect2));
73*c8dee2aaSAndroid Build Coastguard Worker         // FIXME: add a recursive box subdivision method to verify that tight bounds is correct
74*c8dee2aaSAndroid Build Coastguard Worker         SkDPoint leftTop = {rect2.fLeft, rect2.fTop};
75*c8dee2aaSAndroid Build Coastguard Worker         REPORTER_ASSERT(reporter, rect.contains(leftTop));
76*c8dee2aaSAndroid Build Coastguard Worker         SkDPoint rightBottom = {rect2.fRight, rect2.fBottom};
77*c8dee2aaSAndroid Build Coastguard Worker         REPORTER_ASSERT(reporter, rect.contains(rightBottom));
78*c8dee2aaSAndroid Build Coastguard Worker     }
79*c8dee2aaSAndroid Build Coastguard Worker }
80