TURBO PASCAL |
Новости
|
1.2. СТРУКТУРА CHR-ФАЙЛОВ ДЛЯ ВЕКТОРНЫХ ШРИФТОВВ этом параграфе мы рассмотрим структуру CHR— файлов, т.е. файлов с расширением CHR, в которых поставляются векторные BGI— шрифты. Такие шрифты широко используются в различных программных продуктах фирмы Borland, в том числе — в компиляторах Турбо Паскаль, Турбо С, Borland С + +. Необходимость анализа очевидна — ведь стандартные шрифты фирмы Borland не содержат символов кириллицы, и поэтому отечественные программисты либо вообще отказываются от использования векторных шрифтов, либо переводят сообщения на английский язык, что, согласитесь, не всегда удобно. Познакомившись с несложными соглашениями, по которым конструируются CHR— файлы, Вы затем сможете создать собственную версию генератора (редактора) векторных шрифтов или воспользоваться программой, приводимой в прил.ПЗ, чтобы вставить в стандартные шрифты кириллицу. Существует профессиональный пакет Borland BGI Toolkit, в состав которого включен более мощный редактор FE.EXE. Любой CHR—файл. состоит из пяти частей: заголовка, блока параметров, таблицы смещений, таблицы ширин, блока векторных команд. Структура файла показана в таблице 1.1. Таблица 1.1 Структура CHR-файла
Поле FontFileID открывает любой CHR—файл и всегда содержит символы 'РК'#8#8, которые служат для определения корректности файла. Символы ' РК' — это инициалы Филиппа Кана (Philip Kahn) — основателя фирмы Borland. Два следующих за ними символа #8 («Забой») стирают эти инициалы при выводе содержимого файла на экран командой Type, поэтому на экране будет видна только последовательность символов из массива Copyright, в котором содержатся название шрифта и объявление авторских прав фирмы Borland. Д^ина массива Copyright в принципе может быть произвольной (во всех четырех стандартных шрифтах это г массив имеет одинаковую длину — 83 байта), т.к. он всегда заканчивается полем CopyrightEnd, содержащим символ #26 (#$1А) — конец файла. Сразу за полем CopyrightEnd следует двухбайтное поле HeaderSize, содержащее длину заголовка в байтах плюс 1 (в стандартных шрифтах это поле имеет значение 128). Поле FontName содержит четырехбуквенное название шрифта; это название передается процедуре InstallUserFont и должно совпадать с именем CHR— файла. Двухбайтное поле FileSize содержит длину CHR— файла за вычетом длины заголовка, т.е. оно равно FileSize(File)- HeaderSize. Трехбайтное поле FontVersion в стандартных шрифтах содержит значения 1, 0, 1 и, по всей видимости, означает номер версии шрифта. При разработке собственных шрифтов лучше сохранить это поле таким же, как в стандартных шрифтах. Остальная часть заголовка не имеет значения и может быть произвольной. Поле ParPrefix отстоит на HeaderSize байт от начала файла (в стандартных шрифтах — на 128 байт). Оно открывает блок параметров шрифта и всегда содержит символ '+'. В поле CharsCount указывается общее количество символов, начертания которых определены в CHR— файле, а в FirstChar — код первого определенного символа. Совокупность полей CharsCount и FirstChar задают диапазон кодов символов; в стандартных шрифтах они обычно содержат значения 32 и 223, что означает, что эти шрифты определяют начертания ASCII— символов, начиная с #32 (Пробел) и до символа # 254 включительно. Поле DataOffset содержит расстояние в байтах от поля ParPrefix до поля FirstData. Его значение определяется по формуле DataOffset = 16+3*CharsCount, в которой слагаемое 16 учитывает мину блока параметров, a Z'CharsCount — длину двух таблиц, следующих сразу за блоком параметров. Для стандартных шрифтов из файлов Trip, Goth и Litt это поле содержит 16 + 3*223 = 685 (для этих шрифтов CharsCount = 254-32+1 = 223). Поле FillFlag содержит так называемый флаг заливки символов: если он сброшен (имеет нулевое значение), процедуры OutText и OutTextXY вы — водят только векторный «скелет» каждого символа, а при ненулевом значении заливают его текущим рисунком заполнения (устанавливается процедурой SetFillStyle). Поскольку контуры многих символов незамкнуты, заливка может разлиться по всему экрану, поэтому в стандартных шрифтах это поле всегда имеет значение 0. Поле UpperMargin содержит максимальное, a LowerMargin — минимальное значение локальных координат для оси У. Локальные вертикальные координаты векторных команд могут иметь значения в диапазоне от —64 до +63 (см. ниже). Таким образом, эти поля определяют максимальный вертикальный размер любого символа: поле UpperMargin задает высоту от базовой линии до верхнего края самого высокого символа шрифта, а поле LowerMargin обычно содержит отрицательное значение типа Shortint, показывающее, насколько ниже базовой линии может располагаться нижний край любого символа. Остальные поля блока параметров не используются и содержат нули. Сразу за блоком параметров начинается таблица смещений Offsets. Эта таблица содержит CharsCount двухбайтных слов — по одному слову на каждый символ. В ней указывается, на каком расстоянии от поля FirstData содержится начало векторных команд каждого символа. Самый первый элемент таблицы всегда содержит 0. Разница в смещениях между соседними элементами определяет длину векторных команд для очередного символа, например, разница между вторым и первым элементами — длину командной последовательности (в байтах) для первого символа, между третьим и вторым — для второго элемента и т.д. Для последнего символа эта длина определяется разницей между полями FileSize и последним элементом таблицы. Если Вы не загружаете весь файл в память, Вам понадобится построить свою таблицу значений длин командных последовательностей, чтобы, по мере н_адобности, динамически подкачивать эти данные с диска, как это сделано в процедуре OutString модуля F_GrText [см. п.1.3.4). Поле Widths длиной CharsCount байт содержит таблицу ширин, в которой указывается ширина (длина по оси X) каждого символа. Обычно каждый символ выравнивается влево относительно локальных координат, поэтому его ширина в таблице должна задавать также небольшое меж— символьное расстояние справа от него, чтобы символы не сливались друг с другом. Поле FirstData определяет начало векторных команд, используемых для вычерчивания первого символа. Каждая векторная команда занимает одно двухбайтное слово и содержит локальные координаты и собственно команду (см. рис. 1.3). Поскольку локальные координаты определены в диапазоне от —64 до +63, для "их представления используется 7 младших разрядов каждого байта, в то время как старшие разряды А и В определяют код команды (табл. 1.2). Таблица 1.2 _________Векторные команды________
Как правило, последовательность векторов начинается командой 01, по которой воображаемое «перо» в поднятом состоянии переводится к началу самого первого вычерчиваемого вектора. Заканчивается последователь— Текстовый ввод/вывод в графическом режиме 23 ность командой 00, в которой координаты Х и У игнорируются, поэтому обычно это — команда $0000. Непосредственно перед ней часто указывается команда Widths [N]+$80, что означает установку «пера» на горизонтальной оси на расстоянии ширины символа от начала координат. То положение, которое «перо» заняло в конце вычерчивания предыдущего символа, автоматически становится началом локальных координат для векторных команд следующего символа. Если не перевести перо в самый правый край предыдущего символа, следующий за ним символ может частично или полностью перекрыть предыдущий символ, а если при этом вертикальная координата не равна нулю, символы будут вычерчиваться «лесенкой».
а)
б) Рис. 1.3. К определению векторных команд: а) структура команды; б) вертикальные координаты символов Координата Х определяет обычную декартовую координату по оси абсцисс и всегда имеет значение в диапазоне от 0 до Widths [N] (Widths [N] — ширина символа в таблице ширин). Координата У может задавать как положительные, так и отрицательные значения, поскольку нижняя кромка символа (поле LowerMargin} может располагаться ниже координаты У=0 («хвостики» у букв р, q, g и т.п.). Поэтому при опреде— лении координаты У используется следующее соглашение: если У<=63, координата используется так, как она задана в команде, в противном случае она определяется разницей У— 128. В прил.П! приводится текст относительно несложной программы, с помощью которой Вы сможете разработать собственные векторные символы и включить их в стандартные CHR — файлы. |
(с)Все права защищены По всем интересующим вопросам прошу писать на электронный адрес |