-- file: MFTFMImpl.mesa
-- Pascal-to-Mesa translator output, translated at October 31, 1985 4:28:02 pm PST


DIRECTORY
  PascalBasic,
  PascalWizardFiles,
  MFTypes,
  MFProcArray,
  MFInteraction,
  MFMath,
  MFMemory,
  MFSymbols,
  MFTFM;

MFTFMImpl: PROGRAM IMPORTS PascalBasic, PascalWizardFiles, MFProcArray, MFInteraction, MFMath, MFMemory, MFSymbols EXPORTS MFTFM = PUBLIC
BEGIN OPEN PascalBasic, PascalWizardFiles, MFTypes, MFProcArray, MFInteraction, MFMath, MFMemory, MFSymbols, MFTFM;
--:1083----1086:--
TfmFile: ByteFile;


MetricFileName: StrNumber;
--:1086----1095:--
Bc: EightBits;

Ec: EightBits;

TfmWidth: LONG POINTER TO ARRAY EightBits OF Scaled ← PascalStaticZone.NEW[ARRAY EightBits OF Scaled];

TfmHeight: LONG POINTER TO ARRAY EightBits OF Scaled ← PascalStaticZone.NEW[ARRAY EightBits OF Scaled];

TfmDepth: LONG POINTER TO ARRAY EightBits OF Scaled ← PascalStaticZone.NEW[ARRAY EightBits OF Scaled];

TfmItalCorr: LONG POINTER TO ARRAY EightBits OF Scaled ← PascalStaticZone.NEW[ARRAY EightBits OF Scaled];

CharExists: LONG POINTER TO ARRAY EightBits OF PascalBoolean ← PascalStaticZone.NEW[ARRAY EightBits OF PascalBoolean];

CharTag: LONG POINTER TO ARRAY EightBits OF PascalInteger[0..3] ← PascalStaticZone.NEW[ARRAY EightBits OF PascalInteger[0..3]];

CharRemainder: LONG POINTER TO ARRAY EightBits OF EightBits ← PascalStaticZone.NEW[ARRAY EightBits OF EightBits];

HeaderByte: LONG POINTER TO ARRAY PascalInteger[1..100] OF PascalInteger[-1..255] ← PascalStaticZone.NEW[ARRAY PascalInteger[1..100] OF PascalInteger[-1..255]];

LigKern: LONG POINTER TO ARRAY PascalInteger[0..300] OF FourQuarters ← PascalStaticZone.NEW[ARRAY PascalInteger[0..300] OF FourQuarters];

Nl: PascalInteger[0..LigTableSize];

Kern: LONG POINTER TO ARRAY EightBits OF Scaled ← PascalStaticZone.NEW[ARRAY EightBits OF Scaled];

Nk: PascalInteger[0..256];

Exten: LONG POINTER TO ARRAY EightBits OF FourQuarters ← PascalStaticZone.NEW[ARRAY EightBits OF FourQuarters];

Ne: PascalInteger[0..256];

Param: LONG POINTER TO ARRAY PascalInteger[1..50] OF Scaled ← PascalStaticZone.NEW[ARRAY PascalInteger[1..50] OF Scaled];

Np: PascalInteger[0..MaxFontDimen];


Nw: PascalInteger[0..256];

Nh: PascalInteger[0..256];

Nd: PascalInteger[0..256];

Ni: PascalInteger[0..256];
--:1095----1118:--
Perturbation: Scaled;
--:1118----1124:
DimenHead: LONG POINTER TO ARRAY PascalInteger[1..4] OF Halfword ← PascalStaticZone.NEW[ARRAY PascalInteger[1..4] OF Halfword];
--:1124----1129:--
MaxTfmDimen: Scaled;


TfmChanged: PascalInteger;
 SortIn: PROCEDURE[V: Scaled] RETURNS[SortInResult: Halfword] = 
BEGIN  P, Q, R:Halfword;
 P←49999;{WHILE TRUE DO BEGIN Q←Mem[P]↑.Hh.Rh;
IF V<=Mem[ INT[Q]+1]↑.Int  THEN  GOTO Label40;P←Q; END ENDLOOP ;
EXITS Label40 => NULL};IF V<Mem[ INT[Q]+1]↑.Int  THEN BEGIN R←GetNode[2];Mem[ INT[R]+1]↑.Int←V;
Mem[R]↑.Hh.Rh←Q;Mem[P]↑.Hh.Rh←R; END;SortInResult←Mem[P]↑.Hh.Rh; END;--:1116
--1117:-- MinCover: PROCEDURE[D: Scaled] RETURNS[MinCoverResult: PascalInteger] = 
BEGIN P:Halfword;L:Scaled;
M:PascalInteger; M←0;P←Mem[49999]↑.Hh.Rh;Perturbation←2147483647;
WHILE P#19 DO BEGIN M←M+1;L←Mem[ INT[P]+1]↑.Int;DO P←Mem[P]↑.Hh.Rh;
 IF Mem[ INT[P]+1]↑.Int>L+D THEN EXIT; ENDLOOP;
