DIRECTORY CDInstances, CDPolygons, CDTexts, CD, CDBasics, CDDefaultsExtras, CDIO, CDOps, Imager, ImagerPath, Rope, TokenIO; CDPolygonsImpl: CEDAR PROGRAM IMPORTS CD, CDInstances, CDBasics, CDDefaultsExtras, CDIO, CDOps, Imager, ImagerPath, Rope, TokenIO EXPORTS CDPolygons = BEGIN PolygonPtr: TYPE = CDPolygons.PolygonPtr; PolygonRec: TYPE = CDPolygons.PolygonRec; PList: TYPE = LIST OF CD.Position; pForPolygon: REF CD.ObjectClass = CD.RegisterObjectClass[$Polygon]; CopyList: PROC [points: PList] RETURNS [copy: PList_NIL, r: CD.Rect, leng: INT_0] = BEGIN min: CD.Position _ CDBasics.highposition; max: CD.Position _ CDBasics.minposition; FOR class: PList _ points, class.rest WHILE class#NIL DO leng _ leng+1; min _ CDBasics.MinPoint[min, class.first]; max _ CDBasics.MaxPoint[max, class.first]; ENDLOOP; FOR class: PList _ points, class.rest WHILE class#NIL DO copy _ CONS[CDBasics.SubPoints[class.first, min], copy]; ENDLOOP; r _ CDBasics.ToRect[min, max] END; CreatePolygon: PUBLIC PROC [points: LIST OF CD.Position, lev: CD.Layer] RETURNS [ob: CD.Object_NIL, offset: CD.Position_[0, 0]] = BEGIN pp: PolygonPtr = NEW[PolygonRec]; r: CD.Rect; leng: INT; [pp.points, r, leng] _ CopyList[points]; IF leng<3 THEN RETURN; pp.path _ ImagerPath.MoveTo[[pp.points.first.x, pp.points.first.y]]; FOR class: PList _ pp.points.rest, class.rest WHILE class#NIL DO pp.path _ ImagerPath.LineTo[pp.path, [class.first.x, class.first.y]]; ENDLOOP; ob _ NEW[CD.ObjectRep_[ size: CDBasics.MaxPoint[[1, 1], CDBasics.SizeOfRect[r]], layer: CDDefaultsExtras.PureLayer[lev], class: pForPolygon, specificRef: pp ]]; offset _ CDBasics.BaseOfRect[r]; END; Init: PROC [] = BEGIN pForPolygon.drawMe _ pForPolygon.quickDrawMe _ DrawMeForPolygon; --pForPolygon.showMeSelected _ ShowPolygonSelection; pForPolygon.hitInside _ HitInsidePolygon; pForPolygon.describe _ Describe; pForPolygon.internalRead _ ReadPolygon; pForPolygon.internalWrite _ WritePolygon; END; Length: PROC [points: LIST OF CD.Position] RETURNS [l: NAT _ 0] = BEGIN FOR class: LIST OF CD.Position _ points, class.rest WHILE class#NIL DO l _ l+1 ENDLOOP END; HitInsidePolygon: PROC [ob: CD.Object, hitRect: CD.Rect] RETURNS [yes: BOOL] = BEGIN yes _ CDBasics.Intersect[ob.class.interestRect[ob], hitRect]; END; DrawMeForPolygon: PROC [inst: CD.Instance, pos: CD.Position, orient: CD.Orientation, pr: CD.DrawRef] = BEGIN DrawPolygonInContext: PROC [context: Imager.Context, ob: CD.Object, layer: CD.Layer] = BEGIN Imager.MaskFillTrajectory[context, NARROW[ob.specificRef, PolygonPtr].path, TRUE]; END; pr.drawContext[pr, DrawPolygonInContext, inst.ob, pos, orient, inst.ob.layer] END; Describe: PROC[me: CD.Object] RETURNS [Rope.ROPE] = BEGIN RETURN [Rope.Concat["polygon ", CDOps.LayerName[me.layer]]] END; WritePolygon: CD.InternalWriteProc -- PROC [me: Object] -- = BEGIN pp: PolygonPtr = NARROW[me.specificRef]; l: NAT _ Length[pp.points]; CDIO.WriteLayer[me.layer]; TokenIO.WriteInt[l]; FOR class: PList _ pp.points, class.rest WHILE class#NIL DO TokenIO.WriteInt[class.first.x]; TokenIO.WriteInt[class.first.y]; ENDLOOP END; ReadPolygon: CD.InternalReadProc --PROC [] RETURNS [Object]-- = BEGIN ob: CD.Object; lev: CD.Layer = CDIO.ReadLayer[]; leng: INT = TokenIO.ReadInt[]; points: PList _ NIL; FOR i: INT IN [1..leng] DO class: CD.Position; class.x _ TokenIO.ReadInt[]; class.y _ TokenIO.ReadInt[]; points _ CONS[class, points]; ENDLOOP; ob _ CreatePolygon[points, lev].ob; RETURN [ob] END; Init[]; END. žCDPolygonsImpl.mesa Copyright c 1985 by Xerox Corporation. All rights reserved. by Christian Jacobi, March 30, 1985 12:19:40 pm PST last edited by Christian Jacobi, June 11, 1985 10:06:47 am PDT --Works only after Cedar 6 because of crazy colors ShowPolygonSelection: PROC [inst: CD.Instance, pos: CD.Position, orient: CD.Orientation, pr: CD.DrawRef] = BEGIN DrawPolygonInContext: PROC [context: Imager.Context, ob: CD.Object, layer: CD.Layer] = BEGIN context.DrawStroke[path: NARROW[ob.specificRef, PolygonPtr].path, closed: TRUE]; END; pr.drawContext[pr, DrawPolygonInContext, inst.ob, pos, orient, 0] END; --is sick IF yes THEN { pp: PolygonPtr = NARROW[inst.ob.specificRef]; cont: Imager.Context _ Imager.NewContext[]; r: CD.Rect _ hitRect; Imager.ClipArea[cont, pp.path]; Imager.ClipBox[cont, Imager.Box[xmin: r.x1, ymin: r.y1, xmax: r.x2, ymax: r.y2]]; yes _ Imager.Visible[cont]; cont _ NIL; }; --reorder?? ΚN˜šœ™Jšœ Οmœ1™™>—J™šΟk ˜ Jšœ ˜ Jšœ ˜ J˜Jšžœ˜Jšœ ˜ Jšœ˜Jšœ˜Jšœ˜Jšœ˜Jšœ ˜ Jšœ˜Jšœ˜J˜—šΟbœžœžœ˜Jšžœžœ)žœ*˜cJšžœ ˜—Jšž˜Jšœ žœ˜)Jšœ žœ˜)Jš œžœžœžœžœ ˜"J˜Jšœ žœžœ˜CJ˜š Οnœžœžœžœžœ žœ˜SJšž˜Jšœžœ"˜)Jšœžœ!˜(šžœ#žœžœžœ˜9Jšœ˜Jšœ*˜*Jšœ*˜*Jšžœ˜—šžœ#žœžœžœ˜9Jšœžœ-˜8Jšžœ˜—Jšœ˜Jšž˜—J˜š  œžœžœ žœžœžœžœ˜HJšžœžœžœ žœ˜:Jšž˜Jšœžœ ˜!Jšœžœ˜ Jšœžœ˜ Jšœ(˜(Jšžœžœžœ˜JšœD˜Dšžœ+žœžœžœ˜AJšœE˜EJšž˜—šœžœžœ ˜Jšœ8˜8Jšœ'˜'Jšœ˜Jšœ˜Jšœ˜—Jšœ ˜ Jšžœ˜—J˜š œžœ˜Jšž˜Jšœ@˜@Jšœ4˜4Jšœ)˜)Jšœ ˜ Jšœ'˜'Jšœ)˜)Jšžœ˜—J˜š œžœ žœžœžœ žœžœ˜AJšž˜šžœžœžœžœžœžœžœ˜GJšœ˜Jšž˜—Jšžœ˜—J˜Jš 2™2š  œžœžœžœžœ ™XJšœžœ ™Jšž™J™š œžœžœžœ ™VJšž™Jšœžœ+žœ™PJšžœ™—J™JšœA™AJšžœ™—J˜š  œžœžœžœžœžœ˜NJšž˜Jšœ=˜=Jšž ™ šžœžœ™ Jšœžœ™-Jšœ+™+Jšœžœ™Jšœ™JšœQ™QJšœ™Jšœžœ™ J™—Jšžœ˜—J˜š  œžœžœžœžœ ˜TJšœžœ ˜Jšž˜J˜š œžœžœžœ ˜VJšž˜Jšœ#žœ#žœ˜RJšžœ˜—J˜JšœM˜MJšžœ˜—J˜š  œžœžœ žœžœ˜3Jšž˜Jšžœ6˜