1 // Copyright 2016 The Chromium Authors
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4
5 #include "testing/libfuzzer/fuzzers/skia_path_common.h"
6
7 #include "third_party/skia/include/core/SkPath.h"
8
9 // This is needed because SkPath::readFromMemory does not seem to be able to
10 // be able to handle arbitrary input.
BuildPath(const uint8_t ** data,size_t * size,SkPath * path,int last_verb)11 void BuildPath(const uint8_t** data,
12 size_t* size,
13 SkPath* path,
14 int last_verb) {
15 uint8_t operation;
16 SkScalar a, b, c, d, e, f;
17 while (read<uint8_t>(data, size, &operation)) {
18 switch (operation % (last_verb + 1)) {
19 case SkPath::Verb::kMove_Verb:
20 if (!read<SkScalar>(data, size, &a) || !read<SkScalar>(data, size, &b))
21 return;
22 path->moveTo(a, b);
23 break;
24
25 case SkPath::Verb::kLine_Verb:
26 if (!read<SkScalar>(data, size, &a) || !read<SkScalar>(data, size, &b))
27 return;
28 path->lineTo(a, b);
29 break;
30
31 case SkPath::Verb::kQuad_Verb:
32 if (!read<SkScalar>(data, size, &a) ||
33 !read<SkScalar>(data, size, &b) ||
34 !read<SkScalar>(data, size, &c) ||
35 !read<SkScalar>(data, size, &d))
36 return;
37 path->quadTo(a, b, c, d);
38 break;
39
40 case SkPath::Verb::kConic_Verb:
41 if (!read<SkScalar>(data, size, &a) ||
42 !read<SkScalar>(data, size, &b) ||
43 !read<SkScalar>(data, size, &c) ||
44 !read<SkScalar>(data, size, &d) ||
45 !read<SkScalar>(data, size, &e))
46 return;
47 path->conicTo(a, b, c, d, e);
48 break;
49
50 case SkPath::Verb::kCubic_Verb:
51 if (!read<SkScalar>(data, size, &a) ||
52 !read<SkScalar>(data, size, &b) ||
53 !read<SkScalar>(data, size, &c) ||
54 !read<SkScalar>(data, size, &d) ||
55 !read<SkScalar>(data, size, &e) ||
56 !read<SkScalar>(data, size, &f))
57 return;
58 path->cubicTo(a, b, c, d, e, f);
59 break;
60
61 case SkPath::Verb::kClose_Verb:
62 path->close();
63 break;
64
65 case SkPath::Verb::kDone_Verb:
66 // In this case, simply exit.
67 return;
68 }
69 }
70 }
71