Files
STM32F4-Base/.dsh/skills/font-regen/SKILL.md
T
wandering1 a3f0c60aef docs(UI设计): 字体字符集计数回填 179字/274字形并登记cmap首命中事故
- UI_中文字体生成与配置.md: §3 计数、§4 输出样例与补回规则(cmap 插入
  位置/可达性守卫)、§7 体积口径;文末安全流程追加 2026-10-25 实测事故
- UI_界面制作流程.md: C3 计数 + 变更记录行(并校正 2026-10-15 瘦身后
  119字/214字形未回填本表的历史计数)
- UI_设计架构.md: 关键约束表默认字体计数 + 变更记录行
- simulator/README.md: 已知坑 #4 计数
- .dsh/skills/font-regen/SKILL.md: 步骤2 增 KEEP_EXTRA 并回警示;坑新增
  "低于最小码位扩字移动稀疏 range 起点"条目;计数更新
2026-10-25 03:24:06 +08:00

2.7 KiB
Raw Blame History

name, description, whenToUse
name description whenToUse
font-regen 重生成中文子集字体 ui_font_cn_12(extract_cn 提取 → make_font 生成 → diff 检查,固定 4 步,.venv 解释器)。 UI 代码新增中文文案、用户报告屏幕缺字/空白块、或提交任何含新汉字的 UI 字符串之前。

中文字体重生成

本工程唯一字体 ui_font_cn_12(宋体 12px 1bpp 子集,MCU/模拟器双端共用)。缺字渲染为空白——新增汉字必须走以下固定顺序,不得跳过或调换。详细原理见 docs/UI设计/UI_中文字体生成与配置.md。

固定顺序(仓库根目录执行)

# 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(换字体)
# 4. diff 检查:新增字在位、旧字不变、生成物 Opts 行字符集与预期一致

提交清单

ui_cn_chars.txt(仓库根)+ Drivers/BSP/UI/ui_font_cn_12.c 随代码一起提交,缺一个都会让另一端/下次构建字体与字集不一致。

坑

  • 不要用 PATH 默认 python(msys64,无 fonttools)跑 make_font.py;.venv 缺失时按 AGENTS.md「Python 环境」重建
  • requirements.txt 必须纯 ASCII(Windows 下 pip 按 GBK 解码,中文注释 → UnicodeDecodeError)
  • 生僻字(宋体可能无字形)→ 写码前先手动验证字形,避免"代码写完才发现是空白"
  • 生成成功后跑 ui-verify skill 全回归;黄金参考因字形变化而 FAIL 属预期 → check_content_pages.py --update 刷新
  • 字数变化时同步更新文档中的字符集计数(当前 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 首命中语义插入/守卫/校验,扩字后模拟器像素回归必跑