
// font class library
#pragma once
#include <cstdint>

class font_t
{
public:
  /// \param height - pixel character height
  /// \param width  - pixel character width
  /// \param spacing - character to character spacing
  /// \param chars  - number of characters in character set
  /// \param data - constant data
  font_t(uint8_t const height, uint8_t const width,
         uint8_t const spacing, uint8_t const chars,
         char const *data) : m_height(height), m_width(width), m_spacing(spacing), m_chars(chars), m_data(data)
  {
  }

  virtual char
  getPixel(char c, int x, int y) = 0;

  // character width
  uint8_t
  width()
  {
    return m_width;
  }

  // character height
  uint8_t
  height()
  {
    return m_height;
  }

  uint8_t
  chars()
  {
    return m_chars;
  }

  uint8_t
  spacing()
  {
    return m_spacing;
  }

protected:
  /// @brief Pixel height
  uint8_t const m_height;
  /// @brief Bitmap width
  uint8_t const m_width;
  /// @brief Spacing between characters
  uint8_t const m_spacing;
  /// @brief Number of characters in the character set bit map
  uint8_t const m_chars;
  char const *m_data;
};

class font5x7_t : public font_t
{
public:
  // one byte of pixels per character row.
  font5x7_t(unsigned char_count, char const *data) : font_t(7, 5, 6, char_count, data){};

  char
  getPixel(char c, int x, int y) override;
};

class font10x18_t : public font_t
{
public:
  // XBM format
  font10x18_t(unsigned char_count, char const *data) : font_t(18, 10, 10, char_count, data){};

  char
  getPixel(char c, int x, int y) override;
};

// defined fonts
// original 5x7
extern font5x7_t small_font;

// lucida font
// in 10x18
extern font10x18_t large_font;
