О блоге

Все новые материалы размещаются на Блогосайте alv.me. Старые - в процессе переноса.

02.08.2008

Оконная система X и шрифты

Citkit, 7 июля 2005 г

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

С другой стороны, жить стало веселей - потому что появилось большое количество новых шрифтов, причём совершенно свободных. И необходимости извращаться с cabextract'ом на предмет легального получения шрифтов от MS или тянуть их с базарных дисков больше нет.

Тем не менее, при переразмещении статья оставлена почти в неизменном виде - базовые понятия о растровых и векторных шрифтах, схема описания шрифтов в Иксах и многое другое осталось неизменным. А всё, что появилось нового, станет предметом отдельной заметки.

Существует две формы представления шрифтов на экране - растровая и векторная. В первой форме изображение символа формируется из описания составляющих его точек в виде матрицы пикселей, во второй же - описывается уравнениями специальных кривых, именуемых кривыми Безье. Разумеется, и векторные шрифты выводятся на экран попиксельно - ведь компьютерные дисплеи суть устройства растровые по своей природе. Однако векторная форма представления символов а) позволяет получать более "гладкие" изображения на мониторах с высоким разрешением, и б) добиваться более качественного вывода на печать (ведь разрешение самого плохого принтера минимум на пол-порядка выше, чем самого лучшего монитора с крутейшей видеокартой).

Очевидно, что растровые шрифты единственно пригодны для применения в чисто текстовом режиме. Теоретически в графической (через Frame Buffer) консоли можно было бы воспроизводить и векторные шрифты, но практически это нигде и никем не реализовано. Да и вообще тема консольных шрифтов будет рассмотрена в специальной заметке. А вот в Иксах могут быть использованы как растровые, так и векторные шрифты, причем последние - во многих форматах.

Для растровых шрифтов в Иксах обычно применяется формат PCF (Portable Compiled Font). Эти шрифты по своей природе почти немасштабируемы - как и консольные шрифты для текстового режима. Конечно, в графическом режиме символ, образованный матрицей точек, можно в принципе растянуть (или сжать) по вертикали и горизонтали как угодно - но вид его при этом будет варьировать от среднепаршивого до вполне отвратительного. И потому каждая PCF-гарнитура содержит файлы шрифтов с несколькими матрицами точек - собственно, число матриц конкретного шрифта и определяет возможности его масштабирования. Но - не только: наборы растровых шрифтов предназначены для совершенно конкретных разрешений, как правило - 75 и 100 dpi (dot per inch, то есть точек на дюйм - здесь термин разрешение используется в квази-типографском смысле, а не в контексте видеосистемы). Первые используются при экранных (то есть пиксельных) разрешениях вплоть до 800x600, вторые - от 1024x768 и выше.

Важно, что в гарнитурных наборах для растровых шрифтов мы, как правило, не найдем отдельных файлов для шрифтоначертаний. Правда, как мы позже увидим, в большинстве случаев таким шрифтам можно придать полужирное или курсивное начертание, но делается это средствами X-сервера, а не на основе описания собственно шрифтового файла. Соответственно, и результат получается не блестящим...

В Иксах находят себе применение как моноширинные, так и пропорциональные гарнитуры растровой формы воспроизведения. Первые используются главным образом в терминальных окнах, вторые же - для элементов интерфейса, а также вывода текстов в большинстве прикладных программ.

Штатная поставка Иксов в обязательном порядке включает в себя два шрифтовых набора растровых шрифтов общего назначения - с разрешениями 75dpi и 100dpi: именно под такими именами фигурируют содержащие их подкаталоги в сводном шрифтовом каталоге /usr/X11R6/lib/X11/fonts/. Ни тот, ни другой набор (а в их составе гарнитуры Courier, Helvetica, Times и несколько специальных) символов кириллицы не содержат ни в какой кодировке ее.

Впрочем, дискриминация русскоязычных (и кириллически-ориентированных) пользователей не столь уж выражена: испокон веку в комплекте Иксов есть и набор "нашинских" растровых шрифтов производства фирмы Cronyx, включающий гарнитуры Courier, Fixed (моноширинные), Times и Helvetica (моноширинные) - правда, только для кодировки KOI8-R. Качество их не то чтобы очень высокое, но на первое время сойдет.

