/*
 * Copyright 2018 Google LLC
 *
 * Use of this source code is governed by a BSD-style license that can be
 * found in the LICENSE file.
 */

#include "fuzz/Fuzz.h"

#include "include/private/SkTemplates.h"
#include "src/utils/SkPolyUtils.h"

void inline ignoreResult(bool ) {}

// clamps the point to the nearest 16th of a pixel
static SkPoint sanitize_point(const SkPoint& in) {
    SkPoint out;
    out.fX = SkScalarRoundToScalar(16.f*in.fX)*0.0625f;
    out.fY = SkScalarRoundToScalar(16.f*in.fY)*0.0625f;
    return out;
}

DEF_FUZZ(PolyUtils, fuzz) {
    int count;
    fuzz->nextRange(&count, 0, 512);
    SkAutoSTMalloc<64, SkPoint> polygon(count);
    for (int index = 0; index < count; ++index) {
        fuzz->next(&polygon[index].fX, &polygon[index].fY);
        polygon[index] = sanitize_point(polygon[index]);
    }
    SkRect bounds;
    bounds.setBoundsCheck(polygon, count);

    ignoreResult(SkGetPolygonWinding(polygon, count));
    ignoreResult(SkIsConvexPolygon(polygon, count));
    ignoreResult(SkIsSimplePolygon(polygon, count));

    SkScalar inset;
    fuzz->next(&inset);
    SkTDArray<SkPoint> output;
    ignoreResult(SkInsetConvexPolygon(polygon, count, inset, &output));

    SkScalar offset;
    fuzz->next(&offset);
    ignoreResult(SkOffsetSimplePolygon(polygon, count, bounds, offset, &output));

    SkAutoSTMalloc<64, uint16_t> indexMap(count);
    for (int index = 0; index < count; ++index) {
        fuzz->next(&indexMap[index]);
    }
    SkTDArray<uint16_t> outputIndices;
    ignoreResult(SkTriangulateSimplePolygon(polygon, indexMap, count, &outputIndices));
}
