Text 跨多个平台的文本显示实现

Text 跨多个平台的文本显示实现,text,fonts,graphics,Text,Fonts,Graphics,我在互联网上搜索了几个星期,试图弄清楚文本(比如你现在正在阅读的内容)是如何显示在屏幕上的 结果少得令人震惊 我遇到了光栅化、位图、矢量图形等概念。我不理解的是,底层实现如何以我们人类理解的方式在所有系统(windows、linux等)上如此一致地工作。是否在某个地方定义了规范?实现代码是否开源并可供公众查看 我现在的理解是: 使用外部绘图程序创建字体,每次一个字符 将这些字符添加到特定语言库可以理解的字体文件中 然后,这些字符将根据GPU的需要从文件中读取,并按照父代码定义的线性方式显示在屏

我在互联网上搜索了几个星期,试图弄清楚文本(比如你现在正在阅读的内容)是如何显示在屏幕上的

结果少得令人震惊

我遇到了光栅化、位图、矢量图形等概念。我不理解的是,底层实现如何以我们人类理解的方式在所有系统(windows、linux等)上如此一致地工作。是否在某个地方定义了规范?实现代码是否开源并可供公众查看

我现在的理解是:

  • 使用外部绘图程序创建字体,每次一个字符
  • 将这些字符添加到特定语言库可以理解的字体文件中
  • 然后,这些字符将根据GPU的需要从文件中读取,并按照父代码定义的线性方式显示在屏幕上
此外,如果在字体文件(如“F、C、…、Z”)中定义了字符,如何支持矢量图形(依赖于一组坐标点)?如果没有坐标点,光栅化似乎是更改大小的唯一选项

这就是我的假设/研究所做的


如果您熟悉这个主题,并且能够提供对我和其他读者可能有用的详细答案,请自行决定回答。我觉得很有趣的是,有多少代码我们认为是理所当然的,但实际上却非常复杂。

下面提供了一个概述(省去了很多血淋淋的细节):

在互联网上显示文本的两个关键组件是(i)字符编码和(ii)字体

字符编码是一种方案,通过该方案,字符(如拉丁大写字母“a”)被指定为字节序列的表示形式。过去设计了许多不同的字符编码方案。今天,在互联网上几乎无处不在的是。Unicode将每个字符分配给一个代码点,该代码点是一个整数值;e、 例如,Unicode将拉丁文大写字母A指定给代码点65,或十六进制中的41。按照惯例,Unicode代码点使用四到六个十六进制数字,前缀为“U+”。因此,拉丁文大写字母A被分配给U+0041

字体提供用于显示文本的图形数据。多年来,已经创建了各种字体格式。如今,互联网上普遍使用的字体都是遵循的字体(这是1991年左右创建的TrueType字体格式的扩展)

屏幕上显示的是字形。OpenType字体包含字形的数据,以及将Unicode代码点映射到相应字形的表。更准确地说,字符到字形映射(或“cmap”)表将Unicode代码点映射到字形ID。代码点由Unicode定义;字形ID是字体内部实现细节,用于在其他表中查找字形描述和相关数据

OpenType字体中的字形可以定义为位图,或者(更常见的)向量轮廓(贝塞尔曲线)。对于图示符描述,有一个假定的坐标网格。然后,将矢量轮廓定义为Bezier曲线控制点坐标对的有序列表。显示文本时,矢量轮廓将根据所请求的文本大小(例如10点)和显示器上的像素大小缩放到显示网格上。光栅化器读取字体中的控制点数据,根据显示网格的需要进行缩放,并生成位图,将位图放置在屏幕上的适当位置

关于显示光栅化位图的另一个细节是:大多数操作系统或应用程序都会使用某种过滤,以使字形的外观更平滑、更清晰。例如,灰度抗混叠过滤器会将轮廓边缘处的显示像素设置为灰度,而不是纯黑色或纯白色,以便在缩放轮廓与物理像素边界(大多数情况下)不完全对齐时,边缘看起来更平滑

我提到“在适当的位置”。字体具有整个字体和每个字形的度量(定位)信息

字体宽度指标将包括建议的文本行行间距,以及基线在每行中的位置。这些度量以字体字形设计网格的单位表示;基线对应于网格中的y=0。要开始一行,将(0,0)设计网格位置与基线与页面布局内文本容器边缘相交的位置对齐,并定位第一个图示符

字体还具有字形度量。标志符号度量之一是每个给定标志符号的前进宽度。因此,当应用程序绘制一行文本时,它在行的开头有一个起始“笔位置”,如上所述。然后,它将第一个标志符号相应地放置在该行上,并根据第一个标志符号的前进宽度前进笔位置。然后,它使用新的笔位置放置第二个图示符,并再次前进。以此类推,因为轮廓是沿着直线放置的

当然,文本行的布局更为复杂。对于在基本文本编辑器中显示的英文文本,我上面描述的内容已经足够了。更一般地说,一行文本的显示可能涉及使用某些替代图示符替换默认图示符;例如,在显示阿拉伯文本时,需要这样做,以便字符显示为草率连接。OpenType字体包含一个“字形替换”(或“GSUB”)表,该表提供字形替换操作的详细信息。此外,可以出于各种原因调整字形的位置;例如,将变音符号正确放置在字母上。OpenType字体包含一个“glyph positioning”('GPOS')表,该表提供了位置信息