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

#include "gm.hpp"
#include "gmutils.hpp"
#include "rive/math/math_types.hpp"
#include "rive/renderer.hpp"
#include "common/rand.hpp"

using namespace rivegm;
using namespace rive;

class Bevel180StrokesGM : public GM
{
public:
    Bevel180StrokesGM() : GM(300, 300, "bevel180strokes") {}

    ColorInt clearColor() const override { return 0xff000000; }

    void onDraw(rive::Renderer* renderer) override
    {
        Rand rand;

        const float r = 141.5;

        Paint strokePaint;
        strokePaint->style(RenderPaintStyle::stroke);
        strokePaint->thickness(15 / r);
        strokePaint->cap(StrokeCap::butt);
        strokePaint->join(StrokeJoin::bevel);

        renderer->translate(150, 150);
        renderer->scale(r, r);

        const size_t spokes = 20;
        for (size_t i = 0; i < spokes; ++i)
        {
            float theta = math::PI * 2 * i / spokes;
            Path path;
            if (i == 0)
                path->lineTo(1, 0);
            else if (i == spokes / 4)
                path->lineTo(0, 1);
            else if (i == spokes * 2 / 4)
                path->lineTo(-1, 0);
            else if (i == spokes * 3 / 4)
                path->lineTo(0, -1);
            else
                path->lineTo(cosf(theta), sinf(theta));
            path->lineTo(0, 0);
            strokePaint->color(rand.u32() | 0xff808080);
            renderer->drawPath(path, strokePaint);
        }
    }
};

GMREGISTER(return new Bevel180StrokesGM())
