Войти
ПрограммированиеФорумОбщее

freetype центрировать относительно точки

Страницы: 1 2 Следующая »
#0
13:00, 15 окт. 2018

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


#1
18:15, 15 окт. 2018

IROV..
перед тем как ты рендерил freetype'ом, ты задавал размер для глифов, вот этот размер и используй.

FT_Set_Pixel_Sizes( ft_face, 0, font_height );
// ...
center_point_y;

DrawText(..., center_point_y - font_height/2);
#2
18:42, 15 окт. 2018

Aroch
font_height = ascent + descent + spacing

в моем случае даже половина ascent почему то выше чем средняя линия "на глаз".

FT_Size face_size = face->size;
const FT_Size_Metrics & face_size_metrics = face_size->metrics;

FT_Pos ascender = face_size_metrics.ascender >> 6;
FT_Pos descender = face_size_metrics.descender >> 6;
FT_Pos height = face_size_metrics.height >> 6;
#3
19:28, 15 окт. 2018

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

#4
19:53, 15 окт. 2018

Aroch
Вот так сейчас получается
1 | freetype центрировать относительно точки

Хочется чуть выше :)

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

#5
19:56, 15 окт. 2018

IROV..
Я с фритайпом не работал, но знаю, что надо гуглить freetype baseline. Гуглил?

#6
19:56, 15 окт. 2018

IROV..
> Раньше я использовал половину высоты буквы А
По стандарту берут за основу высоту буквы M - https://docs.microsoft.com/en-us/typography/opentype/spec/ttch01

EM на рисунке
Изображение

#7
20:02, 15 окт. 2018

MrShoor
> baseline
это по сути 0 и от него идет ascent и descent

mr.DIMAS
A-M это все хорошо, но что делать с локализацией? Я знаю пару языков где нету буквы M :)

#8
20:04, 15 окт. 2018

IROV..
Em это единица измерения как я понял - https://en.wikipedia.org/wiki/Em_(typography). И на вики почему-то сказано про ширину буквы и не высоту как у майков :/

#9
20:08, 15 окт. 2018

mr.DIMAS
А, ну тогда если я не ошибаюсь FT_Set_Pixel_Sizes это и задает Em
но даже по картинке видно что он больше буквы

#10
20:11, 15 окт. 2018

IROV..
> Хочется чуть выше :)
можешь тогда попробовать center_point_y - (font_height - descent)/2

#11
20:26, 15 окт. 2018

Aroch
(fontHeight - fontDescent) * 0.5f
222 | freetype центрировать относительно точки

fontBearingYA * 0.5f
333 | freetype центрировать относительно точки

#12
20:33, 15 окт. 2018

IROV..
> (fontHeight - fontDescent) * 0.5f
ты же показывал тоже самое для fontHeight/2.
> fontBearingYA
что есть fontBearingYA?

и еще момент красная линия это center_point_y, верно? Твой метод вывода текста, за "y" принимает самую верхнюю точку шрифта?

#13
20:37, 15 окт. 2018

Aroch
fontHeight * 0.5f
4444 | freetype центрировать относительно точки

fontBearingYA - это высота глифа 'A' над baseline

#14
20:40, 15 окт. 2018

IROV..
> fontHeight * 0.5f
ерунда какая то, твой метод вывода текста, передаваемые координаты воспринимает явно иначе чем обычный самый верхний левый угол текста.

Вообще у себя я делаю так, когда мне надо отцентрировать текст вертикально в каком-нибудь выджите:
widget_pos_y + (widget_height - font_height)/2

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

Страницы: 1 2 Следующая »
ПрограммированиеФорумОбщее

Тема в архиве.