#include "sprite.hpp"
#include "a83/log.hpp"
#include "stb/stb_image.h"
#include <fstream>
void Sprite::load(a83::Str name, CN(Vec) _offset, LightMode mode) {
  using namespace std;
  using namespace a83;
  IFERROR(name.empty(), "Sprite.load F: file name is empty");
  a83::convSep(name);
  a83::log("Load sprite F \"" + name + "\"");
  std::fstream file(name, std::ios_base::binary | std::ios_base::in);
  IFERROR(file.bad() || !file, "Sprite.load F: file is not loaded. file name \"" + name + "\"");
  // определяет размер файла в байтах:
  file.seekp(0, std::ios::end);
  data_t mem;
  mem.size = std::size_t(file.tellp());
  file.seekp(0, std::ios::beg);
  IFERROR( !mem.size || mem.size == std::size_t(-1), "Sprite.load F: file size = 0");
  // RAW данные с файла
  mem.data = new uint8_t[mem.size];
  file.read(rcast(char*, mem.data), mem.size);
  decode(mem, _offset, mode);
} // load from file
void Sprite::load(CN(Archive) arch, CN(a83::Str) fname, CN(Vec) _offset,
LightMode mode) {
  using namespace std;
  using namespace a83;
  IFERROR(fname.empty(), "Sprite.load A: file name is empty");
  a83::log("Sprite.load A: \"" + fname + "\"");
  auto mem = arch.get_file(fname);
  decode(mem, _offset, mode);
} // load from mem
void Sprite::decode(CN(data_t) mem, CN(Vec) _offset, LightMode mode) {
  using namespace a83;
  IFERROR(mem.empty(), "Sprite.decode: mem.empty");
  // декодирование:
  int x, y;
  int comp; // сколько цветовых каналов
  stbi_uc *decoded = nullptr;
  decoded = stbi_load_from_memory(rcast(stbi_uc*, mem.data), mem.size, &x, &y, &comp, STBI_rgb);
  IFERROR( !decoded, "Sprite.decode: image data is not decoded");
  mask.init(x, y);
  tex.init(x, y);
  // сконвертировать цвета
  int rgb_index = 0;
  for (int i = 0; i < x * y; ++i) {
    const stbi_uc R = decoded[rgb_index + 0];
    const stbi_uc G = decoded[rgb_index + 1];
    const stbi_uc B = decoded[rgb_index + 2];
    rgb_index += 3;
    // зелёный цвет уходит в маску
    Color mask_col = Color(Color::BLACK);
    Color tex_col;
    if (G > 246 && B <= 16 && R <= 16) {
      mask_col = Color::WHITE;
      tex_col = Color::BLACK;
    } else
      tex_col = desaturate_mid(R, G, B);
    mask.fast_set(i, mask_col);
    tex.fast_set(i, tex_col);
  } // for size
  stbi_image_free(decoded);
  offset = _offset;
  // создание маски освящения:
  make_light_mask(mask, Color::WHITE, mode);
} // decode