mirror of
https://github.com/zlgopen/awtk.git
synced 2025-05-08 19:44:45 +08:00
improve font manager
This commit is contained in:
parent
3073964ead
commit
e0497f8588
@ -1,5 +1,8 @@
|
||||
# 最新动态
|
||||
|
||||
2023/08/01
|
||||
* 修复字体管理器可能会重复添加默认字体(感谢福明提供补丁)
|
||||
|
||||
2023/07/31
|
||||
* 更新demoui的style(感谢兆坤提供补丁)
|
||||
* 完善WITH\_WASM(感谢智明提供补丁)
|
||||
|
@ -176,6 +176,8 @@ struct _font_t {
|
||||
font_shrink_cache_t shrink_cache;
|
||||
font_destroy_t destroy;
|
||||
const char* desc;
|
||||
|
||||
font_manager_t* fm;
|
||||
};
|
||||
|
||||
/**
|
||||
|
@ -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++;
|
||||
}
|
||||
|
@ -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*/
|
||||
|
@ -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;
|
||||
|
||||
|
@ -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;
|
||||
|
@ -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*/
|
||||
|
@ -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"
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user