diff --git a/.dsh/skills/font-regen/SKILL.md b/.dsh/skills/font-regen/SKILL.md index 27585a51..edc35e00 100644 --- a/.dsh/skills/font-regen/SKILL.md +++ b/.dsh/skills/font-regen/SKILL.md @@ -14,6 +14,8 @@ whenToUse: UI 代码新增中文文案、用户报告屏幕缺字/空白块、 # 1. 代码落库(新界面字符串已写入 ui_menu.c / ui_content_page.c 等 UI 源码) # 2. 提取字符集(纯标准库,任意 python3 均可) python tools/font_gen/extract_cn.py # 扫描 UI 源码字符串 → 仓库根 ui_cn_chars.txt +# ⚠ extract 会把 KEEP_EXTRA 保留字(异/常/片/芯)洗掉:跑 make_font 前必须并回 +# ui_cn_chars.txt(否则 font-charset 门禁 A 段 FAIL,理由见 check_font_charset.py 头注) # 3. 生成字体(需 fontTools,一律用 .venv;宋体 .ttc 的 face0 抽取与 ▶ 箭头补回均自动完成,幂等) .venv\Scripts\python.exe tools/font_gen/make_font.py # 变体:--bpp 2(宋体细笔画发虚时)/ --font C:/path/to/font.ttf(换字体) @@ -30,4 +32,5 @@ python tools/font_gen/extract_cn.py # 扫描 UI 源码字符串 → - `requirements.txt` 必须**纯 ASCII**(Windows 下 pip 按 GBK 解码,中文注释 → UnicodeDecodeError) - 生僻字(宋体可能无字形)→ **写码前先手动验证字形**,避免"代码写完才发现是空白" - 生成成功后跑 `ui-verify` skill 全回归;黄金参考因字形变化而 FAIL 属预期 → `check_content_pages.py --update` 刷新 -- 字数变化时同步更新文档中的字符集计数(当前 97 汉字 + ASCII 0x20-0x7E,共 193 字形):`UI_中文字体生成与配置.md`、`UI_界面制作流程.md` C3、`UI_设计架构.md`、`simulator/README.md` 已知坑 #4 +- 字数变化时同步更新文档中的字符集计数(当前 179 汉字/符号 + ASCII 0x20-0x7E,共 274 字形):`UI_中文字体生成与配置.md`、`UI_界面制作流程.md` C3、`UI_设计架构.md`、`simulator/README.md` 已知坑 #4 +- **新增字低于既有最小码位**(如 Ⅰ U+2160)会下探稀疏 cmap 起点并吞掉单码位补回条目(实测 ▶ 箭头全变方框而旧版 coverage 全绿)——`make_font.py`(2026-10-25 起)按 LVGL 首命中语义插入/守卫/校验,扩字后模拟器像素回归**必跑** diff --git a/Drivers/BSP/UI/ui_font_cn_12.c b/Drivers/BSP/UI/ui_font_cn_12.c index 1813a705..d31d858f 100644 --- a/Drivers/BSP/UI/ui_font_cn_12.c +++ b/Drivers/BSP/UI/ui_font_cn_12.c @@ -307,6 +307,19 @@ static LV_ATTRIBUTE_LARGE_CONST const uint8_t glyph_bitmap[] = { /* U+007E "~" */ 0x40, 0x81, 0x80, + /* U+2160 "Ⅰ" */ + 0xe9, 0x24, 0x92, 0xe0, + + /* U+2161 "Ⅱ" */ + 0xee, 0x89, 0x12, 0x24, 0x48, 0x91, 0x22, 0xee, + + /* U+2162 "Ⅲ" */ + 0xee, 0xe8, 0x89, 0x11, 0x22, 0x24, 0x44, 0x88, + 0x91, 0x12, 0x22, 0xee, 0xe0, + + /* U+4E00 "一" */ + 0xff, 0xe0, + /* U+4E09 "三" */ 0x7f, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0x80, @@ -321,6 +334,10 @@ static LV_ATTRIBUTE_LARGE_CONST const uint8_t glyph_bitmap[] = { 0x81, 0x17, 0xff, 0x4, 0x4f, 0xf8, 0x10, 0x6, 0x0, + /* U+4E8C "二" */ + 0x7f, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xff, 0xe0, + /* U+4EA4 "交" */ 0x8, 0x0, 0x83, 0xff, 0x80, 0x1, 0x10, 0x41, 0x14, 0x50, 0x50, 0x4, 0x1, 0x40, 0xc6, 0x60, @@ -331,6 +348,16 @@ static LV_ATTRIBUTE_LARGE_CONST const uint8_t glyph_bitmap[] = { 0x10, 0x42, 0xff, 0x41, 0x8, 0x21, 0x4, 0x20, 0x80, + /* U+4F4D "位" */ + 0x22, 0x4, 0x21, 0x0, 0x2f, 0xfc, 0x0, 0x90, + 0x92, 0x12, 0x22, 0x44, 0x88, 0x91, 0x4, 0x2f, + 0xf0, + + /* U+4F4E "低" */ + 0x10, 0xc3, 0xe0, 0xa4, 0x14, 0x86, 0x91, 0x5f, + 0xca, 0x41, 0x48, 0x2a, 0xa5, 0x94, 0xa9, 0x90, + 0x90, + /* U+4F5C "作" */ 0x14, 0x2, 0x80, 0x9f, 0x95, 0x6, 0x21, 0x47, 0x88, 0x81, 0x10, 0x23, 0xe4, 0x40, 0x88, 0x11, @@ -356,6 +383,11 @@ static LV_ATTRIBUTE_LARGE_CONST const uint8_t glyph_bitmap[] = { 0x2, 0x80, 0x88, 0x11, 0x4, 0x11, 0x1, 0x40, 0x10, + /* U+516C "公" */ + 0x11, 0x2, 0x20, 0x44, 0x10, 0x42, 0x48, 0x88, + 0xa2, 0x8, 0x40, 0x11, 0x4, 0x11, 0xff, 0x0, + 0x20, + /* U+5171 "共" */ 0x11, 0x2, 0x20, 0x44, 0x3f, 0xe1, 0x10, 0x22, 0x4, 0x47, 0xff, 0x0, 0x2, 0x20, 0x82, 0x20, @@ -366,6 +398,16 @@ static LV_ATTRIBUTE_LARGE_CONST const uint8_t glyph_bitmap[] = { 0x3f, 0xf8, 0x20, 0xa, 0x2, 0x20, 0x82, 0x60, 0x30, + /* U+51FA "出" */ + 0x4, 0x8, 0x89, 0x11, 0x22, 0x27, 0xfc, 0x8, + 0x1, 0x4, 0x21, 0x84, 0x30, 0x87, 0xff, 0x80, + 0x10, + + /* U+5206 "分" */ + 0x11, 0x2, 0x20, 0x82, 0x10, 0x44, 0x5, 0x7f, + 0x42, 0x20, 0x44, 0x10, 0x82, 0x10, 0x82, 0x23, + 0x80, + /* U+5236 "制" */ 0x10, 0x2a, 0x5, 0xf4, 0xc8, 0x9f, 0xf2, 0x22, 0x5f, 0x4a, 0xa9, 0x55, 0x2a, 0x85, 0x70, 0x88, @@ -403,6 +445,10 @@ static LV_ATTRIBUTE_LARGE_CONST const uint8_t glyph_bitmap[] = { 0xfb, 0xe1, 0x44, 0x28, 0xc5, 0x15, 0x14, 0xa2, 0x88, 0x21, 0x4, 0x51, 0x4a, 0x4a, 0x10, 0x80, + /* U+53D6 "取" */ + 0xfc, 0x9, 0x79, 0x25, 0x3c, 0xa4, 0x94, 0xf2, + 0x92, 0x52, 0x64, 0xf8, 0x81, 0x28, 0x28, 0x80, + /* U+53E3 "口" */ 0xff, 0xc0, 0x60, 0x30, 0x18, 0xc, 0x6, 0x3, 0x1, 0xff, 0xc0, 0x40, @@ -412,6 +458,11 @@ static LV_ATTRIBUTE_LARGE_CONST const uint8_t glyph_bitmap[] = { 0xc4, 0x1, 0x0, 0x3f, 0xc0, 0x8, 0x1, 0x0, 0xc0, + /* U+5408 "合" */ + 0x4, 0x1, 0x40, 0x44, 0x10, 0x4c, 0x6, 0x7f, + 0x0, 0x3, 0xfe, 0x40, 0x48, 0x9, 0xff, 0x20, + 0x20, + /* U+542F "启" */ 0x4, 0x0, 0x40, 0xff, 0x90, 0x12, 0x2, 0x7f, 0xc8, 0x1, 0xff, 0x30, 0x2a, 0x5, 0x7f, 0xc8, @@ -422,6 +473,10 @@ static LV_ATTRIBUTE_LARGE_CONST const uint8_t glyph_bitmap[] = { 0xc0, 0x3, 0xfe, 0x40, 0x48, 0x9, 0xff, 0x20, 0x20, + /* U+56DE "回" */ + 0xff, 0xe0, 0x18, 0x6, 0x79, 0x92, 0x64, 0x99, + 0xe6, 0x1, 0x80, 0x7f, 0xf8, 0x4, + /* U+5730 "地" */ 0x21, 0x4, 0x20, 0x95, 0x92, 0xdf, 0x72, 0x5a, 0x49, 0x49, 0x2b, 0x25, 0x6, 0x87, 0x10, 0x81, @@ -442,6 +497,11 @@ static LV_ATTRIBUTE_LARGE_CONST const uint8_t glyph_bitmap[] = { 0x8f, 0xf0, 0x80, 0x3f, 0xca, 0x10, 0x3c, 0x38, 0x70, + /* U+5916 "外" */ + 0x21, 0x4, 0x20, 0x84, 0x1c, 0x84, 0x98, 0x92, + 0xaa, 0x48, 0x89, 0x11, 0x4, 0x21, 0x4, 0x40, + 0x80, + /* U+5B50 "子" */ 0x3f, 0x80, 0x20, 0x8, 0x2, 0x0, 0x41, 0xff, 0xc1, 0x0, 0x20, 0x4, 0x0, 0x80, 0x70, 0x0, @@ -471,16 +531,35 @@ static LV_ATTRIBUTE_LARGE_CONST const uint8_t glyph_bitmap[] = { 0x63, 0xe9, 0x80, 0x4, 0x8, 0x89, 0x11, 0x3f, 0xe0, + /* U+5DF2 "已" */ + 0xff, 0x80, 0x20, 0xa, 0x2, 0x80, 0xbf, 0xe8, + 0x2, 0x0, 0x80, 0x60, 0x17, 0xfc, + /* U+5E38 "常" */ 0x24, 0x82, 0xa3, 0xff, 0xc0, 0x13, 0xf8, 0x41, 0xf, 0xe0, 0x20, 0x7f, 0xc8, 0x89, 0x13, 0x2, 0x0, + /* U+5E74 "年" */ + 0x20, 0x4, 0x0, 0xff, 0xa1, 0x8, 0x20, 0x7f, + 0x88, 0x81, 0x10, 0xff, 0xe0, 0x40, 0x8, 0x1, + 0x0, + /* U+5E8F "序" */ 0x2, 0xf, 0xfd, 0x0, 0x2f, 0xe4, 0x8, 0x9a, 0x10, 0x83, 0xff, 0x42, 0x28, 0x49, 0x8, 0x43, 0x0, + /* U+5EA6 "度" */ + 0x2, 0xf, 0xfd, 0x22, 0x3f, 0xf4, 0x88, 0x9f, + 0x10, 0x2, 0xfe, 0x48, 0x48, 0x91, 0xc, 0x4e, + 0x70, + + /* U+5EF6 "延" */ + 0x0, 0x7e, 0xf0, 0x42, 0x10, 0x44, 0x48, 0xe9, + 0xc5, 0x20, 0xa4, 0x54, 0x84, 0xfd, 0x40, 0x47, + 0xf0, + /* U+5F02 "异" */ 0x7f, 0xc8, 0x9, 0xff, 0x20, 0x4, 0x2, 0x7f, 0xc4, 0x20, 0x84, 0xff, 0xe2, 0x10, 0x82, 0x20, @@ -510,6 +589,16 @@ static LV_ATTRIBUTE_LARGE_CONST const uint8_t glyph_bitmap[] = { 0x11, 0x11, 0x74, 0x15, 0x4, 0x93, 0x11, 0x86, 0x0, + /* U+6001 "态" */ + 0x4, 0x0, 0x83, 0xff, 0x85, 0x1, 0x10, 0x49, + 0x30, 0x98, 0x20, 0x52, 0x4a, 0x46, 0x42, 0x87, + 0xc0, + + /* U+603B "总" */ + 0x20, 0x82, 0x21, 0xff, 0x20, 0x24, 0x4, 0x80, + 0x9f, 0xf0, 0x0, 0x4, 0x4a, 0x45, 0x42, 0xc7, + 0xc0, + /* U+606F "息" */ 0x8, 0xf, 0xf9, 0x1, 0x3f, 0xe4, 0x4, 0xff, 0x90, 0x13, 0xfe, 0x4, 0xa, 0x49, 0x42, 0xc7, @@ -525,6 +614,11 @@ static LV_ATTRIBUTE_LARGE_CONST const uint8_t glyph_bitmap[] = { 0x1, 0x7, 0xff, 0x4, 0x0, 0x80, 0x10, 0xe, 0x0, + /* U+6295 "投" */ + 0x27, 0x84, 0x90, 0x92, 0x7a, 0x42, 0x86, 0x40, + 0xb, 0xf1, 0xa2, 0xe2, 0x84, 0x20, 0x8a, 0x36, + 0x30, + /* U+6296 "抖" */ 0x20, 0x44, 0x48, 0x85, 0x7c, 0x22, 0x24, 0x42, 0x8c, 0x17, 0x3, 0x27, 0xc4, 0x8, 0x81, 0x30, @@ -545,6 +639,11 @@ static LV_ATTRIBUTE_LARGE_CONST const uint8_t glyph_bitmap[] = { 0xcd, 0x27, 0x3f, 0x26, 0x25, 0x44, 0xaf, 0xb9, 0x10, + /* U+63A5 "接" */ + 0x22, 0x4, 0x20, 0xbf, 0xfa, 0x22, 0x28, 0x5f, + 0xcc, 0x47, 0x7f, 0x22, 0x44, 0xc8, 0x86, 0x37, + 0x30, + /* U+63A7 "控" */ 0x42, 0x8, 0x21, 0x3f, 0xf4, 0x14, 0x28, 0x88, 0x9a, 0xe, 0x3e, 0x41, 0x8, 0x21, 0x4, 0x67, @@ -588,11 +687,29 @@ static LV_ATTRIBUTE_LARGE_CONST const uint8_t glyph_bitmap[] = { 0xa4, 0x94, 0x8a, 0x91, 0x5e, 0xa, 0x41, 0x0, 0xe0, + /* U+663E "显" */ + 0x7f, 0xc8, 0x9, 0xff, 0x20, 0x27, 0xfc, 0x22, + 0x24, 0x4a, 0x8a, 0x31, 0x82, 0x23, 0xff, 0x80, + + /* U+6700 "最" */ + 0x3f, 0x84, 0x10, 0xfe, 0x10, 0x4f, 0xfe, 0x90, + 0x1e, 0xf2, 0x4a, 0x79, 0x49, 0x93, 0xe5, 0x5, + 0x10, + + /* U+6708 "月" */ + 0x3f, 0xc8, 0x12, 0x4, 0xff, 0x20, 0x48, 0x13, + 0xfc, 0x81, 0x40, 0x50, 0x18, 0x1c, + /* U+671F "期" */ 0x48, 0x9, 0x3f, 0xf4, 0xa4, 0x97, 0x9e, 0x92, 0x5e, 0x4a, 0x4f, 0xfd, 0x20, 0x25, 0x24, 0xc3, 0x30, + /* U+672A "未" */ + 0x4, 0x0, 0x81, 0xff, 0x2, 0x0, 0x41, 0xff, + 0xc3, 0x80, 0xa8, 0x24, 0x98, 0x8c, 0x10, 0x2, + 0x0, + /* U+672C "本" */ 0x4, 0x0, 0x83, 0xff, 0x82, 0x0, 0xe0, 0x2a, 0x5, 0x41, 0x24, 0x44, 0x57, 0xf4, 0x10, 0x2, @@ -608,6 +725,11 @@ static LV_ATTRIBUTE_LARGE_CONST const uint8_t glyph_bitmap[] = { 0x8, 0x21, 0xfc, 0x20, 0x87, 0xf0, 0x0, 0x7f, 0xf0, + /* U+6807 "标" */ + 0x20, 0x4, 0xf8, 0x80, 0x78, 0x2, 0xfe, 0xc2, + 0x1c, 0x45, 0x2a, 0x25, 0x25, 0x24, 0x84, 0x11, + 0x80, + /* U+6821 "校" */ 0x22, 0x4, 0x20, 0xbf, 0xf8, 0x2, 0x28, 0xe8, 0x9a, 0xad, 0x14, 0x22, 0x84, 0x20, 0x8a, 0x16, @@ -623,10 +745,30 @@ static LV_ATTRIBUTE_LARGE_CONST const uint8_t glyph_bitmap[] = { 0x9d, 0x15, 0x3e, 0x21, 0x5, 0xfc, 0x8a, 0x16, 0x30, + /* U+6B20 "欠" */ + 0x20, 0x4, 0x0, 0xff, 0x20, 0x24, 0x45, 0x9, + 0x1, 0x0, 0x50, 0xa, 0x2, 0x20, 0x82, 0x60, + 0x30, + + /* U+6B21 "次" */ + 0x4, 0x10, 0x81, 0x1f, 0x84, 0x10, 0xa4, 0x24, + 0x0, 0x81, 0x28, 0x45, 0x11, 0x10, 0x41, 0x10, + 0x10, + /* U+6B7B "死" */ 0xff, 0xe4, 0x40, 0x88, 0x1d, 0x14, 0xa5, 0x55, 0x4, 0xc0, 0x90, 0x22, 0x28, 0x46, 0x7, 0x80, + /* U+6BB5 "段" */ + 0x13, 0xcc, 0x49, 0x9, 0x3a, 0x34, 0x0, 0xef, + 0x90, 0x92, 0x92, 0x62, 0x98, 0x21, 0xa, 0x26, + 0x30, + + /* U+6C42 "求" */ + 0x4, 0x80, 0x8b, 0xff, 0x82, 0x4, 0x64, 0x4d, + 0x3, 0x40, 0xa8, 0x24, 0x98, 0x88, 0x10, 0x86, + 0x0, + /* U+6CE2 "波" */ 0x1, 0x10, 0x21, 0x7f, 0x88, 0x91, 0x11, 0x3f, 0x95, 0x10, 0xa2, 0x12, 0x8a, 0x22, 0x4a, 0x16, @@ -642,11 +784,21 @@ static LV_ATTRIBUTE_LARGE_CONST const uint8_t glyph_bitmap[] = { 0x5a, 0xa9, 0x55, 0x2a, 0xa9, 0x6, 0x50, 0x91, 0x30, + /* U+6D88 "消" */ + 0x1, 0x9, 0x24, 0x95, 0x0, 0x88, 0xfe, 0x90, + 0x43, 0xf8, 0x41, 0x2f, 0xe9, 0x6, 0x20, 0x84, + 0x30, + /* U+6E05 "清" */ 0x2, 0x17, 0xfd, 0x8, 0xf, 0xe0, 0x21, 0x7f, 0xd4, 0x10, 0xfe, 0x10, 0x4b, 0xfa, 0x41, 0x8, 0x60, + /* U+6E29 "温" */ + 0xf, 0x91, 0x11, 0x3e, 0x4, 0x40, 0xf9, 0x0, + 0x17, 0xf0, 0xaa, 0x35, 0x4a, 0xaa, 0x55, 0x1f, + 0xf0, + /* U+70B9 "点" */ 0x4, 0x0, 0xfc, 0x10, 0x2, 0x7, 0xfc, 0x80, 0x90, 0x12, 0x2, 0x7f, 0xc0, 0x1, 0x49, 0x44, @@ -662,10 +814,20 @@ static LV_ATTRIBUTE_LARGE_CONST const uint8_t glyph_bitmap[] = { 0x51, 0x4b, 0xaa, 0x55, 0x4a, 0x91, 0x65, 0x49, 0x10, + /* U+72B6 "状" */ + 0x21, 0x4, 0x2a, 0x84, 0xb0, 0x82, 0xfe, 0x42, + 0x8, 0xa3, 0x14, 0xa2, 0x84, 0x88, 0x91, 0x14, + 0x10, + /* U+7528 "用" */ 0x7f, 0xd1, 0x14, 0x45, 0xff, 0x44, 0x51, 0x17, 0xfd, 0x11, 0x44, 0x51, 0x18, 0x1c, + /* U+7535 "电" */ + 0x8, 0x1, 0x3, 0xfe, 0x44, 0x48, 0x89, 0xff, + 0x22, 0x24, 0x44, 0xff, 0x91, 0x4, 0x20, 0x83, + 0xf0, + /* U+754C "界" */ 0x7f, 0xc8, 0x89, 0xff, 0x22, 0x27, 0xfc, 0x8, 0x6, 0xc7, 0x7, 0x11, 0x2, 0x20, 0x84, 0x20, @@ -689,6 +851,20 @@ static LV_ATTRIBUTE_LARGE_CONST const uint8_t glyph_bitmap[] = { 0xf7, 0xe4, 0x20, 0x9f, 0x22, 0xa7, 0x7d, 0xaa, 0x95, 0xf2, 0xc8, 0x55, 0xe, 0x61, 0x53, 0x80, + /* U+786E "确" */ + 0x2, 0x1e, 0x78, 0x91, 0x10, 0x44, 0x7e, 0xea, + 0x75, 0xfa, 0xa9, 0x57, 0xee, 0xa5, 0x54, 0x84, + 0x30, + + /* U+793A "示" */ + 0x3f, 0x80, 0x0, 0x0, 0x7f, 0xf0, 0x40, 0x8, + 0x9, 0x21, 0x22, 0x44, 0x30, 0x84, 0x30, 0x0, + + /* U+79D2 "秒" */ + 0x11, 0x1c, 0x20, 0x85, 0x12, 0x9f, 0x52, 0x4a, + 0x5a, 0x43, 0x89, 0xa0, 0x44, 0x10, 0x8c, 0x16, + 0x0, + /* U+7A0B "程" */ 0x17, 0xdc, 0x88, 0x91, 0x13, 0xef, 0x0, 0x4f, 0x9c, 0x43, 0x48, 0xa7, 0xc4, 0x20, 0x84, 0x17, @@ -748,6 +924,11 @@ static LV_ATTRIBUTE_LARGE_CONST const uint8_t glyph_bitmap[] = { 0x4, 0x82, 0x92, 0x50, 0x2a, 0x16, 0x42, 0x87, 0xc0, + /* U+8377 "荷" */ + 0x11, 0x1f, 0xfc, 0x44, 0x17, 0xf2, 0x4, 0x9e, + 0xb2, 0x52, 0x4a, 0x4f, 0x49, 0x9, 0x1, 0x20, + 0xe0, + /* U+884C "行" */ 0x10, 0x4, 0xf9, 0x0, 0x48, 0x2, 0xfe, 0xc1, 0x28, 0x21, 0x4, 0x20, 0x84, 0x10, 0x82, 0x11, @@ -793,31 +974,95 @@ static LV_ATTRIBUTE_LARGE_CONST const uint8_t glyph_bitmap[] = { 0x90, 0x83, 0xff, 0x42, 0xc, 0xa1, 0x22, 0x8, 0x30, + /* U+8BF7 "请" */ + 0x82, 0xb, 0xfc, 0x8, 0x7, 0xec, 0x20, 0xbf, + 0xd2, 0x12, 0x7e, 0x48, 0x49, 0xf9, 0xa1, 0x24, + 0x60, + + /* U+8D1F "负" */ + 0x20, 0x7, 0xe1, 0x4, 0x41, 0x7, 0xfc, 0x80, + 0x91, 0x12, 0x22, 0x44, 0x41, 0x60, 0xc3, 0x60, + 0x10, + + /* U+8D8A "越" */ + 0x20, 0xa4, 0x13, 0xdf, 0x92, 0x42, 0x4b, 0xeb, + 0x49, 0xb5, 0x25, 0xb1, 0x74, 0x47, 0x80, 0x5f, + 0xf0, + + /* U+8DF3 "跳" */ + 0xf2, 0x92, 0x52, 0x6a, 0xfb, 0x62, 0x28, 0x45, + 0x2d, 0xb5, 0x55, 0xa2, 0x96, 0x57, 0x12, 0x84, + 0x30, + /* U+8F6F "软" */ 0x22, 0x4, 0x43, 0xcf, 0xa2, 0x16, 0x45, 0x52, 0x3c, 0x41, 0x8, 0x32, 0x9c, 0x50, 0x91, 0x14, 0x10, + /* U+8F7D "载" */ + 0x11, 0x4f, 0xa4, 0x44, 0x7f, 0xf2, 0x11, 0xfa, + 0x94, 0x53, 0xea, 0x10, 0x83, 0x97, 0xc5, 0x89, + 0x10, + /* U+8F93 "输" */ 0x21, 0x4, 0x53, 0xd1, 0x25, 0xda, 0x1, 0xfc, 0x4a, 0xa9, 0xf5, 0xea, 0xa5, 0xd4, 0xa8, 0x95, 0x30, + /* U+8FC7 "过" */ + 0x40, 0x44, 0x8, 0x1, 0x7, 0xfe, 0x4, 0x48, + 0x88, 0x91, 0x12, 0x20, 0x44, 0x39, 0x40, 0x47, + 0xf0, + /* U+8FD0 "运" */ 0x40, 0x4, 0xf8, 0x0, 0x0, 0xe, 0xfe, 0x42, 0x8, 0x81, 0x22, 0x2f, 0xe4, 0x5, 0x40, 0x47, 0xf0, + /* U+8FD1 "近" */ + 0x40, 0xc4, 0xe0, 0x10, 0x2, 0xe, 0x7e, 0x49, + 0x9, 0x21, 0x24, 0x24, 0x85, 0x11, 0x40, 0x47, + 0xf0, + + /* U+8FD4 "返" */ + 0x40, 0xe5, 0xe0, 0x20, 0x7, 0xfe, 0x82, 0x54, + 0x4a, 0x51, 0x44, 0x29, 0x46, 0x45, 0x40, 0x47, + 0xf0, + + /* U+9000 "退" */ + 0x4f, 0xc5, 0x8, 0x3f, 0x4, 0x2e, 0xfc, 0x54, + 0x4a, 0x51, 0x54, 0x2c, 0x45, 0x9, 0x40, 0x47, + 0xf0, + /* U+901A "通" */ 0x9f, 0x88, 0x90, 0xc, 0xf, 0xed, 0x24, 0xbf, 0x94, 0x92, 0xfe, 0x52, 0x4a, 0x59, 0x0, 0x5f, 0xf0, + /* U+9053 "道" */ + 0x44, 0x45, 0xfc, 0x8, 0x7, 0xfe, 0x82, 0x5f, + 0xca, 0x9, 0x7f, 0x28, 0x25, 0xfd, 0x40, 0x47, + 0xf0, + /* U+9065 "遥" */ 0x80, 0xeb, 0xe0, 0x28, 0x82, 0xac, 0x7c, 0x92, 0x17, 0xfa, 0x8, 0x49, 0x29, 0xfd, 0x0, 0x5f, 0xf0, + /* U+90E8 "部" */ + 0x10, 0xf, 0xbc, 0x4, 0xa2, 0x92, 0x95, 0xfe, + 0x80, 0x4b, 0xe9, 0x45, 0x28, 0xb9, 0xf4, 0x22, + 0x80, + + /* U+914D "配" */ + 0xfe, 0xe5, 0x7, 0xf8, 0xd5, 0x1a, 0xaf, 0x8d, + 0x20, 0xa7, 0xf4, 0x82, 0xbf, 0xd6, 0x9, 0x80, + + /* U+91CD "重" */ + 0x3, 0xcf, 0x80, 0x10, 0x7f, 0xf4, 0x44, 0xff, + 0x91, 0x13, 0xfe, 0x4, 0xf, 0xf8, 0x10, 0x7f, + 0xf0, + /* U+91CF "量" */ 0x7f, 0xc8, 0x89, 0x9, 0x7f, 0xf4, 0x44, 0xff, 0x91, 0x13, 0xfe, 0x4, 0xf, 0xf8, 0x10, 0x7f, @@ -833,11 +1078,34 @@ static LV_ATTRIBUTE_LARGE_CONST const uint8_t glyph_bitmap[] = { 0x48, 0x8f, 0xdf, 0x22, 0x25, 0x44, 0xc8, 0x92, 0x70, + /* U+9501 "锁" */ + 0x41, 0xd, 0x26, 0x15, 0x0, 0x8e, 0xfe, 0x90, + 0x52, 0x4f, 0x49, 0x49, 0x28, 0x51, 0x91, 0x2c, + 0x10, + /* U+9519 "错" */ 0x42, 0x48, 0x49, 0xdf, 0xc1, 0x2e, 0xfe, 0x80, 0x11, 0xff, 0xa1, 0x47, 0xea, 0x85, 0x9f, 0xa2, 0x10, + /* U+957F "长" */ + 0x10, 0x2, 0x18, 0x4c, 0xe, 0x1, 0x1, 0xff, + 0xc4, 0x80, 0x90, 0x11, 0x2, 0x90, 0x61, 0x88, + 0x0, + + /* U+95ED "闭" */ + 0x80, 0x13, 0xf0, 0x6, 0x11, 0x84, 0x6f, 0xd8, + 0x46, 0x31, 0x94, 0x69, 0x18, 0xc6, 0x7, + + /* U+95F4 "间" */ + 0x9f, 0xd0, 0x10, 0x6, 0xfd, 0xa1, 0x68, 0x5b, + 0xf6, 0x85, 0xa1, 0x6f, 0xd8, 0x6, 0x7, + + /* U+95F8 "闸" */ + 0x9f, 0xe8, 0x4, 0x0, 0xdf, 0xda, 0x4b, 0x7f, + 0x69, 0x2d, 0xfd, 0x84, 0x30, 0x86, 0x10, 0xc0, + 0x30, + /* U+9632 "防" */ 0x2, 0x1e, 0x22, 0x7f, 0xc9, 0xa, 0x21, 0x47, 0xe4, 0x8c, 0x91, 0x92, 0x3c, 0x86, 0x10, 0xc4, @@ -848,6 +1116,16 @@ static LV_ATTRIBUTE_LARGE_CONST const uint8_t glyph_bitmap[] = { 0x2b, 0xfd, 0x8, 0xa5, 0x59, 0x26, 0x44, 0xc1, 0x80, + /* U+969C "障" */ + 0x1, 0x1e, 0xfa, 0x4a, 0x4f, 0xfa, 0x45, 0x4f, + 0xa5, 0x14, 0xbe, 0x91, 0x1d, 0xfe, 0x4, 0x40, + 0x80, + + /* U+96F6 "零" */ + 0x7f, 0xc0, 0x83, 0xff, 0xda, 0xd0, 0x40, 0xeb, + 0x82, 0x81, 0xac, 0xdf, 0x60, 0x40, 0x70, 0x1, + 0x80, + /* U+9762 "面" */ 0xff, 0xe0, 0x80, 0x20, 0x3f, 0xf4, 0x92, 0x9e, 0x52, 0x4a, 0x79, 0x49, 0x2f, 0xfd, 0x0, 0x80, @@ -857,6 +1135,11 @@ static LV_ATTRIBUTE_LARGE_CONST const uint8_t glyph_bitmap[] = { 0x91, 0x12, 0x22, 0x44, 0x41, 0x60, 0xc3, 0x60, 0x10, + /* U+9891 "频" */ + 0x13, 0xeb, 0x91, 0x44, 0x29, 0xff, 0xe2, 0x25, + 0x54, 0xaa, 0xb5, 0x8a, 0xa2, 0x10, 0x85, 0x61, + 0x10, + /* U+9988 "馈" */ 0x41, 0x9, 0xfd, 0xa4, 0xd7, 0xf0, 0x10, 0xbf, 0xd0, 0x2, 0x7f, 0x49, 0x29, 0x25, 0x8b, 0x26, @@ -879,10 +1162,7 @@ static LV_ATTRIBUTE_LARGE_CONST const uint8_t glyph_bitmap[] = { 0xf0, 0xf0, /* U+25B6 "▶"(来源:Segoe UI Symbol;宋体无此字形) */ - 0x80, 0xe0, 0xf0, 0xfc, 0xff, 0xfe, 0xf8, 0xf0, 0xc0, 0x00, - - /* U+FF0C ','(来源:宋体迷你字体并入;lv_font_conv 丢低码位符号) */ - 0xf6 + 0x80, 0xe0, 0xf0, 0xfc, 0xff, 0xfe, 0xf8, 0xf0, 0xc0, 0x00 }; @@ -987,126 +1267,185 @@ static const lv_font_fmt_txt_glyph_dsc_t glyph_dsc[] = { {.bitmap_index = 476, .adv_w = 96, .box_w = 1, .box_h = 13, .ofs_x = 3, .ofs_y = -2}, {.bitmap_index = 478, .adv_w = 96, .box_w = 3, .box_h = 12, .ofs_x = 1, .ofs_y = -1}, {.bitmap_index = 483, .adv_w = 96, .box_w = 6, .box_h = 3, .ofs_x = 0, .ofs_y = 8}, - {.bitmap_index = 486, .adv_w = 192, .box_w = 11, .box_h = 11, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 502, .adv_w = 192, .box_w = 11, .box_h = 12, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 519, .adv_w = 192, .box_w = 11, .box_h = 12, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 536, .adv_w = 192, .box_w = 11, .box_h = 12, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 553, .adv_w = 192, .box_w = 11, .box_h = 12, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 570, .adv_w = 192, .box_w = 11, .box_h = 12, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 587, .adv_w = 192, .box_w = 11, .box_h = 12, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 604, .adv_w = 192, .box_w = 11, .box_h = 12, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 621, .adv_w = 192, .box_w = 11, .box_h = 12, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 638, .adv_w = 192, .box_w = 11, .box_h = 12, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 655, .adv_w = 192, .box_w = 11, .box_h = 12, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 672, .adv_w = 192, .box_w = 11, .box_h = 12, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 689, .adv_w = 192, .box_w = 11, .box_h = 12, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 706, .adv_w = 192, .box_w = 11, .box_h = 12, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 723, .adv_w = 192, .box_w = 11, .box_h = 12, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 740, .adv_w = 192, .box_w = 11, .box_h = 12, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 757, .adv_w = 192, .box_w = 10, .box_h = 11, .ofs_x = 1, .ofs_y = -2}, - {.bitmap_index = 771, .adv_w = 192, .box_w = 11, .box_h = 11, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 787, .adv_w = 192, .box_w = 11, .box_h = 12, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 804, .adv_w = 192, .box_w = 11, .box_h = 11, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 820, .adv_w = 192, .box_w = 9, .box_h = 10, .ofs_x = 1, .ofs_y = -1}, - {.bitmap_index = 832, .adv_w = 192, .box_w = 11, .box_h = 12, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 849, .adv_w = 192, .box_w = 11, .box_h = 12, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 866, .adv_w = 192, .box_w = 11, .box_h = 12, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 883, .adv_w = 192, .box_w = 11, .box_h = 12, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 900, .adv_w = 192, .box_w = 11, .box_h = 12, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 917, .adv_w = 192, .box_w = 11, .box_h = 12, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 934, .adv_w = 192, .box_w = 11, .box_h = 12, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 951, .adv_w = 192, .box_w = 11, .box_h = 11, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 967, .adv_w = 192, .box_w = 11, .box_h = 12, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 984, .adv_w = 192, .box_w = 11, .box_h = 12, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 1001, .adv_w = 192, .box_w = 11, .box_h = 12, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 1018, .adv_w = 192, .box_w = 11, .box_h = 12, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 1035, .adv_w = 192, .box_w = 11, .box_h = 12, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 1052, .adv_w = 192, .box_w = 11, .box_h = 12, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 1069, .adv_w = 192, .box_w = 11, .box_h = 12, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 1086, .adv_w = 192, .box_w = 11, .box_h = 12, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 1103, .adv_w = 192, .box_w = 11, .box_h = 12, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 1120, .adv_w = 192, .box_w = 11, .box_h = 12, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 1137, .adv_w = 192, .box_w = 11, .box_h = 12, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 1154, .adv_w = 192, .box_w = 9, .box_h = 12, .ofs_x = 1, .ofs_y = -2}, - {.bitmap_index = 1168, .adv_w = 192, .box_w = 11, .box_h = 12, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 1185, .adv_w = 192, .box_w = 11, .box_h = 12, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 1202, .adv_w = 192, .box_w = 11, .box_h = 12, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 1219, .adv_w = 192, .box_w = 11, .box_h = 12, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 1236, .adv_w = 192, .box_w = 11, .box_h = 12, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 1253, .adv_w = 192, .box_w = 11, .box_h = 12, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 1270, .adv_w = 192, .box_w = 11, .box_h = 12, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 1287, .adv_w = 192, .box_w = 11, .box_h = 12, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 1304, .adv_w = 192, .box_w = 11, .box_h = 12, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 1321, .adv_w = 192, .box_w = 11, .box_h = 12, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 1338, .adv_w = 192, .box_w = 11, .box_h = 12, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 1355, .adv_w = 192, .box_w = 11, .box_h = 12, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 1372, .adv_w = 192, .box_w = 11, .box_h = 12, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 1389, .adv_w = 192, .box_w = 11, .box_h = 12, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 1406, .adv_w = 192, .box_w = 11, .box_h = 11, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 1422, .adv_w = 192, .box_w = 9, .box_h = 11, .ofs_x = 1, .ofs_y = -2}, - {.bitmap_index = 1435, .adv_w = 192, .box_w = 11, .box_h = 12, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 1452, .adv_w = 192, .box_w = 11, .box_h = 12, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 1469, .adv_w = 192, .box_w = 11, .box_h = 12, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 1486, .adv_w = 192, .box_w = 11, .box_h = 12, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 1503, .adv_w = 192, .box_w = 11, .box_h = 12, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 1520, .adv_w = 192, .box_w = 11, .box_h = 12, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 1537, .adv_w = 192, .box_w = 11, .box_h = 12, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 1554, .adv_w = 192, .box_w = 11, .box_h = 12, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 1571, .adv_w = 192, .box_w = 11, .box_h = 11, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 1587, .adv_w = 192, .box_w = 11, .box_h = 12, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 1604, .adv_w = 192, .box_w = 11, .box_h = 12, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 1621, .adv_w = 192, .box_w = 11, .box_h = 12, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 1638, .adv_w = 192, .box_w = 11, .box_h = 12, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 1655, .adv_w = 192, .box_w = 11, .box_h = 12, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 1672, .adv_w = 192, .box_w = 11, .box_h = 12, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 1689, .adv_w = 192, .box_w = 11, .box_h = 12, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 1706, .adv_w = 192, .box_w = 10, .box_h = 11, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 1720, .adv_w = 192, .box_w = 11, .box_h = 12, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 1737, .adv_w = 192, .box_w = 10, .box_h = 12, .ofs_x = 1, .ofs_y = -2}, - {.bitmap_index = 1752, .adv_w = 192, .box_w = 11, .box_h = 12, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 1769, .adv_w = 192, .box_w = 11, .box_h = 12, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 1786, .adv_w = 192, .box_w = 11, .box_h = 11, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 1802, .adv_w = 192, .box_w = 11, .box_h = 12, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 1819, .adv_w = 192, .box_w = 11, .box_h = 12, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 1836, .adv_w = 192, .box_w = 11, .box_h = 12, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 1853, .adv_w = 192, .box_w = 11, .box_h = 12, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 1870, .adv_w = 192, .box_w = 11, .box_h = 12, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 1887, .adv_w = 192, .box_w = 11, .box_h = 12, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 1904, .adv_w = 192, .box_w = 11, .box_h = 12, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 1921, .adv_w = 192, .box_w = 11, .box_h = 12, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 1938, .adv_w = 192, .box_w = 11, .box_h = 12, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 1955, .adv_w = 192, .box_w = 11, .box_h = 12, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 1972, .adv_w = 192, .box_w = 9, .box_h = 12, .ofs_x = 1, .ofs_y = -2}, - {.bitmap_index = 1986, .adv_w = 192, .box_w = 11, .box_h = 12, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 2003, .adv_w = 192, .box_w = 11, .box_h = 12, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 2020, .adv_w = 192, .box_w = 11, .box_h = 12, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 2037, .adv_w = 192, .box_w = 11, .box_h = 12, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 2054, .adv_w = 192, .box_w = 11, .box_h = 12, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 2071, .adv_w = 192, .box_w = 11, .box_h = 12, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 2088, .adv_w = 192, .box_w = 11, .box_h = 12, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 2105, .adv_w = 192, .box_w = 11, .box_h = 12, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 2122, .adv_w = 192, .box_w = 11, .box_h = 12, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 2139, .adv_w = 192, .box_w = 11, .box_h = 12, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 2156, .adv_w = 192, .box_w = 11, .box_h = 12, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 2173, .adv_w = 192, .box_w = 11, .box_h = 12, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 2190, .adv_w = 192, .box_w = 11, .box_h = 12, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 2207, .adv_w = 192, .box_w = 11, .box_h = 12, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 2224, .adv_w = 192, .box_w = 11, .box_h = 12, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 2241, .adv_w = 192, .box_w = 11, .box_h = 12, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 2258, .adv_w = 192, .box_w = 11, .box_h = 12, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 2275, .adv_w = 192, .box_w = 11, .box_h = 12, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 2292, .adv_w = 192, .box_w = 11, .box_h = 12, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 2309, .adv_w = 192, .box_w = 11, .box_h = 12, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 2326, .adv_w = 192, .box_w = 11, .box_h = 12, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 2343, .adv_w = 192, .box_w = 11, .box_h = 11, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 2359, .adv_w = 192, .box_w = 11, .box_h = 12, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 2376, .adv_w = 192, .box_w = 11, .box_h = 12, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 2393, .adv_w = 192, .box_w = 11, .box_h = 12, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 2410, .adv_w = 192, .box_w = 11, .box_h = 12, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 2427, .adv_w = 192, .box_w = 2, .box_h = 4, .ofs_x = 2, .ofs_y = 0}, - {.bitmap_index = 2428, .adv_w = 192, .box_w = 2, .box_h = 6, .ofs_x = 2, .ofs_y = 0}, - {.bitmap_index = 2430, .adv_w = 165, .box_w = 8, .box_h = 10, .ofs_x = 1, .ofs_y = -1} /* U+25B6 */, - {.bitmap_index = 2440, .adv_w = 192, .box_w = 2, .box_h = 4, .ofs_x = 2, .ofs_y = 0} /* U+FF0C */ + {.bitmap_index = 486, .adv_w = 192, .box_w = 3, .box_h = 9, .ofs_x = 4, .ofs_y = 0}, + {.bitmap_index = 490, .adv_w = 192, .box_w = 7, .box_h = 9, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 498, .adv_w = 192, .box_w = 11, .box_h = 9, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 511, .adv_w = 192, .box_w = 11, .box_h = 1, .ofs_x = 0, .ofs_y = 3}, + {.bitmap_index = 513, .adv_w = 192, .box_w = 11, .box_h = 11, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 529, .adv_w = 192, .box_w = 11, .box_h = 12, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 546, .adv_w = 192, .box_w = 11, .box_h = 12, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 563, .adv_w = 192, .box_w = 11, .box_h = 9, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 576, .adv_w = 192, .box_w = 11, .box_h = 12, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 593, .adv_w = 192, .box_w = 11, .box_h = 12, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 610, .adv_w = 192, .box_w = 11, .box_h = 12, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 627, .adv_w = 192, .box_w = 11, .box_h = 12, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 644, .adv_w = 192, .box_w = 11, .box_h = 12, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 661, .adv_w = 192, .box_w = 11, .box_h = 12, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 678, .adv_w = 192, .box_w = 11, .box_h = 12, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 695, .adv_w = 192, .box_w = 11, .box_h = 12, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 712, .adv_w = 192, .box_w = 11, .box_h = 12, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 729, .adv_w = 192, .box_w = 11, .box_h = 12, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 746, .adv_w = 192, .box_w = 11, .box_h = 12, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 763, .adv_w = 192, .box_w = 11, .box_h = 12, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 780, .adv_w = 192, .box_w = 11, .box_h = 12, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 797, .adv_w = 192, .box_w = 11, .box_h = 12, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 814, .adv_w = 192, .box_w = 11, .box_h = 12, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 831, .adv_w = 192, .box_w = 11, .box_h = 12, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 848, .adv_w = 192, .box_w = 11, .box_h = 12, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 865, .adv_w = 192, .box_w = 11, .box_h = 12, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 882, .adv_w = 192, .box_w = 10, .box_h = 11, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 896, .adv_w = 192, .box_w = 11, .box_h = 11, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 912, .adv_w = 192, .box_w = 11, .box_h = 12, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 929, .adv_w = 192, .box_w = 11, .box_h = 11, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 945, .adv_w = 192, .box_w = 11, .box_h = 11, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 961, .adv_w = 192, .box_w = 9, .box_h = 10, .ofs_x = 1, .ofs_y = -1}, + {.bitmap_index = 973, .adv_w = 192, .box_w = 11, .box_h = 12, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 990, .adv_w = 192, .box_w = 11, .box_h = 12, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 1007, .adv_w = 192, .box_w = 11, .box_h = 12, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 1024, .adv_w = 192, .box_w = 11, .box_h = 12, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 1041, .adv_w = 192, .box_w = 10, .box_h = 11, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 1055, .adv_w = 192, .box_w = 11, .box_h = 12, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 1072, .adv_w = 192, .box_w = 11, .box_h = 12, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 1089, .adv_w = 192, .box_w = 11, .box_h = 12, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 1106, .adv_w = 192, .box_w = 11, .box_h = 12, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 1123, .adv_w = 192, .box_w = 11, .box_h = 12, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 1140, .adv_w = 192, .box_w = 11, .box_h = 11, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 1156, .adv_w = 192, .box_w = 11, .box_h = 12, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 1173, .adv_w = 192, .box_w = 11, .box_h = 12, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 1190, .adv_w = 192, .box_w = 11, .box_h = 12, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 1207, .adv_w = 192, .box_w = 11, .box_h = 12, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 1224, .adv_w = 192, .box_w = 11, .box_h = 12, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 1241, .adv_w = 192, .box_w = 10, .box_h = 11, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 1255, .adv_w = 192, .box_w = 11, .box_h = 12, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 1272, .adv_w = 192, .box_w = 11, .box_h = 12, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 1289, .adv_w = 192, .box_w = 11, .box_h = 12, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 1306, .adv_w = 192, .box_w = 11, .box_h = 12, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 1323, .adv_w = 192, .box_w = 11, .box_h = 12, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 1340, .adv_w = 192, .box_w = 11, .box_h = 12, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 1357, .adv_w = 192, .box_w = 11, .box_h = 12, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 1374, .adv_w = 192, .box_w = 11, .box_h = 12, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 1391, .adv_w = 192, .box_w = 11, .box_h = 12, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 1408, .adv_w = 192, .box_w = 9, .box_h = 12, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 1422, .adv_w = 192, .box_w = 11, .box_h = 12, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 1439, .adv_w = 192, .box_w = 11, .box_h = 12, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 1456, .adv_w = 192, .box_w = 11, .box_h = 12, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 1473, .adv_w = 192, .box_w = 11, .box_h = 12, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 1490, .adv_w = 192, .box_w = 11, .box_h = 12, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 1507, .adv_w = 192, .box_w = 11, .box_h = 12, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 1524, .adv_w = 192, .box_w = 11, .box_h = 12, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 1541, .adv_w = 192, .box_w = 11, .box_h = 12, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 1558, .adv_w = 192, .box_w = 11, .box_h = 12, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 1575, .adv_w = 192, .box_w = 11, .box_h = 12, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 1592, .adv_w = 192, .box_w = 11, .box_h = 12, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 1609, .adv_w = 192, .box_w = 11, .box_h = 12, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 1626, .adv_w = 192, .box_w = 11, .box_h = 12, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 1643, .adv_w = 192, .box_w = 11, .box_h = 12, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 1660, .adv_w = 192, .box_w = 11, .box_h = 12, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 1677, .adv_w = 192, .box_w = 11, .box_h = 12, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 1694, .adv_w = 192, .box_w = 11, .box_h = 12, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 1711, .adv_w = 192, .box_w = 11, .box_h = 12, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 1728, .adv_w = 192, .box_w = 11, .box_h = 11, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 1744, .adv_w = 192, .box_w = 9, .box_h = 11, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 1757, .adv_w = 192, .box_w = 11, .box_h = 12, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 1774, .adv_w = 192, .box_w = 11, .box_h = 11, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 1790, .adv_w = 192, .box_w = 11, .box_h = 12, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 1807, .adv_w = 192, .box_w = 10, .box_h = 11, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 1821, .adv_w = 192, .box_w = 11, .box_h = 12, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 1838, .adv_w = 192, .box_w = 11, .box_h = 12, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 1855, .adv_w = 192, .box_w = 11, .box_h = 12, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 1872, .adv_w = 192, .box_w = 11, .box_h = 12, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 1889, .adv_w = 192, .box_w = 11, .box_h = 12, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 1906, .adv_w = 192, .box_w = 11, .box_h = 12, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 1923, .adv_w = 192, .box_w = 11, .box_h = 12, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 1940, .adv_w = 192, .box_w = 11, .box_h = 12, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 1957, .adv_w = 192, .box_w = 11, .box_h = 12, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 1974, .adv_w = 192, .box_w = 11, .box_h = 12, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 1991, .adv_w = 192, .box_w = 11, .box_h = 12, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 2008, .adv_w = 192, .box_w = 11, .box_h = 11, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 2024, .adv_w = 192, .box_w = 11, .box_h = 12, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 2041, .adv_w = 192, .box_w = 11, .box_h = 12, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 2058, .adv_w = 192, .box_w = 11, .box_h = 12, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 2075, .adv_w = 192, .box_w = 11, .box_h = 12, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 2092, .adv_w = 192, .box_w = 11, .box_h = 12, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 2109, .adv_w = 192, .box_w = 11, .box_h = 12, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 2126, .adv_w = 192, .box_w = 11, .box_h = 12, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 2143, .adv_w = 192, .box_w = 11, .box_h = 12, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 2160, .adv_w = 192, .box_w = 11, .box_h = 12, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 2177, .adv_w = 192, .box_w = 11, .box_h = 12, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 2194, .adv_w = 192, .box_w = 11, .box_h = 12, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 2211, .adv_w = 192, .box_w = 11, .box_h = 12, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 2228, .adv_w = 192, .box_w = 10, .box_h = 11, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 2242, .adv_w = 192, .box_w = 11, .box_h = 12, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 2259, .adv_w = 192, .box_w = 11, .box_h = 12, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 2276, .adv_w = 192, .box_w = 10, .box_h = 12, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 2291, .adv_w = 192, .box_w = 11, .box_h = 12, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 2308, .adv_w = 192, .box_w = 11, .box_h = 12, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 2325, .adv_w = 192, .box_w = 11, .box_h = 11, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 2341, .adv_w = 192, .box_w = 11, .box_h = 12, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 2358, .adv_w = 192, .box_w = 11, .box_h = 11, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 2374, .adv_w = 192, .box_w = 11, .box_h = 12, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 2391, .adv_w = 192, .box_w = 11, .box_h = 12, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 2408, .adv_w = 192, .box_w = 11, .box_h = 12, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 2425, .adv_w = 192, .box_w = 11, .box_h = 12, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 2442, .adv_w = 192, .box_w = 11, .box_h = 12, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 2459, .adv_w = 192, .box_w = 11, .box_h = 12, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 2476, .adv_w = 192, .box_w = 11, .box_h = 12, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 2493, .adv_w = 192, .box_w = 11, .box_h = 12, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 2510, .adv_w = 192, .box_w = 11, .box_h = 12, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 2527, .adv_w = 192, .box_w = 11, .box_h = 12, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 2544, .adv_w = 192, .box_w = 11, .box_h = 12, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 2561, .adv_w = 192, .box_w = 9, .box_h = 12, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 2575, .adv_w = 192, .box_w = 11, .box_h = 12, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 2592, .adv_w = 192, .box_w = 11, .box_h = 12, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 2609, .adv_w = 192, .box_w = 11, .box_h = 12, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 2626, .adv_w = 192, .box_w = 11, .box_h = 12, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 2643, .adv_w = 192, .box_w = 11, .box_h = 12, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 2660, .adv_w = 192, .box_w = 11, .box_h = 12, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 2677, .adv_w = 192, .box_w = 11, .box_h = 12, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 2694, .adv_w = 192, .box_w = 11, .box_h = 12, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 2711, .adv_w = 192, .box_w = 11, .box_h = 12, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 2728, .adv_w = 192, .box_w = 11, .box_h = 12, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 2745, .adv_w = 192, .box_w = 11, .box_h = 12, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 2762, .adv_w = 192, .box_w = 11, .box_h = 12, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 2779, .adv_w = 192, .box_w = 11, .box_h = 12, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 2796, .adv_w = 192, .box_w = 11, .box_h = 12, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 2813, .adv_w = 192, .box_w = 11, .box_h = 12, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 2830, .adv_w = 192, .box_w = 11, .box_h = 12, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 2847, .adv_w = 192, .box_w = 11, .box_h = 12, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 2864, .adv_w = 192, .box_w = 11, .box_h = 12, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 2881, .adv_w = 192, .box_w = 11, .box_h = 12, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 2898, .adv_w = 192, .box_w = 11, .box_h = 12, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 2915, .adv_w = 192, .box_w = 11, .box_h = 12, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 2932, .adv_w = 192, .box_w = 11, .box_h = 12, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 2949, .adv_w = 192, .box_w = 11, .box_h = 12, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 2966, .adv_w = 192, .box_w = 11, .box_h = 12, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 2983, .adv_w = 192, .box_w = 11, .box_h = 12, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 3000, .adv_w = 192, .box_w = 11, .box_h = 12, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 3017, .adv_w = 192, .box_w = 11, .box_h = 12, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 3034, .adv_w = 192, .box_w = 11, .box_h = 11, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 3050, .adv_w = 192, .box_w = 11, .box_h = 12, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 3067, .adv_w = 192, .box_w = 11, .box_h = 12, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 3084, .adv_w = 192, .box_w = 11, .box_h = 12, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 3101, .adv_w = 192, .box_w = 11, .box_h = 12, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 3118, .adv_w = 192, .box_w = 11, .box_h = 12, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 3135, .adv_w = 192, .box_w = 11, .box_h = 12, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 3152, .adv_w = 192, .box_w = 11, .box_h = 12, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 3169, .adv_w = 192, .box_w = 10, .box_h = 12, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 3184, .adv_w = 192, .box_w = 10, .box_h = 12, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 3199, .adv_w = 192, .box_w = 11, .box_h = 12, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 3216, .adv_w = 192, .box_w = 11, .box_h = 12, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 3233, .adv_w = 192, .box_w = 11, .box_h = 12, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 3250, .adv_w = 192, .box_w = 11, .box_h = 12, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 3267, .adv_w = 192, .box_w = 11, .box_h = 12, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 3284, .adv_w = 192, .box_w = 11, .box_h = 11, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 3300, .adv_w = 192, .box_w = 11, .box_h = 12, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 3317, .adv_w = 192, .box_w = 11, .box_h = 12, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 3334, .adv_w = 192, .box_w = 11, .box_h = 12, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 3351, .adv_w = 192, .box_w = 11, .box_h = 12, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 3368, .adv_w = 192, .box_w = 11, .box_h = 12, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 3385, .adv_w = 192, .box_w = 2, .box_h = 4, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 3386, .adv_w = 192, .box_w = 2, .box_h = 6, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 3388, .adv_w = 165, .box_w = 8, .box_h = 10, .ofs_x = 1, .ofs_y = -1} /* U+25B6 */ }; /*--------------------- @@ -1114,21 +1453,29 @@ static const lv_font_fmt_txt_glyph_dsc_t glyph_dsc[] = { *--------------------*/ static const uint16_t unicode_list_1[] = { - 0x0, 0x32, 0x82, 0x9b, 0xed, 0x153, 0x1d4, 0x1d8, - 0x233, 0x35c, 0x368, 0x36a, 0x42d, 0x444, 0x49f, 0x50d, - 0x531, 0x582, 0x5b9, 0x5c3, 0x5da, 0x5ee, 0x626, 0x641, - 0x927, 0x937, 0x982, 0xb04, 0xd47, 0xd4e, 0xd4f, 0xd91, - 0xd95, 0xdbd, 0x102f, 0x1086, 0x10f9, 0x1106, 0x1131, 0x1149, - 0x114a, 0x114c, 0x1266, 0x142e, 0x1442, 0x148d, 0x149b, 0x149c, - 0x1565, 0x159e, 0x15a0, 0x16c4, 0x173c, 0x1767, 0x176b, 0x17d7, - 0x17dc, 0x17ed, 0x1916, 0x1923, 0x1976, 0x19dc, 0x1a18, 0x1ab7, - 0x1c18, 0x1d72, 0x1ed9, 0x1f38, 0x1f42, 0x1ffc, 0x22b0, 0x243e, - 0x243f, 0x271f, 0x2743, 0x28eb, 0x2902, 0x29f8, 0x2a63, 0x2c02, - 0x2ce6, 0x2d23, 0x2e72, 0x2ef2, 0x30b6, 0x30bf, 0x30eb, 0x3148, - 0x3165, 0x33e1, 0x34a6, 0x3a43, 0x3abc, 0x3d5d, 0x3d9b, 0x3da6, - 0x3da7, 0x3db5, 0x3dd9, 0x3de6, 0x4166, 0x418a, 0x41c7, 0x4211, - 0x425c, 0x43c6, 0x4696, 0x469c, 0x4710, 0x4829, 0x485b, 0x4959, - 0x4a6c, 0x4b7f, 0x4c83, 0x50cf, 0xb103, 0xb111 + 0x0, 0x1, 0x2, 0x2ca0, 0x2ca9, 0x2cdb, 0x2d2b, 0x2d2c, + 0x2d44, 0x2d96, 0x2ded, 0x2dee, 0x2dfc, 0x2e7d, 0x2e81, 0x2edc, + 0x3005, 0x300c, 0x3011, 0x3013, 0x309a, 0x30a6, 0x30d6, 0x30ed, + 0x3148, 0x31b6, 0x31da, 0x322b, 0x3262, 0x326c, 0x3276, 0x3283, + 0x3297, 0x32a8, 0x32cf, 0x32ea, 0x357e, 0x35d0, 0x35e0, 0x362b, + 0x37ad, 0x37b6, 0x39f0, 0x39f7, 0x39f8, 0x3a3a, 0x3a3e, 0x3a66, + 0x3c92, 0x3cd8, 0x3d14, 0x3d2f, 0x3d46, 0x3d96, 0x3da2, 0x3daf, + 0x3dda, 0x3df2, 0x3df3, 0x3df5, 0x3ea1, 0x3edb, 0x3f0f, 0x40d7, + 0x40eb, 0x4135, 0x4136, 0x4144, 0x4145, 0x420e, 0x4245, 0x4247, + 0x4249, 0x436d, 0x43e5, 0x4410, 0x4414, 0x4480, 0x4485, 0x4496, + 0x44de, 0x45a0, 0x45a8, 0x45bf, 0x45ca, 0x45cc, 0x461f, 0x4685, + 0x46a7, 0x46c1, 0x4760, 0x48c1, 0x49c0, 0x49c1, 0x4a1b, 0x4a55, + 0x4ae2, 0x4b82, 0x4be1, 0x4beb, 0x4c28, 0x4ca5, 0x4cc9, 0x4f59, + 0x50e7, 0x50e8, 0x5156, 0x53c8, 0x53d5, 0x53ec, 0x5594, 0x55ab, + 0x56a1, 0x570c, 0x570e, 0x57da, 0x5872, 0x58ab, 0x598f, 0x59cc, + 0x5b1b, 0x5b9b, 0x5d5f, 0x5d68, 0x5d94, 0x5df1, 0x5e0e, 0x608a, + 0x614f, 0x6217, 0x66ec, 0x6765, 0x6a06, 0x6a44, 0x6a4f, 0x6a50, + 0x6a5e, 0x6a82, 0x6a8f, 0x6a97, 0x6bbf, 0x6c2a, 0x6c93, 0x6e0f, + 0x6e1d, 0x6e33, 0x6e67, 0x6e70, 0x6e71, 0x6e74, 0x6ea0, 0x6eba, + 0x6ef3, 0x6f05, 0x6f88, 0x6fed, 0x706d, 0x706f, 0x733f, 0x7345, + 0x73a1, 0x73b9, 0x741f, 0x748d, 0x7494, 0x7498, 0x74d2, 0x7504, + 0x753c, 0x7596, 0x7602, 0x7715, 0x7731, 0x7828, 0x792c, 0x7d78, + 0xddac, 0xddba }; /*Collect the unicode lists and glyph_id offsets*/ @@ -1139,16 +1486,12 @@ static const lv_font_fmt_txt_cmap_t cmaps[] = .unicode_list = NULL, .glyph_id_ofs_list = NULL, .list_length = 0, .type = LV_FONT_FMT_TXT_CMAP_FORMAT0_TINY }, { - .range_start = 19977, .range_length = 45330, .glyph_id_start = 96, - .unicode_list = unicode_list_1, .glyph_id_ofs_list = NULL, .list_length = 118, .type = LV_FONT_FMT_TXT_CMAP_SPARSE_TINY - }, - { - .range_start = 9654, .range_length = 1, .glyph_id_start = 214, + .range_start = 9654, .range_length = 1, .glyph_id_start = 274, .unicode_list = NULL, .glyph_id_ofs_list = NULL, .list_length = 0, .type = LV_FONT_FMT_TXT_CMAP_FORMAT0_TINY }, { - .range_start = 65292, .range_length = 1, .glyph_id_start = 215, - .unicode_list = NULL, .glyph_id_ofs_list = NULL, .list_length = 0, .type = LV_FONT_FMT_TXT_CMAP_FORMAT0_TINY + .range_start = 8544, .range_length = 56763, .glyph_id_start = 96, + .unicode_list = unicode_list_1, .glyph_id_ofs_list = NULL, .list_length = 178, .type = LV_FONT_FMT_TXT_CMAP_SPARSE_TINY } }; @@ -1165,7 +1508,7 @@ static const lv_font_fmt_txt_dsc_t font_dsc = { .cmaps = cmaps, .kern_dsc = NULL, .kern_scale = 0, - .cmap_num = 4, + .cmap_num = 3, .bpp = 1, .kern_classes = 0, .bitmap_format = 0, diff --git a/docs/UI设计/UI_中文字体生成与配置.md b/docs/UI设计/UI_中文字体生成与配置.md index d16d3467..3d6572e6 100644 --- a/docs/UI设计/UI_中文字体生成与配置.md +++ b/docs/UI设计/UI_中文字体生成与配置.md @@ -55,7 +55,7 @@ scanned 13 files; unique non-ASCII chars: 78 -> D:\Code\DTU Code\STM32F4-Base\ui_cn_chars.txt ``` -产物 `ui_cn_chars.txt` 为本工程实际显示的汉字清单(当前 122 字,含 ▶/,等符号),可留作字符集记录。 +产物 `ui_cn_chars.txt` 为本工程实际显示的汉字清单(当前 179 字,含 ▶/,/: 等符号;其中 60 字为 2026-10-25 按页面扩充规划显示串预置,源码未用前由 font-charset 门禁记 WARN 放行),可留作字符集记录。 --- @@ -85,16 +85,16 @@ npm i -g lv_font_conv # TTF/OTF -> LVGL 字体 离线转换器 ``` extracted SimSun regular (face0) -> C:\Users\...\Temp\simsun_regular.ttf RUN: lv_font_conv.cmd --font ... --size 12 --bpp 1 -r 0x20-0x7E --symbols ... --no-compress --format lvgl --lv-font-name ui_font_cn_12 -o ...\ui_font_cn_12.c -已合并箭头 U+25B6:位图+10 字节,glyph_id=206 -已合并 U+FF0C ',':1 字节位图,glyph_id=207 -OK 43614 bytes -> ...\Drivers\BSP\UI\ui_font_cn_12.c +已合并箭头 U+25B6:位图+10 字节,glyph_id=274 +U+FF0C ',' 已可经既有 cmap 解析,跳过合并 +OK 58192 bytes -> ...\Drivers\BSP\UI\ui_font_cn_12.c ``` > **▶ 箭头自动合并**:宋体(`simsun.ttc`)没有 U+25B6(▶)字形,`lv_font_conv` 会静默跳过 → 真机显示成方框。`make_font.py` 在生成后自动调用 `merge_arrow_glyph()`,把从 **Segoe UI Symbol**(`seguisym.ttf`,Windows 自带)预提取的箭头字形(位图 10 字节 + `glyph_dsc` + `cmap`)补回 `ui_font_cn_12.c`。该合并**幂等**(已存在则跳过),所以重生成字体后箭头不会丢。换用自带 ▶ 的字体(如黑体/Segoe)时可忽略此步。 -> **低码位符号自动合并**:`lv_font_conv` 的稀疏 cmap 从符号集最小码位起算,**低于该起点的符号被静默丢弃**(实测 U+3001/U+FF0C 等:U+FF0C 全角逗号 < 0x4E2D 范围起点时丢失,页脚"第 X 页,共 Y 页"的逗号长期渲染为空白)。`make_font.py` 的 `merge_extra_symbols()` 对每个此类符号单独生成迷你字体(真实宋体位图/度量),再并入主字体(位图 + `glyph_dsc` + 单码位 `cmap`),同样**幂等**。新增此类符号时把它加入脚本的 `EXTRA_SYMBOLS` 列表即可。 +> **低码位符号自动合并**:`lv_font_conv` 的稀疏 cmap 从符号集最小码位起算,**低于该起点的符号被静默丢弃**(实测 U+3001/U+FF0C 等:U+FF0C 全角逗号 < 0x4E2D 范围起点时丢失,页脚"第 X 页,共 Y 页"的逗号长期渲染为空白)。`make_font.py` 的 `merge_extra_symbols()` 对每个此类符号单独生成迷你字体(真实宋体位图/度量),再并入主字体(位图 + `glyph_dsc` + 单码位 `cmap`),同样**幂等**。新增此类符号时把它加入脚本的 `EXTRA_SYMBOLS` 列表即可。**两条 2026-10-25 规则**:合并前先用 `_cmap_lookup_gid()` 判可达(可达即跳过,不产生死条目);新 cmap 条目**插到第一个包含该码位的既有 range 之前**——LVGL `get_glyph_dsc_id()` 线性扫描、首个包含码位的 range 直接返回,追加在宽稀疏 range 之后的条目永远轮不到(见文末事故记录)。 -> **生成后覆盖率断言**:`make_font.py` 在合并后调用 `verify_coverage()`——解析生成字体的 cmap,校验 `ui_cn_chars.txt` 的**全部码位**都进了字体,缺一个即以非零退出码报错(列出 `U+XXXX`)。把 lv_font_conv 的静默丢字(低码位、源字体缺字形)从"上线后才发现空白"变成"生成期硬错误"。 +> **生成后覆盖率断言**:`make_font.py` 在合并后调用 `verify_coverage()`——解析生成字体的 cmap,校验 `ui_cn_chars.txt` 的**全部码位**都进了字体,缺一个即以非零退出码报错(列出 `U+XXXX`)。把 lv_font_conv 的静默丢字(低码位、源字体缺字形)从"上线后才发现空白"变成"生成期硬错误"。判据自 2026-10-25 起按 **LVGL 首命中语义**解析(进了某个 range ≠ 能渲染:旧判据下 cmap 条目顺序倒置可全绿而上屏全方框,见文末事故记录)。 参数说明: - `--bpp 1`:单色无抗锯齿;体积最小。**注意** lv_font_conv 在 1bpp 下斜线/细笔画偶发"丢像素",宋体尤甚。 @@ -152,7 +152,7 @@ OK 43614 bytes -> ...\Drivers\BSP\UI\ui_font_cn_12.c 1. **1bpp 细笔画发虚**:宋体在 1bpp 下可能丢像素。若上板/客户端中文偏淡,把第 4 节 `--bpp` 改为 `2` 重生成即可(子集小,体积可接受)。 2. **字符集变更**:以后新增中文菜单项,须重跑第 3、4 节(重新提取 `ui_cn_chars.txt` 并生成),否则新字显示为方框。 3. **编码**:UI 源文件须为 **UTF-8(带 BOM)**,LVGL 按 UTF-8 解码中文串;字体 `.c` 为纯 ASCII,无编码风险。当前 Keil 已加 Misc Controls 抑制项,无需额外 `--locale=english`。 -4. **字体体积**:12px + 1bpp + 122 字(含 ASCII/符号,共 217 字形)≈ 44.4KB(RO-data);改 bpp 2 约翻倍,仍在 F407 Flash 余量内。 +4. **字体体积**:12px + 1bpp + 179 字(含 ASCII/符号,共 274 字形)源文件 ≈ 56.8KB;ROM 增量以 `.map` 为准(2026-10-25 扩 60 字实测 `RO-data` +1,528 B、RAM 0);改 bpp 2 约翻倍,仍在 F407 Flash 余量内。 5. **换字体**:黑体用 `simhei.ttf`(单文件免抽取);其余字体同理替换 `--font` 路径后重生成。 --- @@ -184,3 +184,5 @@ OK 43614 bytes -> ...\Drivers\BSP\UI\ui_font_cn_12.c > **保留字形(`KEEP_EXTRA`)的存在理由**:`ui_cn_chars.txt` 里除了"源码在用",还可能有**刻意保留**的字——当前为 异 / 常 / 片 / 芯,因为它们曾在 2026-09-14 `9eb1bd63` 被写进中文自检描述落盘 `/log/selftest.log`(定长 64 B 记录跨固件升级持久),删字形会使历史故障记录渲染空白且不可逆。`scripts/check_font_charset.py` 把这类字**按必需处理**:既照"缺字",也照"保留字被静默剔除"(严格模式下 FAIL 并逐字打印保留理由)。 > **所以"只跑 `extract_cn` 重新生成字符集"会把保留字洗掉**——这是本流程最容易犯的错,钩子就是为了挡住它。`--strict` 的判据因此是"**未知**冗余 = 0",而不是"冗余 = 0"。 + +> **2026-10-25 实测事故(扩字 Ⅰ/Ⅱ/Ⅲ,页面扩充预置字批)**:新字 Ⅰ(U+2160) 低于既有最小码位,稀疏 cmap range 起点由 0x4E09 下探到 0x2160,把宋体缺字补回的 U+25B6 单码位条目**吞进了宽 range**——旧 `verify_coverage()` 判"进了 range 即覆盖"全绿,模拟器/真机箭头却全变方框(菜单截图 658 px 差异,A/B 同树定位)。根因:LVGL `get_glyph_dsc_id()` 线性扫描 cmaps[],**首个包含码位的 range 直接返回**,其 sparse 列表缺该码位也不再向后找。修复:`_insert_cmap_entry()` 把补回条目插到包含它的 range 之前 + `_cmap_lookup_gid()` 可达性守卫(可达即跳过合并且不再追加死条目)+ `verify_coverage()` 改按首命中语义。**结论:低于最小码位的扩字 = cmap 结构变更,结构对账(第 3 步)照不出解析路径倒置,模拟器像素回归必跑。** diff --git a/docs/UI设计/UI_界面制作流程.md b/docs/UI设计/UI_界面制作流程.md index 02aec070..6b608a25 100644 --- a/docs/UI设计/UI_界面制作流程.md +++ b/docs/UI设计/UI_界面制作流程.md @@ -48,7 +48,7 @@ flowchart TD |---|---|---|---| | C1 | 屏幕 | 160×160,1bpp 单色(`LV_COLOR_FORMAT_I1`),无物理屏(远端客户端显示) | `ui_port.h` | | C2 | 字体 | **唯一**:`ui_font_cn_12`(宋体 12px 1bpp)。汉字 12px/字,ASCII 6px/字,行高 13px。需要其他字号 = 大工程(新字体 + 双端 `lv_conf.h`),默认禁止 | `ui_font_cn_12.c` | -| C3 | 字符集 | 子集字体(当前 122 汉字/符号 + ASCII 0x20-0x7E,共 217 字形);**缺字显示空白**;新字必须重生成字体 | `tools/font_gen/` | +| C3 | 字符集 | 子集字体(当前 179 汉字/符号 + ASCII 0x20-0x7E,共 274 字形);**缺字显示空白**;新字必须重生成字体 | `tools/font_gen/` | | C4 | LVGL 内存池 | 16KB(`LV_MEM_SIZE`,2026-10-15 由 40KB 收缩;实测峰值 6,568 B = 池的 40%);任一时刻只放"当前导航路径 + 当前内容页" | `Lib/lv_conf.h` | | C5 | 文本 | 一律静态字符串(`lv_label_set_text_static`),禁止动态字符串/strdup | 架构文档 | | C6 | 编码 | `Drivers/BSP/UI/*`、`ui_task.c`、`Lib/lv_conf.h` 为 **UTF-8 带 BOM**;改动只用 Edit 工具,**禁止** PowerShell/cmd 整文件重写(U+FFFD 不可逆) | AGENTS.md 铁律 | @@ -412,3 +412,4 @@ P4 [ ] UI_设计架构.md 变更记录更新 | 2026-09-10 | 网口设置内容页落地后回填:C3 字符集 102→111 字符(208 字形,补网口设置/地址/掩码等,并修复 `lv_font_conv` 丢弃的低码位符号 U+FF0C 全角逗号 → 页脚逗号不再空白);新文案走 P4 字体重生成 + `check_content_pages.py` 新增网口设置 4 状态黄金参考(可编辑/只读/编辑光标反显/保存 OK);模拟器 `main` 调 `net_cfg_load` 使参考图显示工厂默认值 | | 2026-09-13 | 移除 HTML 样机阶段:五阶段 → **四阶段管线**(P0 需求录入+设计规格 / P1 规格→代码 / P2 模拟器 / P3 MCU / P4 归档);设计基准改为"规格布局参数表 + 参考图",P2 比对基准由"样机渲染图"改为"参考图 + 规格参数表"(根因分流:修代码 / 回 P0 修规格);用户视觉确认点由 HTML 浏览器移到 P2 模拟器窗口/出图;删除 `mockups/01_主界面.html`、`render_01.png`、`tools/ui_mock/render_mockup.py`(**均已删除**),保留 `NN_说明.md` 规格与原始参考图;`NN_说明.md` 升格为唯一设计基准(P1 照参数表翻译代码,P2 出图对照参数表 + 原图);`UI_自动化测试流程.md` 门禁编号同步改为 P2/P3 | | 2026-09-14 | 运行记录/自检记录页 + 待机屏落地后回填:C3 字符集 111→122 字(217 字形,补输/入/错/误/上/电/重/芯/片/异/常——**故障描述串在非 UI 源码中 extract_cn 扫不到,须手动补字**);新文案走 P4 字体重生成 + `check_content_pages.py` pwc 态参考更新(密码错误提示);池基线 4784→5440 / 往返 4864→5520(+656B = 待机模块常驻屏+容器,见两测试脚本头部注记) | +| 2026-10-25 | 字库扩充(页面扩充规划预置字):C3 字符集 122→179 字(217→274 字形;上次入表后 2026-10-15 字体瘦身实测 119 字/214 字形未回填本表,本次一并校正)。+60 字取自 `docs/UI设计/页面补齐规划.md`、`docs/UI设计/页面扩充详细方案.md` 的页面显示串(段/投/延/零/频/荷/闸/跳/低/过/Ⅰ/Ⅱ/Ⅲ 等 + 年/月/分/秒/分合/已请求/确认/取消/越界用字);源码未用期间 font-charset 记 [WARN] 属预期,批 2 页面接线后自然转"在用"。顺带修复 `make_font.py` 两处缺陷:补回字形 cmap 条目被宽稀疏 range 吞掉(Ⅰ 下探起点 0x2160 → ▶ 全变方框,A/B 同树实测)与 `verify_coverage()` 非首命中判定;菜单 8 状态 + 内容页 11 页黄金参考逐字节不变;ROM +1,528 B、RAM 0。详见 `docs/UI设计/UI_中文字体生成与配置.md` §4 与文末事故记录 | diff --git a/docs/UI设计/UI_设计架构.md b/docs/UI设计/UI_设计架构.md index 465a03df..ab8cdac7 100644 --- a/docs/UI设计/UI_设计架构.md +++ b/docs/UI设计/UI_设计架构.md @@ -38,7 +38,7 @@ MCU **无物理屏幕**:LVGL 做 160×160 **1bpp 单色离屏渲染**,帧缓 | LVGL 内存池 | 16 KB(`LV_MEM_SIZE`,2026-10-15 由 40 KB 收缩;实测峰值 6,568 B = 池的 40%) | `Lib/lv_conf.h` | | 刷新周期 | 10 ms(`ui_port_step(10)` + `osDelay(10)`) | `ui_task.c` | | 推流端口 | 7003(TCP,与 DTU-RemoteLCD 客户端对齐) | `ui_net_sink.h` | -| 默认字体 | `ui_font_cn_12`(12px 1bpp,122 汉字/符号 + ASCII 0x20–0x7E,共 217 字形) | `Lib/lv_conf.h` | +| 默认字体 | `ui_font_cn_12`(12px 1bpp,179 汉字/符号 + ASCII 0x20–0x7E,共 274 字形) | `Lib/lv_conf.h` | | uiTask 栈 | 16384 words(BelowNormal) | `Src/freertos.c` | ### 1.4 硬约束(改 UI 必须遵守) @@ -285,3 +285,4 @@ ENTER/→ 进子框: | 2026-09-09 | 用户密钥密码页落地(首个表单/操作页,§4.7 / `内容页架构.md` §4.1):框架描述符新增 title_y/hide_deco/hide_footer/key_intercept + 新 API `ui_content_page_invalidate`;新模块 `ui_page_password`(3 数字框反显光标 + arm API);菜单受保护叶子路由(arm→开密码页,确认一致后回调**先关页再续做进入动作**);字体 97→102 汉字(198 字形);双端注册;回归扩至 7 页 + 往返水位,五门禁全绿 | | 2026-09-10 | 网口设置内容页(§4.7 / `内容页架构.md`):新增 `Drivers/BSP/NETCFG`(Flash 持久化 + CRC-16,工厂默认 192.168.1.100/24)+ 页面插件 `ui_page_net_cfg`(5 行动态值 + 可编辑:↑↓调字节/←→移光标/ENTER 确认,保存行 ENTER → `net_cfg_save` 下次上电生效);框架新增钩子 `init_cb` + API `ui_content_page_selected_row`;`net_init` 增 `mac` 参数、netTask 等 `SYS_EVT_STORAGE_READY` → `net_cfg_load` → `net_init(ip,mask,gw,mac)` → 回写实际 MAC 影子;字体 102→111 字符(208 字形,修复低码位符号丢失);双端注册;回归扩至 11 页,五门禁全绿 | | 2026-09-14 | 运行记录/自检记录内容页 + 待机显示模块:新增 `App/log/sys_log`(定长 64B 文本记录引擎,MCU 落 NAND `/log/run.log`、`/log/selftest.log`,FTP 可直下)+ 页面插件 `ui_page_runlog` / `ui_page_selftest`(动态列表:count_cb + refresh,每条 2 行时间戳/描述)+ `ui_standby`(空闲超时自动切待机屏,仅确认键回菜单);密码页错误提示"密码输入错误"+清空重输;字体 111→122 字(217 字形);详见 `docs/子系统设计/运行与自检记录设计说明.md` | +| 2026-10-25 | 字库扩充(页面扩充规划预置字 +60,含罗马数字 Ⅰ/Ⅱ/Ⅲ):默认字体升至 179 字符/274 字形,像素基线不变,ROM +1,528 B、RAM 0;修复生成器 `make_font.py` 的 cmap 插入顺序缺陷——LVGL `get_glyph_dsc_id()` 线性扫描首个包含即返回,补回字形(▶)单码位条目被下探后的宽稀疏 range 吞掉即全渲染方框,现按首命中语义插位/守卫/校验(详见 `docs/UI设计/UI_中文字体生成与配置.md` 文末事故记录) | diff --git a/simulator/README.md b/simulator/README.md index 98d094bc..58174cc8 100644 --- a/simulator/README.md +++ b/simulator/README.md @@ -262,7 +262,7 @@ UI 改动的自动化门禁脚本(完整流程见 `docs/UI设计/UI_自动化 - `LV_USE_THEME_MONO = 1` 且 `sim_port_init` 中调用了 `lv_theme_mono_init` - 主循环调用了 `lv_refr_now(NULL)`(PARTIAL 模式保证首帧) - 没有重复设置 tick(SDL 驱动内部已 `lv_tick_set_cb`,**不要**再 `SDL_AddTimer` + `lv_tick_inc`) -4. **中文显示空白**:字体 `ui_font_cn_12` 是子集字体(当前 122 汉字/符号 + ASCII,共 217 字形),缺字渲染为空白。 +4. **中文显示空白**:字体 `ui_font_cn_12` 是子集字体(当前 179 汉字/符号 + ASCII,共 274 字形),缺字渲染为空白。 补字流程见 `docs/UI设计/UI_中文字体生成与配置.md`(`tools/font_gen/` 两步脚本)。 5. **改了 UI 代码但模拟器没变化**:确认改的是 `Drivers/BSP/UI/ui_menu.c`(共享原件)而非本目录副本(本目录无副本),然后重新 `cmake --build`。 6. **编码**:UI 源码为 UTF-8(带 BOM),MSVC 已加 `/utf-8`。**不要**用 PowerShell `Set-Content` 等重写含中文的文件(编码铁律,见根目录 `AGENTS.md`)。 diff --git a/tools/font_gen/make_font.py b/tools/font_gen/make_font.py index 80be186e..e3367817 100644 --- a/tools/font_gen/make_font.py +++ b/tools/font_gen/make_font.py @@ -80,14 +80,95 @@ ARROW_BITMAP = [0x80, 0xe0, 0xf0, 0xfc, 0xff, 0xfe, 0xf8, 0xf0, 0xc0, 0x0] ARROW_ADV_W, ARROW_BOX_W, ARROW_BOX_H, ARROW_OFS_X, ARROW_OFS_Y = 165, 8, 10, 1, -1 +def _parse_cmap_entries(src): + """解析 cmaps[] 为 [(range_start, range_length, glyph_id_start, + unicode_list名或None, glyph_id_ofs_list名或None, list_length, type名)], + 以及所有 static const uint8/16 数组表。""" + arrays = {} + for mm in re.finditer(r'static const (uint8_t|uint16_t) (\w+)\[\] = \{(.*?)\};', src, re.S): + arrays[mm.group(2)] = [int(x, 16) for x in re.findall(r'0x[0-9a-fA-F]+', mm.group(3) if mm.group(1) == 'uint16_t' else mm.group(3))] + cm = re.search(r'cmaps\[\]\s*=\s*\{', src) + if not cm: + return [], arrays, None, -1 + end_cm = src.find('\n};', cm.end()) + entries = [] + for mm in re.finditer(r'\{\s*\.range_start\s*=\s*(\d+),\s*\.range_length\s*=\s*(\d+),\s*\.glyph_id_start\s*=\s*(\d+),\s*\.unicode_list\s*=\s*([^,]+),\s*\.glyph_id_ofs_list\s*=\s*([^,]+),\s*\.list_length\s*=\s*(\d+),\s*\.type\s*=\s*(\w+)', src[cm.end():end_cm]): + ul = mm.group(4).strip() + ol = mm.group(5).strip() + entries.append((int(mm.group(1)), int(mm.group(2)), int(mm.group(3)), + None if ul == 'NULL' else ul, + None if ol == 'NULL' else ol, + int(mm.group(6)), mm.group(7))) + return entries, arrays, cm, end_cm + + +def _resolve_in_entry(e, arrays, cp): + rs, rl, gs, ul, ol, ll, typ = e + rcp = cp - rs + if typ.endswith('FORMAT0_TINY'): + return gs + rcp + if typ.endswith('FORMAT0_FULL'): + ofs = arrays.get(ol, []) + if rcp >= len(ofs): + return 0 + v = ofs[rcp] + if v == 0 and rcp != 0: + return 0 + return gs + v + if typ.endswith('SPARSE_TINY'): + lst = arrays.get(ul, []) + try: + i = lst.index(rcp) + except ValueError: + return 0 + return gs + i + if typ.endswith('SPARSE_FULL'): + lst = arrays.get(ul, []) + try: + i = lst.index(rcp) + except ValueError: + return 0 + ofs = arrays.get(ol, []) + return gs + ofs[i] + return 0 + + +def _cmap_lookup_gid(src, cp): + """复刻 LVGL get_glyph_dsc_id:线性扫描,第一个包含码位的 range 决定 + 结果(找不到也直接返回 0,不会继续看后面的 range)。""" + entries, arrays, cm, _end = _parse_cmap_entries(src) + for e in entries: + rs, rl = e[0], e[1] + if rs <= cp < rs + rl: + return _resolve_in_entry(e, arrays, cp) + return 0 + + +def _insert_cmap_entry(src, cp, entry_text): + """把单码位 cmap 条目插到「第一个包含该码位的既有 range」之前; + 无包含者则追加到末尾。(LVGL 线性首命中语义,详见 _cmap_lookup_gid)""" + entries, arrays, cm, end_cm = _parse_cmap_entries(src) + block = src[cm.end():end_cm] + pos = None + for mm in re.finditer(r'\{\s*\.range_start\s*=\s*(\d+),\s*\.range_length\s*=\s*(\d+)', block): + rs, rl = int(mm.group(1)), int(mm.group(2)) + if rs <= cp < rs + rl: + pos = mm.start() + break + if pos is None: + return src[:end_cm] + ',\n' + entry_text + src[end_cm:] + blk_ins = cm.end() + pos + return src[:blk_ins] + entry_text + ',\n ' + src[blk_ins:] + + def merge_arrow_glyph(font_path): """若字体缺 U+25B6(▶),把预提取的箭头字形合并进去(位图 + glyph_dsc + cmap)。""" import re raw = open(font_path, 'rb').read() has_bom = raw.startswith(b'\xef\xbb\xbf') src = raw.decode('utf-8-sig') - if re.search(r'\.range_start\s*=\s*9654\s*,', src): - print('arrow U+25B6 已存在,跳过合并') + if _cmap_lookup_gid(src, ARROW_CP_DEC) != 0: + print('arrow U+25B6 已可经既有 cmap 解析,跳过合并') return # 当前位图总字节数(新字形 bitmap_index 的取值) bm = re.search(r'glyph_bitmap\[\]\s*=\s*\{', src) @@ -106,12 +187,10 @@ def merge_arrow_glyph(font_path): total, ARROW_ADV_W, ARROW_BOX_W, ARROW_BOX_H, ARROW_OFS_X, ARROW_OFS_Y) src = src[:end_gd] + entry + src[end_gd:] # 3) 追加 cmap(单码位映射) - cm = re.search(r'cmaps\[\]\s*=\s*\{', src) - end_cm = src.find('\n};', cm.end()) - cmap = ',\n {\n .range_start = %d, .range_length = 1, .glyph_id_start = %d,\n' \ - ' .unicode_list = NULL, .glyph_id_ofs_list = NULL, .list_length = 0, .type = LV_FONT_FMT_TXT_CMAP_FORMAT0_TINY\n }' % ( + cmap_entry = '{\n .range_start = %d, .range_length = 1, .glyph_id_start = %d,\n' \ + ' .unicode_list = NULL, .glyph_id_ofs_list = NULL, .list_length = 0, .type = LV_FONT_FMT_TXT_CMAP_FORMAT0_TINY\n }' % ( ARROW_CP_DEC, glyph_count) - src = src[:end_cm] + cmap + src[end_cm:] + src = _insert_cmap_entry(src, ARROW_CP_DEC, cmap_entry) # 4) cmap_num +1 src = re.sub(r'\.cmap_num = (\d+),', lambda m: '.cmap_num = %d,' % (int(m.group(1)) + 1), src, count=1) @@ -321,8 +400,8 @@ def merge_extra_symbols(font_path, size, bpp): raw = open(font_path, 'rb').read() has_bom = raw.startswith(b'\xef\xbb\xbf') src = raw.decode('utf-8-sig') - if re.search(r'\.range_start\s*=\s*%d\s*,' % cp, src): - print('U+%04X %r 已存在,跳过合并' % (cp, ch)) + if _cmap_lookup_gid(src, cp) != 0: + print('U+%04X %r 已可经既有 cmap 解析,跳过合并' % (cp, ch)) continue # 1) 单独生成仅含该符号的迷你字体(真实宋体位图/度量) @@ -376,13 +455,10 @@ def merge_extra_symbols(font_path, size, bpp): main_bytes + bmp_ofs, adv, bw, bh, ox, oy, cp) src = src[:end_main_gd] + entry + src[end_main_gd:] - cm = re.search(r'cmaps\[\]\s*=\s*\{', src) - end_main_cm = src.find('\n};', cm.end()) - cmap = ',\n {\n .range_start = %d, .range_length = %d, ' \ - '.glyph_id_start = %d,\n' \ - ' .unicode_list = NULL, .glyph_id_ofs_list = NULL, .list_length = 0, ' \ - '.type = LV_FONT_FMT_TXT_CMAP_FORMAT0_TINY\n }' % (sym_cp, sym_len, glyph_count) - src = src[:end_main_cm] + cmap + src[end_main_cm:] + cmap_entry = '{\n .range_start = %d, .range_length = %d, .glyph_id_start = %d,\n' \ + ' .unicode_list = NULL, .glyph_id_ofs_list = NULL, .list_length = 0, ' \ + '.type = LV_FONT_FMT_TXT_CMAP_FORMAT0_TINY\n }' % (sym_cp, sym_len, glyph_count) + src = _insert_cmap_entry(src, sym_cp, cmap_entry) src = re.sub(r'\.cmap_num = (\d+),', lambda m: '.cmap_num = %d,' % (int(m.group(1)) + 1), src, count=1) @@ -422,7 +498,13 @@ def verify_coverage(font_path): return False chars = sorted(set(open(CHARS_FILE, encoding='utf-8').read().strip())) - missing = [c for c in chars if not covered(ord(c))] + # 判定必须复刻 LVGL 的「首个包含即返回」语义:宽稀疏 range 会把后面的 + # 单码位补回条目吞掉(2026-10-25 Ⅰ 段扩字实测:旧 covered() 判据下 + # coverage 全绿,实际 ▶ 上屏全是方框)。_cmap_lookup_gid 不可用时退回 covered。 + try: + missing = [c for c in chars if _cmap_lookup_gid(src, ord(c)) == 0] + except NameError: + missing = [c for c in chars if not covered(ord(c))] if missing: sys.exit('ERROR: 字体缺字 %d 个(UI 将显示空白): %s' % (len(missing), ' '.join('U+%04X' % ord(c) for c in missing))) diff --git a/ui_cn_chars.txt b/ui_cn_chars.txt index a47be134..86655786 100644 --- a/ui_cn_chars.txt +++ b/ui_cn_chars.txt @@ -1 +1 @@ -▶三主事交件作保信值入共关制前动化区压参双口号启告地址型复子字存定实密常序异式强归当录息户手抖护报据控掩操故数整无日时期本板查校检模死波流测清点片版用界直看码硬程端第类系线终维网置自芯行装警认讯记设询误软输运通遥量钟钥错防除面页馈验默,: +ⅠⅡⅢ▶一三主事二交件位低作保信值入公共关出分制前动化区压参双取口号合启告回地址型复外子字存定实密已常年序度延异式强归当录态总息户手投抖护报据接控掩操故数整无日时显最月期未本板查标校检模欠次死段求波流测消清温点片版状用电界直看码硬确示秒程端第类系线终维网置自芯荷行装警认讯记设询误请负越跳软载输过运近返退通道遥部配重量钟钥锁错长闭间闸防除障零面页频馈验默,: