#pragma once
#include "font.hpp"
#include "image/image.hpp"
#include "a83/log.hpp"
//! стандартный тип шрифтов
class FontStd: public FontBase {
public:
  FontStd(): FontBase() {}
  ~FontStd() { FontBase::free(); }
  template <blend_pf f> void make_print(Image& dst, int x, int y,
  CN(a83::Str) text, bool black_gr = false, int /*wnd_x*/ = 0,
  int /*wnd_y*/ = 0) const {
    // рисуем чёрный прямоугольник туда, где будет текст:
    if (black_gr)
      dst.draw_rect_filled(x - 1, y - 1,
        int(text.length()) * (char_x + space_x) + 1,
        char_y + 2, Color(Color::BLACK));
    int posx = x;
    int posy = y;
    for (std::size_t i = 0; i < text.size(); ++i) {
      const char ch = text[i];
      if (ch == '\n') {
        posy += char_y + space_y;
        posx = x;
        continue;
      }
      get(ch).make_print<f>(posx, posy, dst);
      posx += char_x + space_x;
    } // for text size
  } // print
  #define PRINT_SUFFIX (Image& dst, int x, int y, CN(a83::Str) text, bool black_gr = false, int wnd_x = 0, int wnd_y = 0) const override
  void print PRINT_SUFFIX { make_print<blend_or>(dst, x,y, text, black_gr, wnd_x, wnd_y); }
  void print_past PRINT_SUFFIX { make_print<blend_past>(dst, x,y, text, black_gr, wnd_x, wnd_y); }
  void print_diff PRINT_SUFFIX { make_print<blend_diff>(dst, x,y, text, black_gr, wnd_x, wnd_y); }
  #undef PRINT_SUFFIX
};
//! грузит файл шрифтов из архива
void load_font_table(FontBase& font, CN(Archive) arch, CN(a83::Str) fname,
int size_x, int size_y, int space, int col, int row) {
  a83::log("loading table font");
  Image img(arch, fname); // картинка с таблицей шрифтов
  font.init();
  font.char_x = size_x;
  font.char_y = size_y;
  font.space_x = font.space_y = space;
  uint8_t ch = 0;
  for (int c = 0; c < col; ++c)
  for (int r = 0; r < row; ++r) {
    cauto sx = c * size_x + space * c;
    cauto sy = r * size_y + space * r;
    img.fast_cut(sx, sy, size_x, size_y, font.get_addr(ch++));
  } // for col row
} // load_font_table