FreeType2: получить глобальную ограничивающую рамку шрифта в пикселях?

Я использую FreeType2 для рендеринга шрифтов, и мне нужно получить глобальную ограничивающую рамку для всех шрифтов, чтобы я мог выровнять их в красивой сетке. Я вызываю FT_Set_Char_Size, а затем извлекаю глобальные границы, используя

int pixels_x = ::FT_MulFix((face->bbox.xMax - face->bbox.xMin), face->size->metrics.x_scale );
int pixels_y = ::FT_MulFix((face->bbox.yMax - face->bbOx.yMin), face->size->metrics.y_scale );
return Size (pixels_x / 64, pixels_y / 64);

который работает, но он слишком большой. Я также пытался вычислять с использованием двойников (как описано в руководстве по FreeType2) , но результаты практически те же. Даже использование только face->bbox.xMax приводит к слишком широким ограничивающим рамкам. Правильно ли я поступаю, или в моем шрифте просто есть какой-то огромный глиф (в данном случае Arial.ttf?). Есть ли способ проверить, какой глиф предположительно такой большой?


person Anteru    schedule 10.03.2011    source источник


Ответы (3)


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

person Evil Activity    schedule 11.03.2011
comment
Я не знаю, какие символы/сколько будут запрошены. То есть, когда я инициализирую сетку, у меня еще ничего не визуализируется. Каждый новый персонаж добавляется в следующее свободное место в сетке. - person Anteru; 11.03.2011
comment
Невозможно переместить уже размещенные символы, как только вы обнаружите более крупные символы? - person Evil Activity; 11.03.2011
comment
это будет выглядеть некрасиво, если сетка экрана начнет перестраиваться. - person Anteru; 12.03.2011

У меня похожая проблема с использованием freetype для рендеринга набора текстовых элементов, которые будут отображаться в сетке. Не все текстовые элементы имеют одинаковый размер, и мне нужно предварительно отрисовать их, прежде чем я узнаю, где они будут расположены. Различные размеры были самой большой проблемой при изменении высоты, например, для букв с нисходящей частью (например, «j» или «Q»).

В итоге я использовал высоту, которая находится на лице (вроде того, что вы сделали с bbox). Но, как вы упомянули, это значение было слишком большим. Предполагается, что это расстояние от базовой линии до базовой линии, но оказалось, что оно примерно в два раза больше. Итак, я пошел по простому пути и разделил полученную высоту на 2 и использовал ее как общее значение высоты. Скорее всего, высота слишком велика, потому что в шрифте есть символы, которые расположены слишком высоко или слишком низко.

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

person Scott Minster    schedule 15.02.2013

Ваш код правильный.

Он не слишком большой.

Потому что существует так много специальных символов, которые различаются больше, чем символы ascii. . просмотреть специальный большой символ

легко пройти весь код Unicode, чтобы найти этот большой символ.

если вам нужен только ascii, мой метод взлома

FT_MulFix(face_->units_per_EM, face_->size->metrics.x_scale ) >> 6

FT_MulFix(face_->units_per_EM, face_->size->metrics.y_scale ) >> 6
person niu2x    schedule 14.11.2020