IF Mem[ INT[P]+1]↑.Int-L<Perturbation  THEN Perturbation←Mem[ INT[P]+1]↑.Int-L; END ENDLOOP ;
MinCoverResult←M; END;--:1117----1119:-- Threshold: PROCEDURE[M: PascalInteger] RETURNS[ThresholdResult: Scaled]
 = 
BEGIN D:Scaled;
 IF MinCover[0]<=M  THEN ThresholdResult←0  ELSE BEGIN DO D←
Perturbation; IF MinCover[D+D]<=M THEN EXIT; ENDLOOP;
WHILE MinCover[D]>M DO D←Perturbation ENDLOOP ;ThresholdResult←D; END; END;--:1119
--1120:-- Skimp: PROCEDURE[M: PascalInteger] RETURNS[SkimpResult: PascalInteger] = 
BEGIN D:Scaled;P, Q, R:Halfword;
L:Scaled;V:Scaled; D←Threshold[M];Perturbation←0;Q←49999;M←0;
P←Mem[49999]↑.Hh.Rh;WHILE P#19 DO BEGIN M←M+1;L←Mem[ INT[P]+1]↑.Int;
Mem[P]↑.Hh.Lh←M;IF Mem[ INT[Mem[P]↑.Hh.Rh]+1]↑.Int<=L+D  THEN--1121:
BEGIN DO P←Mem[P]↑.Hh.Rh;Mem[P]↑.Hh.Lh←M;
 IF Mem[ INT[Mem[P]↑.Hh.Rh]+1]↑.Int>L+D THEN EXIT; ENDLOOP;V← PascalDIVPower2[(L+Mem[ INT[P]+1]↑.Int),1];
IF Mem[ INT[P]+1]↑.Int-V>Perturbation  THEN Perturbation←Mem[ INT[P]+1]↑.Int-V;R←Q;
DO R←Mem[R]↑.Hh.Rh;Mem[ INT[R]+1]↑.Int←V; IF R=P THEN EXIT; ENDLOOP;Mem[Q]↑.Hh.Rh←P;
 END--:1121--;Q←P;P←Mem[P]↑.Hh.Rh; END ENDLOOP ;SkimpResult←M; END;--:1120----1122:
 TfmWarning: PROCEDURE[M: SmallNumber] = 
BEGIN PrintNl[898];
Print[IntName↑[M]];Print[899];PrintScaled[Perturbation];Print[900]; END;
--:1122----1127:-- FixDesignSize: PROCEDURE = 
BEGIN D:Scaled;
 D←Internal↑[26];
IF(D<65536)OR (D>=134217728) THEN BEGIN IF D#0  THEN PrintNl[901];
D←8388608;Internal↑[26]←D; END;
IF  INT[HeaderByte↑[5]]<0  THEN IF  INT[HeaderByte↑[6]]<0  THEN IF  INT[HeaderByte↑[7]]<0
 THEN IF  INT[HeaderByte↑[8]]<0  THEN BEGIN HeaderByte↑[5]← PascalDIVPower2[D ,20];
HeaderByte↑[6]← PascalMODPower2Mask[( PascalDIVPower2[D ,12]),255];HeaderByte↑[7]← PascalMODPower2Mask[( PascalDIVPower2[D ,4]),255];
HeaderByte↑[8]←( PascalMODPower2Mask[D ,15])*16; END;
MaxTfmDimen← 16*Internal↑[26]-PascalDIVPower2[Internal↑[26],21];
IF MaxTfmDimen>=134217728  THEN MaxTfmDimen←134217727; END;--:1127
--1128:-- DimenOut: PROCEDURE[X: Scaled] RETURNS[DimenOutResult: PascalInteger]
 = 
BEGIN IF ABS[X]>MaxTfmDimen  THEN BEGIN TfmChanged←TfmChanged+1;
IF X>0  THEN X←16777215  ELSE X←-16777215;
 END  ELSE X←MakeScaled[X*16,Internal↑[26]];DimenOutResult←X; END;--:1128
