diff options
| -rw-r--r-- | src/displayapp/fonts/neofont.c | 409 |
1 files changed, 316 insertions, 93 deletions
diff --git a/src/displayapp/fonts/neofont.c b/src/displayapp/fonts/neofont.c index a3adde4..de6381b 100644 --- a/src/displayapp/fonts/neofont.c +++ b/src/displayapp/fonts/neofont.c @@ -21,220 +21,431 @@ 0 + (o<<1) + (n<<2) + (m<<3) + (l << 4) + (k << 5) + (j << 6) + (i << 7) \ } +#define NEOFONT_SET_CHAR(lhs, \ + a,b,c, \ + d,e,f, \ + g,h,i, \ + j,k,l, \ + m,n,o \ +) \ +do { \ + (lhs)[0] = h + (g<<1) + (f<<2) + (e<<3) + (d << 4) + (c << 5) + (b << 6) + (a << 7); \ + (lhs)[1] = 0 + (o<<1) + (n<<2) + (m<<3) + (l << 4) + (k << 5) + (j << 6) + (i << 7); \ +} while(0) + #define X 1 #define _ 0 -static const uint8_t glyphs[][2] = { +// https://en.wikipedia.org/wiki/ASCII#Printable_characters +static const uint8_t glyphs[96][2] = { + // ASCII 0x20 [space] + G( _, _, _, + _, _, _, + _, _, _, + _, _, _, + _, _, _ ), + + // ASCII 0x21 {!} + G( _, X, _, + _, X, _, + _, X, _, + _, _, _, + _, X, _ ), + + // ASCII 0x22 {"} + G( X, _, X, + X, _, X, + _, _, _, + _, _, _, + _, _, _ ), + + // ASCII 0x23 {#} + G( X, _, X, + X, X, X, + X, _, X, + X, X, X, + X, _, X ), + + // ASCII 0x24 {$} + G( _, X, X, + X, X, _, + _, X, _, + _, X, X, + X, X, _ ), + + // ASCII 0x25 {%} + G( X, _, _, + _, _, X, + _, X, _, + X, _, _, + _, _, X ), + + // ASCII 0x26 {&} + G( _, X, _, + X, _, _, + X, X, X, + X, X, _, + _, X, X ), + + // ASCII 0x27 {'} + G( _, X, _, + _, X, _, + _, _, _, + _, _, _, + _, _, _ ), + + // ASCII 0x28 "(" + G( _, _, X, + _, X, _, + _, X, _, + _, X, _, + _, _, X ), + + // ASCII 0x29 ")" + G( X, _, _, + _, X, _, + _, X, _, + _, X, _, + X, _, _ ), + + // ASCII 0x2A "*" + G( X, _, X, + _, X, _, + X, _, X, + _, _, _, + _, _, _ ), + + // ASCII 0x2B "+" + G( _, _, _, + _, X, _, + X, X, X, + _, X, _, + _, _, _ ), + + // ASCII 0x2C "," + G( _, _, _, + _, _, _, + _, _, _, + _, X, _, + X, _, _ ), + + // ASCII 0x2D "-" + G( _, _, _, + _, _, _, + X, X, X, + _, _, _, + _, _, _ ), + + + // ASCII 0x2E "." + G( _, _, _, + _, _, _, + _, _, _, + _, X, _, + _, _, _ ), + + // ASCII 0x2F "/" + G( _, _, _, + _, _, X, + _, X, _, + X, _, _, + _, _, _ ), + + // ASCII 0x30 "0" G( _, X, _, X, _, X, X, _, X, X, _, X, _, X, _ ), + // ASCII 0x31 "1" G( _, X, _, X, X, _, _, X, _, _, X, _, X, X, X ), + // ASCII 0x32 "2" G( X, X, _, _, _, X, _, _, X, _, X, _, X, X, X ), + // ASCII 0x33 "3" G( X, X, _, _, _, X, _, X, _, _, _, X, X, X, _ ), + // ASCII 0x34 "4" G( _, _, X, _, X, X, X, _, X, X, X, X, _, _, X ), + // ASCII 0x35 "5" G( X, X, X, X, _, _, X, X, _, _, _, X, X, X, _ ), + // ASCII 0x36 "6" G( _, X, X, X, _, _, X, X, _, X, _, X, _, X, _ ), + // ASCII 0x37 "7" G( X, X, X, _, _, X, _, _, X, _, X, _, _, X, _ ), + // ASCII 0x38 "8" G( _, X, _, X, _, X, _, X, _, X, _, X, _, X, _ ), + // ASCII 0x39 "9" G( _, X, _, X, _, X, _, X, X, _, _, X, X, X, _ ), + // ASCII 0x3A ":" + G( _, _, _, + _, X, _, + _, _, _, + _, X, _, + _, _, _ ), + + // ASCII 0x3B ";" + G( _, _, _, + _, X, _, + _, _, _, + _, X, _, + X, _, _ ), + + // ASCII 0x3C "<" + G( _, _, X, + _, X, _, + X, _, _, + _, X, _, + _, _, X ), + + // ASCII 0x3D "=" + G( _, _, _, + X, X, X, + _, _, _, + X, X, X, + _, _, _ ), + + // ASCII 0x3E ">" + G( X, _, _, + _, X, _, + _, _, X, + _, X, _, + X, _, _ ), + + // ASCII 0x3F "?" + G( X, X, _, + _, _, X, + _, X, _, + _, _, _, + _, X, _ ), + + // ASCII 0x40 "@" + G( _, X, _, + X, _, X, + X, _, X, + X, _, _, + _, X, X ), + + // ASCII 0x41 "A" G( _, X, _, X, _, X, X, _, X, X, X, X, X, _, X ), + // ASCII 0x42 "B" G( X, X, _, X, _, X, X, X, _, X, _, X, X, X, _ ), + // ASCII 0x43 "C" G( _, X, X, X, _, _, X, _, _, X, _, _, _, X, X ), + // ASCII 0x44 "D" G( X, X, _, X, _, X, X, _, X, X, _, X, X, X, _ ), + // ASCII 0x45 "E" G( X, X, X, X, _, _, X, X, _, X, _, _, X, X, X ), + // ASCII 0x46 "F" G( X, X, X, X, _, _, - X, X, _, + X, X, X, X, _, _, X, _, _ ), + // ASCII 0x47 "G" G( _, X, X, X, _, _, X, _, _, X, _, X, _, X, X ), + // ASCII 0x48 "H" G( X, _, X, X, _, X, X, X, X, X, _, X, X, _, X ), + // ASCII 0x49 "I" G( X, X, X, _, X, _, _, X, _, _, X, _, X, X, X ), + // ASCII 0x4A "J" G( X, X, X, _, _, X, _, _, X, X, _, X, _, X, _ ), + // ASCII 0x4B "K" G( X, _, X, X, _, X, X, X, _, X, _, X, X, _, X ), + // ASCII 0x4C "L" G( X, _, _, X, _, _, X, _, _, X, _, _, X, X, X ), + // ASCII 0x4D "M" G( X, _, X, X, X, X, X, _, X, X, _, X, X, _, X ), + // ASCII 0x4E "N" G( X, X, _, X, _, X, X, _, X, X, _, X, X, _, X ), + // ASCII 0x4F "O" G( X, X, X, X, _, X, X, _, X, X, _, X, X, X, X ), + // ASCII 0x50 "P" G( X, X, X, X, _, X, X, X, X, X, _, _, X, _, _ ), + // ASCII 0x51 "Q" G( _, X, _, X, _, X, X, _, X, X, _, X, _, X, X ), + // ASCII 0x52 "R" G( X, X, _, X, _, X, X, X, _, X, _, X, X, _, X ), + // ASCII 0x53 "S" G( _, X, X, X, _, _, _, X, _, _, _, X, X, X, _ ), + // ASCII 0x54 "T" G( X, X, X, _, X, _, _, X, _, _, X, _, _, X, _ ), + // ASCII 0x55 "U" G( X, _, X, X, _, X, X, _, X, X, _, X, X, X, X ), + // ASCII 0x56 "V" G( X, _, X, X, _, X, X, _, X, _, X, _, _, X, _ ), + // ASCII 0x57 "W" G( X, _, X, X, _, X, X, X, X, X, X, X, X, _, X ), + // ASCII 0x58 "X" G( X, _, X, X, _, X, _, X, _, X, _, X, X, _, X ), + // ASCII 0x59 "Y" G( X, _, X, X, _, X, _, X, _, _, X, _, _, X, _ ), + // ASCII 0x5A "Z" G( X, X, X, _, _, X, _, X, _, @@ -242,156 +453,224 @@ static const uint8_t glyphs[][2] = { X, X, X ), + // ASCII 0x5B "[" + G( _, X, X, + _, X, _, + _, X, _, + _, X, _, + _, X, X ), + + // ASCII 0x5B {\} + G( _, _, _, + X, _, _, + _, X, _, + _, _, X, + _, _, _ ), + + // ASCII 0x5D "]" + G( X, X, _, + _, X, _, + _, X, _, + _, X, _, + X, X, _ ), + + // ASCII 0x5E {^} + G( _, X, _, + X, _, X, + _, _, _, + _, _, _, + _, _, _ ), + + // ASCII 0x5F {_} + G( _, _, _, + _, _, _, + _, _, _, + _, _, _, + X, X, X ), + + // ASCII 0x60 {`} + G( _, X, _, + _, _, X, + _, _, _, + _, _, _, + _, _, _ ), + + // ASCII 0x61 "a" G( _, _, _, X, X, _, _, X, X, X, _, X, _, X, X ), + // ASCII 0x62 "b" G( X, _, _, X, X, _, X, _, X, X, _, X, X, X, _ ), + // ASCII 0x63 "c" G( _, _, _, _, X, X, X, _, _, X, _, _, _, X, X ), + // ASCII 0x64 "d" G( _, _, X, _, X, X, X, _, X, X, _, X, _, X, X ), + // ASCII 0x65 "e" G( _, _, _, _, X, _, X, _, X, X, X, _, _, X, X ), + // ASCII 0x66 "f" G( _, _, X, _, X, _, X, X, X, _, X, _, _, X, _ ), + // ASCII 0x67 "g" G( _, _, _, X, X, X, X, _, X, _, X, X, X, X, X ), + // ASCII 0x68 "h" G( X, _, _, X, _, _, X, X, _, X, _, X, X, _, X ), + // ASCII 0x69 "i" G( _, X, _, _, _, _, _, X, _, _, X, _, X, X, X ), + // ASCII 0x6A "j" G( _, X, _, _, _, _, _, X, _, _, X, _, X, _, _ ), + // ASCII 0x6B "k" G( X, _, _, X, _, X, X, X, _, X, X, _, X, _, X ), + // ASCII 0x6C "l" G( X, X, _, _, X, _, _, X, _, _, X, _, _, X, X ), + // ASCII 0x6D "m" G( _, _, _, X, X, _, X, X, X, X, X, X, X, _, X ), + // ASCII 0x6E "n" G( _, _, _, X, X, _, X, _, X, X, _, X, X, _, X ), + // ASCII 0x6F "o" G( _, _, _, X, X, X, X, _, X, X, _, X, X, X, X ), + // ASCII 0x70 "p" G( _, _, _, X, X, _, X, _, X, X, X, _, X, _, _ ), + // ASCII 0x71 "q" G( _, _, _, _, X, X, X, _, X, _, X, X, _, _, X ), + // ASCII 0x72 "r" G( _, _, _, X, _, X, X, X, _, X, _, _, X, _, _ ), + // ASCII 0x73 "s" G( _, _, _, _, X, X, X, _, _, _, X, X, X, X, _ ), + // ASCII 0x74 "t" G( _, X, _, X, X, X, _, X, _, _, X, _, _, X, _ ), + // ASCII 0x75 "u" G( _, _, _, X, _, X, X, _, X, X, _, X, X, X, X ), + // ASCII 0x76 "v" G( _, _, _, X, _, X, X, _, X, _, X, _, _, X, _ ), + // ASCII 0x77 "w" G( _, _, _, X, _, X, X, _, X, X, X, X, X, X, X ), + // ASCII 0x78 "x" G( _, _, _, X, _, X, _, X, _, _, X, _, X, _, X ), + // ASCII 0x79 "y" G( _, _, _, X, _, X, X, X, X, _, _, X, X, X, _ ), + // ASCII 0x7A "z" G( _, _, _, X, X, X, _, X, _, @@ -399,87 +678,50 @@ static const uint8_t glyphs[][2] = { X, X, X ), - G( _, X, _, - _, X, _, - _, X, _, - _, X, _, - _, X, _ ), - - G( _, _, _, - _, _, _, - X, X, X, - _, _, _, - _, _, _ ), - - - G( _, _, _, - _, _, X, - _, X, _, - X, _, _, - _, _, _ ), - - G( _, _, _, - _, X, _, - _, _, _, - _, X, _, - _, _, _ ), - - G( _, _, _, - _, _, _, - _, _, _, - _, X, _, - _, _, _ ), - - G( _, _, _, - _, _, _, - _, _, _, + // ASCII 0x7B "{" + G( _, X, X, _, X, _, - X, _, _ ), - - G( _, _, _, - _, _, _, - _, _, _, - _, _, _, - X, X, X ), - - G( X, X, _, _, _, X, _, X, _, - _, _, _, - _, X, _ ), + _, X, X ), + // ASCII 0x7C {|} G( _, X, _, _, X, _, _, X, _, - _, _, _, + _, X, _, _, X, _ ), - G( X, _, _, - _, _, X, + // ASCII 0x7D "]" + G( X, X, _, _, X, _, X, _, _, - _, _, X ), + _, X, _, + X, X, _ ), + // ASCII 0x7E "~" G( _, _, _, - _, X, _, + _, _, X, X, X, X, - _, X, _, + X, _, _, _, _, _ ), - - G( _, X, _, - X, X, X, - _, X, _, - X, X, X, - _, X, _ ), - + + // Degree symbol G( _, X, _, X, _, X, _, X, _, _, _, _, - _, _, _ ), + _, _, _ ) }; +#define NEOFONT_SET_CHAR_UNKNOWN(lhs) NEOFONT_SET_CHAR(lhs, \ + 0, 1, 0, \ + 1, 1, 1, \ + 0, 1, 0, \ + 1, 1, 1, \ + 0, 1, 0 ) + #undef X #undef _ #undef G @@ -510,48 +752,29 @@ static const uint8_t * neofont0mono_glyph_bitmap_cb(const lv_font_t * font, uint { if (unicode_letter < 0x20) return NULL; - static const uint8_t spc[] = { 0, 0 }; - static uint8_t custom[2]; - /* Your code here */ - // /* The bitmap should be a continuous bitstream where // * each pixel is represented by `bpp` bits */ - if ('0' <= unicode_letter && unicode_letter <= '9') { - return glyphs[(unicode_letter - '0')]; - } - if ('A' <= unicode_letter && unicode_letter <= 'Z') { - return glyphs[(unicode_letter - 'A')+10]; - } - if ('a' <= unicode_letter && unicode_letter <= 'z') { - return glyphs[(unicode_letter - 'a')+36]; - } - - if (unicode_letter == ' ') { return spc; } - static const char *symbols = "|-/:.,_?!%+#"; - if (unicode_letter < 0x80) { - char*x = strchr(symbols,((uint8_t)unicode_letter)); - if (x != NULL) { - return glyphs[62+(x-symbols)]; - } + if (' ' <= unicode_letter && unicode_letter <= '~') { + return glyphs[(unicode_letter - ' ')]; } - switch (unicode_letter) { - case 0xB0: - return glyphs[sizeof(glyphs)/sizeof(glyphs[0])-1]; - } + static uint8_t custom[2]; -#define NEOFONT_LOWERCASE_I (0xF0000 + (1 << 0) + (1 << 6) + (1 << 9) + (1 << 12)) - - if ((0xF0000 < unicode_letter) && (unicode_letter < 0xF7FFF)) { + if (unicode_letter == 0xB0) { + // Degree symbol + return glyphs[sizeof(glyphs)/sizeof(glyphs[0])-1]; + } else if ((0xF0000 < unicode_letter) && (unicode_letter < 0xF7FFF)) { custom[0] = unicode_letter; custom[1] = (unicode_letter >> 7); - return custom; - } - - return glyphs[sizeof(glyphs)/sizeof(glyphs[0])-2]; + } else { + NEOFONT_SET_CHAR_UNKNOWN(custom); + } + return custom; } +#define NEOFONT_LOWERCASE_I (0xF0000 + (1 << 0) + (1 << 6) + (1 << 9) + (1 << 12)) + lv_font_t neofont0mono = { .get_glyph_dsc = neofont0mono_glyph_dsc_cb, /*Set a callback to get info about gylphs*/ .get_glyph_bitmap = neofont0mono_glyph_bitmap_cb, /*Set a callback to get bitmap of a glyp*/ |
