
// 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:
  uint8_t const m_height;
  uint8_t const m_width;
  uint8_t const m_spacing;
  uint8_t const m_chars;
  char const *m_data;
};

class font5x7_t : public font_t
{
public:
  font5x7_t (char const *data) :
      font_t (7, 5, 6, 96, data)
  {
  }
  ;

  char
  getPixel (char c, int x, int y) override;

};

class font10x18_t : public font_t
{
public:
  font10x18_t (char const *data) :
      font_t (18, 10, 10, 96, 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;
