TURBO PASCAL

Новости

Программы   

Turbo Pascal 

Игры

Документация   

Странности

FAQ

Ссылки

Форум

Гостевая книга

Рассылка

Благодарности

Об авторе

 

 

1.2. СТРУКТУРА CHR-ФАЙЛОВ ДЛЯ ВЕКТОРНЫХ ШРИФТОВ

В этом параграфе мы рассмотрим структуру CHR— файлов, т.е. файлов с расширением CHR, в которых поставляются векторные BGI— шрифты. Такие шрифты широко используются в различных программных продуктах фирмы Borland, в том числе — в компиляторах Турбо Паскаль, Турбо С,

Borland С + +. Необходимость анализа очевидна — ведь стандартные шрифты фирмы Borland не содержат символов кириллицы, и поэтому отечественные программисты либо вообще отказываются от использования векторных шрифтов, либо переводят сообщения на английский язык, что, согласитесь, не всегда удобно. Познакомившись с несложными соглашениями, по которым конструируются CHR— файлы, Вы затем сможете создать собственную версию генератора (редактора) векторных шрифтов или воспользоваться программой, приводимой в прил.ПЗ, чтобы вставить в стандартные шрифты кириллицу. Существует профессиональный пакет Borland BGI Toolkit, в состав которого включен более мощный редактор FE.EXE.

Любой CHR—файл. состоит из пяти частей: заголовка, блока параметров, таблицы смещений, таблицы ширин, блока векторных команд. Структура файла показана в таблице 1.1.

Таблица 1.1 Структура CHR-файла

 

Название поля

Смещение

Размер поля

Содержимое

FontPileID

о

4

'РК'#8#8

Copyright

2

0...253

Любое (кроме $1А)

CopyrightEnd

?

1

$1А

HeaderOffset

CopyrightEnd +1

2

HeaderSize

FontName

CopyrightEnd + 3

4

Название шрифта

FontSize

CopyrightEnd + 7

2

Длина загружаемой части шрифта

FontVersion

CopyrightEnd + 9

3

1

ParPrefix

? (Обычно 128)

1

'+'

CharsCount

ParPrefix+1

2

Количество символов в шрифте

Reservl

ParPrefix+3

1

Не используется

FirstChar

ParPrefix + 4

1

Код первого символа

DataOffset

ParPrefix + 5

2

FontStart— ParPrefix

FillFlag

ParPrefix+7

1

Флаг заполнения

UpperMargin

ParPrefix+8

1

Верхняя граница символа

Reserv2

ParPrefix+9

1

Не используется

LowerMargin

ParPrefix+10

1

Нижняя граница символа

Reserv3

ParPrefix +11

5

Не используется

Offsets

ParPrefix+16

2'[CharsCount]

Таблица смещений

Widths

ParPrefix+16+ 2'[CharsCount]

[CharsCount]

Таблица ширин

FirstData

ParPrefix+16+ 3'[CharsCount]

?

Образы символов

FontEnd

 

 

 


Поле 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 _________Векторные команды________

 

А

В

Команда

0

о

Конец образа символа

1

о

Не используется

о

1

Поднять «перо» и перевести его в точку Х,У

1

1

Опустить «перо» и вести его до точки X,Y


Как правило, последовательность векторов начинается командой 01, по которой воображаемое «перо» в поднятом состоянии переводится к началу самого первого вычерчиваемого вектора. Заканчивается последователь—

Текстовый ввод/вывод в графическом режиме 23

ность командой 00, в которой координаты Х и У игнорируются, поэтому обычно это — команда $0000. Непосредственно перед ней часто указывается команда Widths [N]+$80, что означает установку «пера» на горизонтальной оси на расстоянии ширины символа от начала координат. То положение, которое «перо» заняло в конце вычерчивания предыдущего символа, автоматически становится началом локальных координат для векторных команд следующего символа. Если не перевести перо в самый правый край предыдущего символа, следующий за ним символ может частично или полностью перекрыть предыдущий символ, а если при этом вертикальная координата не равна нулю, символы будут вычерчиваться «лесенкой».

h00231.jpg

а)

h00232.jpg

б)

Рис. 1.3. К определению векторных команд: а) структура команды;

б) вертикальные координаты символов

Координата Х определяет обычную декартовую координату по оси абсцисс и всегда имеет значение в диапазоне от 0 до Widths [N] (Widths [N] — ширина символа в таблице ширин). Координата У может задавать как положительные, так и отрицательные значения, поскольку нижняя кромка символа (поле LowerMargin} может располагаться ниже координаты У=0 («хвостики» у букв р, q, g и т.п.). Поэтому при опреде—

лении координаты У используется следующее соглашение: если У<=63, координата используется так, как она задана в команде, в противном случае она определяется разницей У— 128.

В прил.П! приводится текст относительно несложной программы, с помощью которой Вы сможете разработать собственные векторные символы и включить их в стандартные CHR — файлы.

 

Глава1

Оглавление

На первую страницу

Rambler's Top100 Rambler's Top100
PROext: Top 1000

(с)Все права защищены

По всем интересующим вопросам прошу писать на электронный адрес

Hosted by uCoz