xref: /aosp_15_r20/external/skia/fuzz/FuzzPolyUtils.cpp (revision c8dee2aa9b3f27cf6c858bd81872bdeb2c07ed17)
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)
ignoreResult(bool)18 void inline ignoreResult(bool ) {}
19 
20 // clamps the point to the nearest 16th of a pixel
sanitize_point(const SkPoint & in)21 static SkPoint sanitize_point(const SkPoint& in) {
22     SkPoint out;
23     out.fX = SkScalarRoundToScalar(16.f*in.fX)*0.0625f;
24     out.fY = SkScalarRoundToScalar(16.f*in.fY)*0.0625f;
25     return out;
26 }
27 
DEF_FUZZ(PolyUtils,fuzz)28 DEF_FUZZ(PolyUtils, fuzz) {
29     int count;
30     fuzz->nextRange(&count, 0, 512);
31     AutoSTMalloc<64, SkPoint> polygon(count);
32     for (int index = 0; index < count; ++index) {
33         fuzz->next(&polygon[index].fX, &polygon[index].fY);
34         polygon[index] = sanitize_point(polygon[index]);
35     }
36     SkRect bounds;
37     bounds.setBoundsCheck(polygon, count);
38 
39     ignoreResult(SkGetPolygonWinding(polygon, count));
40     bool isConvex = SkIsConvexPolygon(polygon, count);
41     bool isSimple = SkIsSimplePolygon(polygon, count);
42 
43     SkTDArray<SkPoint> output;
44     if (isConvex) {
45         SkScalar inset;
46         fuzz->next(&inset);
47         ignoreResult(SkInsetConvexPolygon(polygon, count, inset, &output));
48     }
49 
50     if (isSimple) {
51         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         fuzz->nextRange(&offset, -1000, 1000);
55         ignoreResult(SkOffsetSimplePolygon(polygon, count, bounds, offset, &output));
56 
57         AutoSTMalloc<64, uint16_t> indexMap(count);
58         for (int index = 0; index < count; ++index) {
59             fuzz->next(&indexMap[index]);
60         }
61         SkTDArray<uint16_t> outputIndices;
62         ignoreResult(SkTriangulateSimplePolygon(polygon, indexMap, count, &outputIndices));
63     }
64 }
65 #else
DEF_FUZZ(PolyUtils,fuzz)66 DEF_FUZZ(PolyUtils, fuzz) {}
67 #endif // !defined(SK_ENABLE_OPTIMIZE_SIZE)
68