/*
 * 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) {}

  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(parallelclips, return new ParallelClipsGM)
} // namespace rive::gpu
