summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorMichele Bini <michele.bini@gmail.com>2022-04-10 05:27:41 (GMT)
committerMichele Bini <michele.bini@gmail.com>2022-04-10 05:28:09 (GMT)
commit910a14a13151e5fc0d08364ed39368778bb3dd5d (patch)
tree1899690fd4087be715d669d00872d07a592c985a /src
parent0d18fd6474e989f262dd8744fb15ec8577193d51 (diff)
src/displayapp/fonts/neofont.c
Diffstat (limited to 'src')
-rw-r--r--src/displayapp/fonts/neofont.c464
1 files changed, 464 insertions, 0 deletions
diff --git a/src/displayapp/fonts/neofont.c b/src/displayapp/fonts/neofont.c
new file mode 100644
index 0000000..25fa3de
--- /dev/null
+++ b/src/displayapp/fonts/neofont.c
@@ -0,0 +1,464 @@
+#ifdef LV_LVGL_H_INCLUDE_SIMPLE
+#include "lvgl.h"
+#else
+#include "lvgl/lvgl.h"
+#endif
+
+
+#include <stdint.h>
+// #include <stdio.h>
+// #include <string.h>
+
+#define G( \
+ a,b,c, \
+ d,e,f, \
+ g,h,i, \
+ j,k,l, \
+ m,n,o \
+) \
+{ \
+ h + (g<<1) + (f<<2) + (e<<3) + (d << 4) + (c << 5) + (b << 6) + (a << 7), \
+ 0 + (o<<1) + (n<<2) + (m<<3) + (l << 4) + (k << 5) + (j << 6) + (i << 7) \
+}
+
+#define X 1
+#define _ 0
+
+static const uint8_t glyphs[][2] = {
+ G( _, X, _,
+ X, _, X,
+ X, _, X,
+ X, _, X,
+ _, X, _ ),
+
+ G( _, X, _,
+ X, X, _,
+ _, X, _,
+ _, X, _,
+ X, X, X ),
+
+ G( X, X, _,
+ _, _, X,
+ _, _, X,
+ _, X, _,
+ X, X, X ),
+
+ G( X, X, _,
+ _, _, X,
+ _, X, _,
+ _, _, X,
+ X, X, _ ),
+
+ G( _, _, X,
+ _, X, X,
+ X, _, X,
+ X, X, X,
+ _, _, X ),
+
+ G( X, X, X,
+ X, _, _,
+ X, X, _,
+ _, _, X,
+ X, X, _ ),
+
+ G( _, X, X,
+ X, _, _,
+ X, X, _,
+ X, _, X,
+ _, X, _ ),
+
+ G( X, X, X,
+ _, _, X,
+ _, _, X,
+ _, X, _,
+ _, X, _ ),
+
+ G( _, X, _,
+ X, _, X,
+ _, X, _,
+ X, _, X,
+ _, X, _ ),
+
+ G( _, X, _,
+ X, _, X,
+ _, X, X,
+ _, _, X,
+ X, X, _ ),
+
+ G( _, X, _,
+ X, _, X,
+ X, _, X,
+ X, X, X,
+ X, _, X ),
+
+ G( X, X, _,
+ X, _, X,
+ X, X, _,
+ X, _, X,
+ X, X, _ ),
+
+ G( _, X, X,
+ X, _, _,
+ X, _, _,
+ X, _, _,
+ _, X, X ),
+
+ G( X, X, _,
+ X, _, X,
+ X, _, X,
+ X, _, X,
+ X, X, _ ),
+
+ G( X, X, X,
+ X, _, _,
+ X, X, _,
+ X, _, _,
+ X, X, X ),
+
+ G( X, X, X,
+ X, _, _,
+ X, X, _,
+ X, _, _,
+ X, _, _ ),
+
+ G( _, X, X,
+ X, _, _,
+ X, _, _,
+ X, _, X,
+ _, X, X ),
+
+ G( X, _, X,
+ X, _, X,
+ X, X, X,
+ X, _, X,
+ X, _, X ),
+
+ G( X, X, X,
+ _, X, _,
+ _, X, _,
+ _, X, _,
+ X, X, X ),
+
+ G( X, X, X,
+ _, _, X,
+ _, _, X,
+ X, _, X,
+ _, X, _ ),
+
+ G( X, _, X,
+ X, _, X,
+ X, X, _,
+ X, _, X,
+ X, _, X ),
+
+ G( X, _, _,
+ X, _, _,
+ X, _, _,
+ X, _, _,
+ X, X, X ),
+
+ G( X, _, X,
+ X, X, X,
+ X, _, X,
+ X, _, X,
+ X, _, X ),
+
+ G( X, X, _,
+ X, _, X,
+ X, _, X,
+ X, _, X,
+ X, _, X ),
+
+ G( X, X, X,
+ X, _, X,
+ X, _, X,
+ X, _, X,
+ X, X, X ),
+
+ G( X, X, X,
+ X, _, X,
+ X, X, X,
+ X, _, _,
+ X, _, _ ),
+
+ G( _, X, _,
+ X, _, X,
+ X, _, X,
+ X, _, X,
+ _, X, X ),
+
+ G( X, X, _,
+ X, _, X,
+ X, X, _,
+ X, _, X,
+ X, _, X ),
+
+ G( _, X, X,
+ X, _, _,
+ _, X, _,
+ _, _, X,
+ X, X, _ ),
+
+ G( X, X, X,
+ _, X, _,
+ _, X, _,
+ _, X, _,
+ _, X, _ ),
+
+ G( X, _, X,
+ X, _, X,
+ X, _, X,
+ X, _, X,
+ X, X, X ),
+
+ G( X, _, X,
+ X, _, X,
+ X, _, X,
+ _, X, _,
+ _, X, _ ),
+
+ G( X, _, X,
+ X, _, X,
+ X, _, X,
+ X, X, X,
+ X, _, X ),
+
+ G( X, _, X,
+ X, _, X,
+ _, X, _,
+ X, _, X,
+ X, _, X ),
+
+ G( X, _, X,
+ X, _, X,
+ _, X, _,
+ _, X, _,
+ _, X, _ ),
+
+ G( X, X, X,
+ _, _, X,
+ _, X, _,
+ X, _, _,
+ X, X, X ),
+
+
+ G( _, _, _,
+ _, _, _,
+ X, X, X,
+ _, _, _,
+ _, _, _ ),
+
+
+ G( _, _, _,
+ _, _, X,
+ _, X, _,
+ X, _, _,
+ _, _, _ ),
+
+ G( _, _, _,
+ _, X, _,
+ _, _, _,
+ _, X, _,
+ _, _, _ ),
+
+ G( _, _, _,
+ _, _, _,
+ _, _, _,
+ _, X, _,
+ _, _, _ ),
+
+ G( _, _, _,
+ _, _, _,
+ _, _, _,
+ _, X, _,
+ X, _, _ ),
+
+ G( _, _, _,
+ _, _, _,
+ _, _, _,
+ _, _, _,
+ X, X, X ),
+
+ G( X, X, _,
+ _, _, X,
+ _, X, _,
+ _, _, _,
+ _, X, _ ),
+
+ G( _, X, _,
+ _, X, _,
+ _, X, _,
+ _, _, _,
+ _, X, _ ),
+
+ G( X, _, _,
+ _, _, X,
+ _, X, _,
+ X, _, _,
+ _, _, X ),
+
+ G( _, _, _,
+ _, X, _,
+ X, X, X,
+ _, X, _,
+ _, _, _ ),
+
+ G( _, X, _,
+ X, X, X,
+ _, X, _,
+ X, X, X,
+ _, X, _ ),
+
+ G( _, X, _,
+ X, _, X,
+ _, X, _,
+ _, _, _,
+ _, _, _ ),
+
+};
+
+#undef X
+#undef _
+#undef G
+
+// This could be inline to save a few bytes...
+/* Get the bitmap of `unicode_letter` from `font`. */
+static const uint8_t * neofont0_glyph_bitmap_cb(const lv_font_t * font, uint32_t unicode_letter)
+{
+ 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')+10];
+ }
+
+ 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[36+(x-symbols)];
+ }
+ }
+
+ if ((0xF0000 < unicode_letter) && (unicode_letter < 0xF7FFF)) {
+ custom[0] = unicode_letter;
+ custom[1] = (unicode_letter >> 7);
+ return custom;
+ }
+
+ switch (unicode_letter) {
+ case 0xB0:
+ return glyphs[sizeof(glyphs)/sizeof(glyphs[0])-1];
+ }
+
+ return glyphs[sizeof(glyphs)/sizeof(glyphs[0])-2];
+}
+
+static bool neofont15_glyph_dsc_cb(const lv_font_t * font, lv_font_glyph_dsc_t * dsc_out, uint32_t unicode_letter, uint32_t unicode_letter_next)
+{
+
+ dsc_out->adv_w = 12; /*Horizontal space required by the glyph in [px]*/
+ dsc_out->box_h = 15; /*Height of the bitmap in [px]*/
+ dsc_out->box_w = 9; /*Width of the bitmap in [px]*/
+ dsc_out->ofs_x = 1; /*X offset of the bitmap in [pf]*/
+ dsc_out->ofs_y = 0; /*Y offset of the bitmap measured from the as line*/
+ dsc_out->bpp = 1; /*Bits per pixel: 1/2/4/8*/
+
+ return true; /*true: glyph found; false: glyph was not found*/
+}
+
+/* Get the bitmap of `unicode_letter` from `font`. */
+static const uint8_t * neofont15_glyph_bitmap_cb(const lv_font_t * font, uint32_t unicode_letter)
+{
+ const uint8_t *u = neofont0_glyph_bitmap_cb(font, unicode_letter);
+ static uint8_t v[17];
+ uint8_t u0 = u[0];
+ uint8_t u1 = u[1];
+
+ uint8_t a,b,c, d,e,f, g,h,i, j,k,l, m,n,o;
+ a = (u0>>7)&1; u0 <<= 1;
+ b = (u0>>7)&1; u0 <<= 1;
+ c = (u0>>7)&1; u0 <<= 1;
+ d = (u0>>7)&1; u0 <<= 1;
+ e = (u0>>7)&1; u0 <<= 1;
+ f = (u0>>7)&1; u0 <<= 1;
+ g = (u0>>7)&1; u0 <<= 1;
+ h = (u0>>7)&1;
+ i = (u1>>7)&1; u1 <<= 1;
+ j = (u1>>7)&1; u1 <<= 1;
+ k = (u1>>7)&1; u1 <<= 1;
+ l = (u1>>7)&1; u1 <<= 1;
+ m = (u1>>7)&1; u1 <<= 1;
+ n = (u1>>7)&1; u1 <<= 1;
+ o = (u1>>7)&1;
+
+#define P(a,b,c,d, e,f,g,h) ((a<<7)|(b<<6)|(c<<5)|(d<<4)|(e<<3)|(f<<2)|(g<<1)|h)
+
+ v[0] = P(a,a,a,b,b,b,c,c);
+ v[1] = P(c,
+ a,a,a,b,b,b,c);
+ v[2] = P(c,c,
+ a,a,a,b,b,b);
+ v[3] = P(c,c,c,
+
+ d,d,d,e,e);
+ v[4] = P(e,f,f,f,
+ d,d,d,e);
+ v[5] = P(e,e,f,f,f,
+ d,d,d);
+ v[6] = P(e,e,e,f,f,f,
+
+ g,g);
+ v[7] = P(g,h,h,h,i,i,i,
+ g);
+ v[8] = P(g,g,h,h,h,i,i,i);
+ v[9] = P(g,g,g,h,h,h,i,i);
+ v[10] = P(i,
+
+ j,j,j,k,k,k,l);
+ v[11] = P(l,l,
+ j,j,j,k,k,k);
+ v[12] = P(l,l,l,
+ j,j,j,k,k);
+ v[13] = P(k,l,l,l,
+
+ m,m,m,n);
+ v[14] = P(n,n,o,o,o,
+ m,m,m);
+ v[15] = P(n,n,n,o,o,o,
+ m,m);
+ v[16] = P(m,n,n,n,o,o,o,0);
+
+#undef P
+
+ return v; /*Or NULL if not found*/
+}
+
+/*Describe the properties of a font*/
+lv_font_t neofont15 = {
+ .get_glyph_dsc = neofont15_glyph_dsc_cb, /*Set a callback to get info about gylphs*/
+ .get_glyph_bitmap = neofont15_glyph_bitmap_cb, /*Set a callback to get bitmap of a glyp*/
+ .line_height = 18, /*The real line height where any text fits*/
+ .base_line = 2,
+ .dsc = 0, /*Store any implementation specific data here*/
+#if !(LVGL_VERSION_MAJOR == 6 && LVGL_VERSION_MINOR == 0)
+ .subpx = LV_FONT_SUBPX_NONE,
+#endif
+#if LV_VERSION_CHECK(7, 4, 0) || LVGL_VERSION_MAJOR >= 8
+ .underline_position = 0,
+ .underline_thickness = 0,
+#endif
+ .user_data = 0 /*Optionally some extra user data*/
+};
+
+