text rendering tech
TRANSCRIPT
旅行的目标涵盖三个主要桌面平台: X11, Mac OS X 与 Win32
理清技术之间的关系简单评述技术的优劣 (个人意见,请选择性听取)
高层分析,不涉及具体实现细节按本人记忆而定,叙述不一定完整大部分提到的技术、库等都是 google 的第一结果,因此省略 URL
从 "hello world" 到“hello world”
字符的内部表达: UTF-8 字节流char *: "hello, world\0"
优点:向下兼容所有 ASCII 例程,内部表达与存储和网络交换时使用的外部表达一致缺点:访问其中一个字符的时间不是 O(1) 而是 O(n),无法直接用 str[n] 这样的方式访问第 n 个字符在许多 Unix 应用程序库中广泛使用作为内部表达,如 glib
字符的内部表达: UTF-16/UCS-2
short [] = { 0, 'h', 0, 'e', 0, 'l', ... }
有 Little Endian 与 Big Endian 两种表达形式,多数使用前者 (但应用程序开发者不必关心)
在 Win32 Unicode 程序与 Mac OS X 的 Core Foundation, NSFoundation 中广泛使用,因为一开始只考虑 UCS-2 时,认为使用它可以保证字符的 O(1) 访问为了支持 Plane 1+, 一般实现都已支持 Surrogate 扩展,所以单个字符的访问时间还是 O(n) 的
字符的内部表达: UTF-32
uint32_t [] = { 'h', 'e', 'l', 'l', 'o' }
优点:对单个字符的 O(1) 访问时间缺点:每个字符要占用 4 个字节,不经济常用作临时的内部表达,保证内存中的快速访问,例如 ICU 库
字符的内部表达常见跨平台辅助库
glib: 定义了一套完整的 Unicode 输入输出函数,字符转换,与 C 标准库中 ctype.h, string.h 等价的相关接口 (C)
libutf-8: 一套简单的 UTF-8 输入输出库 (C)
libutf8: 一套 C 标准库扩展,支持 UTF-8 下所有的 wchar_t 相关扩展 (C)
ICU: 非常完整的 Unicode 处理库 (C/C++)
从字符 (character) 到字形 (glyph)
一个字符,多个字形
'h'
多个字符,一个字形
'A','´' 'Á'
从字符到字形:Layout Engine
Widths in, Heights out.
–– David Baron
从字符到字形:概览
字符表达
字体信息
排版引擎 字形与位置信息
字体
字体管理
字体解析
从字符到字形:字体在哪里?
InstalledFontCollection (.NET), EnumFontFamilies (Win32 API, C)
fontconfig: 跨平台 (C)
ATS (Apple Type Services): Mac OS X
提供复杂的字体查找、罗列和匹配大部分软件中不需要使用如此复杂的 API, 一般只需要尝试创建一个 Font 对象,看是否成功
从字符到字形:fontconfig
跨平台 (*nix, Mac OS X, Win32)
替代 Xft
著名的 X Hacker Keith Packard 开发维护包含一系列用户工具 (fc-list, fc-match, fc-cache)
通过配置文件指定字体文件的存放路径
从字符到字形:字体解析: FreeType
大部分平台下字体解析一般都包含在字体查找的高层 API 中跨平台, C API
支持几乎现有所有字体格式: TrueType, Type 1, OpenType, CFF, CID, dfont, pcf 等等被大量相关库所调用: fontconfig, xft, cairo, pango, ICU
解析后得到的最重要信息: metrics (字距)
从字符到字形:字体解析: metrics
从字符到字形:Layout Engine
Uniscribe: Windows Unicode Layout Engine (C++)
pango: 跨平台,但在 GTK+/GNOME 中使用最多 (C)
ICU: 跨平台 (C++)
ATSUI (Apple Type Services for Unicode Imaging): Mac OS X 10.4-, 大部分已 deprecate (C)
Core Text: Mac OS X 10.5 (C)
Cocoa Text System: Mac OS X (Objective C)
从 helloworld 到 HelloWorld
光栅化
光栅化:Windows
标准: 关闭 16pt 以下字符的反锯齿清晰: 使用 ClearType
光栅化:Mac OS X
光栅化:FreeType
启用/禁用 TrueType Bytecode Interpreter
启用/禁用 Auto-hinter
Gamma 设置必读: Maxim Shemanarev, Texts Rasterization Exposures (http://www.antigrain.com/research/font_rasterization)
最终绘制
Win32: 需要一个 Win32 Drawing Context,调用 TextOut
Mac OS X: 需要一个 Quartz Context,调用 ATSUDrawText 或 CGShowGlyphs
手动复制 FreeType 光栅化后的像素,或者通过 pango, cairo 等高层库调用
总结:GTK+
gchar *
FT_Face
pango cairo_show_glyphs
FCFontSet
fontconfig
FreeType
总结:Core Text
CFSTR *
CTFont
CTTypesetter CTLineDraw
CTFontDescriptor
CTFontCollection
Core Text
总结:Win32
WCHAR
HFONT
Uniscribe TextOut
LOGFONT
EnumFontFamilies
win32 api
Questions?