/*
 * Copyright 2022 Rive
 */

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

using namespace rivegm;

static void add_star(Path& path, int count, float dir)
{
  if (count & 1)
  {
    path_add_star(path, count, 0, dir);
  }
  else
  {
    count >>= 1;
    path_add_star(path, count, 0, dir);
    path_add_star(
        path,
        count,
        rive::math::PI,
        1); // always wind one on the 2nd contour
  }
}

class PolyGM : public GM
{
  rive::FillRule m_FillRule;

public:
  PolyGM(rive::FillRule fr) : GM(480, 480), m_FillRule(fr) {}

  void onDraw(rive::Renderer* ren) override
  {
    auto draw =
        [this, ren](float tx, float ty, rive::ColorInt c, int pts, float dir) {
          Path path;
          path->fillRule(m_FillRule);
          add_star(path, pts, dir);

          AutoRestore ar(ren, true);
          ren->translate(tx, ty);
          ren->scale(100, 100);
          ren->drawPath(path, Paint(c));
        };

    draw(120, 120, 0xAAFF0000, 5, 1);
    draw(360, 120, 0xAA0000FF, 6, 1);
    draw(360, 360, 0xAA00FF00, 5, -1);
    draw(120, 360, 0xAA000000, 6, -1);
  }
};

// Expect all to be filled but the black-6-pointer
GMREGISTER(poly_nonZero, return new PolyGM(rive::FillRule::nonZero))

// Expect all to have a hole
GMREGISTER(poly_evenOdd, return new PolyGM(rive::FillRule::evenOdd))

// Expect all to be filled but the black-6-pointer, and the black-6-pointer will
// also be missing half the triangle tips.
GMREGISTER(poly_clockwise, return new PolyGM(rive::FillRule::clockwise))
