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