12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970 |
- // 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;
- }
- }
- }
|