skia_path_common.cc 2.2 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970
  1. // Copyright 2016 The Chromium Authors. All rights reserved.
  2. // Use of this source code is governed by a BSD-style license that can be
  3. // found in the LICENSE file.
  4. #include "testing/libfuzzer/fuzzers/skia_path_common.h"
  5. #include "third_party/skia/include/core/SkPath.h"
  6. // This is needed because SkPath::readFromMemory does not seem to be able to
  7. // be able to handle arbitrary input.
  8. void BuildPath(const uint8_t** data,
  9. size_t* size,
  10. SkPath* path,
  11. int last_verb) {
  12. uint8_t operation;
  13. SkScalar a, b, c, d, e, f;
  14. while (read<uint8_t>(data, size, &operation)) {
  15. switch (operation % (last_verb + 1)) {
  16. case SkPath::Verb::kMove_Verb:
  17. if (!read<SkScalar>(data, size, &a) || !read<SkScalar>(data, size, &b))
  18. return;
  19. path->moveTo(a, b);
  20. break;
  21. case SkPath::Verb::kLine_Verb:
  22. if (!read<SkScalar>(data, size, &a) || !read<SkScalar>(data, size, &b))
  23. return;
  24. path->lineTo(a, b);
  25. break;
  26. case SkPath::Verb::kQuad_Verb:
  27. if (!read<SkScalar>(data, size, &a) ||
  28. !read<SkScalar>(data, size, &b) ||
  29. !read<SkScalar>(data, size, &c) ||
  30. !read<SkScalar>(data, size, &d))
  31. return;
  32. path->quadTo(a, b, c, d);
  33. break;
  34. case SkPath::Verb::kConic_Verb:
  35. if (!read<SkScalar>(data, size, &a) ||
  36. !read<SkScalar>(data, size, &b) ||
  37. !read<SkScalar>(data, size, &c) ||
  38. !read<SkScalar>(data, size, &d) ||
  39. !read<SkScalar>(data, size, &e))
  40. return;
  41. path->conicTo(a, b, c, d, e);
  42. break;
  43. case SkPath::Verb::kCubic_Verb:
  44. if (!read<SkScalar>(data, size, &a) ||
  45. !read<SkScalar>(data, size, &b) ||
  46. !read<SkScalar>(data, size, &c) ||
  47. !read<SkScalar>(data, size, &d) ||
  48. !read<SkScalar>(data, size, &e) ||
  49. !read<SkScalar>(data, size, &f))
  50. return;
  51. path->cubicTo(a, b, c, d, e, f);
  52. break;
  53. case SkPath::Verb::kClose_Verb:
  54. path->close();
  55. break;
  56. case SkPath::Verb::kDone_Verb:
  57. // In this case, simply exit.
  58. return;
  59. }
  60. }
  61. }