/*
 * Copyright 2013 Google Inc.
 * Copyright 2022 Rive
 *
 * Use of this source code is governed by a BSD-style license that can be
 * found in the LICENSE file.
 */

#include "gm.hpp"
#include "gmutils.hpp"

using namespace rive;
using namespace rivegm;

class Xfermodes2GM : public GM
{
public:
  Xfermodes2GM() : GM(455, 475) {}

protected:
  rive::ColorInt clearColor() const override { return 0; } // TRANSPARENT!

  void onDraw(rive::Renderer* renderer) override
  {
    renderer->translate(10, 20);

    const float w = kSize;
    const float h = kSize;

    rive::Factory* factory = TestingWindow::Get()->factory();

    float stops[2] = {0, 1};
    rive::ColorInt dstColors[2] = {0, 0xff00ff00};
    rive::ColorInt srcColors[2] = {0, 0xffff0000};
    rcp<RenderShader>
        dstGrad = factory->makeLinearGradient(0, 0, w, 0, dstColors, stops, 2);
    rcp<RenderShader>
        srcGrad = factory->makeLinearGradient(0, 0, 0, h, srcColors, stops, 2);

    // SkFont font(ToolUtils::create_portable_typeface());

    const int W = 6;

    float x = 0, y = 0;
    size_t m = 0;

    for (BlendMode mode RIVE_MAYBE_UNUSED :
         {BlendMode::srcOver,
          BlendMode::screen,
          BlendMode::overlay,
          BlendMode::darken,
          BlendMode::lighten,
          BlendMode::colorDodge,
          BlendMode::colorBurn,
          BlendMode::hardLight,
          BlendMode::softLight,
          BlendMode::difference,
          BlendMode::exclusion,
          BlendMode::multiply,
          BlendMode::hue,
          BlendMode::saturation,
          BlendMode::color,
          BlendMode::luminosity})
    {
      renderer->save();

      renderer->translate(x, y);
      auto p = factory->makeRenderPaint();
      // // p.setStyle(SkPaint::kFill_Style);
      // p.setShader(fBG);
      rive::AABB r = {0, 0, w, h};
      p->shader(dstGrad);
      rivegm::draw_rect(renderer, r, p.get());
      renderer->restore();

      x += w + 10;
      if ((m % W) == W - 1)
      {
        x = 0;
        y += h + 30;
      }
      ++m;
    }

    x = 0, y = 0;
    m = 0;

    for (BlendMode mode :
         {BlendMode::srcOver,
          BlendMode::screen,
          BlendMode::overlay,
          BlendMode::darken,
          BlendMode::lighten,
          BlendMode::colorDodge,
          BlendMode::colorBurn,
          BlendMode::hardLight,
          BlendMode::softLight,
          BlendMode::difference,
          BlendMode::exclusion,
          BlendMode::multiply,
          BlendMode::hue,
          BlendMode::saturation,
          BlendMode::color,
          BlendMode::luminosity})
    {
      renderer->save();

      renderer->translate(x, y);
      auto p = factory->makeRenderPaint();
      // // p.setStyle(SkPaint::kFill_Style);
      // p.setShader(fBG);
      rive::AABB r = {0, 0, w, h};
      // rivegm::draw_rect(renderer, r, p.get());

      p->shader(dstGrad);
      // rivegm::draw_rect(renderer, r, p.get());

      p->shader(srcGrad);
      p->blendMode(mode);
      rivegm::draw_rect(renderer, r, p.get());

      r = r.inset(-.5f, -.5f);
      p->style(RenderPaintStyle::stroke);
      p->shader(nullptr);
      p->blendMode(BlendMode::srcOver);
      rivegm::draw_rect(renderer, r, p.get());

      renderer->restore();

#if 0
            SkTextUtils::DrawString(renderer,
                                    SkBlendMode_Name(mode),
                                    x + w / 2,
                                    y - font.getSize() / 2,
                                    font,
                                    SkPaint(),
                                    SkTextUtils::kCenter_Align);
#endif
      x += w + 10;
      if ((m % W) == W - 1)
      {
        x = 0;
        y += h + 30;
      }
      ++m;
    }
  }

private:
  enum
  {
    kShift = 2,
    kSize = 256 >> kShift,
  };
};

//////////////////////////////////////////////////////////////////////////////

GMREGISTER(xfermodes2, return new Xfermodes2GM)
