22 Глава 1
от —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, по которой воображаемое «перо» в поднятом состоянии переводится к началу самого первого вычерчиваемого вектора. Заканчивается последователь—