Я пытаюсь создать средство рендеринга растрового шрифта, однако у меня возникают проблемы с отображением фактических размещений отдельных букв.
Я получу информацию о символах шрифта через GetCharABCWidthsFloat и GetTextMetricsW, однако я не уверен, как правильно использовать ширину ABC ... или мне нужна дополнительная информация для этого?
Я не хочу использовать FreeType или любые другие библиотеки для этого, я пытаюсь сделать это с помощью стандартных функций, доступных через C ++ \ Windows.
Без информации о кернинге буквы не будут отображаться правильно. Например, взгляните на «Times new roman», когда «f» и «t» расположены рядом друг с другом. Без правильного расстояния между буквами они будут выглядеть слишком далеко друг от друга.
Пример алгоритма ---
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