Установка размера символа в FreeType

Я немного смущен установкой полей ширины и высоты символа объекта размера символа (пример из, как описано в Руководство по FreeType)

error = FT_Set_Char_Size(
          face,    /* handle to face object           */
          0,       /* char_width in 1/64th of points  */
          16*64,   /* char_height in 1/64th of points */
          300,     /* horizontal device resolution    */
          300 );   /* vertical device resolution      */

Почему указаны char_width и char_height? Разве это не должно зависеть от фактического глифа? Например, символы «w» и «l» имеют разную ширину и высоту.

Кроме того, поскольку я не выполняю рендеринг на экран (я планирую использовать данные растровых шрифтов для некоторых других эзотерических целей), достаточно ли использовать FT_Set_Pixel_Sizes?


person Olumide    schedule 17.11.2016    source источник


Ответы (1)


Функции FT_Set_Char_Size и FT_Set_Pixel_Sizes устанавливают размер не отдельного символа, а em square для шрифта, который является условным квадратом, высота которого может быть равна высоте самого высокого символа (например, квадратная скобка: '['), но на самом деле может не совпадать. рост как у любого персонажа; он просто определяет справочный размер. Основное значение установки размера 12pt состоит в том, чтобы создавать символы, которые обычно соответствуют базовым линиям на расстоянии 12 пунктов друг от друга без конфликтов, и которые гармонируют с символами 12pt из других шрифтов. Таким образом, «em» представляет собой типографское измерение, представляющее размер шрифта.

Высота и ширина настраиваются отдельно, поэтому вы можете создавать расширенные (увеличенные по горизонтали) или сжатые (сжатые по горизонтали) шрифты, используя большую или меньшую ширину, чем высота. Обычно вы оставляете ширину равной нулю, что означает, что ширина em-квадрата должна быть такой же, как и высота, и символы должны создаваться в своих стандартных пропорциях, а не растягиваться или уменьшаться.

Нет причин использовать FT_Set_Char_Size вместо FT_Set_Pixel_Sizes, кроме того факта, что FT_Set_Char_Size дает более тонкий контроль; FT_Set_Pixel_Sizes не допускает дробных пикселей, которые имеют значение при создании сглаженных глифов. Конечный результат всегда рассчитывается с использованием как размера em, так и разрешения экрана.

В вашем случае вы также можете использовать FT_Set_Pixel_Sizes; но если вам нужен дробный размер пикселя, используйте FT_Set_Char_Sizes с высотой в 64-х долях пикселя, нулевой шириной и нулем как для горизонтального, так и для вертикального разрешения устройства; разрешение 0 делает пиксели того же размера, что и точки. Итак, чтобы получить размер пикселя 11,5, вы должны использовать

FT_Set_Char_Sizes(face,0,11 * 64 + 32,0,0);
person Graham Asher    schedule 13.01.2021