Свежеустановленная система Linux нередко встречает пользователя шрифтами, которые выглядят то размыто, то угловато, особенно если человек пришёл с другой операционной системы с её вылизанным отображением текста. Виной тому не плохие шрифты, а неоптимальные настройки их отрисовки, которые легко поправить. За то, как текст ложится на экран, отвечает библиотека настройки доступа к шрифтам, а саму отрисовку выполняет связанная с ней библиотека рендеринга. Управляя их параметрами, можно превратить мутные или зубчатые буквы в чёткий и приятный глазу текст.
Ключевых рычагов тут два, и оба часто понимают неверно. Первый это хинтинг, подгонка очертаний букв под пиксельную сетку экрана. Второй это субпиксельное сглаживание, использующее цветные составляющие каждого пикселя для утроения горизонтального разрешения текста. Оба заметно влияют на читаемость, но их эффект зависит от типа экрана и личного вкуса, и единственно правильной настройки не существует. Разобраться, что делает каждый рычаг и как подобрать их под свой монитор, стоит каждому, кого не устраивает отображение текста из коробки.
Что такое хинтинг и зачем он нужен
Хинтинг это процесс подгонки очертаний буквы под сетку пикселей экрана. Очертания шрифта заданы гладкими кривыми, но экран состоит из дискретных пикселей, и при малом размере текста кривая буквы редко ложится ровно по пикселям. Хинтинг сдвигает и деформирует очертания так, чтобы ключевые линии буквы совпали с границами пикселей, отчего текст становится резче и чётче, особенно на экранах с невысокой плотностью пикселей.
У хинтинга есть несколько степеней интенсивности, от полного отсутствия до полного хинтинга через промежуточные ступени. Полный хинтинг даёт самую резкую картинку, жёстко сажая буквы на сетку, но ценой искажения их естественных очертаний и нарушения межбуквенных интервалов. Лёгкий хинтинг подгоняет буквы мягче, сохраняя их природную форму и интервалы, и для большинства задач именно он оказывается золотой серединой, давая резкость без уродования букв.
Важная тонкость в том, что роль хинтинга падает с ростом плотности пикселей экрана. На современных мониторах высокого разрешения пиксели настолько мелки, что кривая буквы и так ложится почти ровно, и от подгонки под сетку выигрыш невелик. Поэтому на экранах высокой плотности хинтинг можно ослаблять или отключать вовсе, тогда как на старых экранах с крупными пикселями он по-прежнему важен. Это первое, что стоит учесть: настройка хинтинга зависит от того, какой у вас экран.
Что такое субпиксельное сглаживание и когда оно уместно
Субпиксельное сглаживание это более хитрый приём, опирающийся на устройство самого экрана. Каждый пиксель жидкокристаллического монитора на самом деле состоит из трёх цветных составляющих, красной, зелёной и синей, расположенных рядом. Субпиксельное сглаживание управляет этими составляющими по отдельности, фактически утраивая горизонтальное разрешение для отрисовки краёв букв и делая текст заметно глаже.
Чтобы этот приём работал верно, система должна знать порядок расположения цветных составляющих в пикселе вашего монитора. У большинства современных мониторов это привычный порядок красный-зелёный-синий, но встречается и обратный. Если задать неверный порядок, текст вместо сглаживания получит цветную бахрому по краям букв, что выглядит хуже, чем вообще без сглаживания. Поэтому перед включением субпиксельного сглаживания порядок составляющих стоит проверить специальными тестовыми картинками.
Есть и важное ограничение. Субпиксельное сглаживание рассчитано на жидкокристаллические экраны с привычной структурой пикселя. На экранах с необычным расположением составляющих, какие встречаются у некоторых телевизоров, светящихся панелей и мобильных дисплеев, этот приём работает плохо или вовсе вредит. Для таких экранов лучше отказаться от субпиксельного сглаживания в пользу обычного серого сглаживания, которое не зависит от структуры пикселя. То есть субпиксельное сглаживание это инструмент именно для типичных настольных мониторов, а не универсальное благо.
Как настроить отрисовку шрифтов в конфигурации
Настройки отрисовки задают в конфигурационном файле библиотеки доступа к шрифтам, который лежит в домашнем каталоге пользователя. Базовая настройка включает сглаживание, задаёт степень хинтинга и порядок цветных составляющих с фильтром субпиксельного сглаживания.
<?xml version="1.0"?>
<!DOCTYPE fontconfig SYSTEM "fonts.dtd">
<fontconfig>
<match target="font">
<edit name="antialias" mode="assign"><bool>true</bool></edit>
<edit name="hinting" mode="assign"><bool>true</bool></edit>
<edit name="hintstyle" mode="assign"><const>hintslight</const></edit>
<edit name="rgba" mode="assign"><const>rgb</const></edit>
<edit name="lcdfilter" mode="assign"><const>lcddefault</const></edit>
</match>
</fontconfig>
Эта настройка включает сглаживание, задаёт лёгкий хинтинг как разумную середину, указывает привычный порядок цветных составляющих и включает стандартный фильтр субпиксельного сглаживания. Файл сохраняют по стандартному пути конфигурации шрифтов в домашнем каталоге, после чего настройки подхватываются новыми запускаемыми программами.
Проверить, какие настройки реально применяются к конкретному шрифту, помогает служебная утилита сопоставления шрифтов. Она показывает, какой шрифт и с какими параметрами выберет система по заданному запросу.
fc-match -v "sans-serif" | grep -E "hint|rgba|antialias"
Эта команда выводит фактические параметры отрисовки для шрифта без засечек, и по ней видно, применились ли заданные настройки. Если значения не совпадают с ожидаемыми, значит, какая-то программа или окружение переопределяет их поверх конфигурации, и причину ищут уже там. Это важный диагностический шаг, потому что разные источники настроек порой конфликтуют.
Почему один и тот же конфиг даёт разный результат у разных людей
Здесь кроется главная причина бесконечных споров о настройке шрифтов. Совет, который у одного человека сделал текст идеальным, у другого может всё испортить, и это не потому, что кто-то ошибся. Результат отрисовки зависит от множества обстоятельств: модели и плотности монитора, порядка цветных составляющих, версий установленных библиотек, конкретных шрифтов и даже остроты зрения и личных предпочтений смотрящего.
Конфигурация, вылизанная под старый экран с крупными пикселями и полным хинтингом, на современном мониторе высокого разрешения даст переконтрастный, неестественный текст. Субпиксельное сглаживание, идеальное на типичном мониторе, испортит картинку на экране с необычной структурой пикселя. Поэтому слепо копировать чужой конфиг, расхваленный на форумах, бессмысленно, ведь он подобран под чужое железо и чужой глаз.
Отсюда вытекает единственно верный подход: настройку подбирают под себя экспериментально, а не берут готовую. Начинают с разумной базы вроде лёгкого хинтинга и стандартного субпиксельного сглаживания, смотрят на результат на своём экране и подкручивают степень хинтинга и параметры сглаживания, пока текст не станет приятным именно вам. Несколько итераций с перезапуском программ для применения изменений обычно приводят к удачному сочетанию. Это не наука с единственным ответом, а подгонка под конкретные глаза и конкретный монитор.
Откуда берутся шрифты и как добавить недостающие
Настройка отрисовки бессмысленна, если самих качественных шрифтов в системе мало, а такое бывает на минимальных установках. Библиотека доступа к шрифтам ищет их в нескольких стандартных местах: в общесистемном каталоге шрифтов и в личном каталоге пользователя. Всё, что лежит в этих местах, библиотека находит и делает доступным программам, рекурсивно обходя вложенные папки.
Чтобы добавить свой шрифт, его файлы кладут в личный каталог шрифтов пользователя и обновляют кэш, после чего шрифт становится виден всем программам.
mkdir -p ~/.local/share/fonts
fc-cache -fv
Первая команда создаёт личный каталог шрифтов, если его не было, куда затем копируют файлы шрифтов, а вторая перестраивает кэш библиотеки, заставляя её заметить новинки. После этого новый шрифт появляется в списке доступных и его можно выбирать в программах. Посмотреть весь список установленных шрифтов помогает отдельная команда перечисления.
fc-list | cut -d: -f2 | sort -u
Эта команда выводит имена всех известных системе шрифтов без лишних подробностей, и по ней видно, чего не хватает. Если в системе скудный выбор, стоит доустановить качественные наборы шрифтов из репозитория дистрибутива, включая шрифты с хорошими встроенными инструкциями хинтинга, которые отрисовываются заметно лучше. Качество встроенных в шрифт инструкций сильно влияет на итоговую резкость, и хорошие шрифты выигрывают ещё до всякой настройки.
Чем различаются шрифты с засечками и без них в отрисовке
Полезно понимать, что разные типы шрифтов по-разному отзываются на настройки отрисовки. Шрифты без засечек с их простыми ровными штрихами обычно отрисовываются чисто при любом разумном хинтинге и выглядят опрятно даже на скромных экранах. Шрифты с засечками, у которых тонкие декоративные штрихи и переменная толщина линий, капризнее: на низком разрешении их тонкие элементы рискуют потеряться или огрубеть при жёстком хинтинге.
Моноширинные шрифты, которыми набирают код, заслуживают отдельного внимания, потому что на них смотрят часами. Для них особенно важна чёткость и ровность, и многие подбирают для редактора кода отдельный моноширинный шрифт с хорошим хинтингом, отличный от шрифта интерфейса. Библиотека доступа к шрифтам позволяет задавать разные настройки для разных семейств, так что моноширинному шрифту можно назначить свою степень хинтинга, отличную от остального текста.
Это подводит к мысли, что единая настройка на все шрифты не всегда оптимальна. Тонкая подгонка может задавать одному семейству один хинтинг, другому другой, добиваясь лучшего вида для каждого типа текста. Но усложнять настройку стоит лишь тогда, когда базовая уже не устраивает, ведь для большинства разумной общей настройки с лёгким хинтингом вполне достаточно, а возня с правилами под каждое семейство оправдана лишь у требовательных к виду текста людей.
Краткий ориентир по настройке
Чтобы подбор не превращался в хаос, удобно держаться короткого перечня принципов:
- Начинать с разумной базы: включённое сглаживание, лёгкий хинтинг, стандартное субпиксельное сглаживание;
- На мониторе высокого разрешения ослаблять или отключать хинтинг, ведь там он почти не нужен;
- Проверять порядок цветных составляющих пикселя перед включением субпиксельного сглаживания;
- На экранах с необычной структурой пикселя отказаться от субпиксельного сглаживания в пользу серого;
- Подбирать настройки экспериментально под свой экран и глаз, а не копировать чужие готовые конфиги.
Стоит держать в уме, что окружения рабочего стола часто имеют собственные графические настройки шрифтов, которые накладываются поверх конфигурации библиотеки или даже переопределяют её. Поэтому при настройке через файл стоит проверить, не спорит ли с ним диалог настроек окружения, иначе можно долго править файл, не понимая, почему ничего не меняется. Согласованность этих двух источников избавляет от мучительной путаницы.
Что в итоге запомнить
Качество отображения текста в Linux определяется настройками библиотеки доступа к шрифтам и связанной с ней библиотеки рендеринга, а не самими шрифтами. Два главных рычага это хинтинг, подгоняющий буквы под пиксельную сетку ради резкости, и субпиксельное сглаживание, утраивающее горизонтальное разрешение за счёт цветных составляющих пикселя. Лёгкий хинтинг обычно лучшая середина, а субпиксельное сглаживание уместно на типичных мониторах при верно заданном порядке составляющих.
Главное, что стоит усвоить, это зависимость результата от железа и глаза: роль хинтинга падает с ростом плотности экрана, субпиксельное сглаживание подходит не всякому дисплею, а чужой расхваленный конфиг подобран под чужие условия. Поэтому настройку подбирают экспериментально под свой монитор, начиная с разумной базы и подкручивая параметры, пока текст не станет приятным именно вам. А чтобы правки срабатывали, следят за согласованностью конфигурации с настройками окружения рабочего стола, способными переопределять её поверх.