/*
 * Copyright 2020 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/renderer.hpp"
#include "common/rand.hpp"

using namespace rivegm;
using namespace rive;

static constexpr float kStrokeWidth = 100;
static constexpr int kTestWidth = 120 * 4;
static constexpr int kTestHeight = 120 * 3 + 140;

static void draw_strokes(Renderer* renderer,
                         Rand* rand,
                         RenderPath* path,
                         RenderPath* cubic)
{
    Paint strokePaint;
    strokePaint->thickness(kStrokeWidth);
    strokePaint->style(RenderPaintStyle::stroke);

    renderer->save();

    strokePaint->join(StrokeJoin::bevel);
    strokePaint->color(rand->u32() | 0xff808080);
    renderer->drawPath(path, strokePaint);

    renderer->translate(120, 0);
    strokePaint->join(StrokeJoin::round);
    strokePaint->color(rand->u32() | 0xff808080);
    renderer->drawPath(path, strokePaint);

    renderer->translate(120, 0);
    strokePaint->join(StrokeJoin::miter);
    strokePaint->color(rand->u32() | 0xff808080);
    renderer->drawPath(path, strokePaint);

    renderer->translate(120, 0);
    strokePaint->color(rand->u32() | 0xff808080);
    renderer->drawPath(cubic, strokePaint);

    renderer->restore();
}

class WideButtCapsGM : public GM
{
public:
    WideButtCapsGM() : GM(kTestWidth, kTestHeight) {}

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

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

        renderer->save();

        renderer->translate(60, 60);

        {
            Path path, cubic;
            path->lineTo(10, 0);
            path->lineTo(10, 10);
            cubic->cubicTo(10, 0, 10, 0, 10, 10);
            draw_strokes(renderer, &rand, path, cubic);
        }
        renderer->translate(0, 120);

        {
            Path path, cubic;
            path->lineTo(0, -10);
            path->lineTo(0, 10);
            cubic->cubicTo(0, -10, 0, -10, 0, 10);
            draw_strokes(renderer, &rand, path, cubic);
        }
        renderer->translate(0, 120);

        {
            Path path, cubic;
            path->lineTo(0, -10);
            path->lineTo(10, -10);
            path->lineTo(10, 10);
            path->lineTo(0, 10);
            cubic->cubicTo(0, -10, 10, 10, 0, 10);
            draw_strokes(renderer, &rand, path, cubic);
        }
        renderer->translate(0, 140);

        {
            Path path, cubic;
            path->lineTo(0, -10);
            path->lineTo(10, -10);
            path->lineTo(10, 0);
            path->lineTo(0, 0);
            cubic->cubicTo(0, -10, 10, 0, 0, 0);
            draw_strokes(renderer, &rand, path, cubic);
        }
        renderer->translate(0, 120);

        renderer->restore();
    }
};

GMREGISTER(widebuttcaps, return new WideButtCapsGM();)
