From e565450d0ba81a9869be79664126fd8517dc1632 Mon Sep 17 00:00:00 2001 From: kjlubick Date: Tue, 19 Jul 2016 16:50:03 -0700 Subject: Port FuzzPathop from chromium BUG=skia: GOLD_TRYBOT_URL= https://gold.skia.org/search?issue=2148023002 Review-Url: https://codereview.chromium.org/2148023002 --- fuzz/FuzzPathop.cpp | 87 +++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 87 insertions(+) create mode 100644 fuzz/FuzzPathop.cpp (limited to 'fuzz/FuzzPathop.cpp') diff --git a/fuzz/FuzzPathop.cpp b/fuzz/FuzzPathop.cpp new file mode 100644 index 0000000000..fecf3ca914 --- /dev/null +++ b/fuzz/FuzzPathop.cpp @@ -0,0 +1,87 @@ +/* + * Copyright 2016 Google Inc. + * + * Use of this source code is governed by a BSD-style license that can be + * found in the LICENSE file. + */ + +#include "Fuzz.h" +#include "SkPath.h" +#include "SkPathOps.h" + +const int kLastOp = SkPathOp::kReverseDifference_SkPathOp; + +void BuildPath(Fuzz* fuzz, + SkPath* path, + int last_verb) { + uint8_t operation; + SkScalar a, b, c, d, e, f; + while (fuzz->next(&operation)) { + + switch (operation % (last_verb + 1)) { + case SkPath::Verb::kMove_Verb: + if (!fuzz->next(&a) || !fuzz->next(&b)) + return; + path->moveTo(a, b); + break; + + case SkPath::Verb::kLine_Verb: + if (!fuzz->next(&a) || !fuzz->next(&b)) + return; + path->lineTo(a, b); + break; + + case SkPath::Verb::kQuad_Verb: + if (!fuzz->next(&a) || + !fuzz->next(&b) || + !fuzz->next(&c) || + !fuzz->next(&d)) + return; + path->quadTo(a, b, c, d); + break; + + case SkPath::Verb::kConic_Verb: + if (!fuzz->next(&a) || + !fuzz->next(&b) || + !fuzz->next(&c) || + !fuzz->next(&d) || + !fuzz->next(&e)) + return; + path->conicTo(a, b, c, d, e); + break; + + case SkPath::Verb::kCubic_Verb: + if (!fuzz->next(&a) || + !fuzz->next(&b) || + !fuzz->next(&c) || + !fuzz->next(&d) || + !fuzz->next(&e) || + !fuzz->next(&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; + } + } +} + +DEF_FUZZ(Pathop, fuzz) { + SkOpBuilder builder; + while (fuzz->remaining() >= sizeof(uint8_t)) { + SkPath path; + uint8_t op = fuzz->nextB(); + + BuildPath(fuzz, &path, SkPath::Verb::kDone_Verb); + builder.add(path, static_cast(op % (kLastOp + 1))); + } + + SkPath result; + builder.resolve(&result); +} -- cgit v1.2.3