/*
 * Copyright 2011 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"
#include "rive/renderer.hpp"
#include "rive/math/math_types.hpp"

using namespace rivegm;
using namespace rive;

static const float kStdFakeBoldInterpKeys[] = {
    1.0f * 9,
    1.0f * 36,
};
static const float kStdFakeBoldInterpValues[] = {
    1.0f / 24,
    1.0f / 32,
};
static_assert(
    std::size(kStdFakeBoldInterpKeys) == std::size(kStdFakeBoldInterpValues),
    "mismatched_array_size");
static const int kStdFakeBoldInterpLength = std::size(kStdFakeBoldInterpKeys);

/* Generated on a Mac with:
 * paint.setTypeface(SkTypeface::CreateByName("Papyrus"));
 * paint.getTextPath("H", 1, 100, 80, &textPath);
 */
static Path papyrus_hello()
{
  PathBuilder b;
  b.moveTo(169.824f, 83.4102f);
  b.lineTo(167.285f, 85.6074f);
  b.lineTo(166.504f, 87.2188f);
  b.lineTo(165.82f, 86.7793f);
  b.lineTo(165.186f, 87.1211f);
  b.lineTo(164.6f, 88.1953f);
  b.lineTo(161.914f, 89.416f);
  b.lineTo(161.719f, 89.2207f);
  b.lineTo(160.596f, 88.8789f);
  b.lineTo(160.498f, 87.6094f);
  b.lineTo(160.693f, 86.3887f);
  b.lineTo(161.621f, 84.6797f);
  b.lineTo(161.279f, 83.2148f);
  b.lineTo(161.523f, 81.9941f);
  b.lineTo(162.012f, 79.1133f);
  b.lineTo(162.695f, 76.623f);
  b.lineTo(162.305f, 73.4004f);
  b.lineTo(162.207f, 72.4238f);
  b.lineTo(163.477f, 71.4961f);
  b.quadTo(163.525f, 71.0078f, 163.525f, 70.2754f);
  b.quadTo(163.525f, 68.8594f, 162.793f, 67.1992f);
  b.lineTo(163.623f, 64.6113f);
  b.lineTo(162.598f, 63.6836f);
  b.lineTo(163.184f, 61.0957f);
  b.lineTo(162.695f, 60.8027f);
  b.lineTo(162.988f, 52.5996f);
  b.lineTo(162.402f, 52.1113f);
  b.lineTo(161.914f, 50.1094f);
  b.lineTo(161.523f, 50.5f);
  b.quadTo(160.645f, 50.5f, 160.327f, 50.6465f);
  b.quadTo(160.01f, 50.793f, 159.424f, 51.4766f);
  b.lineTo(158.203f, 52.7949f);
  b.lineTo(156.299f, 52.0137f);
  b.quadTo(154.346f, 52.5996f, 154.004f, 52.5996f);
  b.quadTo(154.053f, 52.5996f, 152.783f, 52.4043f);
  b.quadTo(151.465f, 51.3789f, 150.488f, 51.3789f);
  b.quadTo(150.342f, 51.3789f, 150.269f, 51.4033f);
  b.quadTo(150.195f, 51.4277f, 150.098f, 51.4766f);
  b.lineTo(145.02f, 51.916f);
  b.lineTo(139.893f, 51.2812f);
  b.lineTo(135.693f, 51.623f);
  b.lineTo(133.594f, 51.0859f);
  b.lineTo(130.42f, 52.0137f);
  b.lineTo(125.488f, 51.4766f);
  b.lineTo(124.219f, 51.623f);
  b.lineTo(122.705f, 50.5f);
  b.lineTo(122.217f, 51.7207f);
  b.lineTo(116.211f, 51.623f);
  b.quadTo(114.99f, 52.7949f, 114.99f, 53.8203f);
  b.lineTo(115.576f, 57.6777f);
  b.quadTo(115.723f, 58.2148f, 115.723f, 59.2891f);
  b.quadTo(115.723f, 60.2656f, 115.186f, 61.1934f);
  b.lineTo(115.479f, 64.2207f);
  b.quadTo(114.795f, 64.6602f, 114.648f, 65.0752f);
  b.quadTo(114.502f, 65.4902f, 114.502f, 66.3203f);
  b.quadTo(114.893f, 66.9551f, 115.918f, 67.1992f);
  b.lineTo(116.016f, 69.2988f);
  b.lineTo(116.016f, 75.6953f);
  b.lineTo(116.016f, 75.9883f);
  b.lineTo(116.113f, 77.209f);
  b.quadTo(116.113f, 77.6484f, 115.479f, 78.0879f);
  b.lineTo(115.576f, 79.1133f);
  b.lineTo(116.309f, 82.0918f);
  b.lineTo(116.406f, 83.1172f);
  b.quadTo(116.406f, 85.2656f, 114.404f, 86.291f);
  b.lineTo(111.914f, 87.5117f);
  b.lineTo(109.717f, 88.7812f);
  b.lineTo(108.398f, 89.416f);
  b.lineTo(108.105f, 88.9766f);
  b.lineTo(107.617f, 88.9766f);
  b.quadTo(107.08f, 87.9023f, 107.08f, 87.0234f);
  b.quadTo(107.08f, 85.998f, 107.324f, 85.6074f);
  b.lineTo(108.398f, 83.1172f);
  b.lineTo(108.887f, 81.4082f);
  b.lineTo(109.619f, 81.1152f);
  b.lineTo(109.717f, 79.5039f);
  b.lineTo(108.887f, 78.7227f);
  b.quadTo(109.619f, 77.3555f, 109.619f, 77.1113f);
  b.quadTo(109.619f, 76.8672f, 108.887f, 75.5977f);
  b.lineTo(108.789f, 74.7188f);
  b.lineTo(109.18f, 66.6133f);
  b.lineTo(108.691f, 64.416f);
  b.quadTo(108.691f, 63.293f, 109.521f, 62.707f);
  b.lineTo(110.205f, 62.1211f);
  b.quadTo(110.449f, 61.877f, 110.596f, 60.998f);
  b.quadTo(109.082f, 60.4609f, 109.082f, 59.1914f);
  b.lineTo(109.082f, 58.9961f);
  b.lineTo(109.424f, 55.2852f);
  b.lineTo(108.789f, 53.7227f);
  b.lineTo(108.789f, 48.1074f);
  b.lineTo(108.594f, 45.3242f);
  b.lineTo(108.691f, 43.8105f);
  b.lineTo(107.91f, 43.9082f);
  b.lineTo(107.715f, 44.1035f);
  b.lineTo(107.324f, 42.7852f);
  b.lineTo(107.715f, 43.1758f);
  b.lineTo(107.91f, 41.3203f);
  b.quadTo(109.717f, 40.2949f, 109.717f, 39.2207f);
  b.quadTo(109.717f, 37.707f, 107.715f, 37.4141f);
  b.lineTo(106.982f, 33.9961f);
  b.lineTo(106.982f, 33.2148f);
  b.lineTo(106.689f, 29.3086f);
  b.lineTo(106.689f, 26.1836f);
  b.lineTo(107.91f, 25.6953f);
  b.lineTo(109.521f, 24.5234f);
  b.lineTo(112.109f, 23.3027f);
  b.lineTo(114.014f, 22.5215f);
  b.lineTo(115.479f, 23.1074f);
  b.quadTo(115.479f, 24.0352f, 116.113f, 25.1094f);
  b.quadTo(115.381f, 25.8906f, 115.259f, 26.3789f);
  b.quadTo(115.137f, 26.8672f, 114.99f, 28.8203f);
  b.lineTo(114.893f, 29.9922f);
  b.lineTo(115.82f, 33.4102f);
  b.lineTo(116.016f, 35.4121f);
  b.lineTo(115.576f, 35.4121f);
  b.lineTo(114.697f, 37.707f);
  b.lineTo(115.381f, 38.4883f);
  b.lineTo(115.186f, 39.5137f);
  b.lineTo(114.697f, 40.3926f);
  b.lineTo(114.209f, 41.418f);
  b.lineTo(114.404f, 42.4922f);
  b.lineTo(114.795f, 43.3223f);
  b.quadTo(115.186f, 44.1035f, 115.186f, 46.4961f);
  b.lineTo(116.309f, 46.7891f);
  b.lineTo(125, 47.2773f);
  b.lineTo(126.318f, 48.2051f);
  b.lineTo(129.59f, 48.5957f);
  b.lineTo(130.615f, 48.498f);
  b.lineTo(130.908f, 48.0098f);
  b.lineTo(134.277f, 48.2051f);
  b.lineTo(134.717f, 48.3027f);
  b.quadTo(135.4f, 47.7168f, 136.084f, 47.7168f);
  b.lineTo(137.109f, 47.8145f);
  b.lineTo(137.109f, 48.2051f);
  b.lineTo(137.695f, 48.5957f);
  b.lineTo(138.818f, 48.498f);
  b.lineTo(144.189f, 48.4004f);
  b.lineTo(146.191f, 48.2051f);
  b.lineTo(147.998f, 48.791f);
  b.quadTo(148.877f, 47.5215f, 150.098f, 47.5215f);
  b.lineTo(150.293f, 47.5215f);
  b.lineTo(152.783f, 47.7168f);
  b.lineTo(157.52f, 47.2773f);
  b.lineTo(160.303f, 47.4238f);
  b.lineTo(161.279f, 47.1797f);
  b.lineTo(161.621f, 46.1055f);
  b.lineTo(162.5f, 43.9082f);
  b.lineTo(162.305f, 38.293f);
  b.lineTo(162.5f, 37.1211f);
  b.lineTo(161.816f, 35.998f);
  b.lineTo(160.596f, 34.7773f);
  b.lineTo(160.596f, 32.6777f);
  b.lineTo(160.303f, 30.4805f);
  b.lineTo(160.889f, 29.4062f);
  b.quadTo(160.303f, 27.4043f, 160.303f, 26.2812f);
  b.quadTo(160.303f, 25.3535f, 160.889f, 25.207f);
  b.lineTo(162.207f, 25.0117f);
  b.lineTo(163.721f, 23.8887f);
  b.lineTo(164.893f, 23.8887f);
  b.quadTo(165.625f, 23.6934f, 166.797f, 22.5215f);
  b.lineTo(168.213f, 23.2051f);
  b.lineTo(168.701f, 25.5f);
  b.lineTo(169.092f, 26.8184f);
  b.lineTo(167.676f, 31.9941f);
  b.lineTo(168.018f, 34.6797f);
  b.lineTo(167.822f, 35.8027f);
  b.lineTo(167.285f, 35.8027f);
  b.quadTo(166.602f, 35.8027f, 166.602f, 36.7793f);
  b.quadTo(166.846f, 37.3652f, 167.578f, 37.707f);
  b.lineTo(168.506f, 38.1953f);
  b.lineTo(168.799f, 39.5137f);
  b.lineTo(169.092f, 41.5156f);
  b.lineTo(168.994f, 42.1016f);
  b.lineTo(168.213f, 43.6152f);
  b.lineTo(168.408f, 52.502f);
  b.lineTo(168.213f, 60.1191f);
  b.lineTo(168.994f, 61.291f);
  b.quadTo(168.604f, 63.0488f, 168.604f, 63.9766f);
  b.lineTo(168.604f, 64.123f);
  b.lineTo(168.604f, 64.3184f);
  b.lineTo(168.604f, 64.9043f);
  b.lineTo(168.604f, 66.0762f);
  b.quadTo(167.578f, 67.1504f, 167.578f, 67.5898f);
  b.quadTo(167.578f, 67.7852f, 167.676f, 67.7852f);
  b.lineTo(168.994f, 70.0801f);
  b.lineTo(168.701f, 76.7207f);
  b.lineTo(169.824f, 83.4102f);
  b.close();
  return b.detach();
}

