Программы
Настраиваем шрифты в xorg (FreeBSD и Linux)

Настраиваем шрифты в xorg (FreeBSD и Linux)

Если выделить главные преимущества Unix-like систем перед Windows, то в первой десятке будет красота шрифтов. Для меня это очень важный пункт, так как за чёткими и аккуратными шрифтами можно и просидеть дольше без покрасневших глаз.

Если выделить главные преимущества Unix-like систем перед Windows, то в первой десятке будет красота шрифтов. Для меня это очень важный пункт, так как за чёткими и аккуратными шрифтами можно и просидеть дольше без покрасневших глаз.

Программирование, чтение руководств и блогов — всё это требует хороших шрифтов.

Но, как и почти всё в Unix, шрифты надо уметь настраивать.

Изображение Шпаргалка по командам Linux, FreeBSD и MacOS

Чем отличается хинтинг от антиалиасинга

Перед тем, как приступить к настройке шрифтов, нужно узнать: а собственно что мы будем настраивать. В Убунте была вкладочка в окне настройки рабочего стола, где можно было потыкаться и на глаз всё настроить. Вы, в принципе, можете и здесь поступить так же, но потратите больше времени, чем на убунте, и не узнаете почти ничего нового. Это не наш метод!

Рекомендую всем прочитать статью в Викиучебнике о шрифтах в Linux. На самом деле, не только в линукс, а во всём, что использует xorg. Например, так я настраивал шрифты в своей FreeBSD.

Параметры рендеринга шрифтов в картинках

Что такое хинты (hints):

По сути, хинты отвечают за чёткость или корявость шрифтов. Есть ещё и механизм автохинтинга (autohint), который работает не то, чтобы совсем плохо, но я его не использую:

Что такое антиалиасинг (anti-aliasing):

По сути это аккуратность или размазанность шрифтов. Вещь полезная — в шрифтах исчезает лесенка.

Субпиксельное сглаживание:

Суть довольно проста: экраны существуют разные, и технологии в них зашиты разные. В большинстве экранов каждой точке соответствует 3 субпиксела: для красного, зелёного и синего. Их комбинация и есть точка, которую мы видим. Но вот как они расположены технологически, в каком порядке?

От этого также зависит отображение шрифтов на экране. В частности, при неправильном выборе конфигурации, появляется радуга.

Ну вот, вроде и всё: все параметры перечислены, осталось только грамотно их задать.

Конфиг ~/.fonts.conf

Конфигурацию отображения шрифтов каждый пользователь может задать себе сам, отредактировав файл ~/.fonts.conf . Там всё довольно понятно:

<?xml version="1.0"?>
<!DOCTYPE fontconfig SYSTEM "fonts.dtd">
<fontconfig>

    <!--
        install ==> print/freetype2
        install ==> x11-fonts/dejavu
        install ==> x11-fonts/webfonts
        install ==> x11-fonts/terminus-font
    -->

    <!-- reject all bitmap fonts, with the exception of 'terminus' -->
    <selectfont>
        <acceptfont>
            <pattern>
                <patelt name="family"> <string>Terminus</string> </patelt>
            </pattern>
        </acceptfont>
        <rejectfont>
            <pattern>
                <patelt name="scalable"> <bool>false</bool> </patelt>
            </pattern>
        </rejectfont>
    </selectfont>

    <!-- preferred aliases -->
    <alias> <family>serif</family>
        <prefer>
            <family>DejaVu Serif</family>
        </prefer>
    </alias>

    <!-- preferred aliases -->
    <alias> <family>sans-serif</family>
        <prefer>
            <family>DejaVu Sans</family>
        </prefer>
    </alias>

    <!-- preferred aliases -->
    <alias> <family>monospace</family>
        <prefer>
            <family>DejaVu Sans Mono</family>
            <family>Terminus</family>
        </prefer>
    </alias>

    <!-- default quality settings -->
    <match target="font">
        <edit mode="assign" name="rgba">      <const>rgb</const>     </edit>
        <edit mode="assign" name="antialias"> <bool>true</bool>       </edit>
        <edit mode="assign" name="autohint">  <bool>none</bool>       </edit>
        <edit mode="assign" name="hinting">   <bool>true</bool>       </edit>
        <edit mode="assign" name="hintstyle"> <const>hintmedium</const> </edit>
    </match>

    <!-- reduce ringing ==> requires freetype2 'WITH_LCD_FILTERING=yes' -->
    <match target="font">
        <edit mode="assign" name="lcdfilter"> <const>lcdlight</const> </edit>
    </match>

    <!-- disable autohinting for bold fonts -->
    <match target="font">
        <test compare="more" name="weight">   <const>medium</const> </test>
        <edit mode="assign"  name="autohint"> <bool>false</bool>    </edit>
    </match>

    <!-- disable autohinting for fonts that don't need it -->
    <match target="pattern" name="family">
        <test qual="any" name="family">
          <string>Andale Mono</string>
          <string>Arial</string>
          <string>Arial Black</string>
          <string>Comic Sans MS</string>
          <string>Courier New</string>
          <string>Georgia</string>
          <string>Impact</string>
          <string>Trebuchet MS</string>
          <string>Tahoma</string>
          <string>Times New Roman</string>
          <string>Verdana</string>
          <string>Webdings</string>
       </test>
       <edit mode="assign" name="hinting">  <bool>true</bool>  </edit>
       <edit mode="assign" name="autohint"> <bool>false</bool> </edit>
    </match>

