acid-drop

- Hacking the planet from a LilyGo T-Deck using custom firmware
git clone git://git.acid.vegas/acid-drop.git
Log | Files | Refs | Archive | README | LICENSE

lv_imgfont.c (3242B)

      1 /**
      2  * @file lv_imgfont.c
      3  *
      4  */
      5 
      6 /*********************
      7  *      INCLUDES
      8  *********************/
      9 #include "lv_imgfont.h"
     10 
     11 #if LV_USE_IMGFONT
     12 
     13 /*********************
     14  *      DEFINES
     15  *********************/
     16 #define LV_IMGFONT_PATH_MAX_LEN 64
     17 
     18 /**********************
     19  *      TYPEDEFS
     20  **********************/
     21 typedef struct {
     22     lv_font_t * font;
     23     lv_get_imgfont_path_cb_t path_cb;
     24     char path[LV_IMGFONT_PATH_MAX_LEN];
     25 } imgfont_dsc_t;
     26 
     27 /**********************
     28  *  STATIC PROTOTYPES
     29  **********************/
     30 static const uint8_t * imgfont_get_glyph_bitmap(const lv_font_t * font, uint32_t unicode);
     31 static bool imgfont_get_glyph_dsc(const lv_font_t * font, lv_font_glyph_dsc_t * dsc_out,
     32                                   uint32_t unicode, uint32_t unicode_next);
     33 
     34 /**********************
     35  *  STATIC VARIABLES
     36  **********************/
     37 
     38 /**********************
     39  * GLOBAL PROTOTYPES
     40  **********************/
     41 
     42 /**********************
     43  *      MACROS
     44  **********************/
     45 
     46 /**********************
     47  *   GLOBAL FUNCTIONS
     48  **********************/
     49 lv_font_t * lv_imgfont_create(uint16_t height, lv_get_imgfont_path_cb_t path_cb)
     50 {
     51     LV_ASSERT_MSG(LV_IMGFONT_PATH_MAX_LEN > sizeof(lv_img_dsc_t),
     52                   "LV_IMGFONT_PATH_MAX_LEN must be greater than sizeof(lv_img_dsc_t)");
     53 
     54     size_t size = sizeof(imgfont_dsc_t) + sizeof(lv_font_t);
     55     imgfont_dsc_t * dsc = (imgfont_dsc_t *)lv_mem_alloc(size);
     56     if(dsc == NULL) return NULL;
     57     lv_memset_00(dsc, size);
     58 
     59     dsc->font = (lv_font_t *)(((char *)dsc) + sizeof(imgfont_dsc_t));
     60     dsc->path_cb = path_cb;
     61 
     62     lv_font_t * font = dsc->font;
     63     font->dsc = dsc;
     64     font->get_glyph_dsc = imgfont_get_glyph_dsc;
     65     font->get_glyph_bitmap = imgfont_get_glyph_bitmap;
     66     font->subpx = LV_FONT_SUBPX_NONE;
     67     font->line_height = height;
     68     font->base_line = 0;
     69     font->underline_position = 0;
     70     font->underline_thickness = 0;
     71 
     72     return dsc->font;
     73 }
     74 
     75 void lv_imgfont_destroy(lv_font_t * font)
     76 {
     77     if(font == NULL) {
     78         return;
     79     }
     80 
     81     imgfont_dsc_t * dsc = (imgfont_dsc_t *)font->dsc;
     82     lv_mem_free(dsc);
     83 }
     84 
     85 /**********************
     86  *   STATIC FUNCTIONS
     87  **********************/
     88 
     89 static const uint8_t * imgfont_get_glyph_bitmap(const lv_font_t * font, uint32_t unicode)
     90 {
     91     LV_UNUSED(unicode);
     92     LV_ASSERT_NULL(font);
     93     imgfont_dsc_t * dsc = (imgfont_dsc_t *)font->dsc;
     94     return (uint8_t *)dsc->path;
     95 }
     96 
     97 static bool imgfont_get_glyph_dsc(const lv_font_t * font, lv_font_glyph_dsc_t * dsc_out,
     98                                   uint32_t unicode, uint32_t unicode_next)
     99 {
    100     LV_ASSERT_NULL(font);
    101 
    102     imgfont_dsc_t * dsc = (imgfont_dsc_t *)font->dsc;
    103     LV_ASSERT_NULL(dsc);
    104     if(dsc->path_cb == NULL) return false;
    105 
    106     if(!dsc->path_cb(dsc->font, dsc->path, LV_IMGFONT_PATH_MAX_LEN, unicode, unicode_next)) {
    107         return false;
    108     }
    109 
    110     lv_img_header_t header;
    111     if(lv_img_decoder_get_info(dsc->path, &header) != LV_RES_OK) {
    112         return false;
    113     }
    114 
    115     dsc_out->is_placeholder = 0;
    116     dsc_out->adv_w = header.w;
    117     dsc_out->box_w = header.w;
    118     dsc_out->box_h = header.h;
    119     dsc_out->bpp = LV_IMGFONT_BPP;   /* is image identifier */
    120     dsc_out->ofs_x = 0;
    121     dsc_out->ofs_y = 0;
    122 
    123     return true;
    124 }
    125 
    126 #endif /*LV_USE_IMGFONT*/