Про шрифты с продолжением. Часть 7
Управление шрифтами в X Window
X Window System, называемая также просто «Иксы», X или X11 — оконная среда для графических дисплеев. На момент написания обзора последней ее версией была X11R8.0 от апреля 2010 года. Начало X было положено в Массачусетсском технологическом институте (MIT) в 1984 году. X была реализована как часть проекта «Афина» (Project Atthena), предоставлявшего вычислительную среду, функционирующую на разнотипном оборудовании. В Xсреде за вывод информации отвечает сервер экрана (display server), а логику приложения предоставляют клиенты. Взаимодействие между ними является прозрачным для сети, поэтому сервер и клиент могут работать на разных машинах. Следует отметить, что термины «клиент» и «сервер» несколько отличаются от обыденного представления. Помимо вывода информации сервер обрабатывает ввод информации от различных устройств, таких как клавиатура, мышь, графический планшет и сенсорный экран.
Xсреда предоставляет набор средств для приложений с графическим интерфейсом, но не определяет конкретный интерфейс пользователя. В Linux обычно можно выбирать между графическими оболочками KDE и GNOME, а также между несколькими другими оконными менеджерами. Поскольку X не определяет интерфейс пользователя, то эти среды и оконные менеджеры выглядят поразному.
X разрабатывалась для большого сообщества пользователей, имеющих различные типы оборудования, поэтому разные версии Xклиентов и серверов обычно неплохо взаимодействуют между собой.
Долгие годы за работу со шрифтами отвечала встроенная система шрифтов X11 (core X11 fonts system). Последние версии Xсерверов XFree86 (и X.Org) включают систему шрифтов Xft («X FreeType» library). Встроенная система шрифтов первоначально поддерживала монохромные растровые шрифты, но со временем была усовершенствована. Система Xft была разработана с учетом современных требований, включая сглаживание и субпиксельное растрирование (subpixel rasterization) и позволяет приложениям иметь всесторонний контроль над рендерингом глифов. Основное различие между этими двумя системами шрифтов состоит в том, что встроенная система работает на сервере, а Xftшрифты обрабатываются клиентами, которые отсылают необходимые глифы серверу.
X первоначально использовала шрифты Type 1 (или Adobe Type 1) — формат описания шрифтов, разработанный в компании Adobe. Система Xft может работать с ними наряду со шрифтами OpenType, TrueType, Speedo и CID.
Сервер шрифтов xfs
Со встроенной системой шрифтов X11 X Server получает шрифты и информацию о них от сервера шрифтов. Сервер шрифтов xfs обычно запускается как демон (англ. daemon — в системах класса UNIX — служба, работающая в фоновом режиме без прямого общения с пользователем) при старте системы, хотя возможно запустить его как обычную задачу. Как правило, вы будете устанавливать сервер шрифтов в ходе установки X. Тем не менее, поскольку X является сетевым протоколом, имеется возможность получать шрифты и информацию о них через сеть, а не с локальной машины.
Xсервер шрифтов обычно использует конфигурационный файл /usr/X11R6/lib/X11/fs/config. Пример файла конфигурации шрифтов показан в листинге 1. Конфигурационный файл также может быть расположен в или связан с /etc/X11/fs.
Листинг 1. Пример /usr/X11R6/lib/X11/fs/config
# allow a max of 10 clients to connect to this font server
clientlimit = 10
# when a font server reaches its limit, start up a new one
cloneself = on
# alternate font servers for clients to use
#alternateservers = foo:7101,bar:7102
# where to look for fonts
#
catalogue = /usr/X11R6/lib/X11/fonts/misc:unscaled,
/usr/X11R6/lib/X11/fonts/75dpi:unscaled,
/usr/X11R6/lib/X11/fonts/100dpi:unscaled,
/usr/X11R6/lib/X11/fonts/misc,
/usr/X11R6/lib/X11/fonts/Type1,
/usr/X11R6/lib/X11/fonts/Speedo,
/usr/X11R6/lib/X11/fonts/cyrillic,
/usr/X11R6/lib/X11/fonts/TTF,
/usr/share/fonts/default/Type1
# in 12 points, decipoints
defaultpointsize = 120
# 100 x 100 and 75 x 75
defaultresolutions = 75,75,100,100
# how to log errors
usesyslog = on
# don’t listen to TCP ports by default for security reasons
nolisten = tcp
Если внимательно вчитаться, то всё становится понятно без особого напряжения. Этот пример типичен для установки Linux на рабочую станцию, где сервер шрифтов не предоставляет шрифты по TCPсоединениям (nolisten = tcp).
Библиотека Xft
Библиотека Xft предоставляет функции, позволяющие клиентским приложениям выбирать шрифты по заданному образцу и генерировать глифы для отправки их на сервер. Образцы учитывают семейство шрифтов (Helvetica, Times и т.д.), кегль, начертание и множество других характеристик. В то время как встроенная система шрифтов позволяет клиенту найти лишь первый подходящий шрифт на сервере, Xft находит лучший шрифт по всем критериям и затем отсылает информацию о глифах на сервер. Xft взаимодействует с FreeType для создания картинки из глифа и с расширением RENDER сервера X, ускоряющим процесс рендеринга. Xft входит в состав текущих версий как XFree86, так и X.Org.
Примечание. Если ваш Xсервер работает через сеть и используется видеокарта, не поддерживающая расширение RENDER, то производительность сети в данной ситуации может создать проблемы и вы можете захотеть отключить сглаживание. Вы можете использовать команду xdpyinfo для просмотра информации о вашем Xсервере. Листинг 4 содержит часть информации, выводимой xdpyinfo. Поскольку объем информации, создаваемой xdpyinfo, велик, можно воспользоваться командой grep для поиска ‘RENDER’.
Листинг 2. Проверка наличия расширения RENDER программой xdpyinfo
[ian@lyrebird ian]$ xdpyinfo
name of display: :0.0
version number: 11.0
vendor string: The XFree86 Project, Inc
vendor release number: 40300000
XFree86 version: 4.3.0
maximum request size: 4194300 bytes
motion buffer size: 256
bitmap unit, bit order, padding: 32, LSBFirst, 32
image byte order: LSBFirst
number of supported pixmap formats: 7
supported pixmap formats:
depth 1, bits_per_pixel 1, scanline_pad 32
depth 4, bits_per_pixel 8, scanline_pad 32
depth 8, bits_per_pixel 8, scanline_pad 32
depth 15, bits_per_pixel 16, scanline_pad 32
depth 16, bits_per_pixel 16, scanline_pad 32
depth 24, bits_per_pixel 32, scanline_pad 32
depth 32, bits_per_pixel 32, scanline_pad 32
keycode range: minimum 8, maximum 255
focus: window 0x2000011, revert to Parent
number of extensions: 30
BIGREQUESTS
DOUBLEBUFFER
DPMS
ExtendedVisualInformation
FontCache
GLX
LBX
MITSCREENSAVER
MITSHM
MITSUNDRYNONSTANDARD
RANDR
RECORD
RENDER
SECURITY
SGIGLX
SHAPE
SYNC
TOGCUP
XResource
XCAPPGROUP
XCMISC
XFree86Bigfont
XFree86DGA
XFree86DRI
XFree86Misc
XFree86VidModeExtension
XInputExtension
XKEYBOARD
XTEST
XVideo
default screen number: 0
number of screens: 1
Примечание. Xft вместо встроенной системы шрифтов X требует внесения изменений в приложения, поэтому вы можете обнаружить, что некоторые приложения не используют преимущества улучшенного рендеринга шрифтов в Xft. На момент написания статьи примерами приложений, применяющих Xft, были Qt (используется в KDE), GTK+ (применяется в GNOME) и Mozilla 1.2.
Установка шрифтов
Существует два метода установки шрифтов: один для Xft и более сложный — для встроенной системы шрифтов X11.
Шрифты для Xft
Xft использует шрифты, расположенные в ряде хорошо известных каталогов шрифтов, а также в подкаталоге
.fonts домашнего каталога пользователя. Хорошо известные каталоги шрифтов включают подкаталоги /usr/X11R6/lib/X11/lib/fonts, как перечислено в разделе каталогов в /usr/X11R6/lib/X11/fs/config. Другие каталоги шрифтов могут быть заданы в разделе FontPath файлов XF86Config или xorg.conf (в зависимости от используемого вами Xсервера).
Модули работы со шрифтами X-сервера
Модуль |
Описание |
bitmap |
Растровые шрифты (BDF, PCF, SNF) |
freetype |
TrueType (TTF, TTC), OpenType (OTF, OTC) и Type 1 (PFA, PFB) |
type1 |
Альтернативная поддержка шрифтов Type 1 |
xtt |
Альтернативный модуль TrueType (TTF, TTC) |
speedo |
Шрифты Speedo(SPD) |
Просто скопируйте ваши шрифты в пользовательский каталог .fonts или для применения во всей системе — в /usr/local/share/fonts. Сервер шрифтов должен выбрать новые шрифты и сделать их доступными при следующем запуске. Вы можете провести обновление без перезапуска сервера командой fccache.
Текущая технология работы со шрифтами в X использует загружаемые модули для поддержки различных типов шрифтов, как показано в таблице.
Если у вас возникли проблемы с установкой и применением шрифта, то проверьте журнал сервера (например /var/log/XFree86.0.log), чтобы убедиться в том, что соответствующий модуль был загружен. Имена модулей чувствительны к регистру. Для просмотра (и изменения) настроек Xсервера, включая путь к шрифтам, расположение конфигурационных файлов и журналов, вы можете использовать команду xset, как показано в листинге 3.
Листинг 3. Отображение настроек Xсервера командой xset
[ian@lyrebird ian]$ xset display 0:0 q
Keyboard Control:
auto repeat: on key click percent: 0 LED mask: 00000000
auto repeat delay: 500 repeat rate: 30
auto repeating keys: 00ffffffdffffbbf
fadfffffffdfe5ff
ffffffffffffffff
ffffffffffffffff
bell percent: 50 bell pitch: 400 bell duration: 100
Pointer Control:
acceleration: 2/1 threshold: 4
Screen Saver:
prefer blanking: yes allow exposures: yes
timeout: 0 cycle: 0
Colors:
default colormap: 0x20 BlackPixel: 0 WhitePixel: 16777215
Font Path:
/home/ian/.gnome2/share/cursorfonts,unix/:7100,/home/ian/.gnome2/share/fonts
Bug Mode: compatibility mode is disabled
DPMS (Energy Star):
Standby: 7200 Suspend: 7200 Off: 14340
DPMS is Enabled
Monitor is Off
Font cache:
himark (KB): 5120 lowmark (KB): 3840 balance (%): 70
File paths:
Config file: /etc/X11/XF86Config
Modules path: /usr/X11R6/lib/modules
Log file: /var/log/XFree86.0.log
Если вам требуется дополнительный контроль поведения Xft, вы можете использовать либо общесистемный (/etc/fonts/fonts.conf), либо пользовательский (.fonts.conf в домашнем каталоге пользователя) конфигурационный файл. Кроме того, вы можете включить или отключить сглаживание и управлять субпиксельным рендерингом (применяется на ЖКдисплеях). Это XMLфайлы. Поэтому вы должны убедиться в том, что после редактирования они остались корректными. За дополнительной информацией о содержании и формате этих файлов обратитесь к интерактивной справке.
Встроенные шрифты X11
Перед установкой шрифтов в формате Bitmap Distribution Format (BDF; двоичный формат распространения) желательно преобразовать их в Portable Compiled Format (PCF, переносимый скомпилированный формат) и сжать, используя gzip. После этого вы можете скопировать новые шрифты в каталог, например /usr/local/share/fonts/bitmap/, и затем выполнить команду mkfontdir для создания каталога шрифтов, который будет применяться сервером. Эти шаги показаны в листинге 4.
Листинг 4. Установка растровых шрифтов
[root@lyrebird root]# bdftopcf courier12.bdf o courier12.pcf
[root@lyrebird root]# gzip courier12.pcf
[root@lyrebird root]# mkdir p /usr/local/share/fonts/bitmap
[root@lyrebird root]# cp *.pcf.gz /usr/local/share/fonts/bitmap/
[root@lyrebird root]# mkfontdir /usr/local/share/fonts/bitmap/
[root@lyrebird root]# ls /usr/local/share/fonts/bitmap/
courier12.pcf.gz fonts.dir
Обратите внимание на то, что команда mkfontdir создает файл fonts.dir.
Для установки масштабируемых шрифтов типа TrueType или Type1 требуется дополнительный шаг. После копирования файлов шрифтов в целевой каталог выполните команду mkfontscale а затем mkfontdir. Команда mkfontscale создаст перечень масштабируемых шрифтов в файле fonts.scale.
Теперь, когда вы задали каталог шрифтов и информацию по их масштабированию, вы должны указать серверу, где искать новые шрифты. Это осуществляется включением нового каталога в путь поиска шрифтов. Вы можете сделать это на временной (используя xset) или постоянной (включением записи FontPath в файл XF86Config или xorg.conf) основе. Для того чтобы добавить новый каталог растрового шрифта в начало списка поиска шрифтов, воспользуйтесь параметром +fp команды xset, как показано в листинге 5.
Листинг 5. Обновление пути поиска шрифтов командой xset
[ian@lyrebird ian]$ xset +fp /usr/local/share/fonts/bitmap/ display 0:0
Хорошей идеей (хотя это здесь не показано) является включение масштабируемых шрифтов перед растровыми, поскольку это приводит к лучшему их подбору. Для добавления каталогов в конец списка используйте параметр fp+. Аналогично параметры fp и fp приводят к удалению каталогов из начала и конца списка соответственно.
Вы можете сделать изменения постоянными, отредактировав XF86Config или xorg.conf. Вы можете добавить столько строк FontPath в раздел Files, сколько необходимо, — как показано в листинге 6.
Листинг 6. Изменение XF86Config или xorg.conf
Section «Files»
# RgbPath is the location of the RGB database. Note, this is the name of the
# file minus the extension (like «.txt» or «.db»). There is normally
# no need to change the default.
# Multiple FontPath entries are allowed (they are concatenated together)
# By default, Red Hat 6.0 and later now use a font server independent of
# the X server to render fonts.
RgbPath «/usr/X11R6/lib/X11/rgb»
FontPath «unix/:7100»
FontPath «/usr/local/share/fonts/bitmap/»
EndSection
[
Информацию о том, что еще вы можете изменить в конфигурационных файлах X, смотрите в интерактивном руководстве по XF86Config или xorg.conf.
Менеджеры шрифтов
Fonty Python
Относительно простой менеджер, позволяющий просматривать, искать в системе, устанавливать и удалять шрифты в форматах TTF, OTF, TTC и Type1. У автора нет личного опыта использования Fonty Python, но, судя по описанию, при установке и удалении шрифтов менеджер оперирует не самими файлами шрифтов, а линками на них.
Окно программы Fonty Python
Fontmatrix
Данный менеджер позволяет просматривать, каталогизировать, подключать, отключать по отдельности, группами или все сразу и собирать всю коллекцию в один файл. Всё это относится к шрифтам в форматах TTF, OTF и Type1.
Надо отметить поиск шрифтов по растровым образцам и метаданным PANOSE. При этом разработчики обещают тесную интеграцию с WhatTheFont для поиска по растровому образцу, потому что своего каталога обычно бывает мало.
Окно программы Fontmatrix
Знатоки наверняка обратят внимание на функцию извлечения подмножества шрифтов из PDF. Суть ее заключается в том, что встроенные в PDF шрифтовые файлы с сохраненным подмножеством используемых глифов могут быть сохранены программой в файлы формата PFB с сохранением информации об авторском праве, а затем импортированы в каталог.
Доступны версии для Linux, Macintosh и Windows.
Font Manager
Программа для просмотра и установки шрифтов в GNOME. Она умеет просматривать установленные шрифты, сравнивать их, устанавливать и удалять, активировать и деактивировать шрифты, искать по ряду параметров и собирать шрифты в коллекции.
Окно программы Font Manager
Конвертирование шрифтов
У технологии TrueType, взятой на вооружение операционными системами серии Windows, нет многих недостатков, присущих работе со шрифтами, стандартными для «Иксов». Кроме того, имеется множество кириллических TrueTypeшрифтов. К счастью, эти шрифты можно использовать и в X Window. Существует TrueTypeсервер шрифтов XFSFT для X. Поддержка TrueType встроена во все современные дистрибутивы XFree86.
Для того чтобы стандартные шрифты отображались в нужной нам кодировке (в данном случае для примера взята кодировка cp1251), в каталоге, где лежат TrueTypeшрифты, необходимо создать два одинаковых файла (fonts.dir и fonts.scale) следующего вида:
timesi.ttf monotypeTimes New Romanmediuminormal—0000p0microsoftcp1251
timesbi.ttf monotypeTimes New Romanboldinormal—0000p0microsoftcp1251
timesbd.ttf monotypeTimes New Romanboldrnormal—0000p0microsoftcp1251
times.ttf monotypeTimes New Romanmediumrnormal—0000p0microsoftcp1251
couri.ttf monotypeCourier Newmediuminormal—0000m0microsoftcp1251
courbi.ttf monotypeCourier Newboldinormal—0000m0microsoftcp1251
courbd.ttf monotypeCourier Newboldrnormal—0000m0microsoftcp1251
cour.ttf monotypeCourier Newmediumrnormal—0000m0microsoftcp1251
ariali.ttf monotypeArialmediuminormal—0000p0microsoftcp1251
arialbi.ttf monotypeArialboldinormal—0000p0microsoftcp1251
arialbd.ttf monotypeArialboldrnormal—0000p0microsoftcp1251
arial.ttf monotypeArialmediumrnormal—0000p0microsoftcp1251
Кроме того, сюда же необходимо положить файл encodings.dir, имеющий строку вида:
microsoftcp1251 /usr/X11R6/lib/X11/fonts/encodings/microsoftcp1251.enc.gz
Если вам нужны эти шрифты в кодировке KOI8R, то вместо microsoftcp1251 следует писать koi8r.
Отметим, что в случае кириллической настройки при необходимости следует использовать опцию перекодировки:
xfstt ... —encoding koi8r,windows1251,iso88591
После этого новые шрифты будут доступны для X Window.
Возможно, найденные вами шрифты окажутся не в той кодировке, которая нужна вам. Для перекодировки BDFшрифтов можно использовать программу trbdf из пакета trscripts. Она поддерживает кодовые страницы ibm855, ibm866, iso88595, koi8c, koi8r, koi8u, maccyrillic, mik, unicode и ecmacyrillic. Символы, отсутствующие в исходной кодировке, аппроксимируются, так что ее можно использовать, например, для генерации шрифтов KOI8U из KOI8R.
Начиная с версии 4.0.3 XFree официально поддерживает кодировку cp1251. Если версия вашей XFree более ранняя, то поддержку cp1251 можно получить тремя способами:
- использовать дистрибутив, поддерживающий cp1251;
- патчить XFree. Патч поддержки cp1251 для XFree 3.3.5 и 4.0 сделан Алексеем Новодворским;
- идеологически неверное решение, но работает везде и легко осуществимо: добавьте в конце файла locale.alias (обычно он находится в каталоге /usr/X11R6/lib/X11/locale) строку вида: be_BY.CP1251 en_US.ISO88591.
Конечно, вместо be_BY.CP1251 здесь можно поставить строку для используемой вами локали.
Если для кириллизации клавиатуры применяется утилита xmodmap, то этим всё и закончится. Если же вы захотите использовать Xkbметод, то в клавиатурной раскладке вместо символических имен нужно указать коды символов согласно cp1251. Например, для белорусской раскладки вместо:
key <AD01> { [ q Q ],
[ Cyrillic_shorti, Cyrillic_SHORTI ] };
нужно применять:
key <AD01> { [ q, Q ],
[ 0xe9, 0xc9 ] };
Примечание. Только версии XFree после 4.0.0 поддерживают KOI8U. Если у вас отсутствует поддержка KOI8U, а вам нужна именно эта кодировка, то вы можете воспользоваться всем вышеописанным, где идет речь о cp1251.
Некоторые из приложений для Linux, такие как Star Office и LaTeX, не поддерживают шрифты TrueType, но поддерживают их в формате Type1. Тут можно выразить только большое сожаление по этому поводу, поскольку Linux с его поддержкой TrueType в ghostscript и наличием фонтсервера для TrueType имеет всю необходимую инфраструктуру для обеспечения возможности работы с TrueTypeфонтами. Итак, одной из утилит по преобразованию шрифтов является ttf2pt1. Суть ее работы состоит в том, чтобы преобразовать шрифты TrueType в формат Type1. Для этого надо лишь запустить утилиту из консоли:
ttf2pt1 b file.ttf name
для одного шрифта или:
for X in *.ttf; do ttf2pt1 b $X ${X%%.ttf}; done
в виде цикла для массива шрифтов.
Также в X Window для конвертирования шрифтов можно воспользоваться шрифтовыми редакторами FontForge и gbdfed. Но подробнее о них мы расскажем в следующих номерах журнала.