DIRECTORY GGLines, GGModelTypes, GGShapes, Imager, ImagerBackdoor, ImagerPath, ImagerTransformation, Real; GGShapesImpl: CEDAR PROGRAM IMPORTS GGLines, Imager, ImagerBackdoor, ImagerPath EXPORTS GGShapes = BEGIN Camera: TYPE = GGModelTypes.Camera; Circle: TYPE = GGModelTypes.Circle; Line: TYPE = GGModelTypes.Line; Point: TYPE = GGModelTypes.Point; Ray: TYPE = GGModelTypes.Ray; Vector: TYPE = GGModelTypes.Vector; DrawSquare: PUBLIC PROC [dc: Imager.Context, center: Point, side: REAL] = { halfSide: REAL _ side/2.0; DoDrawSquare: PROC = { SquarePath: Imager.PathProc = { moveTo[[- halfSide, - halfSide]]; lineTo[[- halfSide, halfSide]]; lineTo[[ halfSide, halfSide]]; lineTo[[ halfSide, - halfSide]]; lineTo[[- halfSide, - halfSide]]; }; Imager.SetXY[dc, [center[1], center[2]]]; Imager.Trans[dc]; Imager.SetStrokeWidth[dc, 1.0]; Imager.MaskStroke[dc, SquarePath, TRUE]; }; Imager.DoSaveAll[dc, DoDrawSquare]; }; DrawPlus: PUBLIC PROC [dc: Imager.Context, center: Point] = { halfSide: REAL = 5.0; DoDrawPlus: PROC = { Horiz: Imager.PathProc = { moveTo[[-halfSide, 0.0]]; lineTo[[halfSide, 0.0]]; }; Vert: Imager.PathProc = { moveTo[[0.0, -halfSide]]; lineTo[[0.0, halfSide]]; }; Imager.SetXY[dc, [center[1], center[2]]]; Imager.Trans[dc]; Imager.SetStrokeWidth[dc, 2.0]; Imager.MaskStroke[dc, Horiz, FALSE]; Imager.MaskStroke[dc, Vert, FALSE]; }; Imager.DoSaveAll[dc, DoDrawPlus]; }; DrawRectangle: PUBLIC PROC [dc: Imager.Context, loX, loY, hiX, hiY: REAL] = { RectanglePath: Imager.PathProc = { moveTo[[loX, loY]]; lineTo[[loX, hiY]]; lineTo[[ hiX, hiY]]; lineTo[[ hiX, loY]]; lineTo[[loX, loY]]; }; Imager.SetStrokeWidth[dc, 1.0]; Imager.MaskStroke[dc, RectanglePath, TRUE]; }; DrawCaret: PUBLIC PROC [dc: Imager.Context, point: Point] = { height: REAL = 8.0; halfWidth: REAL = 3.0; DoDrawCaret: PROC = { t: ImagerPath.Trajectory; Imager.SetXY[dc, [point[1], point[2]]]; Imager.Trans[dc]; t _ ImagerPath.MoveTo[[-halfWidth, -height]]; t _ ImagerPath.LineTo[t, [0.0, 0.0]]; t _ ImagerPath.LineTo[t, [halfWidth, -height]]; Imager.SetStrokeWidth[dc, 1.0]; Imager.MaskStrokeTrajectory[dc, t, FALSE]; }; Imager.DoSaveAll[dc, DoDrawCaret]; }; DrawAnchor: PUBLIC PROC [dc: Imager.Context, point: Point] = { DrawFilledSquare[dc, point, 10.0]; }; DrawFilledSquare: PUBLIC PROC [dc: Imager.Context, center: Point, side: REAL] = { halfSide: REAL _ side/2.0; DoDrawFilledSquare: PROC = { Imager.SetXY[dc, [center[1], center[2]]]; Imager.Trans[dc]; Imager.MaskRectangle[dc, [- halfSide, - halfSide, side, side]]; }; Imager.DoSaveAll[dc, DoDrawFilledSquare]; }; DrawSpot: PUBLIC PROC [dc: Imager.Context, point: Point] = { DoDrawSpot: PROC = { Imager.SetXY[dc, [point[1], point[2]]]; Imager.Trans[dc]; Imager.MaskRectangle[dc, [0.0, 0.0, 1.0, 1.0]]; }; Imager.DoSaveAll[dc, DoDrawSpot]; }; DrawFilledRect: PUBLIC PROC [dc: Imager.Context, point: Point, side: REAL] = { DoDrawRect: PROC = { Imager.SetXY[dc, [point[1], point[2]]]; Imager.Trans[dc]; Imager.MaskRectangle[dc, [0.0, 0.0, side, side]]; }; Imager.DoSaveAll[dc, DoDrawRect]; }; DrawLine: PUBLIC PROC [dc: Imager.Context, line: Line] = { rect: ImagerTransformation.Rectangle _ ImagerBackdoor.GetBounds[dc]; count: NAT; ray: Ray; params: ARRAY[1..2] OF REAL; p1, p2, basePoint: Point; direction: Vector; DoDrawLine: PROC = { Imager.SetXY[dc, [p1[1], p1[2]]]; Imager.Trans[dc]; Imager.MaskVector[dc, [0.0, 0.0], [p2[1] - p1[1], p2[2] - p1[2]]]; }; p1 _ [rect.x, rect.y]; p2 _ [rect.x + rect.w, rect.y + rect.h]; basePoint _ GGLines.PointOnLine[line]; direction _ GGLines.DirectionOfLine[line]; ray _ GGLines.CreateRay[basePoint, direction]; [count, params] _ GGLines.LineRayMeetsBox[ray, p1[1], p1[2], p2[1], p2[2]]; IF count = 2 THEN { p1 _ GGLines.EvalRay[ray, params[1]]; p2 _ GGLines.EvalRay[ray, params[2]]; Imager.DoSaveAll[dc, DoDrawLine]; }; }; DrawLittleLine: PUBLIC PROC [dc: Imager.Context, line: Line, point: Point] = { }; DrawCircle: PUBLIC PROC [dc: Imager.Context, circle: Circle] = { leftSide, rightSide: Point; DoDrawCircle: PROC = { CirclePath: Imager.PathProc = { moveTo[[leftSide[1], leftSide[2]]]; arcTo[[rightSide[1], rightSide[2]], [ leftSide[1], leftSide[2]]]; }; Imager.SetStrokeWidth[dc, 1.0]; Imager.MaskStroke[dc, CirclePath, TRUE]; }; leftSide _ [circle.origin[1] - circle.radius, circle.origin[2]]; rightSide _ [circle.origin[1] + circle.radius, circle.origin[2]]; Imager.DoSaveAll[dc, DoDrawCircle]; }; DrawJoint: PUBLIC PROC [dc: Imager.Context, point: Point] = { DrawSquare[dc, point, GGModelTypes.jointSize]; }; DrawSelectedJoint: PUBLIC PROC [dc: Imager.Context, point: Point] = { DrawFilledSquare[dc, point, GGModelTypes.jointSize]; }; END. >GGShapesImpl.mesa Author: Eric Bier on June 7, 1985 5:45:52 pm PDT Last edited by Bier on August 20, 1985 5:06:07 pm PDT Contents: Predefined shapes for use in Gargoyle (e.g. squares for control points). Draws the indicated rectangle (not filled). Draw a short line (1 inch) centered on point, parallel to line. �Êd˜Ihead1™J™0J™5J™RJ˜šÏk ˜ J˜J˜ Jšœ ˜ J˜J˜Jšœ ˜ J˜Jšœ˜J˜—Jšœ�œ�˜Jš�œ,˜3Jš�œ ˜Jš�˜J˜Jšœ�œ˜#Jšœ�œ˜#Jšœ�œ˜Jšœ�œ˜!Jšœ�œ˜Jšœ�œ˜#J˜šÏn œ�œ�œ+�œ˜KJšœ �œ ˜šž œ�œ˜šœ˜Jšœ!˜!Jšœ ˜ Jšœ˜Jšœ!˜!Jšœ"˜"J˜—Jšœ)˜)Jšœ˜Jšœ˜Jšœ"�œ˜(J˜—Jšœ#˜#J˜J˜—šžœ�œ�œ(˜=Jšœ �œ˜šž œ�œ˜šœ˜J˜Jšœ˜J˜—šœ˜J˜Jšœ˜J˜—Jšœ)˜)Jšœ˜Jšœ˜Jšœ�œ˜$Jšœ�œ˜#J˜—Jšœ!˜!J˜J˜—šž œ�œ�œ*�œ˜MJ™+šœ"˜"Jšœ˜Jšœ˜Jšœ˜Jšœ˜Jšœ˜J˜—Jšœ˜Jšœ%�œ˜+J˜J˜—šž œ�œ�œ'˜=Jšœ�œ˜Jšœ �œ˜šž œ�œ˜Jšœ˜Jšœ'˜'Jšœ˜Jšœ-˜-Jšœ%˜%Jšœ/˜/Jšœ˜Jšœ#�œ˜*J˜—Jšœ"˜"J˜J˜—J˜šž œ�œ�œ'˜>Jšœ"˜"J˜J˜—šžœ�œ�œ+�œ˜QJšœ �œ ˜šžœ�œ˜Jšœ)˜)Jšœ˜Jšœ?˜?J˜—Jšœ)˜)J˜J˜—J˜šžœ�œ�œ'˜<šž œ�œ˜Jšœ'˜'Jšœ˜Jšœ/˜/J˜—Jšœ!˜!J˜J˜—šžœ�œ�œ*�œ˜Nšž œ�œ˜Jšœ'˜'Jšœ˜Jšœ1˜1J˜—Jšœ!˜!J˜J˜—šžœ�œ�œ%˜:IprocšœD˜DLšœ�œ˜ L˜ Lšœ�œ�œ�œ˜Lšœ˜L˜šž œ�œ˜Jšœ!˜!Jšœ˜LšœB˜BL˜—Lšœ˜Lšœ(˜(Lšœ&˜&Lšœ*˜*Lšœ.˜.LšœK˜Kš�œ �œ˜Lšœ%˜%Lšœ%˜%L˜!L˜—J˜J˜—šžœ� œ3˜NJ™?J˜—J˜šž œ� œ)˜@J˜šž œ�œ˜šœ˜Jšœ#˜#JšœB˜BJ˜—Jšœ˜Jšœ"�œ˜(J˜—Jšœ@˜@JšœA˜AJšœ#˜#J˜J˜—šž œ�œ�œ'˜=Jšœ.˜.Jšœ˜J˜—šžœ�œ�œ'˜EJšœ4˜4Jšœ˜—J˜Jš�œ˜J˜—…—0Ò