﻿/*
 * Copyright 2022 Rive
 */

#include "gm.hpp"
#include "gmutils.hpp"
#include "common/write_png_file.hpp"
#include <vector>

constexpr int imgW = 512;
constexpr int imgH = 512;

// sRGB encoding function
uint8_t linearToSrgb(float linear)
{
  if (linear <= 0.0031308f)
    return static_cast<uint8_t>(std::round(255.0f * (12.92f * linear)));
  else
    return static_cast<uint8_t>(
        std::round(255.0f * (1.055f * std::pow(linear, 1.0f / 2.4f) - 0.055f)));
}

// Pack ARGB pixel
uint32_t packARGB(uint8_t r, uint8_t g, uint8_t b)
{
  return (255u << 24) | (r << 16) | (g << 8) | b;
}

std::vector<uint32_t> generateTexture()
{
  std::vector<uint32_t> pixels(imgW * imgH);

  for (int y = 0; y < imgH; ++y)
  {
    for (int x = 0; x < imgW; ++x)
    {
      uint8_t val = 0;

      if (y < 64)
      {
        // sRGB ramp
        float linear = static_cast<float>(x) / (imgW - 1);
        val = linearToSrgb(linear);
      }
      else if (y < 128)
      {
        // linear ramp
        val = static_cast<uint8_t>(std::round(255.0f * x / (imgW - 1)));
      }
      else if (y < 192)
      {
        // 8 sRGB squares
        int i = x / (imgW / 8);
        float linear = static_cast<float>(i) / 7.0f;
        val = linearToSrgb(linear);
      }
      else if (y < 256)
      {
        // 8 linear squares
        int i = x / (imgW / 8);
        val = static_cast<uint8_t>(std::round(255.0f * i / 7.0f));
      }
      else
      {
        if (x < imgW / 2)
        {
          // checkerboard
          val = ((x + y) % 2 == 0) ? 255 : 0;
        }
        else
        {
          // right half blocks
          val = (y < 256 + 128) ? 127 : linearToSrgb(0.5f); // ≈ 187
        }
      }

      int yD = (imgH - 1) - y;
      pixels[yD * imgW + x] = packARGB(val, val, val);
    }
  }

  return pixels;
}

using namespace rivegm;

class GammaTextureGM : public GM
{
public:
  GammaTextureGM() : GM(512, 768) {}

  void onDraw(rive::Renderer* renderer) override
  {
    auto pixData = generateTexture();
    std::vector<uint8_t> encodedData = EncodePNGToBuffer(
        imgW,
        imgH,
        (uint8_t*)pixData.data(),
        PNGCompression::fast_rle);
    auto img = LoadImage(rive::Span<uint8_t>(encodedData));
    if (img == nullptr)
    {
      return;
    }

    // Full size image
    rive::AABB r = {0, 0, 512, 512};
    renderer->save();
    renderer->translate(0, 0);
    draw_image(renderer, img.get(), r);
    renderer->restore();

    // Below is 1/4 (1/2 * 1/2) version
    renderer->save();
    renderer->translate(0, 512);
    renderer->scale(.5, .5);
    draw_image(renderer, img.get(), r);
    renderer->restore();

    // Bottom right is 1/16 (1/4 * 1/4) version
    renderer->save();
    renderer->translate(256, 512);
    renderer->scale(.25, .25);
    draw_image(renderer, img.get(), r);
    renderer->restore();
  }
};
GMREGISTER(gamma_texture, return new GammaTextureGM)
