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 的应用中,当遇到 f 和 i 相遇时,在很多英文字体中会合并成一个单独的 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

参考

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

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

相关推荐
xcLeigh29 分钟前
KingbaseES数据库教程:初识数据库,从安装到跑通第一条SQL
android·数据库·sql·安装·数据库教程·kes
TimeFine4 小时前
AI 编码工作流的设计(二)
android·ai编程
2401_881828324 小时前
MySQL操作命令
android·mysql·adb
茶底世界之下4 小时前
雨夜街角裁成方图,人物与冷暖光还能共存吗?
ios
用户60709759149065 小时前
AOSP 14 OTA 升级指导(三):三条升级链路——Java API、自研 HAL 与 TR069
android
前端小D6 小时前
React Native Android 项目搭建
android·react native·react.js
youdexiang6 小时前
IOS录音APP拍照记录能和音频同步吗
ios·音视频
恋猫de小郭7 小时前
感人,Flutter 居然有了一个超实用提案,期待落地
android·前端·flutter
2501_915909067 小时前
Windows 打开 Xcode 工程,编译调试 Xcode 项目并和 Mac 同事协作
ide·windows·vscode·macos·ios·个人开发·xcode
互联网江湖7 小时前
iPhone Duo跌倒,国产折叠屏手机吃饱?
ios·智能手机·iphone