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

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

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

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

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

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

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

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

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

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

Эффекты (7.6Kb)


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

Экран, показанный на скриншоте выше, полностью доступен по ссылке "Some examples" из основного меню пакета. CPI viewer (8Kb)
Следующая утилита пакета - CPI viewer (доступна по соответствующей ссылке).

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

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

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

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

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

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

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

2. Проверяется числовое содержимое свойства error. Если там не ноль, значит произошла ошибка. Текстовое ее описание доступно в свойстве errmsg.

3. Вызывается метод printstr с указанием строки, которая будет напечатана, во втором параметре - через запятую имена эффектов, которые будут применены, в порядке применения. Массив имен эффектов, доступных для использования, возвращает метод AvailEffects(). Метод printstr вызывает печать содержимого картинки в выходной поток. Если требуется вывести картинку в файл, используйте функции буферизации или перепишите класс под свои задачи.

4. Вызывается метод close, без параметров. Он закрывает открытый ранее файл шрифта.

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

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

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

13 июля 2002 14:30

Ваше имя или адрес блога (можно OpenID):

Текст вашего комментария, не HTML: