FuzzPathop.cpp revision 416b248312efe7556f980d390254df8503bbbad7
1/*
2 * Copyright 2016 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 "SkPath.h"
10#include "SkPathOps.h"
11
12const int kLastOp = SkPathOp::kReverseDifference_SkPathOp;
13
14void BuildPath(Fuzz* fuzz,
15               SkPath* path,
16               int last_verb) {
17  while (!fuzz->exhausted()) {
18    // Use a uint8_t to conserve bytes.  This makes our "fuzzed bytes footprint"
19    // smaller, which leads to more efficient fuzzing.
20    uint8_t operation;
21    fuzz->next(&operation);
22    SkScalar a,b,c,d,e,f;
23
24    switch (operation % (last_verb + 1)) {
25      case SkPath::Verb::kMove_Verb:
26        fuzz->next(&a, &b);
27        path->moveTo(a, b);
28        break;
29
30      case SkPath::Verb::kLine_Verb:
31        fuzz->next(&a, &b);
32        path->lineTo(a, b);
33        break;
34
35      case SkPath::Verb::kQuad_Verb:
36        fuzz->next(&a, &b, &c, &d);
37        path->quadTo(a, b, c, d);
38        break;
39
40      case SkPath::Verb::kConic_Verb:
41        fuzz->next(&a, &b, &c, &d, &e);
42        path->conicTo(a, b, c, d, e);
43        break;
44
45      case SkPath::Verb::kCubic_Verb:
46        fuzz->next(&a, &b, &c, &d, &e, &f);
47        path->cubicTo(a, b, c, d, e, f);
48        break;
49
50      case SkPath::Verb::kClose_Verb:
51        path->close();
52        break;
53
54      case SkPath::Verb::kDone_Verb:
55        // In this case, simply exit.
56        return;
57    }
58  }
59}
60
61DEF_FUZZ(Pathop, fuzz) {
62    SkOpBuilder builder;
63
64    uint8_t stragglerOp;
65    fuzz->next(&stragglerOp);
66    SkPath path;
67
68    BuildPath(fuzz, &path, SkPath::Verb::kDone_Verb);
69    builder.add(path, static_cast<SkPathOp>(stragglerOp % (kLastOp + 1)));
70
71    SkPath result;
72    builder.resolve(&result);
73}
74