LINUX.ORG.RU

Как изменить параметры отображения шрифта без изменения fonts.conf?

 , , , ,


0

1

Всех приветствую.

Вопрос следующий.

Дано: некие глобальные настройки Xft (продублированные в fonts.conf):

$ xrdb -query | grep ^Xft
Xft.rgba:       none
Xft.hinting:    true
Xft.autohint:   false
Xft.hintstyle:  hintfull
Xft.antialias:  true
Xft.lcdfilter:  lcddefault

и настройки, индивидуальные для конкретного шрифта (в fonts.conf):

$ fc-match --verbose ':family=Courier New'  | grep -E '\<(family|antialias)\>'
        family: "Courier New"(s)
        antialias: False(s)
$ fc-match --verbose ':family=Luxi Mono'  | grep -E '\<(family|antialias)\>'
        family: "Luxi Mono"(s)
        antialias: True(w)
$ fc-match --verbose ':family=Terminus'  | grep -E '\<(family|antialias)\>'
        family: "Terminus"(s)
        antialias: True(w)
$ fc-match --verbose ':family=DejaVu Sans Mono'  | grep -E '\<(family|antialias)\>'
        family: "DejaVu Sans Mono"(s)
        antialias: True(w)

Т. е. вот здесь видно, что Courier New будет по умолчанию отрисован без AA, а все остальные кандидаты — как раз с AA.

И вот теперь я хочу, например, пресловутый Courier New отрисовать со включённым AA, но только в конкретном приложении, без изменения конфигурационных файлов:

$ xterm -fa 'Courier New:size=12:antialias=true:rgba=rgb'
$ rxvt -fn 'xft:Courier New:size=12:antialias=true:rgba=rgb'
$ stterm -f 'Courier New:size=24:antialias=true:rgba=rgb'

И нихрена — шрифт всё равно выглядит aliased, если только я не поменяю fonts.conf.

ЧЯДНТ?

То, чего я хочу, вообще возможно?

★★★★★
Ответ на: комментарий от r3lgar

Да. Не влияет.

С моей т. з. это не должно быть принципиально — удаление ~/.cache/fontconfig имеет смысл, если я поменял fonts.conf, а я как раз хочу, не меняя настроек, переопределить вид шрифта из командной строки.

Ну, т. е., удаление кэша перед каждым запуском, скажем, терминала, — это, по меньшей мере, лишено смысла.

Bass ★★★★★
() автор топика
Последнее исправление: Bass (всего исправлений: 2)
Ответ на: комментарий от Zubok

$ cat /etc/fonts/conf.d/60-monotype.conf

