写点什么

HarfBuzz 概览

  • 2025-10-26
    北京
  • 本文字数:1517 字

    阅读完需:约 5 分钟

HarfBuzz概览

本文概述

本文主要介绍:

1)什么是 HarfBuzz

2)HarfBuzz 名称来源

3)为什么需要 HarfBuzz

4)HarfBuzz 能做什么

5)HarfBuzz 不能做什么

6)哪些平台在使用 HarfBuzz

可以直接跳转感兴趣部分阅读。

一、什么是 HarfBuzz

HarfBuzz 是一个用 C++ 编写的文字塑形引擎(Text Shaping),即将字符序列转换成字形序列(Glyph)。

二、HarfBuzz 的名称来源

HarfBuzz 的作者是 Behdad Esfahbod(贝赫达德·埃斯法赫博德),HarfBuzz 的命名最初来自于该作者​对 OpenType 的波斯语翻译​。

三、为什么需要 HarfBuzz

我们回答清楚以下几个问题,「为什么需要 HarfBuzz」这个问题就理解了。


1)一段字符串从输入到上屏,需要经历哪些过程?


可以用下面这张图概括:详细的流程可以参考从0到1自定义文字排版引擎:原理篇



图中红色部分就是 HarfBuzz 所能做的事情。


Text Shaping/文本塑形就是将一串 Unicode 字符码点(Codepoints),根据字体中的规则,转换为一串有序的字形(Glyphs)序列及其位置信息的过程。


2)为什么不能把字符串里的字符直接从字体文件里拿出来画在屏幕上?


一文读懂Fon文件一文中,我们知道了 Font 文件中存储着字符的位图信息,那能直接取出每个字符的位图进行绘制吗,答案当然是不可以!


举几个例子:


例子一:


在 Tamil(泰米尔语)语言规则中,当字母“ட”后接元音符号“ு”时,这一对字符必须替换为单个字形“டு”,即字符序列 “ட,ு” 需要用字体中的单个“டு”字形来替代。


例子二:


在配置了连字 feature 的应用中,当遇到 fi 相遇时,在很多英文字体中会合并成一个单独的 字形。


以上这些连字、重排、字形替换等处理,都是在 Shaping 阶段完成的。

四、HarfBuzz 能做什么

1)塑形


沿用上面对塑形的解释:HarfBuzz 可以将一串 Unicode 字符码点(Codepoints),根据字体中的规则,转换为一串有序的字形(Glyphs)序列及其位置信息。


可以用下面这张图来概括 HarfBuzz 的塑形流程:



图片来自:https://mrandri19.github.io/2019/07/24/modern-text-rendering-linux-overview.html


可以看出


HarfBuzz 的输入是​:字体文件 + 分段好的字符


HarfBuzz 的输出是​:字形信息(Glyph)、position、kerning 等


2)字体处理


除了核心的塑形功能,HarfBuzz 还提供了访问其他字体功能的函数,比如:GSUB 和 GPOS 表,可变字体,彩色字体,字体子集化等。

五、HarfBuzz 不能做什么

1)HarfBuzz 不会处理双向文本问题


如果想排版 LTR、RTL(如希伯来语、阿拉伯语)混排的字符串,需要确保在提交给 HarfBuzz 的输入中,字符串的顺序是一致的。


也就是在将文本输入 HarfBuzz 之前,需要进行分段。


2)HarfBuzz 无法处理包含不同字体属性的文本


比如,对于字符串“a huge breakfast”,其中“huge”希望是斜体,那么我们需要向 HarfBuzz 分开发送三个字符串:


  • 使用罗马字体的a

  • 使用斜体字体的huge

  • 以及再次使用罗马字体的breakfast


同样,如果在字符串中包含不同的字体、字号、字体样式、语言或方向,那么需要独立地对每个文本段进行塑形。


HarfBuzz 在处理字符串时要求字符串具有相同的属性。


3)HarfBuzz 不会处理换行、连字符或对齐


HarfBuzz 会​将字符串排列在一条理论上长度无限的单行上,​如果想找出文本中可能的单词、句子和换行点,需要使用 ICU 库的断句函数。

六、哪些平台在使用 HarfBuzz

参考

  • https://github.com/harfbuzz/harfbuzz/wiki/

  • HarfBuzz 作者博客:文本渲染现状

  • https://behdad.org/text2024/

  • https://behdad.org/text/


本文是从 0 到 1 自定义富文本渲染的原理篇之一,此外你还可能感兴趣:



更多内容可订阅公众号:非专业程序员 Ping

发布于: 刚刚阅读数: 2
用户头像

还未添加个人签名 2019-03-12 加入

还未添加个人简介

评论

发布
暂无评论
HarfBuzz概览_ios_非专业程序员Ping_InfoQ写作社区