Skip to content

feat: 集成FreeType矢量字体引擎,新增阅读设置页面#31

Merged
yxGC merged 2 commits intoOpenSiFli:mainfrom
jingxbw-work:main
Mar 27, 2026
Merged

feat: 集成FreeType矢量字体引擎,新增阅读设置页面#31
yxGC merged 2 commits intoOpenSiFli:mainfrom
jingxbw-work:main

Conversation

@jingxbw-work
Copy link
Copy Markdown
Contributor

主要改动

集成 FreeType 矢量字体渲染。将点阵字体引擎替换为 FreeType,支持从 TF 卡加载 TTF 字体文件,实现运行时字体/字号/行距切换。新增后台排版线程和字体预热线程提升翻页响应速度,通过互斥锁和页面锚点机制保证并发安全和设置切换后的阅读位置恢复。

新增文件

  • lib/epdiy/font_ft.c/.h — FreeType 矢量字体引擎,替代旧版 font.c 点阵方案;含 LRU 字形缓存(3MB)、CMap 缓存(4096 条)、可变字体 wght 轴支持、异步预热线程
  • src/ft_dfs_bridge.c — FreeType 文件 I/O 桥接层,内置 64KB 低区预读 + 16×4KB LRU 多槽缓冲,减少 SD 卡随机读取
  • src/font_manager.c/.h — 字体管理器,启动时扫描 /fonts 目录,支持运行时切换字体,失败时自动回退到内置字体
  • src/reading_settings.cpp/.h — 阅读设置页面,可调字体、字号、字重、行距、边距;持久化到 TF 卡 /settings.cfg;操作逻辑与通用设置页一致(UP/DOWN 切换选项,SELECT 循环调值,"保存退出"项确认退出)
  • font/SConscript + tools/font_converter.py — 构建时将 TTF 文件转换为带 .font_data section 属性的 C 数组,链接到 PSRAM

修改文件

核心逻辑

  • src/main.cpp — 新增 READING_SETTINGS 状态处理;阅读设置入口有两个:覆盖层"设置"按钮(从阅读页进入,退出后锚点恢复阅读位置)和主界面设置页"阅读设置"选项(退出后回设置页);FreeType 初始化(font_manager_init + reading_settings_load);电池刷屏优化(仅状态变化时刷新);SD 卡电源保护(后台排版/预热线程运行时不断电)
  • lib/Epub/EpubList/EpubReader.cpp/.h — 后台排版线程(优先级 24、32KB 栈),仅在 render() 末尾统一启动,消除 prev() 向前翻章时的竞态;字体切换时通过页面锚点(PageAnchor)恢复阅读位置;next() 翻到未排好的页时等待后台线程而非同步阻塞;覆盖层从 11 个按钮扩展为 12 个(新增"设置");render_overlay() 中注册触控区域修复触摸不响应问题
  • lib/Epub/RubbishHtmlParser/RubbishHtmlParser.cpp/.h — 互斥锁保护 pages 向量读写(block 排版不持锁、分页 push_back 持锁);新增 PageAnchor 结构体和锚点查找接口(get_page_anchor/find_page_by_anchor);分页底部溢出修复(分页条件从 m_layout_y + m_layout_line_height 改为 m_layout_y + 2 * m_layout_line_height

适配改动

  • src/type.hAppUIState 枚举新增 READING_SETTINGSSettingsItem 枚举新增 SET_READING_SETTINGS
  • src/epub_screen.cpp/.h — 通用设置页新增"阅读设置"选项;handleSettingsPage 返回值从 bool 改为 int(0=继续,1=回主页,2=进阅读设置)
  • src/boards/controls/Actions.h — 新增 ENTER_READING_SETTINGS 动作
  • src/boards/controls/SF32_ButtonControls.cpp — 所有板子长按统一发 UPGLIDE(通过覆盖层进入阅读设置)
  • src/boards/controls/SF32_TouchControls.cpp — 覆盖层触控检测改为遍历 12 个已注册区域;设置页新增"阅读设置"区域触控检测
  • src/epub_fonts.c — 移除点阵字体头文件引用,改为 FreeType dummy stubs
  • src/epub_mem.c — PSRAM 堆从 2MB 扩展到 6MB;新增 FreeType 内存分配适配(ft_smalloc/ft_sfree/ft_srealloc/ft_scalloc 指向 PSRAM 堆)
  • src/boards/SF32Paper.cpp — SD 卡电源管理接口
  • lib/Epub/Renderer/EpdiyFrameBufferRenderer.hdraw_text 改用 FreeType API(get_line_height 调用 epd_font_ft_get_line_height

构建与链接

  • project/SConscriptsrc/SConscript — 加入新源文件(font_manager.cft_dfs_bridge.creading_settings.cpp
  • project/proj.conf — 项目配置更新,加入freetype宏开关
  • link.lds*epub_fonts.o (.text* .rodata*)*(.font_data)
  • link.sctfont.o (+RO)font_ft.o (+RO)

删除文件

  • lib/epdiy/font.c — 旧版点阵字体引擎
  • Fonts/ 目录(bold_font.hbold_italic_font.hitalic_font.hregular_font.h)— 旧版点阵字体头文件

@yxGC yxGC merged commit f897e34 into OpenSiFli:main Mar 27, 2026
2 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants