2011-01-03 2 views
3

Я пытаюсь создать рендеринга растрового шрифта, однако у меня возникают проблемы с отображением фактических мест размещения отдельных букв.Рисование рендеринга растровых изображений и кернинг

Я получу информацию о символах шрифта через 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

+0

Разве никто не имеет никаких идей? – jack

+0

Кто-нибудь написал рендеринга растрового шрифта? – jack

ответ

2

Документация для KERNINGPAIR кажется довольно простой. Если в таблице встречаются как текущий символ, так и следующий символ через члены wFirst и wSecond, добавьте iKernAmount в число пикселей, которые вы продвигаете для следующего символа.

Я бы предложил создать std::map<std::pair<wchar_t,wchar_t>,int> с результатами поиска GetKerningPairs для быстрого поиска. Вы заметили, что GetKerningPairs не возвращает результат для каждой возможной комбинации символов. Эта информация поступает из самого шрифта, и разработчик шрифтов может указать, какие пары символов нуждаются в настройке. Вполне возможно, что эта информация будет отсутствовать целиком или исчезнуть пары символов, которые кажутся вам очевидными.

Перед вызовом любой из этих функций убедитесь, что вы делаете SetMapMode(hdc,MM_TEXT), так как режим отображения влияет на результаты.

+0

Интеграция. Где следует «SetMapMode (hdc, MM_TEXT)» по put? Вот как я это делаю, я не уверен, правильно ли он это использует (извините за многие ответы, форматирование здесь ужасно для ответов). HFONT fnt CreateFont (размер, 0,0,0, FW_NORMAL, 0,0,0, ANSI_CHARSET, OUT_TT_PRECIS, CLIP_DEFAULT_PRECIS, PROOF_QUALITY, FF_DONTCARE, «Times New Roman»); – jack

+0

SelectObject (dc, fnt); – jack

+0

SetMapMode (dc, MM_TEXT); – jack

0

Одно общее решение для создания ширины таблицы буквы пары. Таким образом, буквы «Ti» будут расположены ближе друг к другу, чем MN. Это быстрый стол, который позволяет делать приличные и отличные результаты по стоимости.

+1

Есть ли способ создать эту таблицу автоматически? Казалось бы, что взломать просто вставлять ценности там, не спрашивая какую-то информацию. GetKerningPairs не будет возвращать информацию обо всех парах, даже если им требуется специальное размещение. – jack

+0

Я из земли разработки встроенных игр. Инструмент для этого был бы идеальным, но мы, как известно, стремимся к получению результатов. В основном, я просто дал вам представление о жизнеспособном решении. –

Смежные вопросы