Шрифты: все семейства и начертания

Порт держит двадцать один слот (fb_faces[] в font_freetype.c): пять семейств по четыре начертания плюс emoji. Выбор идёт по family + weight + FONTF_ITALIC. Файлов при этом девять, остальное — псевдонимы и наклонные дубли; эта страница показывает, где что.

1. Матрица: семейство × начертание

CSSобычноежирноекурсивжирный курсив
sans-serif Шрифт Handgloves 123 Шрифт Handgloves 123 Шрифт Handgloves 123 Шрифт Handgloves 123
файл sans.ttf sans_serif_bold.ttf sans_serif_italic.ttf sans_serif_italic_bold.ttf
serif Шрифт Handgloves 123 Шрифт Handgloves 123 Шрифт Handgloves 123 Шрифт Handgloves 123
файл serif.ttf serif_bold.ttf serif.ttf + сдвиг 12° serif_bold.ttf + сдвиг 12°
monospace Шрифт Handgloves 123 Шрифт Handgloves 123 Шрифт Handgloves 123 Шрифт Handgloves 123
файл monospace.ttf monospace_bold.ttf monospace.ttf + сдвиг 12° monospace_bold.ttf + сдвиг 12°
cursive Шрифт Handgloves 123 Шрифт Handgloves 123 Шрифт Handgloves 123 Шрифт Handgloves 123
файл cursive.ttf нет → четыре слота сами берут четыре sans-слота, то есть настоящие FreeSans Regular/Bold/Oblique/BoldOblique. Строка должна выглядеть ровно как sans выше
fantasy Шрифт Handgloves 123 Шрифт Handgloves 123 Шрифт Handgloves 123 Шрифт Handgloves 123
файл fantasy.ttf нет → то же самое, четыре sans-слота

Ожидаемо: у sans все четыре клетки различаются — там четыре настоящих файла. У serif и monospace наклонные клетки тоже отличаются от прямых, но это синтетика: тот же контур, сдвинутый на 12°, а не отдельный рисунок курсива. Отличить можно по букве «a» — у настоящей антиквенной италики она одноэтажная, у сдвинутой остаётся двухэтажной. У cursive и fantasy своих файлов нет, поэтому их четыре строки должны совпасть со строками sans — включая жирную и наклонную, которые раньше в этих семействах не работали вовсе.

2. font-style: italic против oblique

Обе ветки в fb_fill_scalar() ведут в один слот, так что различий быть не должно:

italicoblique
sans Наклонный Handgloves Наклонный Handgloves
serif Наклонный Handgloves Наклонный Handgloves
mono Наклонный Handgloves Наклонный Handgloves

3. Порог жирности

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

weightsansserifmono
100Handgloves ШрифтHandgloves ШрифтHandgloves
300Handgloves ШрифтHandgloves ШрифтHandgloves
400Handgloves ШрифтHandgloves ШрифтHandgloves
500Handgloves ШрифтHandgloves ШрифтHandgloves
600Handgloves ШрифтHandgloves ШрифтHandgloves
700Handgloves ШрифтHandgloves ШрифтHandgloves
900Handgloves ШрифтHandgloves ШрифтHandgloves

4. Покрытие: что каждое семейство умеет

Пустой прямоугольник значит, что глифа нет ни в самом файле, ни в emoji.ttf, к которому уходит fallback.

письменностьsans (FreeSans, 4622)serif (DejaVu Serif, 3447)mono (DejaVu Sans Mono, 3322)
латиницаQuick brown foxQuick brown foxQuick brown fox
кириллицаСъешь ещё этих булокСъешь ещё этих булокСъешь ещё этих булок
диакритикаàéîõü ñç ĝŵ ăţ łżàéîõü ñç ĝŵ ăţ łżàéîõü ñç ĝŵ ăţ łż
греческийΖεύς ὁ λόγος αβγδΖεύς ὁ λόγος αβγδΖεύς ὁ λόγος αβγδ
валюты$ € £ ¥ ₽ ₴ ₸ ₿$ € £ ¥ ₽ ₴ ₸ ₿$ € £ ¥ ₽ ₴ ₸ ₿
типографика« » „ “ — – … † ‡ ‰ №« » „ “ — – … † ‡ ‰ №« » „ “ — – … † ‡ ‰ №
математика± × ÷ ≈ ≠ ≤ ≥ ∞ √ ∑ ∫ ∂± × ÷ ≈ ≠ ≤ ≥ ∞ √ ∑ ∫ ∂± × ÷ ≈ ≠ ≤ ≥ ∞ √ ∑ ∫ ∂
стрелки/боксы← ↑ → ↓ ⇒ ▲ ▼ ● ■ □ ✓ ✗← ↑ → ↓ ⇒ ▲ ▼ ● ■ □ ✓ ✗← ↑ → ↓ ⇒ ▲ ▼ ● ■ □ ✓ ✗
псевдографика┌─┬─┐ │ ├─┼─┤ └─┴─┘ ░▒▓█┌─┬─┐ │ ├─┼─┤ └─┴─┘ ░▒▓█┌─┬─┐ │ ├─┼─┤ └─┴─┘ ░▒▓█
ивритאבגד שלוםאבגד שלוםאבגד שלום
арабицаابجد سلامابجد سلامابجد سلام
армянскийԲարեւ աբգդԲարեւ աբգդԲարեւ աբգդ
грузинскийგამარჯობაგამარჯობაგამარჯობა
деванагариनमस्ते अआइईनमस्ते अआइईनमस्ते अआइई
CJK漢字 かな 한글漢字 かな 한글漢字 かな 한글