--1130:-- FixCheckSum: PROCEDURE = 
BEGIN  K:EightBits;
B1, B2, B3, B4:EightBits;X:PascalInteger;
 {IF  INT[HeaderByte↑[1]]<0  THEN IF  INT[HeaderByte↑[2]]<0  THEN IF  INT[HeaderByte↑[3
]]<0  THEN IF  INT[HeaderByte↑[4]]<0  THEN BEGIN--1131:--B1←Bc;B2←Ec;B3←Bc;
B4←Ec;TfmChanged←0;
FOR i:INT    IN [ INT[Bc ].. INT[Ec ]] DO  K ← i; IF CharExists↑[K] THEN BEGIN X←DimenOut[Mem[
TfmWidth↑[K]+1]↑.Int]+(K+4)*4194304;B1← (B1+B1+X)MOD 255;
B2← (B2+B2+X)MOD 253;B3← (B3+B3+X)MOD 251;B4← (B4+B4+X)MOD 247;
 END--:1131-- ENDLOOP;HeaderByte↑[1]←B1;HeaderByte↑[2]←B2;HeaderByte↑[3]←B3;
HeaderByte↑[4]←B4; GOTO Label10; END;
FOR i:INT    IN [ INT[1 ].. INT[4 ]] DO  K ← i; IF  INT[HeaderByte↑[K]]<0  THEN HeaderByte↑[K]←0 ENDLOOP;EXITS Label10 => NULL}; END;
--:1130----1132:-- TfmTwo: PROCEDURE[X: PascalInteger]
 = 
BEGIN  {grossExprHack:EightBits ← PascalDIVPower2[X ,8]; PascalWriteLong[file: @TfmFile.baseFile, length: SIZE[EightBits, 2], element: @TfmFile.element, item: @grossExprHack]}; {grossExprHack:EightBits ← PascalMODPower2Mask[X ,255]; PascalWriteLong[file: @TfmFile.baseFile, length: SIZE[EightBits, 2], element: @TfmFile.element, item: @grossExprHack]}; END;
 TfmFour: PROCEDURE[X: PascalInteger]
 = 
BEGIN IF X>=0  THEN  {grossExprHack:EightBits ← PascalDIVPower2[X ,24]; PascalWriteLong[file: @TfmFile.baseFile, length: SIZE[EightBits, 2], element: @TfmFile.element, item: @grossExprHack]} ELSE BEGIN X←X
+1073741824;X←X+1073741824;{grossExprHack:EightBits ← ( PascalDIVPower2[X ,24])+128; PascalWriteLong[file: @TfmFile.baseFile, length: SIZE[EightBits, 2], element: @TfmFile.element, item: @grossExprHack]}; END;
X← PascalMODPower2Mask[X ,16777215]; {grossExprHack:EightBits ← PascalDIVPower2[X ,16]; PascalWriteLong[file: @TfmFile.baseFile, length: SIZE[EightBits, 2], element: @TfmFile.element, item: @grossExprHack]};X← PascalMODPower2Mask[X ,65535];
 {grossExprHack:EightBits ← PascalDIVPower2[X ,8]; PascalWriteLong[file: @TfmFile.baseFile, length: SIZE[EightBits, 2], element: @TfmFile.element, item: @grossExprHack]}; {grossExprHack:EightBits ← PascalMODPower2Mask[X ,255]; PascalWriteLong[file: @TfmFile.baseFile, length: SIZE[EightBits, 2], element: @TfmFile.element, item: @grossExprHack]}; END;
 TfmQqqq: PROCEDURE[X: FourQuarters] = 
BEGIN {grossExprHack:EightBits ← X.B0; PascalWriteLong[file: @TfmFile.baseFile, length: SIZE[EightBits, 2], element: @TfmFile.element, item: @grossExprHack]};
{grossExprHack:EightBits ← X.B1; PascalWriteLong[file: @TfmFile.baseFile, length: SIZE[EightBits, 2], element: @TfmFile.element, item: @grossExprHack]};{grossExprHack:EightBits ← X.B2; PascalWriteLong[file: @TfmFile.baseFile, length: SIZE[EightBits, 2], element: @TfmFile.element, item: @grossExprHack]};{grossExprHack:EightBits ← X.B3; PascalWriteLong[file: @TfmFile.baseFile, length: SIZE[EightBits, 2], element: @TfmFile.element, item: @grossExprHack]}; END;

END.