Столь же обязательно наличие в комплекте Иксов так называемых misc-шрифтов, которые располагаются в каталоге /usr/X11R6/lib/X11/fonts/misc. Это - чисто моноширинные шрифты единственной гарнитуры (Fixed), которая включает набор шрифтовых файлов с разными матрицами (4x6, 5x7, 6x8 и так далее, вплоть до 10x20) и для разных наборов символов: в числе их, наряду со всеми кодировками ISO8859 (включая ISO8859-5 - ранее это называлось кодировкой ГОСТ для кириллицы), присутствует и KOI8-R. Шрифты misc-fixed предназначены в основном для терминалов, но могут использоваться и в приложениях (например, в текстовых редакторах).

В отечественные дистрибутивы Linux, а также в порты FreeBSD, включены дополнительные растровые шрифты с поддержкой кириллицы. Это - шрифты, выполненные Дмитрием Болховитяновым, собравшим их в виде пакета под именем cyr-rxf. Пакет этот включает, кроме стандартных гарнитур Times, Helvetica, Courier, дополнительные пропорциональные гарнитуры Lucida и Serene и моноширинные - Lucida Typewriter и Serene Typewriter, и существует ныне для всех кодировок Великого и Могучего. Не смотря на то, что все эти шрифты рассчитаны на разрешение 75 dpi, каждая гарнитура содержит большое количество шрифтовых файлов с разными матрицами (от 8 до 24 точек по вертикали), что позволяет использовать их при высоких разрешениях. И еще одна отличительная особенность пакета - наличие отдельных шрифтовых файлов для разных начертаний - нормального, курсивного и полужирного. С подробностями об этих шрифтах можно ознакомиться здесь.

Что касается векторных шрифтов - Иксы, насколько мне известно, поддерживают все распространенные их форматы. Однако практическое значение в наших условиях имеют только Adobe Type 1 и True Type Fonts (TTF) - прочие, типа Speedo, поддержкой кириллицы не обременены. Однако и для Type 1 или TTF кириллических вариантов штатно не предусмотрено. И потому обзаведение ими для использования в Иксах - дело рук самого использователя.

Правда, отечественные дистрибутивы содержат и кириллические шрифты обоих типов, причем - для многих кодировок кириллицы, включая, кроме KOI8-R, также CP1251 и ISO8859-5. В формате Type 1 существует несколько шрифтовых наборов для кодировки KOI8-R. Однако они бедны в отношении гарнитур, качество шрифтов не всегда "на уровне", и лицензионная чистота некоторых из них не вполне ясна.

Наиболее интересны наборы Type1 и TTF, разработанные Валентином Филипповым и распространяемые в составе дистрибутивов Altlinux, но доступные в Сети и сами по себе, в частности - здесь. Гарнитуры обоих наборов - весьма многочисленны: здесь и гротески Avantgarde, Gothic, Helvetica, Nimbus Sans, и серифы Bookman, Centure Scoolbook, Nimbus Roman, Palatino, Times, и моноширинные гарнитуры Courier и Nimbus Mono. Качество шрифтов весьма высокое - хотя и не всех. Имеются отдельные файлы для различных шрифтоначертаний - нормального, "легкого", полужирного и жирного, курсивного. Шрифты Валентина изначально создавались в кодировке Unicode (UTF8), так что могут быть использованы для передачи любых наборов символов кириллицы (как KOI8, так и CP1251). В общем, учитывая их лицензионную чистоту, - вполне приемлемый выбор.

Однако наибольшее распространение в последнее время получили среди отечественных пользователей юникодные TTF-шрифты, заимствованные из Windows. Малый их джентльменский набор, включающий гарнитуры гротеска Arial, Tahoma, Verdana, сериф Times New Roman, моноширинные Andale и Coutier New, долгое время (видимо, по недосмотру) был доступен свободно на сайте Microsoft. Правда, на условиях распространения только через Сеть (то есть без права на включение в дистрибутивы) и исключительно в первозданном виде - каковой являл собой, понятное дело, cab-архивы. Теперь с сайта Microsoft эти шрифты исчезли, но явного запрещения на их использование и сетевое распространение, насколько мне известно, так и не последовало. И потому их можно (в виде пакета corefonts) скачать с одного из сайтов, где они имеют место быть, распаковать и юзать в своей POSIX-системе вполне легально. На сей предмет была даже специально придумана утилита cabextract и разработана методика ее применения.

