#include <Arduino.h>
#include "font5x7.h"

Font5x7 font5x7;

void Font5x7::Init()
{
  memset(m_Defn, 0, sizeof(m_Defn));
}

bool Font5x7::GetPixel(int Row, int Col)
{
  return bitRead(m_Defn[1 + Row], 4-Col) == 1;
}

#define NARROW  B10000000
#define DESCEND B01000000

prog_uint8_t kFont5x7[] PROGMEM =
{
  ':',
  B00000011 | NARROW,
  B00000100,
  B00001010,
  B00001000,
  B00001011,
  B00000100,
  B00000011,

  ')',
  B00010000,
  B00001000,
  B00010100,
  B00000100,
  B00010100,
  B00001000,
  B00010000,

  '!',
  B00001000 | NARROW,
  B00001000,
  B00001000,
  B00001000,
  B00001000,
  B00000000,
  B00001000,

  'A',
  B00001110,
  B00010001,
  B00010001,
  B00011111,
  B00010001,
  B00010001,
  B00010001,
  
  'B',
  B00011110,
  B00010001,
  B00010001,
  B00011111,
  B00010001,
  B00010001,
  B00011110,

  'C',
  B00001110,
  B00010001,
  B00010000,
  B00010000,
  B00010000,
  B00010001,
  B00001110,

  'D',
  B00011100,
  B00010010,
  B00010001,
  B00010001,
  B00010001,
  B00010010,
  B00011100,

  'E',
  B00011111,
  B00010000,
  B00010000,
  B00011110,
  B00010000,
  B00010000,
  B00011111,

  'F',
  B00011111,
  B00010000,
  B00010000,
  B00011110,
  B00010000,
  B00010000,
  B00010000,

  'G',
  B00001110,
  B00010001,
  B00010000,
  B00010111,
  B00010001,
  B00010001,
  B00001110,

  'H',
  B00010001,
  B00010001,
  B00010001,
  B00011111,
  B00010001,
  B00010001,
  B00010001,
  
  'I',
  B00001110,
  B00000100,
  B00000100,
  B00000100,
  B00000100,
  B00000100,
  B00001110,
  
  'J',
  B00000111,
  B00000010,
  B00000010,
  B00000010,
  B00000010,
  B00010010,
  B00001100,
  
  'K',
  B00010001,
  B00010010,
  B00010100,
  B00011000,
  B00010100,
  B00010010,
  B00010001,
  
  'L',
  B00010000,
  B00010000,
  B00010000,
  B00010000,
  B00010000,
  B00010000,
  B00011111,
  
  'M',
  B00010001,
  B00011011,
  B00010101,
  B00010101,
  B00010001,
  B00010001,
  B00010001,

  'N',
  B00010001,
  B00010001,
  B00011001,
  B00010101,
  B00010011,
  B00010001,
  B00010001,
  
  'O',
  B00001110,
  B00010001,
  B00010001,
  B00010001,
  B00010001,
  B00010001,
  B00001110,
  
  'P',
  B00011110,
  B00010001,
  B00010001,
  B00011110,
  B00010000,
  B00010000,
  B00010000,
  
  'Q',
  B00001110,
  B00010001,
  B00010001,
  B00010001,
  B00010101,
  B00010010,
  B00001101,

  'R',
  B00011110,
  B00010001,
  B00010001,
  B00011110,
  B00010100,
  B00010010,
  B00010001,
  
  'S',
  B00001110,
  B00010001,
  B00010000,
  B00001110,
  B00000001,
  B00010001,
  B00001110,
  
  'T',
  B00011111,
  B00000100,
  B00000100,
  B00000100,
  B00000100,
  B00000100,
  B00000100,
  
  'U',
  B00010001,
  B00010001,
  B00010001,
  B00010001,
  B00010001,
  B00010001,
  B00001110,

  'V',
  B00010001,
  B00010001,
  B00010001,
  B00010001,
  B00010001,
  B00001010,
  B00000100,
  
  'W',
  B00010001,
  B00010001,
  B00010001,
  B00010101,
  B00010101,
  B00011011,
  B00010001,
  
  'X',
  B00010001,
  B00010001,
  B00001010,
  B00000100,
  B00001010,
  B00010001,
  B00010001,
  
  'Y',
  B00010001,
  B00010001,
  B00001010,
  B00000100,
  B00000100,
  B00000100,
  B00000100,
  
  'Z',
  B00011111,
  B00000001,
  B00000010,
  B00000100,
  B00001000,
  B00010000,
  B00011111,
  
  '-',
  B00000000,
  B00000000,
  B00000000,
  B00000000,
  B00011111,
  B00000000,
  B00000000,
  
  ' ',
  B00000000,
  B00000000,
  B00000000,
  B00000000,
  B00000000,
  B00000000,
  B00000000,

  '\'',
  B00001100 | NARROW,
  B00000100,
  B00001000,
  B00000000,
  B0000000,
  B00000000,
  B00000000,
  
  'a',
  B00000000,
  B00000000,
  B00011110,
  B00000001,
  B00001111,
  B00010001,
  B00001110,
  
  'b',
  B00010000,
  B00010000,
  B00011110,
  B00010001,
  B00010001,
  B00010001,
  B00011110,

  'c',
  B00000000,
  B00000000,
  B00001111,
  B00010000,
  B00010000,
  B00010000,
  B00001111,

  'd',
  B00000001,
  B00000001,
  B00001111,
  B00010001,
  B00010001,
  B00010001,
  B00001111,
  
  'e',
  B00000000,
  B00000000,
  B00001110,
  B00010001,
  B00011110,
  B00010000,
  B00001111,
  'f',
  B00000110 | NARROW,
  B00001000,
  B00001000,
  B00011110,
  B00001000,
  B00001000,
  B00001000,
  
  'g',
  B00000000 | DESCEND,
  B00001111,
  B00010001,
  B00001111,
  B00000001,
  B00010001,
  B00001110,
  
  'h',
  B00010000 | NARROW,
  B00010000,
  B00011100,
  B00010010,
  B00010010,
  B00010010,
  B00010010,
  
  'i',
  B00000100 | NARROW,
  B00000000,
  B00001100,
  B00000100,
  B00000100,
  B00000100,
  B00001110,

  'j',
  B00000100 | NARROW | DESCEND,
  B00000000,
  B00001100,
  B00000100,
  B00000100,
  B00000100,
  B00011000,

  'k',
  B00010000 | NARROW,
  B00010000,
  B00010010,
  B00010100,
  B00011000,
  B00010100,
  B00010010,

  'l',
  B00001000 | NARROW,
  B00001000,
  B00001000,
  B00001000,
  B00001000,
  B00001000,
  B00000100,

  'm',
  B00000000,
  B00000000,
  B00011010,
  B00010101,
  B00010101,
  B00010101,
  B00010101,
  
  'n',
  B00000000 | NARROW,
  B00000000,
  B00011100,
  B00010010,
  B00010010,
  B00010010,
  B00010010,

  'o',
  B00000000,
  B00000000,
  B00001110,
  B00010001,
  B00010001,
  B00010001,
  B00001110,

  'p',
  B00000000 | NARROW | DESCEND,
  B00011100,
  B00010010,
  B00011100,
  B00010000,
  B00010000,
  B00010000,

  'q',
  B00000000 | DESCEND,
  B00001110,
  B00010010,
  B00001110,
  B00000010,
  B00000010,
  B00000011,

  'r',
  B00000000 | NARROW,
  B00000000,
  B00011100,
  B00010010,
  B00010000,
  B00010000,
  B00010000,

  's',
  B00000000,
  B00000000,
  B00000111,
  B00001000,
  B00000110,
  B00000001,
  B00001110,

  't',
  B00001000 | NARROW,
  B00001000,
  B00011110,
  B00001000,
  B00001000,
  B00001000,
  B00000110,
  
  'u',
  B00000000 | NARROW,
  B00000000,
  B00010010,
  B00010010,
  B00010010,
  B00010010,
  B00001110,

  'v',
  B00000000,
  B00000000,
  B00010001,
  B00010001,
  B00010001,
  B00001010,
  B00000100,

  'w',
  B00000000,
  B00000000,
  B00010101,
  B00010101,
  B00010101,
  B00010101,
  B00001011,

  'x',
  B00000000,
  B00000000,
  B00010001,
  B00001010,
  B00000100,
  B00001010,
  B00010001,

  'y',
  B00000000 | NARROW | DESCEND,
  B00010010,
  B00010010,
  B00001110,
  B00000010,
  B00010010,
  B00001100,

  'z',
  B00000000,
  B00000000,
  B00011111,
  B00000010,
  B00000100,
  B00001000,
  B00011111,

  
  '\0',
};

bool Font5x7::Load(char Char, bool& Drop, bool& Narrow)
{
  int Idx = 0;
  bool Found = false;
  Drop = false;
  Narrow = false;
  do
  {
    byte Ch = pgm_read_byte_near(kFont5x7 + Idx);
    if (Ch == Char)
    {
      m_Defn[0] = Ch;
      for (int Row = 1; Row < 8; Row++)
        m_Defn[Row] = pgm_read_byte_near(kFont5x7 + Idx + Row);
      Found = true;
      Drop   = m_Defn[1] & DESCEND;
      Narrow = m_Defn[1] & NARROW;
      break;
    }
    else if (Ch)
    {
      Idx += 8;
    }
    else
    {
      m_Defn[0] = Char;
      for (int Row = 1; Row < 8; Row++)
        m_Defn[Row] = 0;
      break;
    }
  } while (true);
  return Found;
}


