字体渲染和字形信息

6
我调用“GetCharABCWidthsFloatW”来获取字符的宽度信息。这样我就能得到左侧轴承、右侧轴承和高级宽度。
为了定位每个字符,我将从零开始使用一个“xPlacement”变量。首先,我会通过减去“左侧轴承”来调整xPlacement变量。绘制字符后,我会按字符的宽度将其向前推进(稍后我会展示计算方法)。然后,我将通过将当前“xPlacement”的“右侧轴承”信息相加来移动xPlacement变量。
在我看来,这就是字符定位所需的全部代码,对吗?
重要的一点是要纠正字符的宽度。宽度将通过取advancedWidth、左侧轴承的正值和右侧轴承的正值来计算。如果它们是负数,我会将这些值转换为正数,以便获得字符的总宽度。
以下是关于如何生成伪代码的一些内容。
float xPlacement = 0.0f;
for(int i = 0; i < strlen(text); ++i)
{
 char charValue = text[i];
 GetCharWidthABC(.., .., charInfo);

 float posLeft = charInfo.leftSideBearing;
 if(charInfo.leftSideBearing < 0)
  posLeft = -charInfo.leftSideBearing;

 float posRight = charInfo.rightSideBearing;
 if(posRight < 0)
  posRight = -charInfo.rightSideBearing;

 float posWidth = posRight + posRight + charInfo.advancedWidth;

 float letterWidth = posWidth;

 xPlacement  -= charInfo.leftSideBearing;

 /* generated some vertex coordinates, using the xPlacement variable and letterWidth */

 xPlacement += letterWidth;
 xPlacement += charInfo.rightSideBearing
}

这样做是否正确?

2个回答

3
由于问题标签中提到了C#,也许您会对一些随.NET Framework一起提供的非常强大的类感兴趣(实际上是从版本3.0开始,与WPF核心程序集一起提供)。它们是:
  • GlyphTypeFace:指定与磁盘上的字体文件相对应的物理字体面,有助于解析.TTF文件并从中构建字形。
  • GlyphRun:表示来自单个字体面的单个字体的序列,具有单个呈现样式和许多有用的属性和方法(例如,您可以从中构建几何图形)。
  • GlyphRunDrawing:表示呈现GlyphRun的Drawing对象。对您来说可能不那么有趣,因为它更与WPF渲染/组合系统相关。
前两个类在某种程度上是技术/设备无关的,除了.NET Framework本身。

我想将字符打印到位图中,然后进行渲染,这就是我想了解字形渲染算法的原因。 - jack
通过这些类,您可以将字形渲染到位图上。 - Simon Mourier

2
听起来差不多,但确认是否正确的最好方法是运行它并使用各种不同的字体查看结果。
字形度量中的左/右轴承值不包括字距信息(字距=允许字符“挤在一起”或侵入相邻字符单元格框以消除由悬挂的上伸或下伸创建的令人分心的空白)。
字距数据针对特定的字符对,字符的顺序很重要。 "AV"的字距偏移量可能与"VA"的字距偏移量不同,这取决于字体。 有些字体不包括字距数据,有些则包括。
有关详细信息和呈现指南,请查看可在SourceForge下载的FreeType库的文档。 FreeType是处理OpenType字体加载的例程库(与TrueType大部分兼容)。 FreeType文档中的信息大部分适用于Win32 GDI中呈现TrueType。
还要测试使用粗体和斜体(以及粗斜体)字体替代品,并混合和匹配同一行文本中的字体。 如果您的算法缺少某些内容,这将显示字符间距问题。

我已经尝试了上述方法,但它不能正确地贴合。是否有其他方法可以获得字距信息?我正在将一个包含256个值的字符表渲染到位图中。然后,我尝试单独渲染每个字符,考虑到我将把每个字符的x/y信息存储到不同的二进制文件中。我这样做是为了使用这些字体表实现更高级的渲染技术,比如阿尔法距离场。我理解这一部分,但对于我来说,正确地渲染字体表中的实际字符似乎很困难。 - jack
你提到想要将文本渲染成位图。只是出于好奇,为什么不使用DrawText来布局和渲染字形呢?它会使用字体支持的字距调整。 - dthorpe
1
查看FreeType的文档,这是一个用于加载OpenType字体文件的开源库。文档非常好。特别是请参阅第4节有关字距调整的内容。请注意,字距数据与字形测量值是分开的,因为字距数据针对特定字符对,并且字符顺序很重要。 "AV"的字距可能与"VA"不同,具体取决于字体。http://sourceforge.net/projects/freetype/files/ - dthorpe

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接