Описывать эту методику не буду: я не настолько наивен, чтобы полагать, будто в наших условиях ею кто-то воспользуется (при наличии более простого способа получения этих шрифтов, на котором не будем акцентировать внимание). Опишу лишь действия, которые потребуются после извлечения шрифтов из их "кабинетов" - они будут общими для всех TTF-шрифтов (а частично и для шрифтовых коллекций вообще).

Вернемся, однако, к столь полюбившимся пользователям шрифтам от MS (тем более, что все описанное ниже справедливо и для любых иных шрифтовых наборов). Как уже говорилось, файлы любого шрифтового набора принято помещать в отдельный каталог внутри каталога /usr/X11R6/lib/X11/fonts/. Поступим так и с извлеченными из cab-архива TTF-шрифтами, создав для них подкаталог corefonts (например). Однако, чтобы Иксы были в состоянии их воспринять, шрифтовой подкаталог должен содержать еще файл fonts.dir и (для масштабируемых векторных шрифтов) fonts.scale. Это - простые списки имен шрифтовых файлов и полного описания соответствующего им шрифтоначертания, например:

Arial.TTF -monotype-Arial-medium-r-normal--0-0-0-0-p-0-koi8-ru

Эту длинную последовательность можно представить в виде подобия базы данных, в которой имя шрифтового файла (в примере - Arial.TTF) выступает в качестве идентификатора записи, а все остальное образовано отдельными полями с дефисом в качестве разделителя. Поскольку тот же формат описания шрифта используется утилитой xfontsel и в так называемых файлах X-ресурсов (речь вскоре дойдет и до того, и до другого), остановимся на смысле отдельных полей подробнее.

Первое поле в терминологии xfontsel носит название fndry - от слова foundry, одно из значений которого - литейная форма (шрифта). А его содержание - это имя фирмы-разработчика, в примере - известного разработчика шрифтов Monotype (то есть можно понимать таr - отлито Монотайпом). И маленькое отступление для тех, кто не может поступиться принципами. И кому западло использовать что бы то ни было, произведенное в "Империи зла". Так вот, все TTF-шрифты из поставки Windows разработаны именно фирмой Monotype. Более того, гарнитуры Arial, Courier New и Times New Roman - это вариации на тему классических гарнитур Helvetica, Courier и Times, соответственно, которые вообще являются общенародным достоянием, а Tahoma и Verdana созданы Monotype по мотивам гротесков середины прошлого столетия. О происхождении Andale, к сожалению, ничего сказать не могу, но полагаю - и тут ничто не ново под луной. Так что при использовании этих шрифтов поступаться принципами не приходится...

Второе поле нашей "как бы базы" (в xfontsel оно называется fmly, то есть family) - это имя гарнитуры, которую данный шрифтовой файл представляет. Третье (wght - от weight, то есть толщина) - шрифтоначертание в критериях насыщенности, в примере - нормальное (medium), другие возможные значения - "светлое" (light), полужирное (bold), и так далее. В следующем же поле (slant) описывается шрифтоначертание с точки зрения наклона - нормальное (r - от roman) или курсивное (i, o - от italic и oblique, соответственно). За этим следует поле sWdth (set Width), описывающее "компоновку" шрифта - нормальную (normal), как в примере, или сжатую (condensed). Ну а позиция между двумя дефисами - это принадлежность гарнитуры к одному из трех семейств (к традиционным serif и sans serif добавляется decorative); очевидно, что она следует из имени гарнитуры, и потому здесь это поле пустое.

Следующие четыре поля определяют: размер шрифта в пикселях (pxlsz), размер шрифта в "точках" (points, ptsz), разрешение шрифта по горизонтали (resx) и вертикали (resy) в точках на дюйм (dpi). В примере все они заполнены нулями, что свидетельствует о принадлежности рассматриваемого шрифта к категории масштабируемых (таковыми являются все векторные шрифты, как TTF, так и Type 1). Однако для растровых шрифтов здесь стояли бы соответствующие значения, характеризующие данный шрифтовой файл, например 10-100-75-75. Следующим полем (spc - от spacing) описывается принадлежность к пропорциональному (p) или моноширинному (m) семействам. А затем - поле avgWdth, в котором определяется средняя ширина символа в шрифте. Наконец, в последних двух полях указываются набор символов (rgstry - от registry, и encdng - от encoding) шрифта (например, koi8) и его вариации (например, ru и r - для KOI8-R).

