Шрифты в Linux: различия между версиями

Содержимое удалено Содержимое добавлено
Отмена правки 44013 участника 95.72.157.65 (обсуждение)
м робот косметические изменения
Строка 107:
Теперь создадим XLFD-запись, выбирающую все шрифты наклонного начертания, имеющие кодировку «iso8859-1». Для этого запустим ''xfontsel'' и выставим значение XLFD-компонента '''slant''' в «i», '''rgstry''' в «iso8859», '''encdng''' в «1»; получим примерно такой результат:
 
[[ИзображениеФайл:LinuxFonts-xfontsel-select-1.png]]
 
И запустим '''xterm''' с только что выбранным шрифтом:
Строка 183:
Рассмотрим подробно изображение одного глифа, в данном случае для символа «a» шрифта Liberation Serif, в разном разрешении.
 
[[ИзображениеФайл:Letter a sample.png]]
 
Как вы видите, глиф имеет достаточно сложную форму, высота первого символа 78 пикселов, при таком разрешении форма буквы хорошо заметна и передана сравнительно качественно. Высота последнего символа 6 пикселов, и что именно там нарисовано, разобрать практически невозможно. Хорошо видно, как с понижением количества использованных для растеризации пикселов падает общее качество картинки и «узнаваемость» формы символа. Чем больше элементов участвует в построении растрового приближения векторной картинки, тем выше качество этого самого приближения.
Строка 189:
Форма глифа шрифта хранится в виде математически описанных контуров, чтобы этот контур отобразить на экране, состоящем из отдельных пикселов, нужно выбрать, какие именно пикселы нужно закрасить, чтобы наилучшим образом отобразить контур. Набор пикселов экрана можно представить в виде растровой сетки, для простоты будем считать, что каждый квадрат может быть либо закрашенным, либо нет.
 
=== Хинты ===
На рисунке ниже показан фрагмент растровой сетки, а также контур ((а), круг) который нужно на этой сетке отобразить. Наложим контур на сетку и закрасим каждый пиксел, который более чем наполовину покрывается контуром<ref name="karow">Пример взят из книги Питера Карова «Шрифтовые Технологии»</ref>.
 
[[ИзображениеФайл:LinuxFonts-raster-circle.png]]
 
На фрагменте (б) видно, что контур очень точно наложен на сетку, в результате чего получаем симметричное и сравнительно качественное приближённое изображение круга. Но на третьем фрагменте (в) контур смещён относительно растровой сетки примерно на треть ширины пиксела вправо и вверх, что приводит к совершенно иной картине. Рассмотрим теперь другой пример — угол в 90°.
 
[[ИзображениеФайл:LinuxFonts-raster-corner.png]]
 
На фрагменте (а) контур угла расположен так, что соответствующие пикселы образуют достаточно приличное изображение. На фрагменте (б) вместо острой вершины получилось совершенно не то, что ожидалось, хотя контур был смещён на очень незначительное расстояние.
Строка 204:
Вот пример использования хинтов при растеризации глифа символа «а».
 
[[ИзображениеФайл:LinuxFonts-hinting-a-sample-1.png]]
 
Глиф взят из TrueType шрифта Verdana версии 2.43, отрисован размером в 21 пункт и увеличен в пять раз. Видно, что при бесхинтовой отрисовке символ содержит разнообразные артефакты, штрих неровный. При использовании хинтов картинка значительно яснее, артефактов практически нет и в целом результат растеризации отличный.
Строка 216:
Другим способом разрешить проблему с патентами на алгоритмы обработки хинтов является так называемый ''автохинтинг'' (по-английски ''autohint'') — метод исправления дефектов растеризации без использования встроенных в шрифт инструкций. Обычно результат действия автохинтинга не намного лучше стандартного рендеринга:
 
[[ИзображениеФайл:LinuxFonts-hinting-a-sample-2.png]]
 
=== Монохромное сглаживание ===
Другим способом улучшения качества растеризации является так называемое ''сглаживание'' (по-английски ''anti-aliasing'', также по-русски называется ''антиалиасингом''). Как видно из названия, в этом методе используется сглаживание резких переходов от контура шрифта к фоновому цвету, в результате чего в картинке сглаживаются и маскируются ошибки растеризации. Сравните результат растеризации с использованием ''простого сглаживания'' и без оного:
 
[[ИзображениеФайл:LinuxFonts-antialiasing-a-sample-1.png]]
 
