/*
 * Copyright 2023 Rive
 */

#include "gm.hpp"
#include "gmutils.hpp"
#include "rive/renderer.hpp"

using namespace rivegm;
using namespace rive;

// Make sure gradients don't go NaN-tastic when they have co-located
// (degenerate) stops, and that they render as specified when stops are
// co-located.
class DegenGradGM : public GM
{
public:
    DegenGradGM() : GM(200 * 4 + 50, 200 * 3 + 50, "degengrad") {}

    void onDraw(rive::Renderer* renderer) override
    {
        Factory* factory = TestingWindow::Get()->factory();

        auto rect = factory->makeEmptyRenderPath();
        rect->addRect(0, 0, 150.f, 150.f);

        auto paint = factory->makeRenderPaint();

        renderer->translate(50, 50);

        ColorInt colors2[] = {0xff0000ff, 0xff00ff00};
        // Stuff a red stop in the middle and ensure no red shows up in the
        // drawing.
        ColorInt colors3[] = {0xff0000ff, 0xffff0000, 0xff00ff00};

        for (float stop : {.0f, .5f, 1.f})
        {
            float stops[] = {stop, stop, stop};

            renderer->save();

            paint->shader(
                factory->makeLinearGradient(0, 0, 150, 150, colors2, stops, 2));
            renderer->drawPath(rect.get(), paint.get());

            renderer->translate(200, 0);
            paint->shader(
                factory->makeRadialGradient(75, 75, 75, colors2, stops, 2));
            renderer->drawPath(rect.get(), paint.get());

            renderer->translate(200, 0);
            paint->shader(
                factory->makeLinearGradient(0, 0, 150, 150, colors3, stops, 3));
            renderer->drawPath(rect.get(), paint.get());

            renderer->translate(200, 0);
            paint->shader(
                factory->makeRadialGradient(75, 75, 75, colors3, stops, 3));
            renderer->drawPath(rect.get(), paint.get());

            renderer->restore();
            renderer->translate(0, 200);
        }
    }
};

GMREGISTER(return new DegenGradGM())
