1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
| /*
| * Copyright 2016 Google Inc.
| *
| * Use of this source code is governed by a BSD-style license that can be
| * found in the LICENSE file.
| */
|
| #include "SkRandom.h"
| #include "random_parse_path.h"
|
| const struct Legal {
| char fSymbol;
| int fScalars;
| } gLegal[] = {
| { 'M', 2 },
| { 'H', 1 },
| { 'V', 1 },
| { 'L', 2 },
| { 'Q', 4 },
| { 'T', 2 },
| { 'C', 6 },
| { 'S', 4 },
| { 'A', 4 },
| { 'Z', 0 },
| };
|
| bool gEasy = false; // set to true while debugging to suppress unusual whitespace
|
| // mostly do nothing, then bias towards spaces
| const char gWhiteSpace[] = { 0, 0, 0, 0, 0, 0, 0, 0, ' ', ' ', ' ', ' ', 0x09, 0x0D, 0x0A };
|
| static void add_white(SkRandom* rand, SkString* atom) {
| if (gEasy) {
| atom->append(" ");
| return;
| }
| int reps = rand->nextRangeU(0, 2);
| for (int rep = 0; rep < reps; ++rep) {
| int index = rand->nextRangeU(0, (int) SK_ARRAY_COUNT(gWhiteSpace) - 1);
| if (gWhiteSpace[index]) {
| atom->append(&gWhiteSpace[index], 1);
| }
| }
| }
|
| static void add_comma(SkRandom* rand, SkString* atom) {
| if (gEasy) {
| atom->append(",");
| return;
| }
| size_t count = atom->size();
| add_white(rand, atom);
| if (rand->nextBool()) {
| atom->append(",");
| }
| do {
| add_white(rand, atom);
| } while (count == atom->size());
| }
|
| static void add_some_white(SkRandom* rand, SkString* atom) {
| size_t count = atom->size();
| do {
| add_white(rand, atom);
| } while (count == atom->size());
| }
|
| SkString MakeRandomParsePathPiece(SkRandom* rand) {
| SkString atom;
| int index = rand->nextRangeU(0, (int) SK_ARRAY_COUNT(gLegal) - 1);
| const Legal& legal = gLegal[index];
| gEasy ? atom.append("\n") : add_white(rand, &atom);
| char symbol = legal.fSymbol | (rand->nextBool() ? 0x20 : 0);
| atom.append(&symbol, 1);
| int reps = rand->nextRangeU(1, 3);
| for (int rep = 0; rep < reps; ++rep) {
| for (int index = 0; index < legal.fScalars; ++index) {
| SkScalar coord = rand->nextRangeF(0, 100);
| add_white(rand, &atom);
| atom.appendScalar(coord);
| if (rep < reps - 1 && index < legal.fScalars - 1) {
| add_comma(rand, &atom);
| } else {
| add_some_white(rand, &atom);
| }
| if ('A' == legal.fSymbol && 1 == index) {
| atom.appendScalar(rand->nextRangeF(-720, 720));
| add_comma(rand, &atom);
| atom.appendU32(rand->nextRangeU(0, 1));
| add_comma(rand, &atom);
| atom.appendU32(rand->nextRangeU(0, 1));
| add_comma(rand, &atom);
| }
| }
| }
| return atom;
| }
|
|