LINUX.ORG.RU

HarfBuzz 11.5.0

 , , , ,


0

3

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 ★
()
Вы не можете добавлять комментарии в эту тему: топик перемещен в архив.