-- file: MFEnvelopesImpl5.mesa -- Pascal-to-Mesa translator output, translated at October 31, 1985 4:28:01 pm PST DIRECTORY PascalBasic, PascalWizardFiles, MFTypes, MFProcArray, MFMath, MFMemory, MFSymbols, MFInteraction, MFEdges, MFOctants, MFContours, MFEnvelopes; MFEnvelopesImpl5: PROGRAM IMPORTS PascalBasic, MFProcArray, MFMath, MFMemory, MFSymbols, MFInteraction, MFEdges, MFOctants, MFContours, MFEnvelopes EXPORTS MFEnvelopes = PUBLIC BEGIN OPEN PascalBasic, PascalWizardFiles, MFTypes, MFProcArray, MFMath, MFMemory, MFSymbols, MFInteraction, MFEdges, MFOctants, MFContours, MFEnvelopes; OffsetPrep: PROCEDURE[C,H: Halfword] = BEGIN N:Halfword; P, Q, R, Lh, Ww:Halfword;K:Halfword;W:Halfword;--495: X0, X1, X2, Y0, Y1, Y2:PascalInteger;T0, T1, T2:PascalInteger;Du, Dv, Dx, Dy:PascalInteger; MaxCoef:PascalInteger;X0a, X1a, X2a, Y0a, Y1a, Y2a:PascalInteger;T:Fraction;S:Fraction; --:495-- P_C;N_Mem[H]^.Hh.Lh;Lh_Mem[H]^.Hh.Rh; WHILE Mem[P]^.Hh.B1#0 DO BEGIN Q_Mem[P]^.Hh.Rh;--494: IF INT[N]<=1 THEN Mem[P]^.Hh.B1_1 ELSE BEGIN--496: X0_Mem[ INT[P]+5]^.Int-Mem[ INT[P]+1]^.Int;X2_Mem[ INT[Q]+1]^.Int-Mem[ INT[Q]+3]^.Int; X1_Mem[ INT[Q]+3]^.Int-Mem[ INT[P]+5]^.Int;Y0_Mem[ INT[P]+6]^.Int-Mem[ INT[P]+2]^.Int; Y2_Mem[ INT[Q]+2]^.Int-Mem[ INT[Q]+4]^.Int;Y1_Mem[ INT[Q]+4]^.Int-Mem[ INT[P]+6]^.Int; MaxCoef_ABS[X0];IF ABS[X1]>MaxCoef THEN MaxCoef_ABS[X1]; IF ABS[X2]>MaxCoef THEN MaxCoef_ABS[X2]; IF ABS[Y0]>MaxCoef THEN MaxCoef_ABS[Y0]; IF ABS[Y1]>MaxCoef THEN MaxCoef_ABS[Y1]; IF ABS[Y2]>MaxCoef THEN MaxCoef_ABS[Y2];{IF MaxCoef=0 THEN GOTO Label45; WHILE MaxCoef<268435456 DO BEGIN MaxCoef_MaxCoef+MaxCoef;X0_X0+X0; X1_X1+X1;X2_X2+X2;Y0_Y0+Y0;Y1_Y1+Y1;Y2_Y2+Y2; END--:496-- ENDLOOP ;--501: Dx_X0;Dy_Y0;IF Dx=0 THEN IF Dy=0 THEN BEGIN Dx_X1;Dy_Y1; IF Dx=0 THEN IF Dy=0 THEN BEGIN Dx_X2;Dy_Y2; END; END--:501--; IF Dx=0 THEN--505: FinOffsetPrep[P,N,Mem[Mem[Lh]^.Hh.Lh]^.Hh.Lh,-X0,-X1,-X2,-Y0,-Y1,-Y2, FALSE,N]--:505-- ELSE BEGIN--502:-- --503:-- K_1;W_Mem[Lh]^.Hh.Rh; {WHILE TRUE DO BEGIN IF K=N THEN GOTO Label30;Ww_Mem[W]^.Hh.Rh; IF AbVsCd[Dy,ABS[Mem[ INT[Ww]+1]^.Int-Mem[ INT[W]+1]^.Int],Dx,ABS[Mem[ INT[Ww]+2]^.Int-Mem[ INT[W]+2]^.Int]]>=0 THEN BEGIN K_ INT[K]+1;W_Ww; END ELSE GOTO Label30; END ENDLOOP ;EXITS Label30 => NULL};--:502--IF K=1 THEN T_268435457 ELSE BEGIN Ww_Mem[W]^.Hh.Lh;--498: Du_Mem[ INT[Ww]+1]^.Int-Mem[ INT[W]+1]^.Int;Dv_Mem[ INT[Ww]+2]^.Int-Mem[ INT[W]+2]^.Int; IF ABS[Du]>=ABS[Dv] THEN BEGIN S_MakeFraction[Dv,Du]; T0_TakeFraction[X0,S]-Y0;T1_TakeFraction[X1,S]-Y1; T2_TakeFraction[X2,S]-Y2; END ELSE BEGIN S_MakeFraction[Du,Dv]; T0_X0-TakeFraction[Y0,S];T1_X1-TakeFraction[Y1,S]; T2_X2-TakeFraction[Y2,S]; END--:498--;T_CrossingPoint[-T0,-T1,-T2]; END; IF T>=268435456 THEN FinOffsetPrep[P,K,W,X0,X1,X2,Y0,Y1,Y2,TRUE,N] ELSE BEGIN SplitForOffset[P,T];R_Mem[P]^.Hh.Rh; X1a_X0-TakeFraction[X0-X1,T];X1_X1-TakeFraction[X1-X2,T]; X2a_X1a-TakeFraction[X1a-X1,T];Y1a_Y0-TakeFraction[Y0-Y1,T]; Y1_Y1-TakeFraction[Y1-Y2,T];Y2a_Y1a-TakeFraction[Y1a-Y1,T]; FinOffsetPrep[P,K,W,X0,X1a,X2a,Y0,Y1a,Y2a,TRUE,N];X0_X2a;Y0_Y2a; T1_T1-TakeFraction[T1-T2,T];IF T1<0 THEN T1_0; T_CrossingPoint[0,T1,T2];IF T<268435456 THEN--504: BEGIN SplitForOffset[R,T];X1a_X1-TakeFraction[X1-X2,T]; X1_X0-TakeFraction[X0-X1,T];X0a_X1-TakeFraction[X1-X1a,T]; Y1a_Y1-TakeFraction[Y1-Y2,T];Y1_Y0-TakeFraction[Y0-Y1,T]; Y0a_Y1-TakeFraction[Y1-Y1a,T]; FinOffsetPrep[Mem[R]^.Hh.Rh,K,W,X0a,X1a,X2,Y0a,Y1a,Y2,TRUE,N];X2_X0a; Y2_Y0a; END--:504--; FinOffsetPrep[R, INT[K]-1,Ww,-X0,-X1,-X2,-Y0,-Y1,-Y2,FALSE,N]; END--:503--; END; EXITS Label45 => NULL}; END--:494--;--492:--DO R_Mem[P]^.Hh.Rh; IF Mem[ INT[P]+1]^.Int=Mem[ INT[P]+5]^.Int THEN IF Mem[ INT[P]+2]^.Int=Mem[ INT[P]+6]^.Int THEN IF Mem[ INT[P]+1]^.Int=Mem[ INT[R]+3]^.Int THEN IF Mem[ INT[P]+2]^.Int=Mem[ INT[R]+4]^.Int THEN IF Mem[ INT[P]+1]^.Int=Mem[ INT[R]+1]^.Int THEN IF Mem[ INT[P]+2]^.Int=Mem[ INT[R]+2]^.Int THEN BEGIN RemoveCubic[P];IF R=Q THEN Q_P;R_P; END;P_R; IF P=Q--:492-- THEN EXIT; ENDLOOP; END ENDLOOP ; END; --:491----506:----510:-- SkewLineEdges: PROCEDURE[P,W,Ww: Halfword] = BEGIN X0, Y0, X1, Y1:Scaled; IF(Mem[ INT[W]+1]^.Int#Mem[ INT[Ww]+1]^.Int)OR (Mem[ INT[W]+2]^.Int#Mem[ INT[Ww]+2]^.Int) THEN BEGIN X0_Mem[ INT[P]+1]^.Int+Mem[ INT[W]+1]^.Int;Y0_Mem[ INT[P]+2]^.Int+Mem[ INT[W]+2]^.Int; X1_Mem[ INT[P]+1]^.Int+Mem[ INT[Ww]+1]^.Int;Y1_Mem[ INT[P]+2]^.Int+Mem[ INT[Ww]+2]^.Int; Unskew[X0,Y0,Octant];X0_CurX;Y0_CurY;Unskew[X1,Y1,Octant]; IF Internal^[10]>65536 THEN BEGIN PrintNl[452];PrintTwo[X0,Y0]; Print[451];PrintTwo[CurX,CurY];PrintNl[157]; END; LineEdges[X0,Y0,CurX,CurY]; END; END;--:510----518: --:506----527:-- MakeEllipse: PROCEDURE[MajorAxis,MinorAxis: Scaled, Theta: Angle] RETURNS[MakeEllipseResult: Halfword] = BEGIN P, Q, R, S:Halfword;H:Halfword; Alpha, Beta, Gamma, Delta:PascalInteger;C, D:PascalInteger;U, V:PascalInteger; Symmetric:PascalBoolean;--528:----530: IF(MajorAxis=MinorAxis)OR ( Theta MOD 94371840=0) THEN BEGIN Symmetric_ TRUE;Alpha_0;IF PascalODD[ Theta /94371840] THEN BEGIN Beta_MajorAxis; Gamma_MinorAxis;NSin_268435456;NCos_0; END ELSE BEGIN Beta_MinorAxis;Gamma_MajorAxis; END; END ELSE BEGIN Symmetric_FALSE;NSinCos[Theta]; Gamma_TakeFraction[MajorAxis,NSin]; Delta_TakeFraction[MinorAxis,NCos];Beta_PythAdd[Gamma,Delta]; Alpha_TakeFraction[TakeFraction[MajorAxis,MakeFraction[Gamma,Beta]] ,NCos]-TakeFraction[TakeFraction[MinorAxis,MakeFraction[Delta,Beta] ],NSin];Alpha_ PascalDIVPower2[(Alpha+32768),16]; Gamma_PythAdd[TakeFraction[MajorAxis,NCos],TakeFraction[MinorAxis ,NSin]]; END;Beta_ PascalDIVPower2[(Beta+32768),16]; Gamma_ PascalDIVPower2[(Gamma+32768),16];P_GetNode[7];Q_GetNode[7]; R_GetNode[7];IF Symmetric THEN S_0 ELSE S_GetNode[7];H_P; Mem[P]^.Hh.Rh_Q;Mem[Q]^.Hh.Rh_R;Mem[R]^.Hh.Rh_S;--529: IF Beta=0 THEN Beta_1;IF Gamma=0 THEN Gamma_1; IF Gamma<=ABS[Alpha] THEN IF Alpha>0 THEN Alpha_Gamma-1 ELSE Alpha_ 1-Gamma--:529--;Mem[ INT[P]+1]^.Int_-Alpha*32768;Mem[ INT[P]+2]^.Int_-Beta*32768; Mem[ INT[Q]+1]^.Int_Gamma*32768;Mem[ INT[Q]+2]^.Int_Mem[ INT[P]+2]^.Int; Mem[ INT[R]+1]^.Int_Mem[ INT[Q]+1]^.Int;Mem[ INT[P]+5]^.Int_0;Mem[ INT[Q]+3]^.Int_- INT[32768]; Mem[ INT[Q]+5]^.Int_32768;Mem[ INT[R]+3]^.Int_0;Mem[ INT[R]+5]^.Int_0;Mem[ INT[P]+6]^.Int_Beta; Mem[ INT[Q]+6]^.Int_Gamma;Mem[ INT[R]+6]^.Int_Beta;Mem[ INT[Q]+4]^.Int_Gamma+Alpha; IF Symmetric THEN BEGIN Mem[ INT[R]+2]^.Int_0;Mem[ INT[R]+4]^.Int_Beta; END ELSE BEGIN Mem[ INT[R]+2]^.Int_-Mem[ INT[P]+2]^.Int;Mem[ INT[R]+4]^.Int_Beta+Beta; Mem[ INT[S]+1]^.Int_-Mem[ INT[P]+1]^.Int;Mem[ INT[S]+2]^.Int_Mem[ INT[R]+2]^.Int; Mem[ INT[S]+3]^.Int_32768;Mem[ INT[S]+4]^.Int_Gamma-Alpha; END--:528--;--531: {WHILE TRUE DO BEGIN U_Mem[ INT[P]+5]^.Int+Mem[ INT[Q]+5]^.Int; V_Mem[ INT[Q]+3]^.Int+Mem[ INT[R]+3]^.Int;C_Mem[ INT[P]+6]^.Int+Mem[ INT[Q]+6]^.Int;--533: Delta_PythAdd[U,V]; IF MajorAxis=MinorAxis THEN D_MajorAxis ELSE BEGIN IF Theta=0 THEN BEGIN Alpha_U;Beta_V; END ELSE BEGIN Alpha_TakeFraction[U,NCos]+TakeFraction[V,NSin]; Beta_TakeFraction[V,NCos]-TakeFraction[U,NSin]; END; Alpha_MakeFraction[Alpha,Delta];Beta_MakeFraction[Beta,Delta]; D_PythAdd[TakeFraction[MajorAxis,Alpha],TakeFraction[MinorAxis, Beta]]; END;D_TakeFraction[D,Delta];Alpha_ABS[U];Beta_ABS[V]; IF Alpha0 THEN BEGIN IF Delta>Mem[ INT[R]+4]^.Int THEN Delta_Mem[ INT[R]+4]^.Int; IF Delta>=Mem[ INT[Q]+4]^.Int THEN--534:--BEGIN Delta_Mem[ INT[Q]+4]^.Int; Mem[ INT[P]+6]^.Int_C-Delta;Mem[ INT[P]+5]^.Int_U;Mem[ INT[Q]+3]^.Int_V; Mem[ INT[Q]+1]^.Int_Mem[ INT[Q]+1]^.Int-Delta*Mem[ INT[R]+3]^.Int; Mem[ INT[Q]+2]^.Int_Mem[ INT[Q]+2]^.Int+Delta*Mem[ INT[Q]+5]^.Int; Mem[ INT[R]+4]^.Int_Mem[ INT[R]+4]^.Int-Delta; END--:534-- ELSE--535: BEGIN S_GetNode[7];Mem[P]^.Hh.Rh_S;Mem[S]^.Hh.Rh_Q; Mem[ INT[S]+1]^.Int_Mem[ INT[Q]+1]^.Int+Delta*Mem[ INT[Q]+3]^.Int; Mem[ INT[S]+2]^.Int_Mem[ INT[Q]+2]^.Int-Delta*Mem[ INT[P]+5]^.Int; Mem[ INT[Q]+1]^.Int_Mem[ INT[Q]+1]^.Int-Delta*Mem[ INT[R]+3]^.Int; Mem[ INT[Q]+2]^.Int_Mem[ INT[Q]+2]^.Int+Delta*Mem[ INT[Q]+5]^.Int; Mem[ INT[S]+3]^.Int_Mem[ INT[Q]+3]^.Int;Mem[ INT[S]+5]^.Int_U;Mem[ INT[Q]+3]^.Int_V; Mem[ INT[S]+6]^.Int_C-Delta;Mem[ INT[S]+4]^.Int_Mem[ INT[Q]+4]^.Int-Delta; Mem[ INT[Q]+4]^.Int_Delta;Mem[ INT[R]+4]^.Int_Mem[ INT[R]+4]^.Int-Delta; END--:535--; END ELSE P_Q;--532:--{WHILE TRUE DO BEGIN Q_Mem[P]^.Hh.Rh; IF Q=0 THEN GOTO Label30; IF Mem[ INT[Q]+4]^.Int=0 THEN BEGIN Mem[P]^.Hh.Rh_Mem[Q]^.Hh.Rh; Mem[ INT[P]+6]^.Int_Mem[ INT[Q]+6]^.Int;Mem[ INT[P]+5]^.Int_Mem[ INT[Q]+5]^.Int;FreeNode[Q,7]; END ELSE BEGIN R_Mem[Q]^.Hh.Rh;IF R=0 THEN GOTO Label30; IF Mem[ INT[R]+4]^.Int=0 THEN BEGIN Mem[P]^.Hh.Rh_R;FreeNode[Q,7];P_R; END ELSE GOTO Label40; END; END ENDLOOP ;EXITS Label40 => NULL};--:532-- END ENDLOOP ;EXITS Label30 => NULL};--:531--IF Symmetric THEN--536: BEGIN S_0;Q_H;{WHILE TRUE DO BEGIN R_GetNode[7];Mem[R]^.Hh.Rh_S;S_R; Mem[ INT[S]+1]^.Int_Mem[ INT[Q]+1]^.Int;Mem[ INT[S]+2]^.Int_-Mem[ INT[Q]+2]^.Int; IF Q=P THEN GOTO Label31;Q_Mem[Q]^.Hh.Rh;IF Mem[ INT[Q]+2]^.Int=0 THEN GOTO Label31; END ENDLOOP ; EXITS Label31 => NULL};Mem[P]^.Hh.Rh_S;Beta_-Mem[ INT[H]+2]^.Int; WHILE Mem[ INT[P]+2]^.Int#Beta DO P_Mem[P]^.Hh.Rh ENDLOOP ;Q_Mem[P]^.Hh.Rh; END--:536--; --537:--IF Q#0 THEN BEGIN IF Mem[ INT[H]+5]^.Int=0 THEN BEGIN P_H; H_Mem[H]^.Hh.Rh;FreeNode[P,7];Mem[ INT[Q]+1]^.Int_-Mem[ INT[H]+1]^.Int; END;P_Q; END ELSE Q_P;R_Mem[H]^.Hh.Rh;DO S_GetNode[7];Mem[P]^.Hh.Rh_S; P_S;Mem[ INT[P]+1]^.Int_-Mem[ INT[R]+1]^.Int;Mem[ INT[P]+2]^.Int_-Mem[ INT[R]+2]^.Int; R_Mem[R]^.Hh.Rh; IF R=Q THEN EXIT; ENDLOOP;Mem[P]^.Hh.Rh_H--:537--;MakeEllipseResult_H; END; END.