blob: 51e2d18518525d1c67d83fa04b27bbf7f098f60e [file] [log] [blame]
Cary Clark91390c82018-03-09 14:02:46 -05001/*
2 * Copyright 2018 Google Inc.
3 *
4 * Use of this source code is governed by a BSD-style license that can be
5 * found in the LICENSE file.
6 */
7
8#include "Fuzz.h"
9#include "FuzzCommon.h"
10
11// allows some float values for path points
12void FuzzPath(Fuzz* fuzz, SkPath* path, int maxOps) {
13 if (maxOps < 2) {
14 maxOps = 2;
15 }
16 uint8_t fillType;
17 fuzz->nextRange(&fillType, 0, (uint8_t)SkPath::kInverseEvenOdd_FillType);
18 path->setFillType((SkPath::FillType)fillType);
19 uint8_t numOps;
20 fuzz->nextRange(&numOps, 2, maxOps);
21 for (uint8_t i = 0; i < numOps; ++i) {
22 uint8_t op;
23 fuzz->nextRange(&op, 0, 6);
24 SkScalar a, b, c, d, e, f;
25 switch (op) {
26 case 0:
27 fuzz_nice_float(fuzz, &a, &b);
28 path->moveTo(a, b);
29 break;
30 case 1:
31 fuzz_nice_float(fuzz, &a, &b);
32 path->lineTo(a, b);
33 break;
34 case 2:
35 fuzz_nice_float(fuzz, &a, &b, &c, &d);
36 path->quadTo(a, b, c, d);
37 break;
38 case 3:
39 fuzz_nice_float(fuzz, &a, &b, &c, &d, &e);
40 path->conicTo(a, b, c, d, e);
41 break;
42 case 4:
43 fuzz_nice_float(fuzz, &a, &b, &c, &d, &e, &f);
44 path->cubicTo(a, b, c, d, e, f);
45 break;
46 case 5:
47 fuzz_nice_float(fuzz, &a, &b, &c, &d, &e);
48 path->arcTo(a, b, c, d, e);
49 break;
50 case 6:
51 path->close();
52 break;
53 default:
54 SkASSERT(false);
55 break;
56 }
57 }
58}
59
60// allows all float values for path points
61void BuildPath(Fuzz* fuzz, SkPath* path, int last_verb) {
62 while (!fuzz->exhausted()) {
63 // Use a uint8_t to conserve bytes. This makes our "fuzzed bytes footprint"
64 // smaller, which leads to more efficient fuzzing.
65 uint8_t operation;
66 fuzz->next(&operation);
67 SkScalar a,b,c,d,e,f;
68
69 switch (operation % (last_verb + 1)) {
70 case SkPath::Verb::kMove_Verb:
71 fuzz->next(&a, &b);
72 path->moveTo(a, b);
73 break;
74
75 case SkPath::Verb::kLine_Verb:
76 fuzz->next(&a, &b);
77 path->lineTo(a, b);
78 break;
79
80 case SkPath::Verb::kQuad_Verb:
81 fuzz->next(&a, &b, &c, &d);
82 path->quadTo(a, b, c, d);
83 break;
84
85 case SkPath::Verb::kConic_Verb:
86 fuzz->next(&a, &b, &c, &d, &e);
87 path->conicTo(a, b, c, d, e);
88 break;
89
90 case SkPath::Verb::kCubic_Verb:
91 fuzz->next(&a, &b, &c, &d, &e, &f);
92 path->cubicTo(a, b, c, d, e, f);
93 break;
94
95 case SkPath::Verb::kClose_Verb:
96 path->close();
97 break;
98
99 case SkPath::Verb::kDone_Verb:
100 // In this case, simply exit.
101 return;
102 }
103 }
104}