Такое сглаживание также называют ''монохромным'' (по-английски ''grayscale antialiasing''), поскольку для создания эффекта плавного перехода используется цвет самого шрифта, но различной степени яркости. Как вы могли заметить, в сглаженной версии растеризованного глифа используется значительно большее количество пикселов растровой сетки, чем для растеризации глифа без сглаживания. Вернёмся немного назад, к правилам выбора пикселов, которые нужно закрасить на растровой сетке, чтобы получить образ векторного контура. Как вы помните, мы закрашивали чёрным цветом только те клетки, которые более, чем наполовину покрывались контуром глифа. Теперь же в нашем распоряжении есть множество градаций серого цвета — от белого до чёрного — и мы можем выбирать цвет пиксела в заивисимости от процента его площади, покрытой векторным контуром глифа. Следующий рисунок иллюстрирует механизм растеризации глифа с использованием сглаживания и без (на примере глифа «a», увеличенного в 20 раз).
 
[[ИзображениеФайл:LinuxFonts-antialiasing-greyscale-1.png]]
 
Красным цветом на рисунке обозначен векторная граница глифа шрифта, на левом рисунке также нанесена сетка, один квадрат которой соответствует одному реальному пикселю, это поможет наглядно представить какую часть пиксела покрывает векторный контур.
Строка 231:
Логичным шагом является объединение двух упомянутых методов: использования хинтов и сглаживания. Вот как это выглядит.
 
[[ИзображениеФайл:LinuxFonts-antialiasing-hinting-a-sample-1.png]]
 
=== Субпиксельное сглаживание ===
==== Принципы формирования цветного изображения на мониторе ====
 
Цветное изображение на дисплее монитора формируется из пикселов, а каждый пиксел состоит из компонентов трёх цветов — красного, зелёного и синего (red, green, blue), каждый из таких компонентов называется ''субпикселом''. Существует несколько различных вариантов геометрии субпикселов, самые главные из них — это: [[w:ЭЛТ|ЭЛТ]] телевизора, [[w:ЭЛТ|ЭЛТ]] монитора, жидкокристаллический экран. Субпикселы на них располагаются следующим образом:
 
[[ИзображениеФайл:LinuxFonts-display-types.png]]
 
Особенность человеческого зрения такова, что при достаточно маленьких размерах субпикселов глаз перестаёт различать отдельные красно-сине-зелёные компоненты и мозг формирует из них полноцветное изображение как бы смешивая три цвета в нужной пропорции в зависимости от яркости каждого цветового компонента.
Строка 248:
Каждый цвет отдельного пиксела получается путём «смешивания» трёх цветов субпикселов в разных пропорциях. Пропорция задаётся уровнем яркости субпиксела. Чёрный цвет получается при полностью погашенных субпикселах, белый — при полностью включенных, чистый красный цвет получается при полностью погашенных синем и зелёном субпикселе (уровень яркости красного субпиксела при этом определяет яркость итогового красного цвета), а жёлтый цвет получается смешиванием красного и зелёного в равных пропорциях.
 
[[ИзображениеФайл:LinuxFonts-lcd-colors-example-1.png]]
 
При выбранном подходе серый цвет получается смешиванием в равных долях красного, зелёного и синего цветов субпикселов и при использовании монохромного сглаживания экран LCD-монитора при большом увеличении выглядит приблизительно так:
 
[[ИзображениеФайл:LinuxFonts-lcd-colors-greyscale-sample-1.png]]
 
Такой способ формирования цветного изображения позволяет добиваться интересных эффектов. Рассмотрим следующую иллюстрацию (её нужно обязательно рассматривать на LCD-мониторе):
 
[[ИзображениеФайл:LinuxFonts-lcd-colors-example-2.png]]
 
На рисунке изображены шесть параллельных линий. Первые три линии красного, зелёного и синего цвета соответственно, четвёртая белого цвета, а пятая и шестая состоят из сегментов разных цветов. В построении первых трёх линий задействовано только по одному из субпикселов, в четвёртой линии — все субпикселы, по этой причине четвёртая линия кажется визуально шире, чем первые три, хотя все они одинаковой ширины — один пиксел. Пятая линия также шириной в один пиксель, однако в каждом сегменте задействован только один субпиксел, в результате чего линия кажется неровной (физически так и есть, линия состоит из трёх сегментов, каждый из которых сдвинут вправо относительно предыдущего на один пиксель). Шестая линия имеет ширину два пиксела и состоит из двух трёхсегментных линий.
Строка 262:
Давайте рассмотрим этот рисунок в масштабе 8:1.
 
[[ИзображениеФайл:LinuxFonts-lcd-colors-example-3.png]]
 
