我调用“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
}

这似乎是执行此操作的正确方法吗?

最佳答案

由于问题标记中提到了C#,也许您会发现对.NET Framework附带的一些非常强大的类(从3.0版开始,实际上是WPF核心程序集附带)非常感兴趣。他们是:

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

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

    09-26 21:48