PRIVATE VAR Bar := Text.GetChar("|", 0); PRIVATE PROC res := FinishedText(txt) IS VAR last IN last := Text.Length(txt) - 1; IF Text.GetChar(txt, last) = Bar -> res := NIL | res := Bar FI END END; PRIVATE CONST YScale = 1.417, LineGap = 5, MaxSize = 20; PRIVATE PROC DrawLines(a, b) IS IF VAR ax, ay, bx, by, i = 0 IN a = (ax, ay) AND b = (bx, by) -> DO i <= MaxSize -> PS.MoveTo((ax, ay + i)); PS.LineTo((bx, ay + i)); i := i + LineGap OD; PS.Stroke() END FI END; PRIVATE CONST LetterGap = 2.5, Char = "G"; PRIVATE PROC DrawChars(a) IS IF VAR ax, ay, l = PS.FontSizes IN a = (ax, ay) -> SAVE PS IN PS.SetColor(Color.Red); DO l # NIL -> ax := ax + LetterGap; PS.SetFontSize(CAR(l)); PS.Type((ax, ay), Char); ax := ax + PS.StringWidth(Char); l := CDR(l) OD END END FI END; PROC ShowFace(a, b, txtName) IS DrawLines(a, b); IF FinishedText(txtName) # NIL -> PS.SetFontFace(txtName); DrawChars(a) | SKIP FI; PS.SetFontSize(PS.Big); Type.R(R2.Minus(a, (LetterGap, 0)), txtName) END; PROC ShowFaces(a, b) IS VAR l IN l := PS.FontFaces; DO l # NIL -> ShowFace(a, b, CAR(l)); a := R2.Minus(a, (0, MaxSize + 10)); l := CDR(l) OD END END; PROC Cmd0() IS IF VAR a ~ (170.7, 400.2), b ~ (256, 441.1) IN ShowFaces(a, b) END FI END;