c# - 带有字形信息的字体渲染

标签 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
}

这看起来是正确的方法吗?

最佳答案

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

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

前两个类在某种程度上独立于技术/设备,除了 .NET Framework 本身。

关于c# - 带有字形信息的字体渲染,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4522958/

相关文章:

c# - 如何在 ASP.Net Core 中更改路由中的 DateTime 格式?

algorithm - 可变分区未在 mozart Oz 中引入错误

java - 找到列表中最接近的数字

algorithm - 时间复杂度和 Big-O 符号特定问题

c# - 如何给 DLL 中的一行代码打补丁?

c# - ThreadAbortException 是否仍然强制执行 finally (try/catch) 部分中的代码?

c# - 在 Visual Studio 2019 中添加带有 css 类的 div 的键盘快捷方式

C++:如何为控制台应用程序设置新的 wndProc?

C++ 或 Python(也许是其他)为 C 中的控制台应用程序创建 GUI

c++ - 模板和两个单独的类之间的区别