LINUX.ORG.RU

HarfBuzz 11.5.0

 , , , ,


0

2

12 сентября состоялся выпуск 11.5.0 библиотеки и сопутствующих утилит проекта HarfBuzz.
Библиотека предназначена для преобразования строк Unicode в правильно отформатированные и расположенные глифы (text shaping) для их дальнейшего рендеринга — для любой системы письма и любого языка.

Проект написан на языке C++ и распространяется по лицензии Old MIT.

Изменения:

  • Поддержка Unicode 17.0.
  • Оптимизация сабсеттинга.
  • Множество внутренних микрооптимизаций.

>>> Подробности на GitHub

★★★★★

Проверено: hobbit ()
Последнее исправление: hobbit (всего исправлений: 1)

О, а похоже нужная штука, спасибо, в очередной раз за расширение кругозора!

pihter ★★★★★
()

О. Я постоянно в списке апдейтов вижу это название, думаю «что ты такое? Надо загуглить» и ленюсь.

thesis ★★★★★
()
Ответ на: комментарий от thesis

Шрифты. Чтобы их отрисовать нужно многое. Всякие вычисления с фиксированной запятой. Кэширование. Кривые Безье. Направление вращения. Хинтинг. Кернинг. Сглаживание. Все дела. Если погружаться подробно, то это надолго.

thegoldone ★★
()
Ответ на: комментарий от MoldAndLimeHoney

Пока ты будешь называть «хипстерами» пользователей всего, чему ты не нашёл применения – ответа на свои вопросы ты не получишь.

hobbit ★★★★★
()
Ответ на: комментарий от thesis

DeepSeek:

Типичный пайплайн отображения текста в современном приложении (браузер, текстовый редактор, ОС) выглядит так:

  1. Приложение получает строку Unicode-текста, которую нужно отобразить.

  2. HarfBuzz получает эту строку и информацию о шрифте.

  3. HarfBuzz выполняет шейпинг:

    • Обращается к FreeType (или другой библиотеке), чтобы загрузить метрики шрифта и информацию о доступных глифах.

    • На основе правил для данного языка/шрифта преобразует строку символов в последовательность идентификаторов глифов (glyph id) и их позиций.

  4. HarfBuzz возвращает результат: массив глифов (их ID) и массив позиций для каждого глифа.

  5. Приложение (или движок рендеринга) для каждого глифа из массива:

    • Обращается к FreeType, чтобы растеризовать этот конкретный глиф (по его ID) в bitmap.
  6. Приложение рисует полученные bitmap’ы на экране в рассчитанных HarfBuzz позициях.

static_lab ★★★★★
()
Последнее исправление: static_lab (всего исправлений: 1)
Ответ на: комментарий от static_lab

Приложение рисует полученные bitmap’ы на экране в рассчитанных HarfBuzz позициях.

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

sarumeister
()

Отличная новость, пора обновляться. Жаль, что API немного поломали.

andreyu ★★★★★
()
Ответ на: комментарий от Smacker

А число цветов на знакоместо должно быть 2. Не больше и не меньше.

Как завещал дядюшка Клайв Синклер.

andreyu ★★★★★
()
Ответ на: комментарий от LINUX-ORG-RU

Автор эффекта БДЛПСУДКС редко рисует иные.
Этот общеизвестный эффект, конечно же, был воспроизведён в бесчисленном множестве экспериментов.

dataman ★★★★★
() автор топика
Ответ на: комментарий от sarumeister

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

static_lab ★★★★★
()
Ответ на: комментарий от static_lab

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

Да, я перепутал. Это Freetype сделает х3 самостоятельно на флаге FT_RENDER_MODE_LCD: «It produces 8-bit bitmaps that are 3 times the width of the original».

sarumeister
()
Ответ на: комментарий от safocl

тем временем в archlinux у меня:

╰─>$ pacman -Qi harfbuzz
...
Required By     : chromium  electron34  electron37  ffmpeg  gimp  gnome-font-viewer  gtk3  gtk4  harfbuzz-icu  jdk-openjdk  jdk21-openjdk  lib32-harfbuzz  libass libgdiplus  libraqm  librsvg  opencv  pango  qt5-base  qt6-base  qt6-webengine  sdl2_ttf  texlive-bin  webkit2gtk  webkit2gtk-4.1  webkitgtk-6.0

safocl ★★
()
Последнее исправление: safocl (всего исправлений: 1)
Ответ на: комментарий от GAMer

дак тем более — зачем делать больше кода — преобразование к `void*` делается неявно — не нужно делать явный каст, тем более уж reinterpret_cast...

safocl ★★
()
Ответ на: комментарий от static_lab

Я тут задал правильный вопрос ChatGPT:

Роли FreeType и HarfBuzz

