【发布时间】:2011-01-03 00:08:27
【问题描述】:
我正在尝试创建位图字体渲染器,但是在渲染实际的单个字母位置时遇到问题。
我将通过 GetCharABCWidthsFloat 和 GetTextMetricsW 获取字体字符信息,但是,我不确定如何正确使用 ABC 宽度……还是需要更多信息才能做到这一点?
我不想使用 FreeType 或任何其他库来执行此操作,我正在尝试使用 C++\Windows 提供的标准功能来执行此操作。
没有字距调整信息,字母将不正确。例如,看一下“f”和“t”并排放置的“Times new roman”。如果没有正确的字母间距,它们看起来会相距太远。 算法示例---
float letterBottomLeftX = 0.0f;
float letterHeight = 1.0f;
float letterWidth = 1.0f;
float scale = 1.0f;
for(U32 c = 0; c < numberOfCharacters; ++c)
{
fon->GetCharcterInfo(charValue, charInfo);
//float advancedWith = (charInfo.A * scale) + (charInfo.B * scale) + (charInfo.C * scale);
letterWidth = charInfo.B * scale;
letterHeight = textMetrics.Height * scale;
if(c == 0)
{
letterBottomLeftX = -(charInfo.A * scale);
}
// vertex placement, beginning at letterBottomLeftX
// texture placement
// index placement
letterBottomLeftX += (charInfo.A + charInfo.B + charInfo.C) * scale;
}
这是一个外观示例,您可以注意到字符之间的错误间距。 (忽略纹理 UV,我将在正确放置字母后修复它)。
【问题讨论】:
-
有人写过位图字体渲染器吗?
标签: c# c++ algorithm gdi+ rendering