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