Шрифти в linux вбудована шрифтовая підсистема x-сервера

У цій частині розповідається про класичну системі рендеринга і відтворення шрифтів в X Window System: Core X Renderer.

В основі клієнт-серверної моделі X11 лежить так званий X Window System core protocol. тобто Основний протокол X Window System. Саме їм регулюється взаємодія між різними компонентами системи. Основний протокол дозволяє використання шрифтів на стороні X-сервера. X-сервер має або безпосередній доступ до файлів шрифтів в файлової системі, або через мережу, з програми, званої сервером шрифтів. X-клієнти можуть запитувати у X-сервера список доступних шрифтів, будь-які їх атрибути або розмір, який займе на екрані рядок тексту, намальовані певним шрифтом.

X-сервер дуже жорстко залежить від наявності певного набору базових шрифтів, він просто не запуститься, якщо в його розпорядженні не буде достатнього набору шрифтів або у вигляді файлів в файлову систему, або у вигляді сервера шрифтів. Тому в будь-якій операційній системі пакет з X-сервером він обов'язково залежить від пакета з базовими шрифтами.

Сервер шрифтів або X Font Server забезпечує стандартний механізм доставки шрифтів X-сервера, найчастіше підключається до TCP-порту 7100. В даний час використовувати сервер шрифтів не рекомендується.

конфігурація

Головним конфігураційним файлом X.org Server частіше за все є файл /etc/X11/xorg.conf. За шрифти в ньому відповідає секція Files, ось як вона може виглядати:

Нас цікавить директива FontPath. в якій вказується повний шлях до каталогу, який містить файли шрифтів. Якщо цих директив немає або в них вказані невірні шляху, або за вказаними шляхами немає шрифтів, X-сервер не запуститься. Всередині папки шрифтів повинні знаходитися безпосередньо файли шрифтів, а також кілька спеціальних службових файлів: encodings.dir, fonts.alias, fonts.dir.

список імен шрифтів в даному каталозі і файлів, в яких вони містяться. З цього файлу X-сервер бере список шрифтів, які будуть використовуватися;

список псевдонімів для імен шрифтів, також читається X-сервером;

encodings.dir список відомих кодувань шрифтів, читається X-сервером при відкриванні шрифту з невідомої кодуванням.

Перераховані вище службові файли створюються за допомогою команд mkfontdir і mkfontscale. mkfontdir сканує зазначені каталоги, індексує знайдені там файли растрових шрифтів і створює файли fonts.dir і encodings.dir. Крім того, mkfontdir додає в файл fonts.dir вміст файлу fonts.scale, якщо такий виявиться. Файл fonts.scale в свою чергу створюється командою mkfontscale. яка індексує файли векторних шрифтів.

У старих довідниках можна зустріти рекомендацію використовувати програму ttmkfdir для індексування шрифтів формату TrueType, однак останні версії mkfontscale самі здатні виконати цю роботу, так що ніякої необхідності в ttmkfdir більше немає.

Отже, щоб підготувати каталог, що містить файли шрифтів для використання в X-сервері, необхідно послідовно виконати дві команди: mkfontscale і mkfontdir. найчастіше цього буває достатньо. Тепер цей каталог можна прописати в файлі xorg.conf і X-сервер при наступному запуску «побачить» нові шрифти.

Однак, можна обійтися і без перезавантаження, для цього потрібно виконати команду xset + fp шлях-до-каталогу-со-шрифтами. Якщо ви змінили щось в вже доданому каталозі, або ж в системному, виконайте команду xset fp rehash. щоб X-сервер оновив список завантажених шрифтів. Зверніть увагу, що згадані програми працюють в контексті X-сервера, тому їх потрібно запускати в терміналі зсередини X-сесії.

Цей спосіб можна використовувати, наприклад, для завантаження в X-сервер пользователькіх шрифтів без редагування системних конфігураційних файлів. Для цього потрібно прописати відповідні команди в файл, який запускається при старті вашої графічної оболонки або X-сервера.

