Flutter Engine
The Flutter Engine
Loading...
Searching...
No Matches
FuzzPolyUtils.cpp
Go to the documentation of this file.
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
14
15using namespace skia_private;
16
17#if !defined(SK_ENABLE_OPTIMIZE_SIZE)
18void inline ignoreResult(bool ) {}
19
20// clamps the point to the nearest 16th of a pixel
21static 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
28DEF_FUZZ(PolyUtils, fuzz) {
29 int count;
30 fuzz->nextRange(&count, 0, 512);
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
40 bool isConvex = SkIsConvexPolygon(polygon, count);
41 bool isSimple = SkIsSimplePolygon(polygon, count);
42
43 SkTDArray<SkPoint> output;
44 if (isConvex) {
46 fuzz->next(&inset);
47 ignoreResult(SkInsetConvexPolygon(polygon, count, inset, &output));
48 }
49
50 if (isSimple) {
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
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
66DEF_FUZZ(PolyUtils, fuzz) {}
67#endif // !defined(SK_ENABLE_OPTIMIZE_SIZE)
int count
static SkPoint sanitize_point(const SkPoint &in)
void ignoreResult(bool)
#define DEF_FUZZ(name, f)
Definition Fuzz.h:156
bool SkIsConvexPolygon(const SkPoint *polygonVerts, int polygonSize)
bool SkTriangulateSimplePolygon(const SkPoint *polygonVerts, uint16_t *indexMap, int polygonSize, SkTDArray< uint16_t > *triangleIndices)
bool SkOffsetSimplePolygon(const SkPoint *inputPolygonVerts, int inputPolygonSize, const SkRect &bounds, SkScalar offset, SkTDArray< SkPoint > *offsetPolygon, SkTDArray< int > *polygonIndices)
bool SkIsSimplePolygon(const SkPoint *polygon, int polygonSize)
int SkGetPolygonWinding(const SkPoint *polygonVerts, int polygonSize)
bool SkInsetConvexPolygon(const SkPoint *inputPolygonVerts, int inputPolygonSize, SkScalar inset, SkTDArray< SkPoint > *insetPolygon)
#define SkScalarRoundToScalar(x)
Definition SkScalar.h:32
float SkScalar
Definition extension.cpp:12
static SkRect inset(const SkRect &r)
Point offset
float fX
x-axis value
float fY
y-axis value