Пакет для печати шрифтом CPI в XBM
Тема генерации картинок в формате XBM меня не отпускает. :) Вдоволь набаловавшись с генерацией буковок на бумаге в клеточку с последующим переносом их на экран, я решил сделать скрипт, который бы сей скорбный труд облегчил. Проще говоря, я решил сделать движок на PHP, который позволял производить печать в XBM произвольных символов шрифта.
Если вы читали предыдущую заметку на эту тему, то знаете, что XBM, сам по себе, формат очень простой и запрограммировать печать в него — дело нехитрое. Проблему составил поиск описания хотя бы одного формата шрифтов из их богатого разнообразия.
Большие надежды я возлагал на FON и формат шрифтов Palm, но не найдя описания ни того, ни другого, плюнул на все и воспользовался тем, что было под рукой — описанием формата CPI.
CPI — формат, придуманный в Microsoft для хранения шрифтов в ОС
Формат CPI нехитрый, хотя из скудного описания такой вывод сделать никак нельзя. Мне пришлось провести несколько экспериментов, чтобы выяснить что же он
Вкратце. Файл состоит из заголовка и нескольких секций — так называемых кодовых таблиц. Напомню, формат был придуман, когда старались экономить каждый байт и об Unicode еще не задумывались. В каждом шрифте одной кодовой таблицы хранится копия таблицы ASCII, где
Кодовая таблица имеет свой номер. Например, русскому шрифту в
Задержавшись пару раз после работы, я сделал небольшой пакет XBM+CPI, который позволяет печатать в формат XBM шрифтами CPI. Кроме этого, он позволяет накладывать на шрифты некоторые запрограммированные эффекты и использовать их комбинации.
Что интересно. Я обнаружил, что под IE картинка
На скриншоте показано несколько эффектов и пара их комбинаций.
Экран, показанный на скриншоте выше, полностью доступен по ссылке «Some examples» из основного меню пакета.
Следующая утилита пакета — CPI viewer (доступна по соответствующей ссылке).
Она позволяет просмотреть внутренности файлов со шрифтами (некоторые из файлов, которые мне удалось найти, лежат в каталоге cpi).
В частности, показывает номер каждой кодовой страницы и номер шрифта внутри её — эти данные пригодятся при использовании пакета в своих программных продуктах.
В ветке Windows NT используется свой формат шрифтов с заголовком яFONT.NT. Описания его мне найти не удалось, но экспериментально я установил, что отличаются они лишними
Видимо, существенного влияния на использование шрифта эти байты не оказывают.
Надо сказать, что у пакета есть некоторые ограничения, избавляться от которых я не стал, так как не вижу в этом особого смысла. Например, ширина символа выравнивается по восьмерке — символ шириной 9 символов будет печататься так же, как символ с шириной 16 символов. Далее, могут быть использованы только шрифты, предназначенные для устройства display — как использовать шрифты для принтера я не знаю и не понимаю зачем это может быть нужно в данной ситуации.
Посмотреть, как реагирует библиотека на изменения параметров можно на первом экране. Чтобы немедленно увидеть ее в действии нужно выбрать файл шрифта, вписать
Теперь, что касается программирования. Для использования в своих проектах подключать нужно файл xbm_cpi.inc. Внутри находится
- Создается экземпляр класса с указанием из какого файла брать шрифт, номером по порядку кодовой страницы и номером шрифта, которые будут использоваться.
- Проверяется числовое содержимое свойства error. Если там не ноль, значит произошла ошибка. Текстовое ее описание доступно в свойстве errmsg.
- Вызывается метод printstr с указанием строки, которая будет напечатана, во втором параметре — через запятую имена эффектов, которые будут применены, в порядке применения. Массив имен эффектов, доступных для использования, возвращает метод AvailEffects(). Метод printstr вызывает печать содержимого картинки в выходной поток. Если требуется вывести картинку в файл, используйте функции буферизации или перепишите класс под свои задачи.
- Вызывается метод close, без параметров. Он закрывает открытый ранее файл шрифта.
Методы, имена которых начинаются с символа подчеркивания, считаются приватными. Использование их вне класса не рекомендуется.
Скачать весь пакет можно у меня. Файлы упакованы архиватором RAR, для распаковки требуется RAR версии 2.90 или выше.
Добавление от 19 июля: в связи с многочисленными жалобами на «битость» файла выкладываю тот же пакет, упакованный ZIPом.
Пишите!