Я пытаюсь создать библиотеку преобразования для любого установленного шрифта TrueType в ряд полигонов, которые могут быть использованы для отображения текста в OpenGL. Я использую функцию GetGlyphOutline, чтобы преобразовать глифы в серию контуров, а затем триангулировать (тесселять) эти контуры с помощью библиотеки glu.
Обычно это работает, но не всегда, и есть странные исключения. Предполагается, что GetGlyphOutline сначала возвращает внешние контуры в порядке намотки по часовой стрелке, а внутренние контуры (отверстия) — в порядке намотки по часовой стрелке. В зависимости от шрифта и глифа, к сожалению, это не так. Иногда внешний контур имеет порядок намотки против часовой стрелки, а отверстия расположены по часовой стрелке, или, хотя порядок намотки правильный, порядок контуров, возвращаемых GetGlyphOutline, является неправильным (например, сначала я получаю «отверстия», а затем внешний контур).
Я попытался настроить преобразование, чтобы проверить эти странные случаи и, если необходимо, поменять местами вершины и порядок наматывания контура, но, похоже, правила нет, и если для символа с 1 или 2 отверстиями в нем все в порядке с несколькими шрифтами, я всегда найти исключение. Например. со шрифтом с именем MinionPro-BoldCn даже символ «8» возвращает неправильный символ GetGlyphOutline, и в результате получается только одно отверстие вместо двух.
Я также попытался использовать другой метод вместо GetGlyphOutline. Я использую GDI для рендеринга текста в путь, затем получаю контуры этого пути, используя функцию GetPath. Результат тот же. Существуют шрифты, в которых GetPath возвращает определенные символы с неправильным порядком контуров и / или с неправильной обмоткой.
У кого-нибудь есть опыт с этим и могу ли я что-нибудь сделать?
Может быть, не идеальный обходной путь, но одна идея (не подумал ни о каких контрпримерах):
Я думаю, что любая область, не покрытая глифом, будет иметь значение трафарета == 0, любая область внутри глифа будет иметь значение трафарета == 1, а любые отверстия внутри глифа будут иметь значение трафарета == 2 (так как они покрыты оригинальным глифом и «дырой»). Затем вы можете отфильтровать это так, чтобы рисовать только те области, где трафарет равен 1.
Я выяснил правило, чтобы определить, разграничивает ли контур внешнюю или внутреннюю область глифа.
Для каждого ребра во внутреннем контуре должна быть хотя бы одна точка, так чтобы треугольник был в порядке намотки по часовой стрелке.
Для ребра во внешнем контуре не должно быть такой точки, чтобы треугольник располагался по часовой стрелке.
см. раздел «Контуры» в Основы TrueType.