288____________ ____ __ _________________________Приложение

Leng[LastChar] := FileSize(F)-

Offs[LastChar-1]-ParOffs end;

{Формируем список описателей} if FontNumb=0 then

FontList := PD {Список был пустым} else

begin {Ищем конец списка} Р := FontList; {Начало списка} while P^NextFontONIL do

Р := P^.NextFont; {Next^NIL - конец} P^NextFont :» PD end;

inc(FontNumb)i RegisterChrFile := FontHumb end; {RegisterChrFile} ^_————.———————_

Function RegisterCHRFont(Font: Pointer): Integer;

{Регистрирует векторный шрифт, загруженный в память по адресу Font, и возвращает порядковый номер шрифта}

type

TByte = array [0..65534] of Byte;

var

PH: "THead;

PP: "TFontPara;

PB: "TByte absolute PH;

P,PD: PFontDesc;

k: Integer;

ParOffset: Word;

FileSize: Word;

begin

{Проверяем начало заголовка} PH Font;

RegisterChrFont := -Si-if PH^oHeadO then

Exit; {Нет поля 'РК'#8#8} k := 4 у {Ищем CopynghtEnd} while (PB''[k]o$lA) and (k<256) do

inc(k);

if PB^[k]o$lA then

Exit; /Яе нашли терминатор в 256 байтах} {Проверяем блок параметров} ParOffset := РВ^+И+РВ"^-!^] shi 8;

FileSize := PB'^ [k+7]^-PBЛ [k+8] shi 8;

PP :» AddrtPB^[ParOffset]);

if PPA.ParPrefix<>'+^ then

Exit; {Нет префикса параметров} {Резервируем память для описателя} RegisterChrFont :» -3;

if MaxAvail<SizeOf(TFontDesc) then

Exit; /йег памяти для регистрации} New(PD) ;

{Формируем новый дескриптор} with PD^PP^ do

begin

NextFont := 11IL;

NFont := FontNumb+1;

Name.Flag := 0; {Шрифт - в памяти)