| // Copyright 2016 The Chromium Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| #include "testing/libfuzzer/fuzzers/skia_path_common.h" |
| |
| #include "third_party/skia/include/core/SkPath.h" |
| |
| // This is needed because SkPath::readFromMemory does not seem to be able to |
| // be able to handle arbitrary input. |
| void BuildPath(const uint8_t** data, |
| size_t* size, |
| SkPath* path, |
| int last_verb) { |
| uint8_t operation; |
| SkScalar a, b, c, d, e, f; |
| while (read<uint8_t>(data, size, &operation)) { |
| switch (operation % (last_verb + 1)) { |
| case SkPath::Verb::kMove_Verb: |
| if (!read<SkScalar>(data, size, &a) || !read<SkScalar>(data, size, &b)) |
| return; |
| path->moveTo(a, b); |
| break; |
| |
| case SkPath::Verb::kLine_Verb: |
| if (!read<SkScalar>(data, size, &a) || !read<SkScalar>(data, size, &b)) |
| return; |
| path->lineTo(a, b); |
| break; |
| |
| case SkPath::Verb::kQuad_Verb: |
| if (!read<SkScalar>(data, size, &a) || |
| !read<SkScalar>(data, size, &b) || |
| !read<SkScalar>(data, size, &c) || |
| !read<SkScalar>(data, size, &d)) |
| return; |
| path->quadTo(a, b, c, d); |
| break; |
| |
| case SkPath::Verb::kConic_Verb: |
| if (!read<SkScalar>(data, size, &a) || |
| !read<SkScalar>(data, size, &b) || |
| !read<SkScalar>(data, size, &c) || |
| !read<SkScalar>(data, size, &d) || |
| !read<SkScalar>(data, size, &e)) |
| return; |
| path->conicTo(a, b, c, d, e); |
| break; |
| |
| case SkPath::Verb::kCubic_Verb: |
| if (!read<SkScalar>(data, size, &a) || |
| !read<SkScalar>(data, size, &b) || |
| !read<SkScalar>(data, size, &c) || |
| !read<SkScalar>(data, size, &d) || |
| !read<SkScalar>(data, size, &e) || |
| !read<SkScalar>(data, size, &f)) |
| return; |
| path->cubicTo(a, b, c, d, e, f); |
| break; |
| |
| case SkPath::Verb::kClose_Verb: |
| path->close(); |
| break; |
| |
| case SkPath::Verb::kDone_Verb: |
| // In this case, simply exit. |
| return; |
| } |
| } |
| } |