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

#include "gm/gm.h"
#include "include/core/SkCanvas.h"
#include "include/core/SkPath.h"
#include "include/core/SkPathBuilder.h"

constexpr int kSize = 1000;

// Makes sure PathInnerTriangulateOp uses correct stencil settings when there is a clip in the
// stencil buffer.
static void draw_clipped_flower(SkCanvas* canvas, SkPathFillType fillType) {
    canvas->clear(SK_ColorCYAN);
    SkPathBuilder clip;
    clip.setFillType(SkPathFillType::kWinding);
    constexpr static int kGridCount = 50;
    constexpr static float kCellSize = (float)kSize / kGridCount;
    for (int y = 0; y < kGridCount; ++y) {
        clip.addRect({0, y * kCellSize, kSize, (y + 1) * kCellSize}, SkPathDirection(y & 1));
    }
    for (int x = 0; x < kGridCount; ++x) {
        clip.addRect({x * kCellSize, 0, (x + 1) * kCellSize, kSize}, SkPathDirection(x & 1));
    }
    canvas->clipPath(clip.detach());
    SkPathBuilder flower(fillType);
    flower.moveTo(1, 0);
    constexpr static int kNumPetals = 9;
    for (int i = 1; i <= kNumPetals; ++i) {
        float c = 2*SK_ScalarPI*(i - .5f) / kNumPetals;
        float theta = 2*SK_ScalarPI*i / kNumPetals;
        flower.quadTo(cosf(c)*2, sinf(c)*2, cosf(theta), sinf(theta));
    }
    flower.close();
    flower.addArc(SkRect::MakeLTRB(-.75f, -.75f, .75f, .75f), 0, 360);
    canvas->translate(kSize/2.f, kSize/2.f);
    canvas->scale(kSize/3.f, kSize/3.f);
    SkPaint p;
    p.setAntiAlias(true);
    p.setColor(SK_ColorMAGENTA);
    canvas->drawPath(flower.detach(), p);
}

DEF_SIMPLE_GM(largeclippedpath_winding, canvas, kSize, kSize) {
    draw_clipped_flower(canvas, SkPathFillType::kWinding);
}

DEF_SIMPLE_GM(largeclippedpath_evenodd, canvas, kSize, kSize) {
    draw_clipped_flower(canvas, SkPathFillType::kEvenOdd);
}