<?xml version="1.0"?>
<!DOCTYPE fontconfig SYSTEM "fonts.dtd">
<fontconfig>
        <alias binding="same">
                <family>serif</family>
                <accept>
                        <family>Times New Roman</family>
                </accept>
                <prefer>
                        <family>Times New Roman</family>
                </prefer>
        </alias>

        <alias binding="same">
                <family>times</family>
                <accept>
                        <family>Times New Roman</family>
                </accept>
                <prefer>
                        <family>Times New Roman</family>
                </prefer>
        </alias>

        <alias binding="same">
                <family>sans</family>
                <accept>
                        <family>Arial</family>
                </accept>
                <prefer>
                        <family>Arial</family>
                </prefer>
        </alias>

        <alias binding="same">
                <family>sansserif</family>
                <accept>
                        <family>Arial</family>
                </accept>
                <prefer>
                        <family>Arial</family>
                </prefer>
        </alias>

        <alias binding="same">
                <family>sans-serif</family>
                <accept>
                        <family>Arial</family>
                </accept>
                <prefer>
                        <family>Arial</family>
                </prefer>
        </alias>

        <alias binding="same">
                <family>monospace</family>
                <accept>
                        <family>Courier New</family>
                </accept>
                <prefer>
                        <family>Courier New</family>
                </prefer>
        </alias>

        <alias binding="same">
                <family>monospaced</family>
                <accept>
                        <family>Courier New</family>
                </accept>
                <prefer>
                        <family>Courier New</family>
                </prefer>
        </alias>

        <match target="font">
                <test name="family" qual="any" compare="eq">
                        <string>Arial</string>
                </test>
                <edit name="antialias" mode="assign" binding="strong">
                        <bool>false</bool>
                </edit>
                <edit name="hinting" mode="assign" binding="strong">
                        <bool>true</bool>
                </edit>
                <edit name="autohint" mode="assign" binding="strong">
                        <bool>false</bool>
                </edit>
                <edit name="hintstyle" mode="assign" binding="strong">
                        <const>hintfull</const>
                </edit>
        </match>

        <match target="font">
                <test name="family" qual="any" compare="eq">
                        <string>Courier New</string>
                </test>
                <edit name="antialias" mode="assign" binding="strong">
                        <bool>false</bool>
                </edit>
                <edit name="hinting" mode="assign" binding="strong">
                        <bool>true</bool>
                </edit>
                <edit name="autohint" mode="assign" binding="strong">
                        <bool>false</bool>
                </edit>
                <edit name="hintstyle" mode="assign" binding="strong">
                        <const>hintfull</const>
                </edit>
        </match>

        <match target="font">
                <test name="family" qual="any" compare="eq">
                        <string>Times New Roman</string>
                </test>
                <edit name="antialias" mode="assign" binding="strong">
                        <bool>false</bool>
                </edit>
                <edit name="hinting" mode="assign" binding="strong">
                        <bool>true</bool>
                </edit>
                <edit name="autohint" mode="assign" binding="strong">
                        <bool>false</bool>
                </edit>
                <edit name="hintstyle" mode="assign" binding="strong">
                        <const>hintfull</const>
                </edit>
        </match>
</fontconfig>

$ cat ~/.fonts.conf

<?xml version="1.0"?>
<!DOCTYPE fontconfig SYSTEM "fonts.dtd">
<fontconfig>
 <match target="font">
  <edit mode="assign" name="rgba" >
   <const>none</const>
  </edit>
  <edit mode="assign" name="hinting" >
   <bool>true</bool>
  </edit>
  <edit name="autohint" mode="assign">
   <bool>false</bool>
  </edit>
  <edit mode="assign" name="hintstyle" >
   <const>hintfull</const>
  </edit>
  <edit mode="assign" name="antialias" >
   <bool>true</bool>
  </edit>
  <edit name="lcdfilter" mode="assign">
   <const>lcddefault</const>
  </edit>
 </match>
</fontconfig>
Bass ★★★★★
() автор топика
Ответ на: комментарий от Bass

удаление ~/.cache/fontconfig имеет смысл, если я поменял fonts.conf

Или убрал/добавил файлов шрифтов.

Можно, конечно, кэш вручную перегенерировать, но я так не делал уже очень давно.

Ну, т. е., удаление кэша перед каждым запуском, скажем, терминала, — это, по меньшей мере, лишено смысла.

Не перед каждым запуском, а после изменения файлов шрифтов (у меня так недавно Terminus слетел, хотя в системе он был, но его приложения упорно отказывались видеть).

r3lgar ★★★★★
()

Такой вариант, в теории, должен сработать: копируешь шрифт, меняешь название (придется поставить fontforge или что-то подобное), прописываешь правило для влючения АА на новом шрифте.

monday
()
Ответ на: комментарий от monday

Не, ну это как-то слишком радикально. :)

Zubok ★★★★★
()
Ответ на: комментарий от Bass

Глянул я твои правила и призадумался. Потому что то, что идет у тебя в строчке терминалов в виде шаблона для шрифтов — это не правило, а *запрос*, по которому fontconfig ищет наиболее подходящий вариант, а вот поле поиска определяются правилами. И по всему комплексу правил находит наиболее подходящий.

Ближайший — это рисовать Courier New, но только без AA, так как такой способ задан правилом. Если правила нет и поле antialias пустое, то можно и так и сяк рисовать, но у тебя задано. Вот как выглядит без правил (нет поля antialias):

