/*
 * Copyright 2022 Rive
 */

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

using namespace rivegm;
using namespace rive;

constexpr int W = 1000;
constexpr int H = 400;
constexpr int N = 9999;

class VeryComplexGradGM : public GM
{
public:
    VeryComplexGradGM() : GM(W, H, "verycomplexgrad") {}

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

    void onDraw(rive::Renderer* renderer) override
    {
        Rand rand;
        ColorInt colors[N];
        float stops[N];
        for (size_t i = 0; i < N; ++i)
        {
            colors[i] = rand.u32() | 0xff808080;
            stops[i] = std::round(rand.f32() * W) / W;
        }
        std::sort(stops, stops + N);

        Paint paint;
        paint->shader(TestingWindow::Get()
                          ->factory()
                          ->makeLinearGradient(0, 0, W, 0, colors, stops, N));

        Path fullscreen = PathBuilder().addRect({0, 0, W, H}).detach();

        renderer->drawPath(fullscreen, paint);
    }
};

GMREGISTER(return new VeryComplexGradGM())