Вы можете сами проделать эту операцию в любом графичесок редакторе, чтобы убедиться, что на этих двух иллюстрациях представлено одинаковое изображение. Теперь рассмотрим, как это избражение рисуется на экране LCD-монитора.
 
[[ИзображениеФайл:LinuxFonts-lcd-colors-example-4.png]]
 
В верхней правой части видно, что смежными сегментами оказываются субпиксели, принадлежащие двум соседним пикселам: слева синий, справа красный. Для глаза эти два соседних сегмента сливаются в один цвет, в результате чего на экране получается линия пурпурного цвета. Также видно, откуда берётся пустой промежуток между двумя соседними линиями.
 
==== Основы субпиксельного рендеринга ====
''Субпиксельным рендерингом'' в общем случае называется тип рендеринга, использующий особенности физического формирования изображения из субпикселов. А ''субпиксельное сглаживание'' базируется на особенностях человеческого зрения: на маленьких объектах глаз лучше различает ''контраст яркостей'', чем ''контраст цветов''. На практике это выражается в том, что экран рассматривается не как набор пикселов (как это происходит, например, в графическом редакторе), а как набор субпикселов; при этом горизонтальное разрешение экрана увеличивается втрое. После «субпиксельного» отрисовывания производится коррекция яркости субпикселов, чтобы максимально подавить видимые глазу цветные переходы.
 
Строка 280:
является устаревшим, и будет в ближайшее время удалён
 