/* Generated on a Mac with:
 * paint.setTypeface(SkTypeface::CreateByName("Hiragino Maru Gothic Pro"));
 * const unsigned char hyphen[] = { 0xE3, 0x83, 0xBC };
 * paint.getTextPath(hyphen, SK_ARRAY_COUNT(hyphen), 400, 80, &textPath);
 */
static Path hiragino_maru_gothic_pro_dash()
{
  Path path;
  path->moveTo(488, 55.1f);
  path->cubicTo(490.5f, 55.1f, 491.9f, 53.5f, 491.9f, 50.8f);
  path->cubicTo(491.9f, 48.2f, 490.5f, 46.3f, 487.9f, 46.3f);
  path->lineTo(412, 46.3f);
  path->cubicTo(409.4f, 46.3f, 408, 48.2f, 408, 50.8f);
  path->cubicTo(408, 53.5f, 409.4f, 55.1f, 411.9f, 55.1f);
  path->lineTo(488, 55.1f);
  path->close();
  return path;
}

float scalarInterpFunc(
    float searchKey,
    const float keys[],
    const float values[],
    int length)
{
  assert(length > 0);
  assert(keys != nullptr);
  assert(values != nullptr);
#ifdef RIVE_DEBUG
  for (int i = 1; i < length; i++)
  {
    assert(keys[i - 1] <= keys[i]);
  }
#endif
  int right = 0;
  while (right < length && keys[right] < searchKey)
  {
    ++right;
  }
  // Could use sentinel values to eliminate conditionals, but since the
  // tables are taken as input, a simpler format is better.
  if (right == length)
  {
    return values[length - 1];
  }
  if (right == 0)
  {
    return values[0];
  }
  // Otherwise, interpolate between right - 1 and right.
  float leftKey = keys[right - 1];
  float rightKey = keys[right];
  float fract = (searchKey - leftKey) / (rightKey - leftKey);
  return lerp(values[right - 1], values[right], fract);
}

