/*
 * Copyright 2024 Rive
 */

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

using namespace rivegm;

namespace rive::gpu
{
// Verifies that draw call batching works correctly when drawing strokes and
// fills with and without feathers.
class InterleavedFeatherGM : public GM
{
public:
    InterleavedFeatherGM() : GM(1000, 1000) {}

    ColorInt clearColor() const override { return 0; }

    void onDraw(Renderer* renderer) override
    {
        Rand rando;
        rando.seed(1);

        Path flower;
        flower->fillRule(FillRule::clockwise);
        constexpr static int NUM_PETALS = 7;
        constexpr static float R = 100;
        flower->moveTo(R, 0);
        for (int i = 1; i <= NUM_PETALS; ++i)
        {
            float c1 = 2 * rive::math::PI * (i - 2 / 3.f) / NUM_PETALS;
            float c2 = 2 * rive::math::PI * (i - 1 / 3.f) / NUM_PETALS;
            float theta = 2 * rive::math::PI * i / NUM_PETALS;
            flower->cubicTo(cosf(c1) * R * 1.65,
                            sinf(c1) * R * 1.65,
                            cosf(c2) * R * 1.65,
                            sinf(c2) * R * 1.65,
                            cosf(theta) * R,
                            sinf(theta) * R);
        }
        path_addOval(flower,
                     AABB(-.6f * R, -.6f * R, .6f * R, .6f * R),
                     rivegm::PathDirection::ccw);
        flower->close();

        Paint paint;
        paint->blendMode(BlendMode::colorBurn);
        for (int i = 0; i < 300; ++i)
        {
            if (rando.boolean())
            {
                paint->feather(rando.f32(20));
            }
            else
            {
                paint->feather(expf(rando.f32(4)));
            }
            renderer->save();
            // Sequence Rand calls into named locals — C++ doesn't specify
            // argument evaluation order, so passing them directly causes
            // the random draws to interleave differently across compilers.
            float tx = rando.f32(0, 1000);
            float ty = rando.f32(0, 1000);
            renderer->translate(tx, ty);
            float s = rando.f32(.25f, .5f);
            renderer->scale(s, s);
            renderer->rotate(rando.f32(math::PI * 2));

            paint->style(RenderPaintStyle::fill);
            paint->color(rando.u32() | 0x40808080);
            renderer->drawPath(flower.get(), paint.get());

            if (rando.boolean())
            {
                paint->style(RenderPaintStyle::stroke);
                paint->thickness(rando.f32(1, 8));
                paint->join(static_cast<StrokeJoin>(rando.u32(0, 2)));
                paint->color(rando.u32() & 0xff000000);
                renderer->drawPath(flower.get(), paint.get());
            }

            renderer->restore();
        }
    }
};
GMREGISTER(interleavedfeather, return new InterleavedFeatherGM)
} // namespace rive::gpu
