/src/skia/fuzz/FuzzPolyUtils.cpp
Line | Count | Source |
1 | | /* |
2 | | * Copyright 2018 Google LLC |
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/Fuzz.h" |
9 | | |
10 | | #include "include/core/SkPoint.h" |
11 | | #include "include/private/base/SkTDArray.h" |
12 | | #include "include/private/base/SkTemplates.h" |
13 | | #include "src/utils/SkPolyUtils.h" |
14 | | |
15 | | using namespace skia_private; |
16 | | |
17 | | #if !defined(SK_ENABLE_OPTIMIZE_SIZE) |
18 | 6.85k | void inline ignoreResult(bool ) {} |
19 | | |
20 | | // clamps the point to the nearest 16th of a pixel |
21 | 95.0k | static SkPoint sanitize_point(const SkPoint& in) { |
22 | 95.0k | SkPoint out; |
23 | 95.0k | out.fX = SkScalarRoundToScalar(16.f*in.fX)*0.0625f; |
24 | 95.0k | out.fY = SkScalarRoundToScalar(16.f*in.fY)*0.0625f; |
25 | 95.0k | return out; |
26 | 95.0k | } |
27 | | |
28 | 942 | DEF_FUZZ(PolyUtils, fuzz) { |
29 | 942 | int count; |
30 | 942 | fuzz->nextRange(&count, 0, 512); |
31 | 942 | AutoSTMalloc<64, SkPoint> polygon(count); |
32 | 95.9k | for (int index = 0; index < count; ++index) { |
33 | 95.0k | fuzz->next(&polygon[index].fX, &polygon[index].fY); |
34 | 95.0k | polygon[index] = sanitize_point(polygon[index]); |
35 | 95.0k | } |
36 | 942 | SkRect bounds; |
37 | 942 | bounds.setBoundsCheck(polygon, count); |
38 | | |
39 | 942 | ignoreResult(SkGetPolygonWinding(polygon, count)); |
40 | 942 | bool isConvex = SkIsConvexPolygon(polygon, count); |
41 | 942 | bool isSimple = SkIsSimplePolygon(polygon, count); |
42 | | |
43 | 942 | SkTDArray<SkPoint> output; |
44 | 942 | if (isConvex) { |
45 | 478 | SkScalar inset; |
46 | 478 | fuzz->next(&inset); |
47 | 478 | ignoreResult(SkInsetConvexPolygon(polygon, count, inset, &output)); |
48 | 478 | } |
49 | | |
50 | 942 | if (isSimple) { |
51 | 812 | SkScalar offset; |
52 | | // Limit this to prevent timeouts. |
53 | | // This should be fine, as this is roughly the range we expect from the shadow algorithm. |
54 | 812 | fuzz->nextRange(&offset, -1000, 1000); |
55 | 812 | ignoreResult(SkOffsetSimplePolygon(polygon, count, bounds, offset, &output)); |
56 | | |
57 | 812 | AutoSTMalloc<64, uint16_t> indexMap(count); |
58 | 79.4k | for (int index = 0; index < count; ++index) { |
59 | 78.6k | fuzz->next(&indexMap[index]); |
60 | 78.6k | } |
61 | 812 | SkTDArray<uint16_t> outputIndices; |
62 | 812 | ignoreResult(SkTriangulateSimplePolygon(polygon, indexMap, count, &outputIndices)); |
63 | 812 | } |
64 | 942 | } |
65 | | #else |
66 | | DEF_FUZZ(PolyUtils, fuzz) {} |
67 | | #endif // !defined(SK_ENABLE_OPTIMIZE_SIZE) |