FreeType — это библиотека рендеринга шрифтов. Она загружает шрифты, растеризует глифы, предоставляет метрики символов, извлекает кривые и т.п. 👉 Но она не занимается полноценной текстовой разметкой и не делает комплексную типографику.

HarfBuzz — это библиотека для шейпинга текста, т.е. превращения последовательности символов в последовательность глифов с учётом правил OpenType, языковых особенностей, лигатур, кернинга и прочего.

🤔 Почему раньше обходились без HarfBuzz? 1. Текст был проще

Раньше (особенно в 90-х и начале 2000-х) приложения:

работали в основном с латиницей, которая не требует сложного шейпинга;

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

🔹 Для ASCII или базового латинского текста действительно хватало FreeType.

2. Не было широкого распространения сложных языков

Поддержка:

арабского (с контекстными формами),

индийских скриптов (с перестановками глифов),

ивритa, тайского, т.д. — требует сложного шейпинга, который FreeType никогда не умел и не должен уметь.

Раньше это либо не поддерживалось вовсе, либо делалось костыльно через кастомные движки.

3. Приложения писали свой шейпинг-код

Многие графические системы (например, Pango, Qt, Uniscribe на Windows) имели собственные реализации шейпинга. Это был дублирующийся, сложный, и часто неполный код.

🛠 Зачем появился HarfBuzz?

HarfBuzz стал стандартизированным, мощным и кросс-платформенным решением для:

поддержки OpenType features (лигатуры, альтернативы, кернинг, контекстные формы),

корректного отображения сложных языков,

обеспечения правильного текстового вывода в любой системе.

Иными словами:

HarfBuzz дополняет FreeType и закрывает задачу, которую FreeType решать не должен.

Shadow ★★★★★
()
Ответ на: комментарий от GAMer

шрифтов 6х8 хватит всем

Вот бы ещё и конкретный объем памяти под эти шрифты хоть бы раз кто-нибудь обозначил…

pihter ★★★★★
()
Ответ на: комментарий от Shadow

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

static_lab ★★★★★
()
Ответ на: комментарий от safocl

Функция так и называется crap. Так что претензия снимается.

ox55ff ★★★★★
()
Ответ на: комментарий от static_lab

диакритика

бОльшая часть диакритики уже в буквах, и даже не unicode

эмодзи

они все обычно занимают одно знакоместо, без диакритики и приколов лигатур и т.п.

не нужны лигатуры, ... поддержка восточных языков

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

Shadow ★★★★★
()
Последнее исправление: Shadow (всего исправлений: 2)
Ответ на: комментарий от GAMer

Нет, вообще. Ибо сказано: не сотвори себе знакоместа более 8х8, и не возжелай более двух цветов для него. Всякий спектрумист подтвердит.

Smacker ★★★★★
()
Ответ на: комментарий от u-235

я уже подумываю сделать) — но поначалу issue

safocl ★★
()
Ответ на: комментарий от Shadow

бОльшая часть диакритики уже в буквах

обычно занимают одно знакоместо

не всех восточных языков, но, в целом, да

То есть выходит, что лучше библиотеку прикрутить, чем нет. Особенно, если круг пользователей твоей программы может выходить за рамки ЛОРовских поборников ненужна :)

static_lab ★★★★★
()
Ответ на: комментарий от pasquale

Чувак, ну не надо так... iso8859-1...9 их не имеют.

Shadow ★★★★★
()
Ответ на: комментарий от safocl

https://eel.is/c draft/atomics.types.generic#general-3

3 [Note 2: The representation of an atomic specialization need not have the same size and alignment requirement as its corresponding argument type. — end note]

прямо явно сказано... а тут `reinterpret_cast`'ы из числа в атомики))) (хоть они и должны быть `standard-layout-structs` для бул, интеджер и флоатинг инстанциаций)
да и даже если бы они имели обязательно первым полем именно тот тип шаблонного арга, то всё равно не гарантируется, что для работы ничего иного внутреннего не нужно — иными словами нельзя вообще никак полагаться, что одного поля должно быть достаточным, а раз так, — то такой каст явно создаёт очень грустные последствия недопустимого доступа к памяти.

вывод следующий — сея либа является исключительно небезопасной и может становиться причиной нестабильной и неправильной работы приложений, которые её используют.

safocl ★★
()
Последнее исправление: safocl (всего исправлений: 4)
Ответ на: комментарий от Shadow

А если люди всю свою жизнь только европейские алфавиты используют? Зачем им harfbuzz?

Ну насколько я понял, просто большинство присутствующих услышало «ttf», «шревты» и решило что нужно. Ну или у нас тут тайные арабо-еврейские секты.

bdrbt
()
Ответ на: комментарий от bdrbt

или у нас тут тайные арабо-еврейские секты.

Я лично из <ЗНТРФ> zalgo-секты. Приходите к нам!

sarumeister
()
Для того чтобы оставить комментарий войдите или зарегистрируйтесь.