gpt4 book ai didi

c# - 位图字体渲染和字距微调

转载 作者:太空狗 更新时间:2023-10-29 21:51:02 25 4
gpt4 key购买 nike

我正在尝试创建一个位图字体渲染器,但是,我在渲染实际的单个字母位置时遇到了问题。

我将通过 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,我将在正确放置字母后修复它)。

http://img88.imageshack.us/img88/4015/njpjp2.png

最佳答案

KERNINGPAIR 的文档看起来很简单。如果当前字符和后续字符都通过 wFirst 出现在表中和 wSecond成员,添加 iKernAmount到您为下一个字符前进的像素数。

我建议创建一个 std::map<std::pair<wchar_t,wchar_t>,int>结果来自 GetKerningPairs用于快速查找。你已经注意到 GetKerningPairs不会为每种可能的字符组合返回结果。此信息来自字体本身,由字体设计者指示哪些字符对需要调整。此信息很可能完全缺失,或者缺失对您来说显而易见的字符对。

确保你做到了 SetMapMode(hdc,MM_TEXT)在调用任何这些函数之前,因为映射模式会影响结果。

关于c# - 位图字体渲染和字距微调,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4581229/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com