PRIVATE CONST HBorder = 5, VBorder = HBorder - 5; PRIVATE PROC RectCWH(c, w, h) IS VAR v = (w / 2, -h / 2) IN Shape.Rect(R2.Minus(c, v), R2.Plus(c, v)) END END; (* Add a rectangle centered about "c" with width "w" and height "h" to the current path. *) PROC BoxedText(c, txt) IS TypeLinesC.Center(c, txt); VAR w, h, l IN l := TextList.FromText(txt); w, h := TextList.Size(l); h := h + 2 * VBorder; w := w + h / 2; OvalCWH(c, w + 5, h) END; PS.Stroke() END; PRIVATE PROC OvalEnd(c) IS VAR a IN a := PS.CurrentPoint(); VAR b = Geometry.HorVer(c, a) IN Shape.QCircleCC(b); Shape.QCircleCC(b) END END END; PRIVATE PROC Oval2(c, a) IS IF VAR d = (-1, 0) REL (c, a) IN PS.MoveTo(a); OvalEnd(c); PS.LineTo(d); OvalEnd(c); PS.Close() END FI END; PRIVATE FUNC c = F(a, b) IS c ~ (0, 1) REL (a, b) AND c HOR a AND (c, a) CONG (a, b) END; PROC HorOval(a, c) IS IF VAR b = F(c, d), d = Geometry.HorVer(a, c) IN Oval2(a, b) END FI END; PRIVATE PROC OvalCWH(c, w, h) IS w := MAX(w, h); HorOval(c, R2.Plus(c, (-w / 2, h / 2))) END;