5. emoji.ttf как fallback

Эмодзи в текстовом шрифте нет, они приходят из emoji.ttf (Twemoji Mozilla, COLRv0). Проверяется, что подмена работает во всех трёх семействах и не сбивает базовую линию.

sansСборка ✅ прошла, но 🔥 есть нюанс ⚠️ — жми 🚀
serifСборка ✅ прошла, но 🔥 есть нюанс ⚠️ — жми 🚀
monoСборка ✅ прошла, но 🔥 есть нюанс ⚠️ — жми 🚀
sans boldСборка ✅ прошла, но 🔥 есть нюанс ⚠️ — жми 🚀
sans italicСборка ✅ прошла, но 🔥 есть нюанс ⚠️ — жми 🚀

6. Кернинг

Порт кернит через FT_Get_Kerning, то есть по legacy-таблице kern. У FreeSans 464 пары, у DejaVu Serif 1367, у DejaVu Sans Mono ноль (и не нужно). Пары должны подтягиваться, у моно — строго нет.

AV To Yo Wa LT P, F.

AV To Yo Wa LT P, F.

AV To Yo Wa LT P, F.

7. Кегли

Один и тот же текст от 8 до 48 px: хинтер должен держать стебли ровными на мелких кеглях и не ломать пропорции на крупных.

8px — Шрифт Handgloves, съешь ещё булок 0123456789

10px — Шрифт Handgloves, съешь ещё булок 0123456789

11px — Шрифт Handgloves, съешь ещё булок 0123456789

13px — Шрифт Handgloves, съешь ещё булок 0123456789

16px — Шрифт Handgloves, съешь ещё булок

24px — Шрифт Handgloves, съешь ещё

32px — Шрифт Handgloves

48px — Handgloves

То же для serif и mono, только мелкий конец — там хинтовано меньше глифов, и провалы видны раньше.

8px serif — Шрифт Handgloves, съешь ещё булок 0123456789

11px serif — Шрифт Handgloves, съешь ещё булок 0123456789

13px serif — Шрифт Handgloves, съешь ещё булок 0123456789

8px mono — Шрифт Handgloves 0123456789

11px mono — Шрифт Handgloves 0123456789

13px mono — Шрифт Handgloves 0123456789

8. Смешанные строки

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

Обычный текст, жирный кусок, курсивный кусок, жирный курсив, кусок кода и снова обычный — всё в одной строке.

Serif-абзац с жирным, курсивом (синтетический наклон) и моноширинной вставкой внутри.

Ширины у синтетического наклона обязаны совпадать с прямым начертанием — сдвиг не трогает advance. Две строки ниже должны кончаться на одном и том же месте:

0123456789 abcdefghij ABCDEFGHIJ |

0123456789 abcdefghij ABCDEFGHIJ |

Одинаковая длина строки, прямое начертание. |

Одинаковая длина строки, прямое начертание. |

Кириллица и латиница вперемешку: NetSurf на KolibriOS рендерит текст через FreeType, кэш глифов — FTC_ImageCache, 0x1234 байт.

9. Служебное

Файлов девять, слотов двадцать один: пять семейств по четыре начертания плюс emoji. Различимых начертаний двенадцать — sans R/B/I/BI настоящими файлами, serif и mono R/B файлами и I/BI сдвигом, cursive и fantasy целиком псевдонимами sans. Наклонные слоты — дубли faceid поверх тех же файлов: ни байта на диске, ни одного нового .ttf.

sans.ttf                      FreeSans / Regular         upem 1000  cmap 4622
sans_serif_bold.ttf           FreeSans / Bold            upem 1000  cmap 2653
sans_serif_italic.ttf         FreeSans / Oblique         upem 1000  cmap 2547
sans_serif_italic_bold.ttf    FreeSans / Bold Oblique    upem 1000  cmap 2380
serif.ttf                     DejaVu Serif / Book        upem 2048  cmap 3447
serif_bold.ttf                DejaVu Serif / Bold        upem 2048  cmap 3443
monospace.ttf                 DejaVu Sans Mono / Book    upem 2048  cmap 3322
monospace_bold.ttf            DejaVu Sans Mono / Bold    upem 2048  cmap 3261
emoji.ttf                     Twemoji Mozilla / Regular  upem  512  cmap 1418