/*
 * Copyright 2023 Rive
 */

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

using namespace rivegm;
using namespace rive;

// Make sure gradients don't go NaN-tastic when they have co-located
// (degenerate) stops, and that they render as specified when stops are
// co-located.
class DegenGradGM : public GM
{
public:
  DegenGradGM() : GM(200 * 4 + 50, 200 * 3 + 50) {}

  void onDraw(rive::Renderer* renderer) override
  {
    Factory* factory = TestingWindow::Get()->factory();

    auto rect = factory->makeEmptyRenderPath();
    rect->addRect(0, 0, 150.f, 150.f);

    auto paint = factory->makeRenderPaint();

    renderer->translate(50, 50);

    ColorInt colors2[] = {0xff0000ff, 0xff00ff00};
    // Stuff a red stop in the middle and ensure no red shows up in the
    // drawing.
    ColorInt colors3[] = {0xff0000ff, 0xffff0000, 0xff00ff00};

    for (float stop : {.0f, .5f, 1.f})
    {
      float stops[] = {stop, stop, stop};

      renderer->save();

      paint->shader(
          factory->makeLinearGradient(0, 0, 150, 150, colors2, stops, 2));
      renderer->drawPath(rect.get(), paint.get());

      renderer->translate(200, 0);
      paint->shader(factory->makeRadialGradient(75, 75, 75, colors2, stops, 2));
      renderer->drawPath(rect.get(), paint.get());

      renderer->translate(200, 0);
      paint->shader(
          factory->makeLinearGradient(0, 0, 150, 150, colors3, stops, 3));
      renderer->drawPath(rect.get(), paint.get());

      renderer->translate(200, 0);
      paint->shader(factory->makeRadialGradient(75, 75, 75, colors3, stops, 3));
      renderer->drawPath(rect.get(), paint.get());

      renderer->restore();
      renderer->translate(0, 200);
    }
  }
};

GMREGISTER(degengrad, return new DegenGradGM())
