高通字库

单片机怎么渲染 Markdown?从一个控件到流式引擎

GT-HMI 渲染 Markdown 的两条代码路径:gt_markdown 控件五行代码渲染静态内容,GT-MD 自研流式引擎接 AI 逐段输出,峰值内存与全文长度无关。附最小可跑示例与字库接入说明。

发布于 2026-09-24更新于 2026-10-12

你的设备要上 AI 对话功能,大模型的回答是一段 Markdown——标题、列表、加粗、引用块。你的 MCU 屏要把它排得像个样子,而不是把 # 和 * 原样糊上去。

如果你在用 GT-HMI,这件事有两条代码路径可以走:GUI 工程里用 gt_markdown 控件,或者直接调 GT-MD 流式引擎。这篇把两条路的最小可跑代码都给你,代码全部摘自 GT-HMI-Engine 开源仓库与官方手册,可以照着编。

MCU 渲染 Markdown:左边纯文本原样上屏,右边渲染后结构清晰MCU 渲染 Markdown:左边纯文本原样上屏,右边渲染后结构清晰

路径一:gt_markdown 控件,五行代码

如果你的界面本来就建在 GT-HMI 的控件体系上,Markdown 就是一个普通控件:

// 在屏幕上创建一个 MarkDown 控件
gt_obj_st *md = gt_markdown_create(screen_home);
gt_obj_set_pos_relative(md, screen_home, 31, 28);
gt_obj_set_size(md, 424, 267);          // 注意:set_text 必须在 set_size 之后

// 设置文本,立即渲染
const char *text = "## 解题思路\n\n1. **先求判别式**\n2. 代入求根公式\n";
gt_markdown_set_text(md, text, strlen(text));

标题、列表、粗体直接渲染。控件支持大/中/小三级字体配置(对应标题、次级标题、正文),每级独立设置字库和字号:

gt_font_info_st font_large = {
    .family = _16_dian_zhen_zhong_wen__ji_chu_,  // 字库 ID
    .cjk = 0,
    .size = 16,
};
gt_markdown_set_font_info_large(md, &font_large);

控件基于成熟的开源 md4c 组件做了嵌入式深度优化,适合静态或整段更新的内容——配置界面、帮助文档、固件内置说明页,都走这条路。

路径二:GT-MD 流式引擎,接 AI 输出

真正的重头戏是 AI 场景:大模型一边生成,屏幕一边排版。GT-MD 是高通自研的流式渲染引擎,纯 C、无 OS 依赖,不绑定任何 GUI 框架——你注入两个回调,它就能在任何帧缓冲上画。

初始化(系统启动时执行一次):

// 字库回调:布局阶段按 Unicode 码点查询字形尺寸
gt_latex_font_register(my_font_get, NULL);

// 绘制回调:渲染阶段自取位图绘制(画线回调用于引用块、分隔线)
gt_latex_render_register(my_draw_glyph, my_draw_hline,
                         my_draw_line, NULL);

整段渲染(静态文本):

uint16_t w, h;
gt_md_get_size(text, len, &w, &h, 240);   // 先取排版尺寸

gt_latex_canvas_t canvas = {
    .x = 0, .y = 0,
    .fg_color = 0x000000,
    .ys = 0, .ye = 0,                     // 垂直裁剪,滚动时只画可见区
};
gt_md_draw(text, len, &canvas, 240);      // 绘制到画布

流式渲染(AI 逐段上屏):

int16_t cur_y = 0;

// AI 每返回一小段就调一次
void on_ai_chunk(const char *chunk, uint16_t len)
{
    gt_latex_canvas_t canvas = { .x = 0, .y = cur_y,
                                 .fg_color = 0x000000 };
    gt_md_draw_stream(chunk, len, &canvas, 240);   // 逐块流式渲染

    uint16_t w, h;
    gt_md_get_size_stream(chunk, len, &w, &h, 240);
    cur_y += h;                                    // 高度累加
}

流式接口逐块处理,峰值内存只与单个 Markdown 块(一个段落、一个列表项)有关,与全文长度无关——这是它能在 KB 级内存的 MCU 上跑长文本的关键。还有一组逐块迭代器 API(gt_md_line_iter_*),y 偏移自动累加,适合更底层的定制。

字库从哪来?

两条路径的字体最终都落到同一套接口上,这也是 GT-HMI 作为字库原厂方案的天然之处:

  • 控件路径:family 字段填高通字库 ID(GT-HMI Designer2 工程里可视化配置后自动生成),点阵、矢量、灰度字库随选;
  • 引擎路径:gt_latex_font_register 注册的回调由你自己实现——用高通字库芯片就按字库 ID 索引取模,用自有字库就在回调里返回你自己字库的字形尺寸与位图。引擎的渲染层完全不介入字库数据,接口是干净的。

标题、正文、注释的字号层级通过字体级别配置(gt_latex_font_level_t)下发,Markdown 排版的质量上限,取决于你给它配的字库质量。

裁剪与体积

GT-MD 的每个语法特性都有独立编译开关(GT_MD_CFG_ENABLE_*):标题、列表、代码块、引用块、粗斜体、删除线、内嵌 LaTeX 公式……用不到的置 0,ROM 不浪费一个字节。列表嵌套深度、单行长度等约束也都是编译期宏,可按目标平台收紧。

小结

静态内容用控件,五行代码;AI 流式输出用 GT-MD,两个回调加一个流式调用。两条路都在 MIT 协议开源的 GT-HMI-Engine 仓库里,完整的 API 参考和错误码说明见官网文档中心《GT-HMI Engine 用户手册》"GT-MD 流式渲染引擎"一章。

高通(GENITOP)始于 1992 年,深耕汉字信息处理与嵌入式 GUI 技术,字库覆盖全球 180+ 国家语言。

完整 API 参考与流式接入指南见《GT-HMI Engine 用户手册》GT-MD 章节。

前往查看

相关阅读