== Xft ==
Xft — это библиотека для X-приложений, основанная на [http://www.freetype.org/ FreeType]. В отличие от Core X Renderer, работает на стороне X-клиента, а не X-сервера. По сути это означает, что если вы запустите X-приложение на другом физическом сервере, а в качестве дисплея укажете свой локальный, то рендеринг шрифтов будет происходить на другом сервере, а вам будут передаваться по сети, условно говоря, картинки с уже отрисованным текстом. И ещё одно важное следствие, которое многие упускают — ''Xft не зависит от конфигурации X-сервера''! Шрифты для использования в Xft задаются совершенно отдельно от него; приложение, использующее Xft будет выглядеть одинаково, независимо от того, на каком именно X-сервере оно отображается.
 
Почти все современные X-приложения явно или косвено используют для рендеринга шрифтов библиотеку Xft. Core X Renderer уже сильно устарел, и не поддерживает многих популярных в настоящее время фич, например, сглаживания шрифтов. Как я уже говорил, Xft использует непосредственно для растеризации шрифтов библиотеку FreeType. FreeType — это высокоэффективная, свободная, расширяемая и переносимая библиотека для работы с разнообразным форматами шрифтов. Она есть для всех платформ и входит во все дистрибутивы. Однако ввиду свободности некоторые возможности библиотеки по умолчанию отключены и их нужно включать самостоятельно и пересобирать библиотеку, чтобы их задействовать. Эти возможности реализуют запатентованные способы рендеринга, а так как на территории России патенты на алгоритмы не действуют, можно на это забить и всегда эти фичи включать. Подробные инструкции, как это сделать, доступны в сети в огромном количестве, а в некоторых дистрибутивах, например, в Debian, эти возможности уже включены в бинарные пакеты, поэтому нет необходимости их пересобирать. А вот пользователям Fedora Core придётся это сделать.
 
=== Настройка Xft ===
 
При работе с Xft необходимо помнить один очень важный момент — ''настройки шрифтов при работе с данной библиотекой локальны по отношению к приложению.'' Это значит, что можно сконфигурировать систему так, что каждое приложение сможет пользоваться своей собственной конфигурацией Xft, и хотя в большинстве операционных систем все приложения используют одни и те же параметры, всегда можно сделать так, что некоторые из них будет иметь свой собственный набор шрифтов и их настроек. Иногда это очень удобно.
Строка 295:
Некоторые операционные системы предоставляют программные средства для упрощения процесса конфигурации. В качестве примера приведу команду ''dpkg-reconfigure fontconfig-config'', с которой неизбежно сталкивается каждый пользователь Debian:
 
[[ИзображениеФайл:LinuxFonts-Debian-fontconfig.png]]
 
Данная команда позволяет глобально сконфигурировать несколько весьма важных параметров, однако при этом полностью скрывает смысл производимых действий. Поэтому далее программы для конфигурации шрифтов рассматриваться не будут, а речь пойдёт исключительно о ручной настройке.
Строка 301:
Чтобы полностью осознать и понять суть производимых действий, я рекомендую по мере чтения статьи выполнять вручную все, о чём вы прочитаете — это сильно помогает пониманию. Чтобы не сломать что-нибудь в главном конфигурационном файле, рекомендую проделывать все действия в специально созданном для этого окружении: Xft можно заставить использовать другой файл конфигурации, отличный от /etc/fonts/fonts.conf, делается это при помощи переменной окружения FONTCONFIG_FILE, которой необходимо присвоить ''полный'' путь (например, /home/user/my-own-fonts.conf) до нового файла. Если переменная FONTCONFIG_FILE установлена, то все X-программы, использующие Xft, будут искать файл конфигурации именно там, а не в /etc/fonts/fonts.conf. Рекомендую также создать каталог, например, ''~/local-font-sandbox'' и все действия (создание новых файлов, например) проводить только внутри него. Для этого открываем новый терминал, заходим внутрь этого каталога, создаём файл ''fonts.conf'' и присваиваем переменной FONTCONFIG_FILE полный путь до него (''export FONTCONFIG_FILE=`pwd`/fonts.conf''), не забываем про экспорт переменной, так как все программы, которые будут использовтать данный файл, мы будем запускать именно из этого терминала. В качестве тестовой программы можно взять любую, использующую Xft, например, kword — текстовый редактор из набора KOffice, нам он полезен тем, что в нём можно одновременно отображать много текста, отрисованного разными шрифтами.
 
=== Формат файла fonts.conf ===
 
{{Врезка
Строка 319:
Если мы попробуем запустить с этим файлом наше тестовое приложение, мы получим вместо букв вот такие квадратики (ведь в файле не описаны ни шрифты, ни правила их рендеринга):
 
[[ИзображениеФайл:LinuxFonts-Basic-fontconfig-res.png]]
 
Также можно нарваться на вот такое сообщение:
Строка 340:
Запускаем kword и видим, что шрифты в нём отображаются, однако если мы попытаемся изменить шрифт набранного текста, мы увидим, что выбор ограничивается только лишь двумя этими шрифтами: DejaVuSans и DejaVuSerif.
 
[[ИзображениеФайл:LinuxFonts-Kword-basic-fonts.png]]
 
На рисунке видно, как выглядит окно kword в моей системе, когда ему доступно всего два шрифта. Обратите внимание, что шрифты отрисовываются в сглаженном виде, в вашем дистрибутиве всё может быть иначе.
Строка 366:
Вы, наверное, уже отметили, что шрифты на скриншоте выглядят не очень хорошо, значит, нужно изменить ещё какие-нибудь атрибуты отрисовки, чтобы стало лучше. Вот об этих атрибутах и поговорим. Но сначала немного теории, а точнее — о различных особенностях отрисовки шрифтов на мониторе. Без этой информации смысл различных опций файла конфигурации останется для вас не совсем ясным.
 
=== Способы растеризации шрифтов ===
Чтобы получить достойно отрисованный векторный шрифт на экране, необходимо указать растеризатору (в нашем случае это FreeType) параметры преобразования символов из векторной формы в растровую. На разных типах мониторов наилучший результат достигается различными наборами таких параметров. Чаще всего пользователи включают сглаживание (antialiasing) шрифтов. Сглаживание производится путём добавления дополнительных пикселов другого цвета или другой яркости, чтобы сгладить резкие переходы между пикселами.
 
Строка 375:
Простейший способ растеризации — это простое преобразование векторных изображений в растровые безо всякой коррекции, выглядит это примерно так:
 
[[ИзображениеФайл:LinuxFonts-Rasterization-simple.png]]
 
Простейшее сглаживание достигается путём добавления вокруг каждого пиксела в несглаженном растровом изображении нескольких пикселов с разной степенью прозрачности, обычно более светлых, такой метод называется ''greyscale antialiasing'', я далее буду его называть ''монохромным сглаживанием''. Это позволяет получить более сглаженную, но несколько замыленную картинку:
 
[[ИзображениеФайл:LinuxFonts-Rasterization-antialiasing-without-hinting.png]]
 
В качественных шрифтах для каждого глифа добавляются специальные инструкции (хинты, hints), чтобы помочь отрисовать шрифт на устройствах вывода низкого разрешения, например, на экране монитора. Создание качественных хинтов — это весьма трудоёмкий процесс и поэтому хинты присутствуют далеко не в каждом шрифте, однако во всех стандартных шрифтах Windows™ они присутствуют (и ОЧЕНЬ качественные), поэтому они и отрисовываются там так хорошо. Рассмотрим, как будет растеризован библиотекой FreeType шрифт Tahoma (размер 12 пунктов) без использования хинтов:
 
[[ИзображениеФайл:Rasterization-no-hinting.png]]
 
Такой метод является самым простым и наименее ресурсоёмким. Однако получаемый результат обычно совершенно непригоден для использования. Однако если мы добавим к полученной растровой картинке эффект простейшего монохромного сглаживания, то получим уже вполне пригодный к использованию метод. Итак, бесхинтовая растеризация плюс сглаживание дают удовлетворительный результат:
 
[[ИзображениеФайл:LinuxFonts-Rasterization-no-hinting-antialias.png]]
 
Однако всё равно шрифт отрисовывается не идеально — штрих получается слишком широкий, видны торчащие из шрифта пиксели. Теперь посмотрите на эту же надпись, но выполненную с применением хинтов и без антиалиасинга:
 
[[ИзображениеФайл:LinuxFonts-Rasterization-hinting-full-alias.png]]
 
Очень хороший результат: все символы отрисованы симметрично, лишние пикселы ниоткуда не торчат, на экране ЭЛТ-монитора шрифт, отрисованный таким методом будет выглядеть вполне приемлемо и качественно. Монохромное сглаживание ещё больше улучшает качество отрисовки (Tahoma, 12 pt):
 
[[ИзображениеФайл:LinuxFonts-Rasterization-hinting-full-antialias.png]]
 
Сравните насколько лучше выглядит результат по сравнению с монохромным сглаживанием без использования хинтов.
Строка 403:
Субпиксельное сглаживание основывается на некоторых особенностях человеческого зрения, а именно — глаз лучше различает ''яркость'' очень маленьких объектов, чем ''цветность''. Поэтому для сглаживания резких контуров используются не пикселы целиком, а лишь отдельные его фрагменты — красный, зелёный или синий. На следующей иллюстрации показано результат растеризации с использованием субпиксельного сглаживания:
 
[[ИзображениеФайл:LinuxFonts-Rasterization-hinting-full-antialias-subpixel.png]]
 
На увеличенном фрагменте чётко видны цветные пикселы, однако на самой картинке они не очень заметны и в целом отрисовка выглядит более «гладкой», чем при использовании монохромного сглаживания. '''Обратите внимание, что если вы просматриваете эту страницу на экране ЭЛТ-монитора, вы увидите совершенно иную картину!''' Всё дело в том, то эта иллюстрация сделана простым масштабированием скриншота, а чтобы совсем понять схему работы метода (и увидеть физические фрагменты пикселов), необходимо сделать фотографию фрагмента экрана, на котором написано это слово. Например, надпись белым цветом на чёрном фоне на LCD-экране выглядит примерно следующим образом (при достаточно сильном увеличении):
 
[[ИзображениеФайл:Screenshot-subpixeRGB.png]]
 
Хорошо видны субпикселы, участвующие в сглаживании, так как их яркость довольно высока, а не участвующие практически сливаются с чёрным фоном страницы, так как их яркость очень низка.
 
=== Редактирование файла fonts.conf ===
Как уже было отмечено, файл fonts.conf состоит из правил, описывающих способы растеризации шрифтов. Правила могут быть как простыми, так и очень сложными, задающими способы отрисовки в зависимости от выполнения каких-либо условий.
 
Я не буду здесь перессеказывать содержимое встроенной справки, а буду приводить примеры установки конкретных режимов отрисовки шрифтов и пояснять, что означают использованные в примере параметры.
 
==== Монохромное сглаживание ====
 
==== Хинтинг ====
Вот пример файла fonts.conf, в котором задаются правила применения хинтинга:
 
Строка 480:
Как вы видите, параметр ''hinting'' установлен в true, а также добавлен параметр ''hintstyle'', который задаёт способ хинтинга. Всего для hintstyle возможны четыре значения: hintnone, hintslight, hintmedium, hintfull. При этом hintnone — это самый слабый хинтинг, hintfull — самый сильный. hintfull даёт самый качественный результат растеризации, поэтому остальные значения использовать смысла нет. На картинке ниже показан результат растеризации шрифта Tahoma, 12pt с включенными полным хинтингом и сглаживанием.
 
[[ИзображениеФайл:LinuxFonts-Rasterization-hinting-full-antialias.png]]
 
Сравните с бесхинтовым сглаживанием того же самого шрифта того же самого размера:
 
[[ИзображениеФайл:LinuxFonts-Rasterization-no-hinting-antialias.png]]
 
Сразу бросается в глаза толщина штрихов, существенно меньшая замыленность контуров. При желании сглаживание можно отключить, но вот отключать хинтинг никогда не следует, так как он позволяет очень качественно растеризовать шрифт.
 
[[Категория: GNU/Linux]]
 
== Примечания ==
 
<references />
 
[[Категория: GNU/Linux]]