Рендеринг шрифта с информацией Glyph - PullRequest
5 голосов
/ 24 декабря 2010

Я вызываю «GetCharABCWidthsFloatW», чтобы получить информацию о ширине символа.С этим я получу левый подшипник, правый боковой подшипник и расширенную ширину.

Для позиционирования каждого символа я начну с переменных «xPlacement», которые начнутся с нуля.Сначала я отрегулирую переменную xPlacement, вычтя «левый боковой подшипник».После того, как персонаж нарисован, я добавлю его на ширину символа (я покажу расчет для этого позже).Затем я переместу переменную xPlacement, добавив информацию о «правой стороне подшипника» из текущего «xPlacement».

Это, на мой взгляд, все, что должно быть кодом для размещения символов, верно?

Важно исправить ширину символов.Ширина будет рассчитываться с использованием параметра advancedWidth, а также ПОЛОЖИТЕЛЬНОЙ версии подшипника с левой стороны и ПОЛОЖИТЕЛЬНОЙ версии подшипника с правой стороны.Я преобразую эти значения в положительные, если они отрицательные, чтобы у меня была общая ширина символа.

Вот некоторый псевдокод о том, как он генерируется.

float xPlacement = 0.0f;
for(int i = 0; i < strlen(text); ++i)
{
 char charValue = text[i];
 GetCharWidthABC(.., .., charInfo);

 float posLeft = charInfo.leftSideBearing;
 if(charInfo.leftSideBearing < 0)
  posLeft = -charInfo.leftSideBearing;

 float posRight = charInfo.rightSideBearing;
 if(posRight < 0)
  posRight = -charInfo.rightSideBearing;

 float posWidth = posRight + posRight + charInfo.advancedWidth;

 float letterWidth = posWidth;

 xPlacement  -= charInfo.leftSideBearing;

 /* generated some vertex coordinates, using the xPlacement variable and letterWidth */

 xPlacement += letterWidth;
 xPlacement += charInfo.rightSideBearing
}

кажется, это правильный способ сделать это?

Ответы [ 2 ]

3 голосов
/ 24 декабря 2010

Поскольку C # упоминается в тегах вопросов, может быть, вам будет интересно посмотреть на некоторые очень мощные классы, поставляемые с .NET Framework (начиная с версии 3.0, фактически поставляемой с базовыми сборками WPF). Это:

  • GlyphTypeFace : Указывает физическую грань шрифта, соответствующую файлу шрифта на диске. Это полезно для анализа файла .TTF и построения из него глифов.
  • GlyphRun : представляет последовательность глифов из одной грани одного шрифта в одном размере и с одним стилем рендеринга со многими полезными свойствами и методами (например, вы можете создать Геометрия из нее)
  • GlyphRunDrawing : Представляет объект Drawing, который отображает GlyphRun. Возможно, он менее интересен для вас, поскольку он более привязан к системе рендеринга и компоновки WPF.

Два первых класса в некоторой степени зависят от технологии / устройства, за исключением самой .NET Framework.

2 голосов
/ 24 декабря 2010

Звучит правильно, но лучший способ проверить, правильно ли это, - это запустить его и посмотреть на результаты с помощью различных шрифтов.

Значения левого / правого несущих в метриках глифа не включают информацию о кернинге. (кернинг = разрешить персонажам «прижиматься» или покушаться на соседнюю ячейку для символов, чтобы устранить отвлекающие пробелы, создаваемые нависающими надстрочными элементами или спусками)

Данные кернинга относятся к конкретным парам символов, а порядок символов является значительным. Смещение кернинга для «AV» может отличаться от смещения кернинга для «VA» в зависимости от шрифта. Некоторые шрифты не содержат данных кернинга, некоторые включают.

Для получения подробной информации и рекомендаций по визуализации ознакомьтесь с документацией библиотеки FreeType , доступной для загрузки на SourceForge. FreeType - это библиотека подпрограмм для загрузки шрифтов OpenType (в значительной степени совместимая с TrueType). Информация в документации FreeType в значительной степени применима к визуализации TrueType в Win32 GDI.

Также проверьте использование альтернатив шрифта жирным и курсивом (и жирным курсивом), а также смешайте и сопоставьте шрифты в одной строке текста. Это покажет проблемы с символами, если ваш алгоритм чего-то не хватает.

...