|  | /* | 
|  | * Copyright 2018 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 "FuzzCommon.h" | 
|  |  | 
|  | // allows some float values for path points | 
|  | void FuzzPath(Fuzz* fuzz, SkPath* path, int maxOps) { | 
|  | if (maxOps < 2) { | 
|  | maxOps = 2; | 
|  | } | 
|  | uint8_t fillType; | 
|  | fuzz->nextRange(&fillType, 0, (uint8_t)SkPath::kInverseEvenOdd_FillType); | 
|  | path->setFillType((SkPath::FillType)fillType); | 
|  | uint8_t numOps; | 
|  | fuzz->nextRange(&numOps, 2, maxOps); | 
|  | for (uint8_t i = 0; i < numOps; ++i) { | 
|  | uint8_t op; | 
|  | fuzz->nextRange(&op, 0, 6); | 
|  | SkScalar a, b, c, d, e, f; | 
|  | switch (op) { | 
|  | case 0: | 
|  | fuzz_nice_float(fuzz, &a, &b); | 
|  | path->moveTo(a, b); | 
|  | break; | 
|  | case 1: | 
|  | fuzz_nice_float(fuzz, &a, &b); | 
|  | path->lineTo(a, b); | 
|  | break; | 
|  | case 2: | 
|  | fuzz_nice_float(fuzz, &a, &b, &c, &d); | 
|  | path->quadTo(a, b, c, d); | 
|  | break; | 
|  | case 3: | 
|  | fuzz_nice_float(fuzz, &a, &b, &c, &d, &e); | 
|  | path->conicTo(a, b, c, d, e); | 
|  | break; | 
|  | case 4: | 
|  | fuzz_nice_float(fuzz, &a, &b, &c, &d, &e, &f); | 
|  | path->cubicTo(a, b, c, d, e, f); | 
|  | break; | 
|  | case 5: | 
|  | fuzz_nice_float(fuzz, &a, &b, &c, &d, &e); | 
|  | path->arcTo(a, b, c, d, e); | 
|  | break; | 
|  | case 6: | 
|  | path->close(); | 
|  | break; | 
|  | default: | 
|  | SkASSERT(false); | 
|  | break; | 
|  | } | 
|  | } | 
|  | } | 
|  |  | 
|  | // allows all float values for path points | 
|  | void BuildPath(Fuzz* fuzz, SkPath* path, int last_verb) { | 
|  | while (!fuzz->exhausted()) { | 
|  | // Use a uint8_t to conserve bytes.  This makes our "fuzzed bytes footprint" | 
|  | // smaller, which leads to more efficient fuzzing. | 
|  | uint8_t operation; | 
|  | fuzz->next(&operation); | 
|  | SkScalar a,b,c,d,e,f; | 
|  |  | 
|  | switch (operation % (last_verb + 1)) { | 
|  | case SkPath::Verb::kMove_Verb: | 
|  | fuzz->next(&a, &b); | 
|  | path->moveTo(a, b); | 
|  | break; | 
|  |  | 
|  | case SkPath::Verb::kLine_Verb: | 
|  | fuzz->next(&a, &b); | 
|  | path->lineTo(a, b); | 
|  | break; | 
|  |  | 
|  | case SkPath::Verb::kQuad_Verb: | 
|  | fuzz->next(&a, &b, &c, &d); | 
|  | path->quadTo(a, b, c, d); | 
|  | break; | 
|  |  | 
|  | case SkPath::Verb::kConic_Verb: | 
|  | fuzz->next(&a, &b, &c, &d, &e); | 
|  | path->conicTo(a, b, c, d, e); | 
|  | break; | 
|  |  | 
|  | case SkPath::Verb::kCubic_Verb: | 
|  | fuzz->next(&a, &b, &c, &d, &e, &f); | 
|  | 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; | 
|  | } | 
|  | } | 
|  | } |