Використання

Для іменування шрифтів в Core Protocol використовується спеціальна нотація, яка називається X Logical Font Description. скорочено XLFD. на російську можна приблизно перекласти як Логічне Опис X-Шрифту. Головними цілями та вимогами цієї нотації є:

  • Забезпечити унікальні, описові імена шрифтів, які б дозволяли виконувати пошук за зразком.
  • Підтримка безлічі виробників шрифтів, довільних наборів символів і кодування.
  • Підтримка векторних шрифтів.
  • Підтримка перетворень і виділень підмножини шрифту.
  • Реалізація, незалежна від X-сервера, операційної та файлової системи.
  • Підтримка довільно складного пошуку і підміни шрифтів.
  • Можливість розширення.

XLFD-запис про шрифт являє собою чотирнадцять полів, розділених симоволом «-». Кожне поле описує будь-яку характеристику шрифту (назва, накреслення, кодування і т.д.). Ось приклад повністю певної XLFD-записи про шрифт:

Запис може бути і в повному обсязі певної, в цьому випадку замість конкретного значення якої-небудь частини варто символ «*», наприклад, так:

Кожна XLFD-запис відповідає деякому набору зі списку відомих X-сервера шрифтів. Для повністю певної записи такий набір може складатися з одного елемента максимум або ж зовсім бути порожнім. Для неповністю певної набір може складатися з декількох записів. Коли виконується деякий додаток (тобто X-клієнт), воно передає X-сервера XLFD-запис про бажаному шрифті. Чим менше певної є цей запис (тобто чим більше символів «*» в ній зустрінеться), тим більша ймовірність, що підходить під неї шрифт буде виявлений і надано. Тобто XLFD грає роль маски при виборі шрифту.

Ключовий момент шрифтової підсистеми X-сервера - отрисовкой шрифту займається X-сервер, а запущене застосування (тобто X-клієнт) оперує виключно XLFD-записами і за растеризування, масштабування та інші графічні операції над шрифтом не відповідає. Перевагою цього є менший обсяг даних, який необхідно передати від X-клієнта до X-сервера, по суті додаток передає тільки рядок тексту, яку вже потім отрісовиваєт X-сервер.

Спочатку поекспериментуємо з іменами шрифтів. До складу X-сервера входить утиліта xfontsel. яка дозволяє наочно уявити процес вибору шрифту за заданими критеріями. Просто запустіть програму без параметрів і спробуйте повиставляли різні значення компонентів XLFD. У міру виставлення значень змінюється кількість шрифтів, під них підпадають (у верхньому правому куті). Щоб скопіювати XLFD-запис в буфер, натисніть кнопку «select».

А тепер кілька прикладів, щоб проілюструвати сказане. Спробуємо запустити програму xterm і вкажемо їй використовувати будь-який шрифт:

Ми використовуємо повністю не певну XLFD-запис, так що програма запуститься з першим потрапили під маску ім'ям шрифту. Тепер спробуємо використовувати свідомо неіснуюче ім'я шрифту, наприклад, поставимо ім'я виробника FAKENAME.

Як ми бачимо, X-сервер не зміг виявити такого шрифту і тому xterm використовує якийсь «шрифт за замовчуванням», в даному випадку «fixed».

Тепер створимо XLFD-запис, що вибирає всі шрифти похилого накреслення, що мають кодування «iso8859-1». Для цього запустимо xfontsel і виставимо значення XLFD-компонента slant в «i», rgstry в «iso8859», encdng в «1»; отримаємо приблизно такий результат:

Шрифти в linux вбудована шрифтовая підсистема x-сервера

І запустимо xterm з тільки що обраним шрифтом:

Крім xfontsel існує кілька інших корисних програм для роботи з вбудованою в X-сервер шрифтів підсистемою:

видає список шрифтів, які відповідають заданим зразком. Запуск без параметрів видає просто список всіх шрифтів. * xfd

обмеження

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