Рендеринг растровых шрифтов и кернинг - PullRequest
3 голосов
/ 03 января 2011

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

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

Ответы [ 2 ]

2 голосов
/ 03 января 2011

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

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

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

0 голосов
/ 03 января 2011

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

...