From 32828206d14722560e369f1281667938bce12426 Mon Sep 17 00:00:00 2001 From: _VIFEXTech Date: Wed, 17 Jan 2024 21:33:02 +0800 Subject: [PATCH] chore(imgfont): simplify imgfont_dsc_t data structure (#5354) Signed-off-by: pengyiqiang Co-authored-by: pengyiqiang --- .devcontainer/__lv_conf.h__ | 7 - Kconfig | 8 - env_support/cmsis-pack/lv_conf_cmsis.h | 10 - .../others/imgfont/lv_example_imgfont_1.c | 4 +- lv_conf_template.h | 7 - src/lv_conf_internal.h | 19 -- src/others/imgfont/lv_imgfont.c | 39 +-- tests/CMakeLists.txt | 1 + tests/ref_imgs/widgets/imgfont_1.png | Bin 0 -> 12743 bytes tests/src/test_assets/test_img_emoji_F600.png | Bin 0 -> 1760 bytes tests/src/test_assets/test_img_emoji_F617.c | 247 ++++++++++++++++++ tests/src/test_cases/widgets/test_imgfont.c | 57 ++++ 12 files changed, 317 insertions(+), 82 deletions(-) create mode 100644 tests/ref_imgs/widgets/imgfont_1.png create mode 100644 tests/src/test_assets/test_img_emoji_F600.png create mode 100644 tests/src/test_assets/test_img_emoji_F617.c create mode 100644 tests/src/test_cases/widgets/test_imgfont.c diff --git a/.devcontainer/__lv_conf.h__ b/.devcontainer/__lv_conf.h__ index 5dc67b349..b022d4020 100644 --- a/.devcontainer/__lv_conf.h__ +++ b/.devcontainer/__lv_conf.h__ @@ -781,13 +781,6 @@ /*1: Support using images as font in label or span widgets */ #define LV_USE_IMGFONT 1 -#if LV_USE_IMGFONT - /*Imgfont image file path maximum length*/ - #define LV_IMGFONT_PATH_MAX_LEN 64 - - /*1: Use img cache to buffer header information*/ - #define LV_IMGFONT_USE_IMAGE_CACHE_HEADER 0 -#endif /*1: Enable an observer pattern implementation*/ #define LV_USE_OBSERVER 1 diff --git a/Kconfig b/Kconfig index 7fec1ac3a..54d06693a 100644 --- a/Kconfig +++ b/Kconfig @@ -1218,14 +1218,6 @@ menu "LVGL configuration" config LV_USE_IMGFONT bool "draw image in label or span obj" default n - config LV_IMGFONT_PATH_MAX_LEN - int "Imgfont image file path maximum length" - depends on LV_USE_IMGFONT - default 64 - config LV_IMGFONT_USE_IMAGE_CACHE_HEADER - bool "Use image cache to buffer header information" - depends on LV_USE_IMGFONT - default n config LV_USE_IME_PINYIN bool "Enable Pinyin input method" diff --git a/env_support/cmsis-pack/lv_conf_cmsis.h b/env_support/cmsis-pack/lv_conf_cmsis.h index a4564225e..f638fe88f 100644 --- a/env_support/cmsis-pack/lv_conf_cmsis.h +++ b/env_support/cmsis-pack/lv_conf_cmsis.h @@ -712,16 +712,6 @@ #define LV_PROFILER_END_TAG LV_PROFILER_BUILTIN_END_TAG #endif - -/*1: Support using images as font in label or span widgets */ -#if LV_USE_IMGFONT - /*Imgfont image file path maximum length*/ - #define LV_IMGFONT_PATH_MAX_LEN 64 - - /*1: Use img cache to buffer header information*/ - #define LV_IMGFONT_USE_IMAGE_CACHE_HEADER 0 -#endif - /*1: Enable an observer pattern implementation*/ #define LV_USE_OBSERVER 1 diff --git a/examples/others/imgfont/lv_example_imgfont_1.c b/examples/others/imgfont/lv_example_imgfont_1.c index 23d773945..8e0aa6d8d 100644 --- a/examples/others/imgfont/lv_example_imgfont_1.c +++ b/examples/others/imgfont/lv_example_imgfont_1.c @@ -4,8 +4,6 @@ #if LV_BUILD_EXAMPLES #if LV_USE_IMGFONT -LV_IMAGE_DECLARE(emoji_F617); -char path_buf[128]; static const void * get_imgfont_path(const lv_font_t * font, uint32_t unicode, uint32_t unicode_next, int32_t * offset_y, void * user_data) { @@ -14,6 +12,8 @@ static const void * get_imgfont_path(const lv_font_t * font, uint32_t unicode, u LV_UNUSED(offset_y); LV_UNUSED(user_data); + LV_IMAGE_DECLARE(emoji_F617); + if(unicode < 0xF000) return NULL; if(unicode == 0xF617) { diff --git a/lv_conf_template.h b/lv_conf_template.h index 79116bdda..f20e840e5 100644 --- a/lv_conf_template.h +++ b/lv_conf_template.h @@ -781,13 +781,6 @@ /*1: Support using images as font in label or span widgets */ #define LV_USE_IMGFONT 0 -#if LV_USE_IMGFONT - /*Imgfont image file path maximum length*/ - #define LV_IMGFONT_PATH_MAX_LEN 64 - - /*1: Use img cache to buffer header information*/ - #define LV_IMGFONT_USE_IMAGE_CACHE_HEADER 0 -#endif /*1: Enable an observer pattern implementation*/ #define LV_USE_OBSERVER 1 diff --git a/src/lv_conf_internal.h b/src/lv_conf_internal.h index d47acc2d6..47ed197bc 100644 --- a/src/lv_conf_internal.h +++ b/src/lv_conf_internal.h @@ -2531,25 +2531,6 @@ #define LV_USE_IMGFONT 0 #endif #endif -#if LV_USE_IMGFONT - /*Imgfont image file path maximum length*/ - #ifndef LV_IMGFONT_PATH_MAX_LEN - #ifdef CONFIG_LV_IMGFONT_PATH_MAX_LEN - #define LV_IMGFONT_PATH_MAX_LEN CONFIG_LV_IMGFONT_PATH_MAX_LEN - #else - #define LV_IMGFONT_PATH_MAX_LEN 64 - #endif - #endif - - /*1: Use img cache to buffer header information*/ - #ifndef LV_IMGFONT_USE_IMAGE_CACHE_HEADER - #ifdef CONFIG_LV_IMGFONT_USE_IMAGE_CACHE_HEADER - #define LV_IMGFONT_USE_IMAGE_CACHE_HEADER CONFIG_LV_IMGFONT_USE_IMAGE_CACHE_HEADER - #else - #define LV_IMGFONT_USE_IMAGE_CACHE_HEADER 0 - #endif - #endif -#endif /*1: Enable an observer pattern implementation*/ #ifndef LV_USE_OBSERVER diff --git a/src/others/imgfont/lv_imgfont.c b/src/others/imgfont/lv_imgfont.c index 9c2f155e5..5a617ad80 100644 --- a/src/others/imgfont/lv_imgfont.c +++ b/src/others/imgfont/lv_imgfont.c @@ -18,7 +18,7 @@ * TYPEDEFS **********************/ typedef struct { - lv_font_t * font; + lv_font_t font; lv_imgfont_get_path_cb_t path_cb; void * user_data; } imgfont_dsc_t; @@ -48,18 +48,14 @@ static bool imgfont_get_glyph_dsc(const lv_font_t * font, lv_font_glyph_dsc_t * **********************/ lv_font_t * lv_imgfont_create(uint16_t height, lv_imgfont_get_path_cb_t path_cb, void * user_data) { - LV_ASSERT_MSG(LV_IMGFONT_PATH_MAX_LEN > sizeof(lv_image_dsc_t), - "LV_IMGFONT_PATH_MAX_LEN must be greater than sizeof(lv_image_dsc_t)"); - - size_t size = sizeof(imgfont_dsc_t) + sizeof(lv_font_t); - imgfont_dsc_t * dsc = lv_malloc_zeroed(size); + imgfont_dsc_t * dsc = lv_malloc_zeroed(sizeof(imgfont_dsc_t)); + LV_ASSERT_MALLOC(dsc); if(dsc == NULL) return NULL; - dsc->font = (lv_font_t *)(((char *)dsc) + sizeof(imgfont_dsc_t)); dsc->path_cb = path_cb; dsc->user_data = user_data; - lv_font_t * font = dsc->font; + 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; @@ -69,7 +65,7 @@ lv_font_t * lv_imgfont_create(uint16_t height, lv_imgfont_get_path_cb_t path_cb, font->underline_position = 0; font->underline_thickness = 0; - return dsc->font; + return font; } void lv_imgfont_destroy(lv_font_t * font) @@ -92,7 +88,7 @@ static const void * imgfont_get_glyph_bitmap(lv_font_glyph_dsc_t * g_dsc, uint32 imgfont_dsc_t * dsc = (imgfont_dsc_t *)font->dsc; int32_t offset_y = 0; - const void * img_src = dsc->path_cb(dsc->font, unicode, 0, &offset_y, dsc->user_data); + const void * img_src = dsc->path_cb(font, unicode, 0, &offset_y, dsc->user_data); return img_src; } @@ -107,33 +103,18 @@ static bool imgfont_get_glyph_dsc(const lv_font_t * font, lv_font_glyph_dsc_t * int32_t offset_y = 0; - const void * img_src = dsc->path_cb(dsc->font, unicode, unicode_next, &offset_y, dsc->user_data); + const void * img_src = dsc->path_cb(font, unicode, unicode_next, &offset_y, dsc->user_data); if(img_src == NULL) return false; - const lv_image_header_t * img_header; -#if LV_IMGFONT_USE_IMAGE_CACHE_HEADER - lv_color_t color = { 0 }; - _lv_image_cache_entry_t * entry = _lv_image_cache_open(dsc->path, color, 0); - - if(entry == NULL) { - return false; - } - - img_header = &entry->dec_dsc.header; -#else lv_image_header_t header; - if(lv_image_decoder_get_info(img_src, &header) != LV_RESULT_OK) { return false; } - img_header = &header; -#endif - dsc_out->is_placeholder = 0; - dsc_out->adv_w = img_header->w; - dsc_out->box_w = img_header->w; - dsc_out->box_h = img_header->h; + 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 = offset_y; diff --git a/tests/CMakeLists.txt b/tests/CMakeLists.txt index fd831be25..637b628cd 100644 --- a/tests/CMakeLists.txt +++ b/tests/CMakeLists.txt @@ -223,6 +223,7 @@ add_library(test_common src/test_assets/test_arc_bg.c src/test_assets/test_img_lvgl_logo_png.c src/test_assets/test_img_lvgl_logo_jpg.c + src/test_assets/test_img_emoji_F617.c src/test_assets/ubuntu_font.c src/test_assets/kern_one_otf.c unity/unity_support.c diff --git a/tests/ref_imgs/widgets/imgfont_1.png b/tests/ref_imgs/widgets/imgfont_1.png new file mode 100644 index 0000000000000000000000000000000000000000..4e7e3319c703e961394082fb23853ed25128a6cc GIT binary patch literal 12743 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 bIGy<{&)CGb_?$@wWdSsv={zk{wSD_P>8vIV literal 0 HcmV?d00001 diff --git a/tests/src/test_assets/test_img_emoji_F600.png b/tests/src/test_assets/test_img_emoji_F600.png new file mode 100644 index 0000000000000000000000000000000000000000..c31a1f79178dd974e63d659e4f023f239d7bb8f0 GIT binary patch literal 1760 zcmV<61|Ru}P)hAYg6ccC|7XR;pBPT&HHdo5hMc+vD?p zYG8+Xg0Q*K78or>L_P7pIhcP!$iu~JSxKCXlcjVhxsEh94H1x9Bg&mL*vW8RFER7r zcAT22>CIPlJsG{LS>v)a`P*9fg~hV~000zpQchC<>SVJn1-BS}Ox4w<=AQ4;#OeE< zB{XFK00opuL_t(o!@bxISE5Q72k=xSNIK;3LE5?9=P&wt`u*yN45V__GrOO~x`M~gs zXHgspx$e+E)&i=bofSWII1Uj|w;e7)eJ)9kh(nAhL2;;ql2VqP1QVx1shqOM3pstq zq3^f21QnO`-0mz;bq$VJ(rHPxBh~AguI}t0oQJ8-9evUzn3;*)RJh=Qr8uHeBpTdB zAvv%_Aa?Gg3Z!_X_}~iVlt2kbNIQ|rg+qa&JP)FzO#34x1AV+tr|(OG2zeAztF^?I zkG+wy@jz>54CO4?dE_E$!7b}}q-?m(=VH)@Gad{E(g^);_21nCuV%)Z4T5T39GV;TB^5H|p|mJ{jU z__!(OGW2~t!R|xso(f@0BGEbTq@tnAE71o)u#aE}u#aLxTShG(@~Wg8eCDbWgkzfq z-AB>U2MB%{1ufHSdCAocH5FR(AAXuF5{Lg`F&S{6bt+ULs2*NCI`6ob29x&(oY{|I zpu4*tK}$!B?20Z-x!3W z?^e+C`{f0O#*Sf%W#ptvkzhB?J)fNC=jUI03mOUXy*ch63{(x4+Ac-Xb=!xr$e6Dm@ zU5AJE^6GoNEjwm6A3mUDZ%8sQQm^M&Nb$gShlY&h^m-V`Am=6=EJ|^AA3ceiQfQ~7g zeB!>gm=ThR(*2?8%T6YF&wi>lQ9??$T^PY%i3&IL`>xHy0;j3&-mvFEV#=t`H@gyZ z_x;VhZZHE*KIO4ZDYaPwt6{tMX%uX9?S@I6z-gCKAKHo;l!!8o+Sc7k1!>%E%`lk( zC$sPI2qdIvfO^e-n{9CCiZR`9W^Z;)=Rx7H_Bui$3N52iv*&N_jLLnR+qDL!xnbsz z15&9SQaBq7ou1ikyn^YWLQK1K@JUw{|^LGfR zMGS>hQ*iXJc_X$U)6N&a_DZAFZcCV4w7qo1+Yv#vo1hWcZi+2OF#OslpJ}I5CZ8=F z|01edieZ^j_4pT2(W|j)H4jy-{_(4^|MX?uG4&7qiS0-H0ra*20000fallback = LV_FONT_DEFAULT; + + lv_obj_t * label = lv_label_create(lv_screen_active()); + lv_label_set_text(label, "12\uF600\uF617\uF000AB"); + lv_obj_set_style_text_font(label, imgfont, LV_PART_MAIN); + lv_obj_center(label); + + lv_refr_now(NULL); + + TEST_ASSERT_EQUAL_SCREENSHOT("widgets/imgfont_1.png"); + + lv_imgfont_destroy(imgfont); +} + +#endif