static void path_bold(Renderer* canvas, const Path& path, float textSize)
{
  Paint p;
  p->thickness(static_cast<float>(5));
  canvas->drawPath(path, p);
  float fakeBoldScale = scalarInterpFunc(
      textSize,
      kStdFakeBoldInterpKeys,
      kStdFakeBoldInterpValues,
      kStdFakeBoldInterpLength);
  float extra = textSize * fakeBoldScale;
  p->thickness(extra);
  canvas->save();
  canvas->translate(0, 120);
  canvas->drawPath(path, p);
  p->style(RenderPaintStyle::stroke);
  canvas->drawPath(path, p);
  canvas->restore();
}

static AABB xywh(float x, float y, float w, float h)
{
  return {x, y, x + w, y + h};
}

DEF_SIMPLE_GM(strokefill, 640, 480, canvas)
{
  float x = static_cast<float>(100);
  float y = static_cast<float>(88);

  Paint paint;
  paint->thickness(static_cast<float>(5));

  // use paths instead of text to test the path data on all platforms, since
  // the Mac-specific font may change or is not available everywhere
  path_bold(canvas, papyrus_hello(), 100);
  path_bold(canvas, hiragino_maru_gothic_pro_dash(), 100);

  PathBuilder b;
  b.fillRule(FillRule::nonZero);
  b.addCircle(
      x,
      y + static_cast<float>(200),
      static_cast<float>(50),
      rivegm::PathDirection::cw);
  b.addCircle(
      x,
      y + static_cast<float>(200),
      static_cast<float>(40),
      rivegm::PathDirection::ccw);
  canvas->drawPath(b.detach(), paint);

  b.addCircle(
      x + static_cast<float>(120),
      y + static_cast<float>(200),
      static_cast<float>(50),
      rivegm::PathDirection::ccw);
  b.addCircle(
      x + static_cast<float>(120),
      y + static_cast<float>(200),
      static_cast<float>(40),
      rivegm::PathDirection::cw);
  canvas->drawPath(b.detach(), paint);

  b.addCircle(
      x + static_cast<float>(240),
      y + static_cast<float>(200),
      static_cast<float>(50),
      rivegm::PathDirection::ccw);
  canvas->drawPath(b.detach(), paint);

  b.addCircle(
      x + static_cast<float>(360),
      y + static_cast<float>(200),
      static_cast<float>(50),
      rivegm::PathDirection::cw);
  canvas->drawPath(b.detach(), paint);

  AABB r = xywh(
      x - static_cast<float>(50),
      y + static_cast<float>(280),
      static_cast<float>(100),
      static_cast<float>(100));
  b.addRect(r, rivegm::PathDirection::cw);
  r = r.inset(static_cast<float>(10), static_cast<float>(10));
  b.addRect(r, rivegm::PathDirection::ccw);
  canvas->drawPath(b.detach(), paint);

  r = xywh(
      x + static_cast<float>(70),
      y + static_cast<float>(280),
      static_cast<float>(100),
      static_cast<float>(100));
  b.addRect(r, rivegm::PathDirection::ccw);
  r = r.inset(static_cast<float>(10), static_cast<float>(10));
  b.addRect(r, rivegm::PathDirection::cw);
  canvas->drawPath(b.detach(), paint);

  r = xywh(
      x + static_cast<float>(190),
      y + static_cast<float>(280),
      static_cast<float>(100),
      static_cast<float>(100));
  b.addRect(r, rivegm::PathDirection::ccw);
  b.moveTo(0, 0); // test for crbug.com/247770
  canvas->drawPath(b.detach(), paint);

  r = xywh(
      x + static_cast<float>(310),
      y + static_cast<float>(280),
      static_cast<float>(100),
      static_cast<float>(100));
  b.addRect(r, rivegm::PathDirection::cw);
  b.moveTo(0, 0); // test for crbug.com/247770
  canvas->drawPath(b.detach(), paint);
}

