improve font manager

This commit is contained in:
lixianjing 2023-08-01 16:10:16 +08:00
parent 3073964ead
commit e0497f8588
8 changed files with 71 additions and 7 deletions

View File

@ -1,5 +1,8 @@
# 最新动态
2023/08/01
* 修复字体管理器可能会重复添加默认字体(感谢福明提供补丁)
2023/07/31
* 更新demoui的style(感谢兆坤提供补丁)
* 完善WITH\_WASM(感谢智明提供补丁)

View File

@ -176,6 +176,8 @@ struct _font_t {
font_shrink_cache_t shrink_cache;
font_destroy_t destroy;
const char* desc;
font_manager_t* fm;
};
/**

View File

@ -105,8 +105,13 @@ ret_t font_manager_set_assets_manager(font_manager_t* fm, assets_manager_t* am)
ret_t font_manager_add_font(font_manager_t* fm, font_t* font) {
return_value_if_fail(fm != NULL && font != NULL, RET_BAD_PARAMS);
if (font->fm == NULL) {
font->fm = fm;
darray_push(&(fm->fonts), font);
}
return darray_push(&(fm->fonts), font);
return RET_OK;
}
#if WITH_BITMAP_FONT
@ -287,9 +292,16 @@ static int font_manager_cmp_by_name(font_manager_t* fm, const char* name) {
return -1;
}
static font_t* font_manager_fallback_get_font_default(void* ctx, const char* name,
font_t* font_manager_fallback_get_font_default(void* ctx, const char* name,
font_size_t size) {
return font_manager_get_font(font_manager(), name, size);
font_manager_t* fm = (font_manager_t*)ctx;
if (fm != font_manager()) {
/*非默认的fm才需要fallback到默认的fm上*/
return font_manager_get_font(font_manager(), name, size);
} else {
return NULL;
}
}
font_manager_t* font_managers_ref(const char* name) {
@ -309,7 +321,7 @@ font_manager_t* font_managers_ref(const char* name) {
fm->name = tk_strdup(name);
darray_push(s_font_managers, fm);
font_manager_set_assets_manager(fm, assets_managers_ref(name));
font_manager_set_fallback_get_font(fm, font_manager_fallback_get_font_default, NULL);
font_manager_set_fallback_get_font(fm, font_manager_fallback_get_font_default, fm);
} else {
fm->refcount++;
}

View File

@ -29,9 +29,6 @@
BEGIN_C_DECLS
struct _font_manager_t;
typedef struct _font_manager_t font_manager_t;
typedef font_t* (*font_manager_get_font_t)(void* ctx, const char* name, font_size_t size);
/**
@ -255,6 +252,12 @@ ret_t font_managers_unload_all(void);
*/
ret_t font_managers_unref(font_manager_t* imm);
/*public for test*/
/**
* @method font_manager_fallback_get_font_default;
*/
font_t* font_manager_fallback_get_font_default(void* ctx, const char* name,
font_size_t size);
END_C_DECLS
#endif /*TK_FONT_MANAGER_H*/

View File

@ -544,6 +544,9 @@ typedef struct _input_engine_t input_engine_t;
struct _canvas_t;
typedef struct _canvas_t canvas_t;
struct _font_manager_t;
typedef struct _font_manager_t font_manager_t;
struct _lcd_t;
typedef struct _lcd_t lcd_t;

View File

@ -56,6 +56,7 @@ static bool_t font_dummy_match(font_t* f, const char* name, uint16_t font_size)
static font_dummy_t s_font_default;
font_t* font_dummy_default(const char* name, uint16_t size) {
memset(&s_font_default, 0x00, sizeof(font_dummy_t));
s_font_default.font_size = size;
s_font_default.base.match = font_dummy_match;
s_font_default.base.get_glyph = font_dummy_get_glyph;
@ -65,8 +66,27 @@ font_t* font_dummy_default(const char* name, uint16_t size) {
return &s_font_default.base;
}
static font_t* font_loader_load_default(font_loader_t* loader, const char* name, const uint8_t* buff,
uint32_t size) {
if(tk_str_eq(name, "default")) {
return font_dummy_default(name, size);
} else {
return NULL;
}
}
static font_loader_t s_default_font_loader = {
.load = font_loader_load_default
};
font_loader_t* default_font_loader(void) {
return &s_default_font_loader;
}
static font_dummy_t s_font0;
font_t* font_dummy_0(const char* name, uint16_t size) {
memset(&s_font0, 0x00, sizeof(font_dummy_t));
s_font0.font_size = size;
s_font0.base.match = font_dummy_match;
s_font0.base.get_glyph = font_dummy_get_glyph;
@ -78,6 +98,8 @@ font_t* font_dummy_0(const char* name, uint16_t size) {
static font_dummy_t s_font1;
font_t* font_dummy_1(const char* name, uint16_t size) {
memset(&s_font1, 0x00, sizeof(font_dummy_t));
s_font1.font_size = size;
s_font1.base.match = font_dummy_match;
s_font1.base.get_glyph = font_dummy_get_glyph;
@ -89,6 +111,8 @@ font_t* font_dummy_1(const char* name, uint16_t size) {
static font_dummy_t s_font2;
font_t* font_dummy_2(const char* name, uint16_t size) {
memset(&s_font2, 0x00, sizeof(font_dummy_t));
s_font2.font_size = size;
s_font2.base.match = font_dummy_match;
s_font2.base.get_glyph = font_dummy_get_glyph;

View File

@ -2,6 +2,7 @@
#define TK_FONT_DUMMY_H
#include "base/font.h"
#include "base/font_loader.h"
BEGIN_C_DECLS
@ -11,6 +12,8 @@ font_t* font_dummy_1(const char* name, uint16_t size);
font_t* font_dummy_2(const char* name, uint16_t size);
font_t* font_dummy_default(const char* name, uint16_t size);
font_loader_t* default_font_loader(void);
END_C_DECLS
#endif /*TK_FONT_DUMMY_H*/

View File

@ -38,6 +38,20 @@ TEST(FontManager, basic) {
font_manager_deinit(&font_manager);
}
TEST(FontManager, not_exist) {
font_manager_t font_manager;
font_dummy_init();
font_manager_init(&font_manager, default_font_loader());
font_manager_add_font(&font_manager, font_dummy_0("demo0", 10));
font_manager_add_font(&font_manager, font_dummy_1("demo1", 11));
font_manager_set_fallback_get_font(&font_manager, (font_manager_get_font_t)font_manager_fallback_get_font_default, &font_manager);
ASSERT_NE(font_manager_get_font(&font_manager, "abc", 10), (font_t*)NULL);
ASSERT_NE(font_manager_get_font(&font_manager, "abc", 10), (font_t*)NULL);
font_manager_deinit(&font_manager);
}
#if defined(WITH_FT_FONT) || defined(WITH_STB_FONT)
#include "font_loader/font_loader_truetype.h"