/*
 * Copyright 2022 Rive
 */

#include "bench.hpp"

#include "rive/math/raw_path.hpp"
#include "rive/math/simd.hpp"

using namespace rive;

static Vec2D randpt()
{
  return Vec2D(float(rand()), float(rand())) * 100 / (float)RAND_MAX;
}

// Measure the speed of RawPath iteration. In an attempt to be representative of
// algorithms that need to know p0 for lines and cubics, we sum up the midpoints
// of lines and cubics.
class IterateRawPath : public Bench
{
public:
  IterateRawPath()
  {
    // Make a random path.
    srand(0);
    for (int i = 0; i < 1000000; ++i)
    {
      int r = rand() % 22;
      if (r == 0)
      {
        m_path.move(randpt());
      }
      else if (r == 1)
      {
        m_path.close();
      }
      else if (r < 12)
      {
        m_path.line(randpt());
      }
      else
      {
        m_path.cubic(randpt(), randpt(), randpt());
      }
    }
  }

private:
  int run() const override
  {
    float4 midpointsSum{};
    float2 startPt{};
    for (auto [verb, p] : m_path)
    {
      switch (verb)
      {
        case PathVerb::move:
          startPt = simd::load2f(&p[0].x);
          break;
        case PathVerb::line:
        {
          float4 p0_1 = simd::load4f(&p[0].x);
          midpointsSum += p0_1 * .5f;
          break;
        }
        case PathVerb::cubic:
        {
          float4 p0_1 = simd::load4f(&p[0].x);
          midpointsSum += p0_1 * float4{.125f, .125f, .75f, .75f};
          float4 p2_3 = simd::load4f(&p[2].x);
          midpointsSum += p2_3 * float4{.75f, .75f, .125f, .125f};
          break;
        }
        case PathVerb::close:
        {
          float4 p0_1;
          p0_1.xy = simd::load2f(&p[0].x);
          p0_1.zw = startPt;
          midpointsSum += p0_1 * .5f;
          break;
        }
        case PathVerb::quad:
          RIVE_UNREACHABLE();
      }
    }
    midpointsSum.xy += midpointsSum.zw;
    return (int)(midpointsSum.x + midpointsSum.y);
  }

  RawPath m_path;
};

REGISTER_BENCH(IterateRawPath);
