2016-12-29 4 views
0

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

Для этого я использую библиотеку FreeType для создания Glyphs всех букв. В частности, я пытаюсь загрузить монохромные растровые изображения, как это:

FT_Load_Char(face, c, FT_LOAD_RENDER | FT_LOAD_TARGET_MONO) 

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

Мой код для извлечения битов и положить его в массив байтов:

FT_Bitmap bm = face->glyph->bitmap; 

FT_Bitmap mono; 
FT_Bitmap_New(&mono); 
//convert from 8 pixel per byte to 1 pixel per byte 
FT_Bitmap_Convert(ft, &bm, &mono, 1); 
//set each byte from 0/1 to 0/255 
for (int y = 0; y < mono.rows; y++) { 
    for (int x = 0; x < mono.width; x++) { 
     mono.buffer[y * mono.width + x] *= 255; 
    } 
} 

Моя проблема, однако, в том, что глифы FreeType производит кажутся асимметричным.

Например, это буква M с шрифтом pixelsize 64 с помощью OpenSans-Regular шрифта:

enter image description here

И это буква М с тем же шрифтом с pixelsize 1024:

enter image description here

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

Любые идеи относительно того, почему FreeType, похоже, создает асимметричные глифы, или кто-нибудь может сказать мне, будет ли это даже проблемой при последующем рендеринге текста?

Редактирование: теперь я извлекаю биты, используя библиотечные функции, поэтому ошибка должна быть где-то в FreeType.

+0

Это именно то, что я собираюсь начать с учебника learnopengl. – Zebrafish

+0

Да, он также использует FreeType, но он не использует поля с записями. –

+0

«* Да, он также использует FreeType, но он не использует поля с полями со знаком. *« FreeType не генерирует »поля с полями со знаком. Он просто растеризует глифы. Мне непонятно, какова ваша проблема с асимметрией здесь. –

ответ

1

Вы делаете предположение, что OpenSans является шрифтом, где все glpyhs являются симметричными. Это не так, и это не ошибка FreeType. Вы всегда можете отправить электронное письмо в список freetype, но, вероятно, ему будет дан тот же ответ.

Это не ошибка, потому что дизайнер шрифтов разработал M-глиф не симметрично по тем или иным причинам, которые он выбрал. Много раз это будет сделано для повышения удобочитаемости. Небольшая асимметрия вызовет намеки на двигатели, чтобы растрировать глиф несколько иначе, что будет более разборчивым или выглядеть более «четким». Вот несколько скриншотов, чтобы доказать, что это так.

Во-первых, это сильно увеличенный снимок экрана Windows 10/Chrome 55, отображающий глиф в браузере с наименьшим размером, который веб-сайт позволит мне выбрать. Хотя на первый взгляд это выглядит симметрично, это не так.

Chrome 55 screenshot

Во-вторых, я скачал шрифт и открыл его в FontForge. Если вы посмотрите внимательно, вы увидите, что кривые на внутреннем краю двух сторон на самом деле немного отличаются друг от друга. Я также потратил немного времени, чтобы посмотреть на две точки, которые определяют нижний центр М. Их позиции равны (848, 0) и (985, 0). Средняя точка между этими двумя точками равна (916,5, 0), однако две точки, которые определяют верхний край этой части глифа, равны (920, 256) и (928, 256). Это немного сдвинуто вправо.

FontForge screenshot

Если вы ищете для симметричных или иначе простых шрифтов, искать шрифты, ориентированных на программистов или консольных шрифтов. Arial, Consolas, Courier New и т. Д., Вероятно, подойдут к законопроекту.

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