DEF_SIMPLE_GM(bug339297, 640, 480, canvas)
{
  Path path;
  path->moveTo(-469515, -10354890);
  path->cubicTo(
      771919.62f,
      -10411179,
      2013360.1f,
      -10243774,
      3195542.8f,
      -9860664);
  path->lineTo(3195550, -9860655);
  path->lineTo(3195539, -9860652);
  path->lineTo(3195539, -9860652);
  path->lineTo(3195539, -9860652);
  path->cubicTo(
      2013358.1f,
      -10243761,
      771919.25f,
      -10411166,
      -469513.84f,
      -10354877);
  path->lineTo(-469515, -10354890);
  path->close();

  canvas->translate(258, 10365663);

  Paint paint;
  paint->color(0xff000000);
  paint->style(RenderPaintStyle::fill);
  canvas->drawPath(path, paint);

  paint->color(0xffff0000);
  paint->style(RenderPaintStyle::stroke);
  paint->thickness(1);
  canvas->drawPath(path, paint);
}

DEF_SIMPLE_GM(bug339297_as_clip, 640, 480, canvas)
{
  Path path;
  path->moveTo(-469515, -10354890);
  path->cubicTo(
      771919.62f,
      -10411179,
      2013360.1f,
      -10243774,
      3195542.8f,
      -9860664);
  path->lineTo(3195550, -9860655);
  path->lineTo(3195539, -9860652);
  path->lineTo(3195539, -9860652);
  path->lineTo(3195539, -9860652);
  path->cubicTo(
      2013358.1f,
      -10243761,
      771919.25f,
      -10411166,
      -469513.84f,
      -10354877);
  path->lineTo(-469515, -10354890);
  path->close();

  canvas->translate(258, 10365663);

  canvas->save();
  canvas->clipPath(path);
  Paint clearPaint;
  clearPaint->color(0xff000000);
  const float b = 1e9f;
  draw_rect(canvas, {-b, -b, b, b}, clearPaint);
  canvas->restore();

  Paint paint;
  paint->style(RenderPaintStyle::fill);
  paint->color(0xffff0000);
  paint->style(RenderPaintStyle::stroke);
  paint->thickness(1);
  canvas->drawPath(path, paint);
}

DEF_SIMPLE_GM(bug6987, 75, 75, canvas)
{
  Paint paint;
  paint->style(RenderPaintStyle::stroke);
  paint->thickness(0.0001f);
  Path path;
  canvas->save();
  canvas->scale(50000.0f, 50000.0f);
  path->moveTo(0.0005f, 0.0004f);
  path->lineTo(0.0008f, 0.0010f);
  path->lineTo(0.0002f, 0.0010f);
  path->close();
  canvas->drawPath(path, paint);
  canvas->restore();
}
