Преобразование символов истинного типа в полигоны OpenGL

Я пытаюсь создать библиотеку преобразования для любого установленного шрифта TrueType в ряд полигонов, которые могут быть использованы для отображения текста в OpenGL. Я использую функцию GetGlyphOutline, чтобы преобразовать глифы в серию контуров, а затем триангулировать (тесселять) эти контуры с помощью библиотеки glu.

Обычно это работает, но не всегда, и есть странные исключения. Предполагается, что GetGlyphOutline сначала возвращает внешние контуры в порядке намотки по часовой стрелке, а внутренние контуры (отверстия) — в порядке намотки по часовой стрелке. В зависимости от шрифта и глифа, к сожалению, это не так. Иногда внешний контур имеет порядок намотки против часовой стрелки, а отверстия расположены по часовой стрелке, или, хотя порядок намотки правильный, порядок контуров, возвращаемых GetGlyphOutline, является неправильным (например, сначала я получаю «отверстия», а затем внешний контур).

Я попытался настроить преобразование, чтобы проверить эти странные случаи и, если необходимо, поменять местами вершины и порядок наматывания контура, но, похоже, правила нет, и если для символа с 1 или 2 отверстиями в нем все в порядке с несколькими шрифтами, я всегда найти исключение. Например. со шрифтом с именем MinionPro-BoldCn даже символ «8» возвращает неправильный символ GetGlyphOutline, и в результате получается только одно отверстие вместо двух.

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

У кого-нибудь есть опыт с этим и могу ли я что-нибудь сделать?

13

Решение

Может быть, не идеальный обходной путь, но одна идея (не подумал ни о каких контрпримерах):

  1. Игнорировать порядок намотки
  2. Нарисуйте все глифы в буфере трафарета, увеличивая значение трафарета на 1 каждый раз, когда рисуется фрагмент.
  3. Нарисуйте квад над сценой, заполнив любой пиксель, где буфер трафарета == 1.

Я думаю, что любая область, не покрытая глифом, будет иметь значение трафарета == 0, любая область внутри глифа будет иметь значение трафарета == 1, а любые отверстия внутри глифа будут иметь значение трафарета == 2 (так как они покрыты оригинальным глифом и «дырой»). Затем вы можете отфильтровать это так, чтобы рисовать только те области, где трафарет равен 1.

1

Другие решения

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

0

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector