Пакет для печати шрифтом 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ом.
Пишите!
Не возжелай
Никто не в состоянии предугадать все последствия исполнения своих желаний. Никто не знает, чем обернется исполнение любого из них. Ко всему прочему, желания мгновенно не исполняются и, может статься, к моменту его исполнения ты уже забудешь о нем и будешь абсолютно не готов к тому, что оно, вот, наконец, исполнилось.
Возможно, ничего страшного в этом не будет, но, может быть, его исполнение не принесет тебе ничего, кроме боли и осознания, как же ты был глуп в то злосчастное мгновение, когда его загадывал. А посему, будьте осторожны со своими желаниями. Особенно, если они имеют тенденцию исполняться.
Ваше имя плохо пахнет…
Пытался сегодня, шутки ради, просмотреть данные лжепользователя (вы уж извините) «гамно». Движку LJ имя не понравилось — сказал «Плохое имя пользователя»… Да уж, чего тут хорошего?