diff --git a/docs/libs/tiny_ttf.rst b/docs/libs/tiny_ttf.rst index c2b6ace6c..573ca2bab 100644 --- a/docs/libs/tiny_ttf.rst +++ b/docs/libs/tiny_ttf.rst @@ -9,7 +9,7 @@ Allow using TrueType fonts LVGL. Based on https://github.com/nothings/stb When enabled in ``lv_conf.h`` with :c:macro:`LV_USE_TINY_TTF` -:c:expr:`lv_tiny_ttf_create_data(data, data_size, line_height)` can be used to +:c:expr:`lv_tiny_ttf_create_data(data, data_size, font_size)` can be used to create a TTF font instance at the specified line height. You can then use that font anywhere :c:struct:`lv_font_t` is accepted. @@ -17,17 +17,17 @@ By default, the TTF or OTF file must be embedded as an array, either in a header, or loaded into RAM in order to function. However, if :c:macro:`LV_TINY_TTF_FILE_SUPPORT` is enabled, -:c:expr:`lv_tiny_ttf_create_file(path, line_height)` will also be available, +:c:expr:`lv_tiny_ttf_create_file(path, font_size)` will also be available, allowing tiny_ttf to stream from a file. The file must remain open the entire time the font is being used. -After a font is created, you can change the size by using -:c:expr:`lv_tiny_ttf_set_size(font, line_height)`. +After a font is created, you can change the font size in pixels by using +:c:expr:`lv_tiny_ttf_set_size(font, font_size)`. By default, a font will use up to 4KB of cache to speed up rendering glyphs. This maximum can be changed by using -:c:expr:`lv_tiny_ttf_create_data_ex(data, data_size, line_height, cache_size)` -or :c:expr:`lv_tiny_ttf_create_file_ex(path, line_height, cache_size)` (when +:c:expr:`lv_tiny_ttf_create_data_ex(data, data_size, font_size, cache_size)` +or :c:expr:`lv_tiny_ttf_create_file_ex(path, font_size, cache_size)` (when available). The cache size is indicated in bytes. Example @@ -35,11 +35,9 @@ Example .. include:: ../examples/libs/tiny_ttf/index.rst - API --- :ref:`stb_rect_pack` :ref:`stb_truetype_htcw` - diff --git a/src/libs/tiny_ttf/lv_tiny_ttf.c b/src/libs/tiny_ttf/lv_tiny_ttf.c index 4229135ab..8959b4608 100644 --- a/src/libs/tiny_ttf/lv_tiny_ttf.c +++ b/src/libs/tiny_ttf/lv_tiny_ttf.c @@ -174,12 +174,12 @@ static const uint8_t * ttf_get_glyph_bitmap_cb(const lv_font_t * font, uint32_t return buffer; /*Or NULL if not found*/ } -static lv_font_t * lv_tiny_ttf_create(const char * path, const void * data, size_t data_size, lv_coord_t line_height, +static lv_font_t * lv_tiny_ttf_create(const char * path, const void * data, size_t data_size, lv_coord_t font_size, size_t cache_size) { LV_UNUSED(data_size); LV_UNUSED(cache_size); - if((path == NULL && data == NULL) || 0 >= line_height) { + if((path == NULL && data == NULL) || 0 >= font_size) { LV_LOG_ERROR("tiny_ttf: invalid argument\n"); return NULL; } @@ -217,57 +217,51 @@ static lv_font_t * lv_tiny_ttf_create(const char * path, const void * data, size LV_LOG_ERROR("tiny_ttf: init failed\n"); return NULL; } - #endif - float scale = stbtt_ScaleForPixelHeight(&dsc->info, line_height); lv_font_t * out_font = (lv_font_t *)TTF_MALLOC(sizeof(lv_font_t)); if(out_font == NULL) { TTF_FREE(dsc); LV_LOG_ERROR("tiny_ttf: out of memory\n"); return NULL; } - out_font->line_height = line_height; - out_font->fallback = NULL; - out_font->dsc = dsc; - int line_gap; - stbtt_GetFontVMetrics(&dsc->info, &dsc->ascent, &dsc->descent, &line_gap); - dsc->scale = scale; - out_font->base_line = line_height - (lv_coord_t)(dsc->ascent * scale); - out_font->underline_position = (uint8_t)line_height - dsc->descent; - out_font->underline_thickness = 0; - out_font->subpx = 0; + lv_memzero(out_font, sizeof(lv_font_t)); out_font->get_glyph_dsc = ttf_get_glyph_dsc_cb; out_font->get_glyph_bitmap = ttf_get_glyph_bitmap_cb; + out_font->dsc = dsc; + lv_tiny_ttf_set_size(out_font, font_size); return out_font; } #if LV_TINY_TTF_FILE_SUPPORT != 0 -lv_font_t * lv_tiny_ttf_create_file_ex(const char * path, lv_coord_t line_height, size_t cache_size) +lv_font_t * lv_tiny_ttf_create_file_ex(const char * path, lv_coord_t font_size, size_t cache_size) { - return lv_tiny_ttf_create(path, NULL, 0, line_height, cache_size); + return lv_tiny_ttf_create(path, NULL, 0, font_size, cache_size); } -lv_font_t * lv_tiny_ttf_create_file(const char * path, lv_coord_t line_height) +lv_font_t * lv_tiny_ttf_create_file(const char * path, lv_coord_t font_size) { - return lv_tiny_ttf_create(path, NULL, 0, line_height, 0); + return lv_tiny_ttf_create(path, NULL, 0, font_size, 0); } #endif -lv_font_t * lv_tiny_ttf_create_data_ex(const void * data, size_t data_size, lv_coord_t line_height, size_t cache_size) +lv_font_t * lv_tiny_ttf_create_data_ex(const void * data, size_t data_size, lv_coord_t font_size, size_t cache_size) { - return lv_tiny_ttf_create(NULL, data, data_size, line_height, cache_size); + return lv_tiny_ttf_create(NULL, data, data_size, font_size, cache_size); } -lv_font_t * lv_tiny_ttf_create_data(const void * data, size_t data_size, lv_coord_t line_height) +lv_font_t * lv_tiny_ttf_create_data(const void * data, size_t data_size, lv_coord_t font_size) { - return lv_tiny_ttf_create(NULL, data, data_size, line_height, 0); + return lv_tiny_ttf_create(NULL, data, data_size, font_size, 0); } -void lv_tiny_ttf_set_size(lv_font_t * font, lv_coord_t line_height) +void lv_tiny_ttf_set_size(lv_font_t * font, lv_coord_t font_size) { - ttf_font_desc_t * dsc = (ttf_font_desc_t *)font->dsc; - if(line_height > 0) { - font->line_height = line_height; - dsc->scale = stbtt_ScaleForPixelHeight(&dsc->info, line_height); - font->base_line = line_height - (lv_coord_t)(dsc->ascent * dsc->scale); - font->underline_position = (uint8_t)line_height - dsc->descent; + if(font_size <= 0) { + LV_LOG_ERROR("invalid font size: %d", font_size); + return; } + ttf_font_desc_t * dsc = (ttf_font_desc_t *)font->dsc; + dsc->scale = stbtt_ScaleForMappingEmToPixels(&dsc->info, font_size); + int line_gap = 0; + stbtt_GetFontVMetrics(&dsc->info, &dsc->ascent, &dsc->descent, &line_gap); + font->line_height = (lv_coord_t)(dsc->scale * (dsc->ascent - dsc->descent + line_gap)); + font->base_line = (lv_coord_t)(dsc->scale * (line_gap - dsc->descent)); } void lv_tiny_ttf_destroy(lv_font_t * font) { diff --git a/src/libs/tiny_ttf/lv_tiny_ttf.h b/src/libs/tiny_ttf/lv_tiny_ttf.h index 5eeb61a92..3297e7379 100644 --- a/src/libs/tiny_ttf/lv_tiny_ttf.h +++ b/src/libs/tiny_ttf/lv_tiny_ttf.h @@ -30,20 +30,20 @@ extern "C" { **********************/ #if LV_TINY_TTF_FILE_SUPPORT !=0 /* create a font from the specified file or path with the specified line height.*/ -lv_font_t * lv_tiny_ttf_create_file(const char * path, lv_coord_t line_height); +lv_font_t * lv_tiny_ttf_create_file(const char * path, lv_coord_t font_size); /* create a font from the specified file or path with the specified line height with the specified cache size.*/ -lv_font_t * lv_tiny_ttf_create_file_ex(const char * path, lv_coord_t line_height, size_t cache_size); +lv_font_t * lv_tiny_ttf_create_file_ex(const char * path, lv_coord_t font_size, size_t cache_size); #endif /* create a font from the specified data pointer with the specified line height.*/ -lv_font_t * lv_tiny_ttf_create_data(const void * data, size_t data_size, lv_coord_t line_height); +lv_font_t * lv_tiny_ttf_create_data(const void * data, size_t data_size, lv_coord_t font_size); /* create a font from the specified data pointer with the specified line height and the specified cache size.*/ -lv_font_t * lv_tiny_ttf_create_data_ex(const void * data, size_t data_size, lv_coord_t line_height, size_t cache_size); +lv_font_t * lv_tiny_ttf_create_data_ex(const void * data, size_t data_size, lv_coord_t font_size, size_t cache_size); -/* set the size of the font to a new line_height*/ -void lv_tiny_ttf_set_size(lv_font_t * font, lv_coord_t line_height); +/* set the size of the font to a new font_size*/ +void lv_tiny_ttf_set_size(lv_font_t * font, lv_coord_t font_size); /* destroy a font previously created with lv_tiny_ttf_create_xxxx()*/ void lv_tiny_ttf_destroy(lv_font_t * font); diff --git a/tests/ref_imgs/tiny_ttf_1.png b/tests/ref_imgs/tiny_ttf_1.png index c92f0d7e9..c4ec1a0d2 100644 Binary files a/tests/ref_imgs/tiny_ttf_1.png and b/tests/ref_imgs/tiny_ttf_1.png differ