$ fc-match --verbose ':family=Courier New'  | grep -E '\<(family|antialias)\>'
        family: "Courier New"(s)

И вот в этом случае работает запрос ...:antialias=true/false. Пока я вижу как единственный вариант в случае твоих правил сделать исключение для конкретных приложений. Например, для xterm. Добавь к своим правилам то, что ниже, и просто проси Courier New без свойства antialias.

  <match target="font">
<!--     Это можно добавить опционально, чтобы только для Courier New -->
<!--     <test name="family" compare="eq"> -->
<!--       <string>Courier New</string> -->
<!--     </test> -->
    <test name="prgname" compare="eq">
      <string>xterm</string>
    </test>
    <edit name="antialias" mode="assign">
      <bool>true</bool>
    </edit>
  </match>

Тестируем: rxvt -fn "xft:Courier New рисует без AA, а xterm -fa "Courier New" рисует в AA. Вроде как и должно быть.

В теме fontconfig я могу плавать, потому что настравивал его ну так редко, что даже не помню, что я там делал. :) Надо еще подумать. Вполне может быть, что xterm и все эти терминалы просто не научены это свойство менять самостоятельно, а просто отдают все на откуп fontconfig.

Zubok ★★★★★
()
Последнее исправление: Zubok (всего исправлений: 2)
Ответ на: комментарий от Zubok

Вполне может быть, что xterm и все эти терминалы просто не научены это свойство менять самостоятельно, а просто отдают все на откуп fontconfig.

С одной стороны:

Fontconfig contains two essential modules, the configuration module which builds an internal configuration from XML files and the matching module which accepts font patterns and returns the nearest matching font.

С другой стороны:

Font configuration is separate from font matching; applications needing to do their own matching can access the available fonts from the library and perform private matching. The intent is to permit applications to pick and choose appropriate functionality from the library instead of forcing them to choose between this library and a private configuration mechanism. The hope is that this will ensure that configuration of fonts for all applications can be centralized in one place. Centralizing font configuration will simplify and regularize font installation and customization.

То есть если надо обойти работу matching, то приложения могут сами лезть к фонтам, что все эти терминалы вряд ли делают. Все они обращаются к стандартному механизму.

Zubok ★★★★★
()
Последнее исправление: Zubok (всего исправлений: 1)
Ответ на: комментарий от Zubok

Евгений, спасибо! Как всегда, исчерпывающе.

P.S. Также спасибо всем, кто откликнулся.

Bass ★★★★★
() автор топика
Ответ на: комментарий от Bass

Еще вариант, но чисто гипотетический, потому что не знаю, можно ли так вообще сделать. Если вообще есть возможность создать виртуальный фонт «Courier New AA» через правила fontconfig из «Courier New», то терминалам можно просить рисовать им. Но это надо документацию читать, возможно ли такое вообще. Я не уверен, если честно.

Пока только факт, что если поле antialias для фонта, который в итоге находит (подставляет) fontconfig, тем или иным способом задано явно, то попросить рисовать с другим значением нельзя, не получается. Или я что-то упускаю из виду. Эксперименты показывают, что не получается. Я и weak делал и strong — ему пофиг.

Zubok ★★★★★
()
Ответ на: комментарий от Bass

Еще одно наблюдение. Можно в свойство antialias в fontconfig добавить несколько значений списком. Вот так:

  <match target="font">
    <test name="family" compare="eq">
      <string>Courier New</string>
    </test>
    <edit name="antialias" mode="append">
      <bool>true</bool>
    </edit>
    <edit name="antialias" mode="append">
      <bool>false</bool>
    </edit>
  </match>

В этом случае параметр antialias в строчке запроса у xterm начинает действовать, так как оба значения допускаются правилами. Однако все равно пока мимо, потому что порядок следования никак не действует на умолчание. Хоть оно «True(w), False(w)», хоть оно «False(w), True(w)» — без указания antialias всегда выбирается сглаживание. Ответ на вопрос, а можно ли как-то тут приоритет задать между ними, пока не ясен.

Zubok ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.