Ответ 1
Calibri поставляется с таблицей EBLC и EBDT, которая сообщает текстовым движкам, что для определенных размеров точек они не должны пытаться "использовать собственные алгоритмы масштабирования", а просто использовать растровые изображения, которые хранятся непосредственно в шрифте.
Каждый размер шрифта может иметь свой собственный список "следующие глифы должны быть растровыми в этом размере", называемый "ударом", поэтому один глиф может иметь несколько растровых изображений для нескольких размеров (но могут быть пробелы, и когда что битмапы должны быть масштабированы, и все может пойти катастрофически неправильно).
Например, Calibri имеет удары по размерам точек 12, 13, 15, 16, 17 и 19, при этом примерный растровый рисунок для A:
<ebdt_bitmap_format_1 name="A">
<SmallGlyphMetrics>
<height value="8"/>
<width value="7"/>
<BearingX value="0"/>
<BearingY value="8"/>
<Advance value="7"/>
</SmallGlyphMetrics>
<rawimagedata>
10102828 447c8282
</rawimagedata>
</ebdt_bitmap_format_1>
Этот битмап ссылается на размер шрифта размером 12 и кодируется как растровое изображение размером 7x8 пикселей. Поскольку 12 - самое низкое значение, мы сталкиваемся с проблемами, когда мы используем размер шрифта ниже 12: внезапно нам нужно масштабировать растровое изображение. Это может пойти только ужасно неправильно.
Если вы посмотрите на что-то вроде WordPad, вы увидите, что Microsoft Uniscribe движок (используется с GDI +, современный эквивалент - Direct2D с DirectWrite в качестве текстового движка) может довольно хорошо масштабировать эти растровые изображения (показаны размеры от 5 до 20), но даже у собственной технологии Microsoft есть четкие ограничения. Мы видим, что при размерах шрифтов 5, 6 и 7px растровые изображения довольно ужасны, и даже 8, 10 и 11 выглядят несколько странно:
Масштабирование:
Все становится интереснее, потому что не каждый глиф представлен в каждом ударе, так что, хотя "A" имеет растровое изображение с размером точки 12, существуют глифы, для которых самый низкий размер точки с явным растровым изображением может составлять 13 или 15, или 16, или 17, или даже 19.
Это означает, что у вас есть три проблемы:
- Шрифт может "потребовать", чтобы текстовый движок использовал свои растровые изображения вместо того, чтобы пытаться растрировать векторные контуры для алгоритмов текстового движка и
- Не существует размера волшебного шрифта, над которым все символы отображаются "красиво", и под которыми все символы отображаются "плохо". Шрифт может иметь любое количество "ударов", содержащих любое подмножество символов, закодированных шрифтом, что фактически означает, что каждый символ может иметь свои собственные правила, когда текстовый движок должен переключиться с растрированного вектора на встроенный растровый рисунок и
- Текстовые движки полностью свободны, чтобы полностью игнорировать шрифт "требования" и делать свою собственную вещь в любом случае, и выяснить, какой движок делает то, что есть, несмотря на доступность интернета в нашем распоряжении, практически невозможно. Это одна из тех вещей, о которых никто, кажется, не документирует.
Самый простой способ узнать, какие шрифты будут делать это, - просто проверить шрифт для таблицы EBDT вообще - если таковой есть, этот шрифт заставит двигатели использовать растровые изображения для очень небольшого (а иногда и очень большого) шрифта размеры. Если вам нужна специфика, вы можете запустить шрифт через TTX, а затем найти начало таблицы <EBDT>
, чтобы увидеть, что происходит на самом деле.
Готовьтесь к переполнению. Например, у Calibri есть растровые изображения, указанные, например, для более тысячи символов.