Пишу, по большей части, про историю, свою жизнь и немного про программирование.

Пакет для печати шрифтом CPI в XBM

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

Если вы читали предыдущую заметку на эту тему, то знаете, что XBM, сам по себе, формат очень простой и запрограммировать печать в него — дело нехитрое. Проблему составил поиск описания хотя бы одного формата шрифтов из их богатого разнообразия.

Большие надежды я возлагал на FON и формат шрифтов Palm, но не найдя описания ни того, ни другого, плюнул на все и воспользовался тем, что было под рукой — описанием формата CPI.

CPI — формат, придуманный в Microsoft для хранения шрифтов в ОС MS-DOS. Если вы когда-нибудь настраивали мелкософтский русификатор для DOS, то помните, что пару раз там надо было указать файл ega3.cpi — это как раз и есть файл со шрифтами.

Формат CPI нехитрый, хотя из скудного описания такой вывод сделать никак нельзя. Мне пришлось провести несколько экспериментов, чтобы выяснить что же он все-таки из себя представляет.

Вкратце. Файл состоит из заголовка и нескольких секций — так называемых кодовых таблиц. Напомню, формат был придуман, когда старались экономить каждый байт и об Unicode еще не задумывались. В каждом шрифте одной кодовой таблицы хранится копия таблицы ASCII, где какая-либо часть подменяется символами языка, для которого эта кодовая таблица предназначена.

Кодовая таблица имеет свой номер. Например, русскому шрифту в MS-DOS соответствует номер 866, Windows — 1251. Внутри кодовой таблицы располагаются одна или несколько секций шрифтов. Обычно их три. Это наборы со шрифтами 8×8, 8×14 и 8×16.

Задержавшись пару раз после работы, я сделал небольшой пакет XBM+CPI, который позволяет печатать в формат XBM шрифтами CPI. Кроме этого, он позволяет накладывать на шрифты некоторые запрограммированные эффекты и использовать их комбинации.

Что интересно. Я обнаружил, что под IE картинка не черно-белая, а черно-прозрачная — вместо белого подкладывается цвет фона. Opera тоже пытается сделать что-то похожее, но у нее это получается хуже. Вообще с форматом XBM у Opera как-то не заладилось — некоторые картинки, например на сером фоне, она не показывает вообще.

Эффекты

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

Экран, показанный на скриншоте выше, полностью доступен по ссылке «Some examples» из основного меню пакета.

CPI viewer

Следующая утилита пакета — CPI viewer (доступна по соответствующей ссылке).

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

В частности, показывает номер каждой кодовой страницы и номер шрифта внутри её — эти данные пригодятся при использовании пакета в своих программных продуктах.

В ветке Windows NT используется свой формат шрифтов с заголовком яFONT.NT. Описания его мне найти не удалось, но экспериментально я установил, что отличаются они лишними 25-ю байтами в каждой секции кодовой страницы.

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

Надо сказать, что у пакета есть некоторые ограничения, избавляться от которых я не стал, так как не вижу в этом особого смысла. Например, ширина символа выравнивается по восьмерке — символ шириной 9 символов будет печататься так же, как символ с шириной 16 символов. Далее, могут быть использованы только шрифты, предназначенные для устройства display — как использовать шрифты для принтера я не знаю и не понимаю зачем это может быть нужно в данной ситуации.

Посмотреть, как реагирует библиотека на изменения параметров можно на первом экране. Чтобы немедленно увидеть ее в действии нужно выбрать файл шрифта, вписать какую-нибудь фразу и нажать «Enter». Далее можно попробовать применить какой-нибудь эффект, изменить кодовую страницу или номер шрифта. Напоминаю, что указывать нужно номер кодовой страницы по порядку, а не её идентификатор!

Теперь, что касается программирования. Для использования в своих проектах подключать нужно файл xbm_cpi.inc. Внутри находится один-единственный класс BOLK_CPI_XBM. Пример его использования можно найти в файле img.php. Последовательность действий очень простая:

  1. Создается экземпляр класса с указанием из какого файла брать шрифт, номером по порядку кодовой страницы и номером шрифта, которые будут использоваться.
  1. Проверяется числовое содержимое свойства error. Если там не ноль, значит произошла ошибка. Текстовое ее описание доступно в свойстве errmsg.
  1. Вызывается метод printstr с указанием строки, которая будет напечатана, во втором параметре — через запятую имена эффектов, которые будут применены, в порядке применения. Массив имен эффектов, доступных для использования, возвращает метод AvailEffects(). Метод printstr вызывает печать содержимого картинки в выходной поток. Если требуется вывести картинку в файл, используйте функции буферизации или перепишите класс под свои задачи.
  1. Вызывается метод close, без параметров. Он закрывает открытый ранее файл шрифта.

Методы, имена которых начинаются с символа подчеркивания, считаются приватными. Использование их вне класса не рекомендуется.

Скачать весь пакет можно у меня. Файлы упакованы архиватором RAR, для распаковки требуется RAR версии 2.90 или выше.

Добавление от 19 июля: в связи с многочисленными жалобами на «битость» файла выкладываю тот же пакет, упакованный ZIPом.

Пишите!