| // 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 <stddef.h> |
| #include <stdint.h> |
| |
| #include "testing/libfuzzer/fuzzers/skia_path_common.h" |
| #include "third_party/skia/include/core/SkCanvas.h" |
| #include "third_party/skia/include/core/SkPaint.h" |
| #include "third_party/skia/include/core/SkPath.h" |
| #include "third_party/skia/include/core/SkSurface.h" |
| |
| |
| extern "C" int LLVMFuzzerTestOneInput(const uint8_t* data, size_t size) { |
| uint8_t w, h, anti_alias; |
| if (!read<uint8_t>(&data, &size, &w)) |
| return 0; |
| if (!read<uint8_t>(&data, &size, &h)) |
| return 0; |
| if (!read<uint8_t>(&data, &size, &anti_alias)) |
| return 0; |
| |
| SkScalar a, b, c, d; |
| if (!read<SkScalar>(&data, &size, &a)) |
| return 0; |
| if (!read<SkScalar>(&data, &size, &b)) |
| return 0; |
| if (!read<SkScalar>(&data, &size, &c)) |
| return 0; |
| if (!read<SkScalar>(&data, &size, &d)) |
| return 0; |
| |
| // In this case, we specifically don't want to include kDone_Verb. |
| SkPath path; |
| BuildPath(&data, &size, &path, SkPath::Verb::kClose_Verb); |
| |
| // Try a few potentially interesting things with our path. |
| path.contains(a, b); |
| path.conservativelyContainsRect(SkRect::MakeLTRB(a, b, c, d)); |
| |
| SkPaint paint_fill; |
| paint_fill.setStyle(SkPaint::Style::kFill_Style); |
| paint_fill.setAntiAlias(anti_alias & 1); |
| |
| SkPaint paint_stroke; |
| paint_stroke.setStyle(SkPaint::Style::kStroke_Style); |
| paint_stroke.setStrokeWidth(1); |
| paint_stroke.setAntiAlias(anti_alias & 1); |
| |
| SkPaint paint_stroke_and_fill; |
| paint_stroke_and_fill.setStyle(SkPaint::Style::kStrokeAndFill_Style); |
| paint_stroke_and_fill.setStrokeWidth(1); |
| paint_stroke_and_fill.setAntiAlias(anti_alias & 1); |
| |
| SkPath dst_path; |
| paint_stroke.getFillPath(path, &dst_path, nullptr); |
| |
| // Width and height should never be 0. |
| auto surface(SkSurface::MakeRasterN32Premul(w ? w : 1, h ? h : 1)); |
| |
| surface->getCanvas()->drawPath(path, paint_fill); |
| surface->getCanvas()->drawPath(path, paint_stroke); |
| surface->getCanvas()->drawPath(path, paint_stroke_and_fill); |
| |
| return 0; |
| } |