Рассмотренное описание каждого шрифта может показаться несколько запутанным и непонятным (да и на самом деле таковым является; хотя, как мы вскоре увидим, некоторая сермяжная правда в таком формате есть). Тем не менее, это - объективная реальность, данная нам в ощущениях разработчиков Иксов, и с ней приходится считаться. То есть - создать файл fonts.dir в новообразованном каталоге. Благо, для этого существуют утилиты - mkfontdir для шрифтов Type 1 и ttmkfdir - для шрифтов True Type. Правда, в комплект Иксов входит лишь первая - вторая должна быть установлена самостоятельно. Однако использование обеих - элементарно просто: достаточно дать одноименную команду с именем шрифтового каталога в качестве аргумента, в нашем примере это будет выглядеть так:

$ ttmkfdir /usr/X11R6/lib/X11/fonts/corefonts

И получить в результате тот самый файл fonts.dir со всеми его зубодробительными записями, а заодно - и с количеством оных в первой строке (это - обязательный элемент файла, без него X-сервер не сможет построить таблицу доступных шрифтов). Важно также, что для юникодных шрифтов автоматически будут заполнены поля rgstry и encdng - в соответствие с реально доступными в них наборами символов.

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

Теперь остается совсем немногое: внести в секцию Files Иксового конфига строку вида

        FontPath     "/usr/X11R6/lib/X11/fonts/corefonts/"

и перезапустить X-сервер, чтобы наслаждаться кириллическими TTF-шрифтами. Проследив предварительно, имеет ли место быть в секции Module конфига строка

 Load  "ttf"

обеспечивающая их поддержку: с некоторых пор это штатная функция X-сервера, тогда как ранее для использования True Type требовались специальные серверы шрифтов (Fonts Server). Использование их не возбраняется и ныне, однако на настольной машине, по моему мнению, лишено смысла. Единственное, что дает Font Server - это возможность загрузки шрифтов с удаленного компьютера, что для пользовательского десктопа не актуально. А вот тормозить работу Иксов сервер шрифтов может вполне...

Теперь нужно только найти способ разбираться с наличным шрифтовым богачеством - выбирать нужные шрифты и устанавливать их. Что касается последнего - для собственно Иксовых приложений это делается либо опциями их командной строки при запуске, либо - в специальных файлах X-ресурсов, о чем речь пойдет в ближайшей интермедии. А вот выбор нужного для установки шрифта возможен на поминаемую выше утилиту xfontsel. Она позволяет через пункты меню, соответствующие описанным ранее полям в файле fonts.dir, выбрать для последних нужные значения (с визуальным контролем результата), а затем, нажатием на кнопку select, скопировать их в буфер. После чего параметры нужного шрифта могут быть либо вставлены в 4командную строку в виде значения соответствующей опции (например, опции -fn), либо вставлены в описание ресурсов приложения в файле типа ~/Xdefaults (см. следующую интермедию).

Выбирать шрифт через меню xfontsel можно в любом порядке. Например, можно сначала через два последних пункта (rgstry и encdng) отфильтровать только шрифты с поддержкой кириллицы, а затем уже определиться с гарнитурой, шрифтоначертанием и размером. Более того, для корректного представления шрифта часто нет нужды в определении всех параметров шрифта: некоторые из них (как, например, размер в пикселях и точках, горизонтальное и вертикальное разрешения) жестко сцеплены друг с другом: выбор размера шрифта 12 пунктов автоматически влечет установку значения 120 в точках. А такие параметры, как семейство гарнитур или их характер (пропорциональный и моноширинный), вообще однозначно вытекают из имени гарнитуры. Хотя шрифты можно фильтровать и по этим признакам: сначала отобрать все моноширинные гарнитуры, пригодные для использования в терминале, а потом уже детализировать свой выбор. Почему я и говорил, что формат описания шрифта содержит в себе некую сермяжную правду...