127 lines
3.2 KiB
C
127 lines
3.2 KiB
C
/**
|
|
* @file lv_imgfont.c
|
|
*
|
|
*/
|
|
|
|
/*********************
|
|
* INCLUDES
|
|
*********************/
|
|
#include "lv_imgfont.h"
|
|
|
|
#if LV_USE_IMGFONT
|
|
|
|
/*********************
|
|
* DEFINES
|
|
*********************/
|
|
#define LV_IMGFONT_PATH_MAX_LEN 64
|
|
|
|
/**********************
|
|
* TYPEDEFS
|
|
**********************/
|
|
typedef struct {
|
|
lv_font_t * font;
|
|
lv_get_imgfont_path_cb_t path_cb;
|
|
char path[LV_IMGFONT_PATH_MAX_LEN];
|
|
} imgfont_dsc_t;
|
|
|
|
/**********************
|
|
* STATIC PROTOTYPES
|
|
**********************/
|
|
static const uint8_t * imgfont_get_glyph_bitmap(const lv_font_t * font, uint32_t unicode);
|
|
static bool imgfont_get_glyph_dsc(const lv_font_t * font, lv_font_glyph_dsc_t * dsc_out,
|
|
uint32_t unicode, uint32_t unicode_next);
|
|
|
|
/**********************
|
|
* STATIC VARIABLES
|
|
**********************/
|
|
|
|
/**********************
|
|
* GLOBAL PROTOTYPES
|
|
**********************/
|
|
|
|
/**********************
|
|
* MACROS
|
|
**********************/
|
|
|
|
/**********************
|
|
* GLOBAL FUNCTIONS
|
|
**********************/
|
|
lv_font_t * lv_imgfont_create(uint16_t height, lv_get_imgfont_path_cb_t path_cb)
|
|
{
|
|
LV_ASSERT_MSG(LV_IMGFONT_PATH_MAX_LEN > sizeof(lv_img_dsc_t),
|
|
"LV_IMGFONT_PATH_MAX_LEN must be greater than sizeof(lv_img_dsc_t)");
|
|
|
|
size_t size = sizeof(imgfont_dsc_t) + sizeof(lv_font_t);
|
|
imgfont_dsc_t * dsc = (imgfont_dsc_t *)lv_mem_alloc(size);
|
|
if(dsc == NULL) return NULL;
|
|
lv_memset_00(dsc, size);
|
|
|
|
dsc->font = (lv_font_t *)(((char *)dsc) + sizeof(imgfont_dsc_t));
|
|
dsc->path_cb = path_cb;
|
|
|
|
lv_font_t * font = dsc->font;
|
|
font->dsc = dsc;
|
|
font->get_glyph_dsc = imgfont_get_glyph_dsc;
|
|
font->get_glyph_bitmap = imgfont_get_glyph_bitmap;
|
|
font->subpx = LV_FONT_SUBPX_NONE;
|
|
font->line_height = height;
|
|
font->base_line = 0;
|
|
font->underline_position = 0;
|
|
font->underline_thickness = 0;
|
|
|
|
return dsc->font;
|
|
}
|
|
|
|
void lv_imgfont_destroy(lv_font_t * font)
|
|
{
|
|
if(font == NULL) {
|
|
return;
|
|
}
|
|
|
|
imgfont_dsc_t * dsc = (imgfont_dsc_t *)font->dsc;
|
|
lv_mem_free(dsc);
|
|
}
|
|
|
|
/**********************
|
|
* STATIC FUNCTIONS
|
|
**********************/
|
|
|
|
static const uint8_t * imgfont_get_glyph_bitmap(const lv_font_t * font, uint32_t unicode)
|
|
{
|
|
LV_UNUSED(unicode);
|
|
LV_ASSERT_NULL(font);
|
|
imgfont_dsc_t * dsc = (imgfont_dsc_t *)font->dsc;
|
|
return (uint8_t *)dsc->path;
|
|
}
|
|
|
|
static bool imgfont_get_glyph_dsc(const lv_font_t * font, lv_font_glyph_dsc_t * dsc_out,
|
|
uint32_t unicode, uint32_t unicode_next)
|
|
{
|
|
LV_ASSERT_NULL(font);
|
|
|
|
imgfont_dsc_t * dsc = (imgfont_dsc_t *)font->dsc;
|
|
LV_ASSERT_NULL(dsc);
|
|
if(dsc->path_cb == NULL) return false;
|
|
|
|
if(!dsc->path_cb(dsc->font, dsc->path, LV_IMGFONT_PATH_MAX_LEN, unicode, unicode_next)) {
|
|
return false;
|
|
}
|
|
|
|
lv_img_header_t header;
|
|
if(lv_img_decoder_get_info(dsc->path, &header) != LV_RES_OK) {
|
|
return false;
|
|
}
|
|
|
|
dsc_out->is_placeholder = 0;
|
|
dsc_out->adv_w = header.w;
|
|
dsc_out->box_w = header.w;
|
|
dsc_out->box_h = header.h;
|
|
dsc_out->bpp = LV_IMGFONT_BPP; /* is image identifier */
|
|
dsc_out->ofs_x = 0;
|
|
dsc_out->ofs_y = 0;
|
|
|
|
return true;
|
|
}
|
|
|
|
#endif /*LV_USE_IMGFONT*/
|