text rendering tech

25
文本渲染技术的 一次短途旅行 jjgod < [email protected] >

Upload: david-ding

Post on 04-Jul-2015

1.679 views

Category:

Technology


5 download

TRANSCRIPT

Page 1: Text Rendering Tech

文本渲染技术的一次短途旅行jjgod <[email protected]>

Page 2: Text Rendering Tech

旅行的目标涵盖三个主要桌面平台: X11, Mac OS X 与 Win32

理清技术之间的关系简单评述技术的优劣 (个人意见,请选择性听取)

高层分析,不涉及具体实现细节按本人记忆而定,叙述不一定完整大部分提到的技术、库等都是 google 的第一结果,因此省略 URL

Page 3: Text Rendering Tech

从 "hello world" 到“hello world”

Page 4: Text Rendering Tech

字符的内部表达: UTF-8 字节流char *: "hello, world\0"

优点:向下兼容所有 ASCII 例程,内部表达与存储和网络交换时使用的外部表达一致缺点:访问其中一个字符的时间不是 O(1) 而是 O(n),无法直接用 str[n] 这样的方式访问第 n 个字符在许多 Unix 应用程序库中广泛使用作为内部表达,如 glib

Page 5: Text Rendering Tech

字符的内部表达: 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) 的

Page 6: Text Rendering Tech

字符的内部表达: UTF-32

uint32_t [] = { 'h', 'e', 'l', 'l', 'o' }

优点:对单个字符的 O(1) 访问时间缺点:每个字符要占用 4 个字节,不经济常用作临时的内部表达,保证内存中的快速访问,例如 ICU 库

Page 7: Text Rendering Tech

字符的内部表达常见跨平台辅助库

glib: 定义了一套完整的 Unicode 输入输出函数,字符转换,与 C 标准库中 ctype.h, string.h 等价的相关接口 (C)

libutf-8: 一套简单的 UTF-8 输入输出库 (C)

libutf8: 一套 C 标准库扩展,支持 UTF-8 下所有的 wchar_t 相关扩展 (C)

ICU: 非常完整的 Unicode 处理库 (C/C++)

Page 8: Text Rendering Tech

从字符 (character) 到字形 (glyph)

一个字符,多个字形

'h'

多个字符,一个字形

'A','´' 'Á'

Page 9: Text Rendering Tech

从字符到字形:Layout Engine

Widths in, Heights out.

–– David Baron

Page 10: Text Rendering Tech

从字符到字形:概览

字符表达

字体信息

排版引擎 字形与位置信息

字体

字体管理

字体解析

Page 11: Text Rendering Tech

从字符到字形:字体在哪里?

InstalledFontCollection (.NET), EnumFontFamilies (Win32 API, C)

fontconfig: 跨平台 (C)

ATS (Apple Type Services): Mac OS X

提供复杂的字体查找、罗列和匹配大部分软件中不需要使用如此复杂的 API, 一般只需要尝试创建一个 Font 对象,看是否成功

Page 12: Text Rendering Tech

从字符到字形:fontconfig

跨平台 (*nix, Mac OS X, Win32)

替代 Xft

著名的 X Hacker Keith Packard 开发维护包含一系列用户工具 (fc-list, fc-match, fc-cache)

通过配置文件指定字体文件的存放路径

Page 13: Text Rendering Tech

从字符到字形:字体解析: FreeType

大部分平台下字体解析一般都包含在字体查找的高层 API 中跨平台, C API

支持几乎现有所有字体格式: TrueType, Type 1, OpenType, CFF, CID, dfont, pcf 等等被大量相关库所调用: fontconfig, xft, cairo, pango, ICU

解析后得到的最重要信息: metrics (字距)

Page 14: Text Rendering Tech

从字符到字形:字体解析: metrics

Page 15: Text Rendering Tech

从字符到字形: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)

Page 16: Text Rendering Tech

从 helloworld 到 HelloWorld

Page 17: Text Rendering Tech

光栅化

Page 18: Text Rendering Tech

光栅化:Windows

标准: 关闭 16pt 以下字符的反锯齿清晰: 使用 ClearType

Page 19: Text Rendering Tech

光栅化:Mac OS X

Page 20: Text Rendering Tech

光栅化:FreeType

启用/禁用 TrueType Bytecode Interpreter

启用/禁用 Auto-hinter

Gamma 设置必读: Maxim Shemanarev, Texts Rasterization Exposures (http://www.antigrain.com/research/font_rasterization)

Page 21: Text Rendering Tech

最终绘制

Win32: 需要一个 Win32 Drawing Context,调用 TextOut

Mac OS X: 需要一个 Quartz Context,调用 ATSUDrawText 或 CGShowGlyphs

手动复制 FreeType 光栅化后的像素,或者通过 pango, cairo 等高层库调用

Page 22: Text Rendering Tech

总结:GTK+

gchar *

FT_Face

pango cairo_show_glyphs

FCFontSet

fontconfig

FreeType

Page 23: Text Rendering Tech

总结:Core Text

CFSTR *

CTFont

CTTypesetter CTLineDraw

CTFontDescriptor

CTFontCollection

Core Text

Page 24: Text Rendering Tech

总结:Win32

WCHAR

HFONT

Uniscribe TextOut

LOGFONT

EnumFontFamilies

win32 api

Page 25: Text Rendering Tech

Questions?