</fontconfig>

Собственно, что тут происходит:

  • Во-первых, надо поставить пакеты, указанные в первом комментарии (здесь написаны относительные пути во FreeBSD-шных портах).
  • Настройка отображения шрифта Terminus — его я обычно использую в терминале.
  • Устанавливаю соответствие шрифтов по-умолчанию шрифтам из семейства DejaVu (вполне неплохие шрифты, советую).

И вот как раз то место, что мы подробно обсуждали выше:

<match target="font">
    <edit mode="assign" name="rgba">     <const>rgb</const>       </edit>
    <edit mode="assign" name="antialias"><bool>true</bool>        </edit>
    <edit mode="assign" name="autohint"> <bool>none</bool>        </edit>
    <edit mode="assign" name="hinting">  <bool>true</bool>        </edit>
    <edit mode="assign" name="hintstyle"><const>hintmedium</const></edit>
</match>

Здесь:

  • rgba это выбор типа отображения субпикселов на Вашем экране. Доступные константы: unknown, rgb, bgr, vrgb, vbgr, none;
  • antialias включаем или нет сглаживание шрифтов (true или none);
  • autohint авто-исправление шрифтов. Значение опять же булевое, поэтому варианты те же: true и none;
  • hinting включаем исправление растеризованного и масштабированного глифа или нет (true и none);
  • hintstyle тип хинтинга. Возможные варианты: hintnone, hintslight, hintmedium, hintfull — по возрастанию степени хинтинга.

Ну и ещё настраиваем отображение жирных шрифтов и отключаем автохинтинг для шрифтов, которые в этом не нуждаются. Это можно было и не писать — автохинтинг мы всё равно отключили. Но пусть будет, подумал я: а вдруг кому пригодится.

Всё, теперь после перезагрузки иксов ваши шрифты будут мягкими и шелковистыми!

Настройка шрифтов в Gtk приложениях

Раз уж зашёл разговор о шрифтах, бонусом ещё опишу настройку их для gtk приложений (gtk2 — до сих пор на нём сижу :-p). Для того, чтобы в gtk программах использовались правильные шрифты, нужно в файле .gtkrc.mine прописать определение этих правильных шрифтов:

style "user-font"
{
    font_name = "DejaVu Sans 9"
}
widget_class "*" style "user-font"
gtk-font-name = "DejaVu Sans 9"

Как я уже говорил, мне нравятся шрифты DejaVu их и написал. А 9-ый кегль смотрится довольно неплохо на моём мониторе.

Надеюсь, данная заметка помогла лучше понять галочки в Убунте, или даже сберегла пару глаз!