FuzzPathop.cpp revision 416b248312efe7556f980d390254df8503bbbad7
1/* 2 * Copyright 2016 Google Inc. 3 * 4 * Use of this source code is governed by a BSD-style license that can be 5 * found in the LICENSE file. 6 */ 7 8#include "Fuzz.h" 9#include "SkPath.h" 10#include "SkPathOps.h" 11 12const int kLastOp = SkPathOp::kReverseDifference_SkPathOp; 13 14void BuildPath(Fuzz* fuzz, 15 SkPath* path, 16 int last_verb) { 17 while (!fuzz->exhausted()) { 18 // Use a uint8_t to conserve bytes. This makes our "fuzzed bytes footprint" 19 // smaller, which leads to more efficient fuzzing. 20 uint8_t operation; 21 fuzz->next(&operation); 22 SkScalar a,b,c,d,e,f; 23 24 switch (operation % (last_verb + 1)) { 25 case SkPath::Verb::kMove_Verb: 26 fuzz->next(&a, &b); 27 path->moveTo(a, b); 28 break; 29 30 case SkPath::Verb::kLine_Verb: 31 fuzz->next(&a, &b); 32 path->lineTo(a, b); 33 break; 34 35 case SkPath::Verb::kQuad_Verb: 36 fuzz->next(&a, &b, &c, &d); 37 path->quadTo(a, b, c, d); 38 break; 39 40 case SkPath::Verb::kConic_Verb: 41 fuzz->next(&a, &b, &c, &d, &e); 42 path->conicTo(a, b, c, d, e); 43 break; 44 45 case SkPath::Verb::kCubic_Verb: 46 fuzz->next(&a, &b, &c, &d, &e, &f); 47 path->cubicTo(a, b, c, d, e, f); 48 break; 49 50 case SkPath::Verb::kClose_Verb: 51 path->close(); 52 break; 53 54 case SkPath::Verb::kDone_Verb: 55 // In this case, simply exit. 56 return; 57 } 58 } 59} 60 61DEF_FUZZ(Pathop, fuzz) { 62 SkOpBuilder builder; 63 64 uint8_t stragglerOp; 65 fuzz->next(&stragglerOp); 66 SkPath path; 67 68 BuildPath(fuzz, &path, SkPath::Verb::kDone_Verb); 69 builder.add(path, static_cast<SkPathOp>(stragglerOp % (kLastOp + 1))); 70 71 SkPath result; 72 builder.resolve(&result); 73} 74