字体渲染与字形信息

时间:2010-12-23 22:34:39

标签: c# c++ algorithm fonts rendering

我调用“GetCharABCWidthsFloatW”来获取角色的宽度信息。有了这个,我将获得左侧轴承,右侧轴承和先进的宽度。

为了定位每个字符,我将从一个从零开始的“xPlacement”变量开始。我将首先通过减去“左侧轴承”来调整xPlacement变量。绘制完角色后,我会按角色的宽度前进(我稍后会显示计算结果)。然后,我将通过添加当前“xPlacement”中的“右侧方位”信息来移动xPlacement变量。

在我看来,这应该是字符放置的代码,对吗?

重要的是要纠正字符的宽度。宽度将通过采用advancedWidth,左侧轴承的POSITIVE版本和右侧轴承的POSITIVE版本来计算。我会将这些值转换为正数,如果它们是负数,那么我可以得到该字符的总宽度。

以下是一些关于如何生成的伪代码。

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 个答案:

答案 0 :(得分:3)

由于问题标签中提到了C#,您可能会对查看.NET Framework附带的一些非常强大的类感兴趣(从3.0版本开始,实际上随WPF核心程序集一起提供)。他们是:

  • GlyphTypeFace:指定与磁盘上的字体文件对应的物理字体,用于解析.TTF文件并从中构建字形。
  • GlyphRun:表示单个字体的单个面的单一字形序列,并且具有单个渲染样式,具有许多有用的属性和方法(例如,您可以从中构建几何图形)它)
  • GlyphRunDrawing:表示呈现GlyphRun的Drawing对象。对你来说可能不那么有趣,因为它更依赖于WPF渲染/合成系统。

除了.NET Framework本身之外,这两个第一类在某种程度上与技术/设备无关。

答案 1 :(得分:2)

听起来不对,但是看看它是否正确的最佳方法是运行它并使用各种不同的字体查看结果。

字形指标中的左/右方位值不包括字距调整信息。 (字距调整=允许字符“依偎”或侵占相邻的字符单元格框,以消除由悬垂的诽谤或下降者创建的分散注意力的空白)。

字距调整数据特定于特定字符对,字符的顺序很重要。 “AV”的字距调整偏移量可能与“VA”的字距调整偏移量不同,具体取决于字体。有些字体不包括字距调整数据,有些字体不包括。

有关详细信息和呈现指南,请查看可在SourceForge上下载的FreeType库的文档。 FreeType是一个用于处理OpenType字体加载的例程库(很大程度上与TrueType兼容)。 FreeType文档中的信息主要适用于在Win32 GDI中呈现TrueType。

另外,使用粗体和斜体(和粗体斜体)字体进行测试交替,并在同一行文本中混合和匹配字体。如果您的算法遗漏了某些内容,这将显示字符间距问题。