felcdnbi программ_________. , . ________________________289

k := ParOffset+DataOffset;

Name.Addrs.sa :=. segtRB-^k]); {Адрес} Name.Addrs.oa := ofs (PB" [Ic]); [шрифта} FirstChr := FirstChar;

LastChar :=' FirstChar+CharsCount-1;

Height := UpperMargin;

Bottom := LowerMargin;

{Переносим таблицу смещений) k := ParOffset+DataOf?set-3*CharsCount;

Move(PB"W,0ffs[FirstChar],2*CharsCount) ;

{Формируем таблицу длин} for k := FirstChar to LastChar^l do Leng[k] := Offs{k+ll-0ffstk};

Leng[LastChar] := FileSize-Offs[LastChar-1] end;

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

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

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

Р := P^NextFont; {Sext=llIL - конец} P^-NextFont := PD end;

inc(FontNumb) ;

RegisterChrFont := FontNurob end; {RegisterCtirFont} /————————————;

Procedure OutString(S: String; Font: Integer; Angle: Integer; MX,MY: Real);

{Выводит с помощью векторного шрифта Font строку S с поворотом на угол Angle и с масштабными коэффициентами MX,UY) vac

х0,у0: Integer; (Начало очередного символа}

Ang: Real;

Procedure OutChar(var V);

{Выполняет векторные .команды V} var

Vec: array [1. .Maxlnt.1 of Word absolute V;

k,op: Word;

Procedure Coo(X,Y: Integer; var xx,yy: Integer);

{Осуществляет поворот координат X,Y на угол Angle и возвращает новые координаты хх,уу} var

г,a: Single;

begin

{Переводим в полярные координаты}

г :» sqrt(1.0*x*x+1.0*y*y);

if x=0 then if y<0 then 'а :=. -pi/2

else

a := pi/2

else

a := arctan(y/x);

a := a+Ang; {поворот координат}

{Вычисляем новые координаты)

уу := Round(r*sin(a));

хх := Round(r*cos(a)) end; {Coo} <-—"-——;