/*
 * Copyright 2024 Rive
 */

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

using namespace rivegm;

namespace rive::gpu
{
// Draws non-overlapping clips, which will get reordered and batched together in
// atomic and msaa modes.
class ParallelClipsGM : public GM
{
public:
    ParallelClipsGM() : GM(850, 850, "parallelclips") {}

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

    void onDraw(Renderer* renderer) override
    {
        for (uint32_t y = 0; y < 7; ++y)
        {
            renderer->save();
            for (uint32_t x = 0; x < 7; ++x)
            {
                bool nested = (x ^ y) & 1;
                renderer->save();
                {
                    PathBuilder clip;
                    clip.addRect({10, 10, 110, 110},
                                 rivegm::PathDirection::counterclockwise);
                    clip.moveTo(cos(math::PI / 2) * 30 + 60,
                                sin(math::PI / 2) * 30 + 60)
                        .lineTo(cos(2 * math::PI / 3 + math::PI / 2) * 30 + 60,
                                sin(2 * math::PI / 3 + math::PI / 2) * 30 + 60)
                        .lineTo(cos(4 * math::PI / 3 + math::PI / 2) * 30 + 60,
                                sin(4 * math::PI / 3 + math::PI / 2) * 30 + 60);
                    renderer->clipPath(clip.detach());
                }
                if (nested)
                {
                    PathBuilder clip;
                    clip.addRect({10, 10, 110, 110},
                                 rivegm::PathDirection::counterclockwise);
                    clip.addRect({55, 10, 65, 110},
                                 rivegm::PathDirection::clockwise);
                    renderer->clipPath(clip.detach());
                }
                if (nested)
                {
                    PathBuilder clip;
                    clip.addRect({10, 10, 110, 110},
                                 rivegm::PathDirection::counterclockwise);
                    clip.addRect({10, 55, 110, 65},
                                 rivegm::PathDirection::clockwise);
                    renderer->clipPath(clip.detach());
                }
                renderer->drawPath(
                    PathBuilder::Circle(60, 60, 50),
                    Paint(((y * x + 123458383u) * 285018463u) | 0xff808080));
                renderer->restore();
                renderer->translate(120, 0);
            }
            renderer->restore();
            renderer->translate(0, 120);
        }
    }
};
GMREGISTER(return new ParallelClipsGM)
} // namespace rive::gpu
