xref: /aosp_15_r20/external/skia/tests/SkPathRangeIterTest.cpp (revision c8dee2aa9b3f27cf6c858bd81872bdeb2c07ed17)
1*c8dee2aaSAndroid Build Coastguard Worker /*
2*c8dee2aaSAndroid Build Coastguard Worker  * Copyright 2020 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 "include/core/SkPath.h"
9*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkPathTypes.h"
10*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkPoint.h"
11*c8dee2aaSAndroid Build Coastguard Worker #include "src/base/SkRandom.h"
12*c8dee2aaSAndroid Build Coastguard Worker #include "src/core/SkPathPriv.h"
13*c8dee2aaSAndroid Build Coastguard Worker #include "tests/Test.h"
14*c8dee2aaSAndroid Build Coastguard Worker 
next_point(SkRandom & rand)15*c8dee2aaSAndroid Build Coastguard Worker SkPoint next_point(SkRandom& rand) { return {rand.nextF(), rand.nextF()}; }
16*c8dee2aaSAndroid Build Coastguard Worker 
DEF_TEST(SkPath_RangeIter,r)17*c8dee2aaSAndroid Build Coastguard Worker DEF_TEST(SkPath_RangeIter, r) {
18*c8dee2aaSAndroid Build Coastguard Worker     enum class Verb {
19*c8dee2aaSAndroid Build Coastguard Worker         kMove = (int)SkPathVerb::kMove,
20*c8dee2aaSAndroid Build Coastguard Worker         kLine = (int)SkPathVerb::kLine,
21*c8dee2aaSAndroid Build Coastguard Worker         kQuad = (int)SkPathVerb::kQuad,
22*c8dee2aaSAndroid Build Coastguard Worker         kConic = (int)SkPathVerb::kConic,
23*c8dee2aaSAndroid Build Coastguard Worker         kCubic = (int)SkPathVerb::kCubic,
24*c8dee2aaSAndroid Build Coastguard Worker         kClose = (int)SkPathVerb::kClose,
25*c8dee2aaSAndroid Build Coastguard Worker         kImplicitMove
26*c8dee2aaSAndroid Build Coastguard Worker     };
27*c8dee2aaSAndroid Build Coastguard Worker 
28*c8dee2aaSAndroid Build Coastguard Worker     Verb verbs[] = {
29*c8dee2aaSAndroid Build Coastguard Worker         Verb::kImplicitMove,
30*c8dee2aaSAndroid Build Coastguard Worker         Verb::kLine,
31*c8dee2aaSAndroid Build Coastguard Worker         Verb::kConic,
32*c8dee2aaSAndroid Build Coastguard Worker         Verb::kClose,
33*c8dee2aaSAndroid Build Coastguard Worker         Verb::kImplicitMove,
34*c8dee2aaSAndroid Build Coastguard Worker         Verb::kCubic,
35*c8dee2aaSAndroid Build Coastguard Worker         Verb::kMove,
36*c8dee2aaSAndroid Build Coastguard Worker         Verb::kConic,
37*c8dee2aaSAndroid Build Coastguard Worker         Verb::kLine,
38*c8dee2aaSAndroid Build Coastguard Worker         Verb::kClose,
39*c8dee2aaSAndroid Build Coastguard Worker         Verb::kMove,
40*c8dee2aaSAndroid Build Coastguard Worker         Verb::kMove
41*c8dee2aaSAndroid Build Coastguard Worker     };
42*c8dee2aaSAndroid Build Coastguard Worker 
43*c8dee2aaSAndroid Build Coastguard Worker     class : SkRandom {
44*c8dee2aaSAndroid Build Coastguard Worker     public:
45*c8dee2aaSAndroid Build Coastguard Worker         SkPoint p() { return {this->SkRandom::nextF(), this->SkRandom::nextF()}; }
46*c8dee2aaSAndroid Build Coastguard Worker         float w() { return this->SkRandom::nextF(); }
47*c8dee2aaSAndroid Build Coastguard Worker     } genData, testData;
48*c8dee2aaSAndroid Build Coastguard Worker 
49*c8dee2aaSAndroid Build Coastguard Worker     for (int i = 0; i < 10; ++i) {
50*c8dee2aaSAndroid Build Coastguard Worker         if (genData.p() != testData.p() || genData.w() != testData.w()) {
51*c8dee2aaSAndroid Build Coastguard Worker             ERRORF(r, "genData and testData not in sync.");
52*c8dee2aaSAndroid Build Coastguard Worker             return;
53*c8dee2aaSAndroid Build Coastguard Worker         }
54*c8dee2aaSAndroid Build Coastguard Worker     }
55*c8dee2aaSAndroid Build Coastguard Worker 
56*c8dee2aaSAndroid Build Coastguard Worker     // Build the path.
57*c8dee2aaSAndroid Build Coastguard Worker     SkPath path;
58*c8dee2aaSAndroid Build Coastguard Worker     for (Verb verb : verbs) {
59*c8dee2aaSAndroid Build Coastguard Worker         switch (verb) {
60*c8dee2aaSAndroid Build Coastguard Worker             case Verb::kImplicitMove:
61*c8dee2aaSAndroid Build Coastguard Worker                 break;
62*c8dee2aaSAndroid Build Coastguard Worker             case Verb::kMove:
63*c8dee2aaSAndroid Build Coastguard Worker                 path.moveTo(genData.p());
64*c8dee2aaSAndroid Build Coastguard Worker                 break;
65*c8dee2aaSAndroid Build Coastguard Worker             case Verb::kLine:
66*c8dee2aaSAndroid Build Coastguard Worker                 path.lineTo(genData.p());
67*c8dee2aaSAndroid Build Coastguard Worker                 break;
68*c8dee2aaSAndroid Build Coastguard Worker             case Verb::kQuad: {
69*c8dee2aaSAndroid Build Coastguard Worker                 auto a = genData.p();
70*c8dee2aaSAndroid Build Coastguard Worker                 auto b = genData.p();
71*c8dee2aaSAndroid Build Coastguard Worker                 path.quadTo(a, b);
72*c8dee2aaSAndroid Build Coastguard Worker                 break;
73*c8dee2aaSAndroid Build Coastguard Worker             }
74*c8dee2aaSAndroid Build Coastguard Worker             case Verb::kCubic: {
75*c8dee2aaSAndroid Build Coastguard Worker                 auto a = genData.p();
76*c8dee2aaSAndroid Build Coastguard Worker                 auto b = genData.p();
77*c8dee2aaSAndroid Build Coastguard Worker                 auto c = genData.p();
78*c8dee2aaSAndroid Build Coastguard Worker                 path.cubicTo(a, b, c);
79*c8dee2aaSAndroid Build Coastguard Worker                 break;
80*c8dee2aaSAndroid Build Coastguard Worker             }
81*c8dee2aaSAndroid Build Coastguard Worker             case Verb::kConic: {
82*c8dee2aaSAndroid Build Coastguard Worker                 auto a = genData.p();
83*c8dee2aaSAndroid Build Coastguard Worker                 auto b = genData.p();
84*c8dee2aaSAndroid Build Coastguard Worker                 path.conicTo(a, b, genData.w());
85*c8dee2aaSAndroid Build Coastguard Worker                 break;
86*c8dee2aaSAndroid Build Coastguard Worker             }
87*c8dee2aaSAndroid Build Coastguard Worker             case Verb::kClose:
88*c8dee2aaSAndroid Build Coastguard Worker                 path.close();
89*c8dee2aaSAndroid Build Coastguard Worker                 break;
90*c8dee2aaSAndroid Build Coastguard Worker         }
91*c8dee2aaSAndroid Build Coastguard Worker     }
92*c8dee2aaSAndroid Build Coastguard Worker 
93*c8dee2aaSAndroid Build Coastguard Worker     // Verify sure the RangeIter works as expected.
94*c8dee2aaSAndroid Build Coastguard Worker     SkPathPriv::Iterate iterate(path);
95*c8dee2aaSAndroid Build Coastguard Worker     auto iter = iterate.begin();
96*c8dee2aaSAndroid Build Coastguard Worker     SkPoint startPt = {0,0};
97*c8dee2aaSAndroid Build Coastguard Worker     SkPoint lastPt = {0,0};
98*c8dee2aaSAndroid Build Coastguard Worker     for (Verb verb : verbs) {
99*c8dee2aaSAndroid Build Coastguard Worker         auto [pathVerb, pathPts, pathWt] = *iter++;
100*c8dee2aaSAndroid Build Coastguard Worker         switch (verb) {
101*c8dee2aaSAndroid Build Coastguard Worker             case Verb::kImplicitMove:
102*c8dee2aaSAndroid Build Coastguard Worker                 REPORTER_ASSERT(r, pathPts[0] == startPt);
103*c8dee2aaSAndroid Build Coastguard Worker                 lastPt = pathPts[0];
104*c8dee2aaSAndroid Build Coastguard Worker                 break;
105*c8dee2aaSAndroid Build Coastguard Worker             case Verb::kMove:
106*c8dee2aaSAndroid Build Coastguard Worker                 REPORTER_ASSERT(r, pathPts[0] == testData.p());
107*c8dee2aaSAndroid Build Coastguard Worker                 startPt = lastPt = pathPts[0];
108*c8dee2aaSAndroid Build Coastguard Worker                 break;
109*c8dee2aaSAndroid Build Coastguard Worker             case Verb::kLine:
110*c8dee2aaSAndroid Build Coastguard Worker                 REPORTER_ASSERT(r, pathPts[0] == lastPt);
111*c8dee2aaSAndroid Build Coastguard Worker                 REPORTER_ASSERT(r, pathPts[1] == testData.p());
112*c8dee2aaSAndroid Build Coastguard Worker                 lastPt = pathPts[1];
113*c8dee2aaSAndroid Build Coastguard Worker                 break;
114*c8dee2aaSAndroid Build Coastguard Worker             case Verb::kQuad:
115*c8dee2aaSAndroid Build Coastguard Worker                 REPORTER_ASSERT(r, pathPts[0] == lastPt);
116*c8dee2aaSAndroid Build Coastguard Worker                 REPORTER_ASSERT(r, pathPts[1] == testData.p());
117*c8dee2aaSAndroid Build Coastguard Worker                 REPORTER_ASSERT(r, pathPts[2] == testData.p());
118*c8dee2aaSAndroid Build Coastguard Worker                 lastPt = pathPts[2];
119*c8dee2aaSAndroid Build Coastguard Worker                 break;
120*c8dee2aaSAndroid Build Coastguard Worker             case Verb::kCubic:
121*c8dee2aaSAndroid Build Coastguard Worker                 REPORTER_ASSERT(r, pathPts[0] == lastPt);
122*c8dee2aaSAndroid Build Coastguard Worker                 REPORTER_ASSERT(r, pathPts[1] == testData.p());
123*c8dee2aaSAndroid Build Coastguard Worker                 REPORTER_ASSERT(r, pathPts[2] == testData.p());
124*c8dee2aaSAndroid Build Coastguard Worker                 REPORTER_ASSERT(r, pathPts[3] == testData.p());
125*c8dee2aaSAndroid Build Coastguard Worker                 lastPt = pathPts[3];
126*c8dee2aaSAndroid Build Coastguard Worker                 break;
127*c8dee2aaSAndroid Build Coastguard Worker             case Verb::kConic:
128*c8dee2aaSAndroid Build Coastguard Worker                 REPORTER_ASSERT(r, pathPts[0] == lastPt);
129*c8dee2aaSAndroid Build Coastguard Worker                 REPORTER_ASSERT(r, pathPts[1] == testData.p());
130*c8dee2aaSAndroid Build Coastguard Worker                 REPORTER_ASSERT(r, pathPts[2] == testData.p());
131*c8dee2aaSAndroid Build Coastguard Worker                 REPORTER_ASSERT(r, *pathWt == testData.w());
132*c8dee2aaSAndroid Build Coastguard Worker                 lastPt = pathPts[2];
133*c8dee2aaSAndroid Build Coastguard Worker                 break;
134*c8dee2aaSAndroid Build Coastguard Worker             case Verb::kClose:
135*c8dee2aaSAndroid Build Coastguard Worker                 REPORTER_ASSERT(r, pathPts[0] == lastPt);
136*c8dee2aaSAndroid Build Coastguard Worker                 break;
137*c8dee2aaSAndroid Build Coastguard Worker         }
138*c8dee2aaSAndroid Build Coastguard Worker     }
139*c8dee2aaSAndroid Build Coastguard Worker     REPORTER_ASSERT(r, iter == iterate.end());
140*c8dee2aaSAndroid Build Coastguard Worker }
141