Порт держит двадцать один слот (fb_faces[] в font_freetype.c): пять семейств по четыре начертания плюс emoji. Выбор идёт по family + weight + FONTF_ITALIC. Файлов при этом девять, остальное — псевдонимы и наклонные дубли; эта страница показывает, где что.
| 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 — включая жирную и наклонную, которые раньше в этих семействах не работали вовсе.
Обе ветки в fb_fill_scalar() ведут в один слот, так что различий быть не должно:
| italic | oblique | |
|---|---|---|
| sans | Наклонный Handgloves | Наклонный Handgloves |
| serif | Наклонный Handgloves | Наклонный Handgloves |
| mono | Наклонный Handgloves | Наклонный Handgloves |
Слот переключается на BOLD_WEIGHT, всё что ниже идёт в обычный файл. Ступенька должна быть ровно одна, между двумя соседними значениями.
| weight | sans | serif | mono |
|---|---|---|---|
| 100 | Handgloves Шрифт | Handgloves Шрифт | Handgloves |
| 300 | Handgloves Шрифт | Handgloves Шрифт | Handgloves |
| 400 | Handgloves Шрифт | Handgloves Шрифт | Handgloves |
| 500 | Handgloves Шрифт | Handgloves Шрифт | Handgloves |
| 600 | Handgloves Шрифт | Handgloves Шрифт | Handgloves |
| 700 | Handgloves Шрифт | Handgloves Шрифт | Handgloves |
| 900 | Handgloves Шрифт | Handgloves Шрифт | Handgloves |
Пустой прямоугольник значит, что глифа нет ни в самом файле, ни в emoji.ttf, к которому уходит fallback.
| письменность | sans (FreeSans, 4622) | serif (DejaVu Serif, 3447) | mono (DejaVu Sans Mono, 3322) |
|---|---|---|---|
| латиница | Quick brown fox | Quick brown fox | Quick brown fox |
| кириллица | Съешь ещё этих булок | Съешь ещё этих булок | Съешь ещё этих булок |
| диакритика | àéîõü ñç ĝŵ ăţ łż | àéîõü ñç ĝŵ ăţ łż | àéîõü ñç ĝŵ ăţ łż |
| греческий | Ζεύς ὁ λόγος αβγδ | Ζεύς ὁ λόγος αβγδ | Ζεύς ὁ λόγος αβγδ |
| валюты | $ € £ ¥ ₽ ₴ ₸ ₿ | $ € £ ¥ ₽ ₴ ₸ ₿ | $ € £ ¥ ₽ ₴ ₸ ₿ |
| типографика | « » „ “ — – … † ‡ ‰ № | « » „ “ — – … † ‡ ‰ № | « » „ “ — – … † ‡ ‰ № |
| математика | ± × ÷ ≈ ≠ ≤ ≥ ∞ √ ∑ ∫ ∂ | ± × ÷ ≈ ≠ ≤ ≥ ∞ √ ∑ ∫ ∂ | ± × ÷ ≈ ≠ ≤ ≥ ∞ √ ∑ ∫ ∂ |
| стрелки/боксы | ← ↑ → ↓ ⇒ ▲ ▼ ● ■ □ ✓ ✗ | ← ↑ → ↓ ⇒ ▲ ▼ ● ■ □ ✓ ✗ | ← ↑ → ↓ ⇒ ▲ ▼ ● ■ □ ✓ ✗ |
| псевдографика | ┌─┬─┐ │ ├─┼─┤ └─┴─┘ ░▒▓█ | ┌─┬─┐ │ ├─┼─┤ └─┴─┘ ░▒▓█ | ┌─┬─┐ │ ├─┼─┤ └─┴─┘ ░▒▓█ |
| иврит | אבגד שלום | אבגד שלום | אבגד שלום |
| арабица | ابجد سلام | ابجد سلام | ابجد سلام |
| армянский | Բարեւ աբգդ | Բարեւ աբգդ | Բարեւ աբգդ |
| грузинский | გამარჯობა | გამარჯობა | გამარჯობა |
| деванагари | नमस्ते अआइई | नमस्ते अआइई | नमस्ते अआइई |
| CJK | 漢字 かな 한글 | 漢字 かな 한글 | 漢字 かな 한글 |
Эмодзи в текстовом шрифте нет, они приходят из emoji.ttf (Twemoji Mozilla, COLRv0). Проверяется, что подмена работает во всех трёх семействах и не сбивает базовую линию.
| sans | Сборка ✅ прошла, но 🔥 есть нюанс ⚠️ — жми 🚀 |
| serif | Сборка ✅ прошла, но 🔥 есть нюанс ⚠️ — жми 🚀 |
| mono | Сборка ✅ прошла, но 🔥 есть нюанс ⚠️ — жми 🚀 |
| sans bold | Сборка ✅ прошла, но 🔥 есть нюанс ⚠️ — жми 🚀 |
| sans italic | Сборка ✅ прошла, но 🔥 есть нюанс ⚠️ — жми 🚀 |
Порт кернит через 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.
Один и тот же текст от 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
Переключение слота внутри одной строки: базовая линия и межстрочный интервал не должны прыгать.
Обычный текст, жирный кусок, курсивный кусок,
жирный курсив, кусок кода и снова обычный — всё в
одной строке.
Serif-абзац с жирным, курсивом (синтетический наклон) и моноширинной вставкой внутри.
Ширины у синтетического наклона обязаны совпадать с прямым начертанием — сдвиг не трогает advance. Две строки ниже должны кончаться на одном и том же месте:
0123456789 abcdefghij ABCDEFGHIJ |
0123456789 abcdefghij ABCDEFGHIJ |
Одинаковая длина строки, прямое начертание. |
Одинаковая длина строки, прямое начертание. |
Кириллица и латиница вперемешку: NetSurf на KolibriOS рендерит текст через FreeType, кэш глифов — FTC_ImageCache, 0x1234 байт.
Файлов девять, слотов двадцать один: пять семейств по четыре начертания плюс 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