#ifdef LV_LVGL_H_INCLUDE_SIMPLE #include "lvgl.h" #else #include "lvgl/lvgl.h" #endif #include // #include // #include #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, _, 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; } return glyphs[sizeof(glyphs)/sizeof(glyphs[0])-1]; } 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*/ const 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*/ };