DIRECTORY ImagerTransformation USING [Transformation], Vector2 USING [VEC]; ImagerPath: CEDAR DEFINITIONS ~ BEGIN VEC: TYPE ~ Vector2.VEC; Transformation: TYPE ~ ImagerTransformation.Transformation; MoveToProc: TYPE ~ PROC [p: VEC]; LineToProc: TYPE ~ PROC [p1: VEC]; CurveToProc: TYPE ~ PROC [p1, p2, p3: VEC]; ConicToProc: TYPE ~ PROC [p1, p2: VEC, r: REAL]; ArcToProc: TYPE ~ PROC [p1, p2: VEC]; PathProc: TYPE ~ PROC [moveTo: MoveToProc, lineTo: LineToProc, curveTo: CurveToProc, conicTo: ConicToProc, arcTo: ArcToProc]; ConicToCurves: PROC [p0, p1, p2: VEC, r: REAL, curveTo: CurveToProc]; ArcToConics: PROC [p0, p1, p2: VEC, conicTo: ConicToProc]; Filter: PROC [path: PathProc, moveTo: MoveToProc _, lineTo: LineToProc _, curveTo: CurveToProc _, conicTo: ConicToProc _ NIL, arcTo: ArcToProc _ NIL, close: PROC _ NIL]; Transform: PROC [path: PathProc, m: Transformation _ NIL, moveTo: MoveToProc _, lineTo: LineToProc _, curveTo: CurveToProc _, conicTo: ConicToProc _ NIL, arcTo: ArcToProc _ NIL, close: PROC _ NIL]; Trajectory: TYPE ~ REF TrajectoryRep; TrajectoryRep: TYPE ~ RECORD [ prev: Trajectory, -- preceding trajectory length: INT, -- number of segments in the trajectory lp: VEC, -- the last point variant: SELECT tag: * FROM move => [], -- begin new trajectory: moveTo[lp] line => [], -- straight line: lineTo[lp] curve => [p1, p2: VEC], -- cubic curve: curveTo[p1, p2, lp] conic => [p1: VEC, r: REAL], -- conic curve: conicTo[p1, lp, r] arc => [p1: VEC], -- circular arc: arcTo[p1, lp] ENDCASE ]; LastPoint: PROC [t: Trajectory] RETURNS [VEC]; MoveTo: PROC [p: VEC] RETURNS [Trajectory]; LineTo: PROC [t: Trajectory, p1: VEC] RETURNS [Trajectory]; LineToX: PROC [t: Trajectory, x: REAL] RETURNS [Trajectory]; LineToY: PROC [t: Trajectory, y: REAL] RETURNS [Trajectory]; CurveTo: PROC [t: Trajectory, p1, p2, p3: VEC] RETURNS [Trajectory]; ConicTo: PROC [t: Trajectory, p1, p2: VEC, r: REAL] RETURNS [Trajectory]; ArcTo: PROC [t: Trajectory, p1, p2: VEC] RETURNS [Trajectory]; MapTrajectory: PROC [trajectory: Trajectory, moveTo: MoveToProc, lineTo: LineToProc, curveTo: CurveToProc, conicTo: ConicToProc, arcTo: ArcToProc]; MapTrajectoryBackward: PROC [trajectory: Trajectory, moveTo: MoveToProc, lineTo: LineToProc, curveTo: CurveToProc, conicTo: ConicToProc, arcTo: ArcToProc]; TrajectoryList: TYPE ~ LIST OF Trajectory; MapTrajectoryList: PROC [trajectoryList: TrajectoryList, moveTo: MoveToProc, lineTo: LineToProc, curveTo: CurveToProc, conicTo: ConicToProc, arcTo: ArcToProc]; Outline: TYPE ~ REF OutlineRep; OutlineRep: TYPE ~ RECORD [oddWrap: BOOL, seq: SEQUENCE size: NAT OF Trajectory]; MapOutline: PROC [outline: Outline, moveTo: MoveToProc, lineTo: LineToProc, curveTo: CurveToProc, conicTo: ConicToProc, arcTo: ArcToProc]; TrajectoriesFromPath: PROC [path: PathProc, m: Transformation _ NIL, action: PROC [Trajectory]]; TrajectoryListFromPath: PROC [path: PathProc, m: Transformation _ NIL] RETURNS [TrajectoryList]; OutlineFromPath: PROC [path: PathProc, oddWrap: BOOL _ FALSE, m: Transformation _ NIL] RETURNS [Outline]; END. ΨImagerPath.mesa Copyright c 1985 by Xerox Corporation. All rights reserved. Doug Wyatt, November 11, 1985 3:38:32 pm PST General Paths A PathProc defines a path by calling moveTo, lineTo, ... in sequence. Its caller supplies moveTo, lineTo, ... procedures and maintains p0: VEC _ [0, 0]. moveTo[p] begins a new trajectory at p; p0 _ p. lineTo[p1] extends a straight line from p0 to p1; p0 _ p1. curveTo[p1, p2, p3] extends a cubic curve from p0 (controlled by p1, p2) to p3; p0 _ p3. The curve segment is defined by four Bezier control points: p0, p1, p2, p3. It begins at p0, tangent to [p0, p1], and ends at p3, tangent to [p2, p3]. The curve is bounded by the quadrilateral [p0, p1, p2, p3]. conicTo[p1, p2, r] extends a conic curve from p0 (controlled by p1, r) to p2; p0 _ p2. Let m be the midpoint of [p0, p2]. Let p be the point on [m, p1] such that Length[m, p]/Length[m, p1] = r. The curve starts at p0, passes through p, and ends at p2. It is a line if r=0; an ellipse if 0™>KšœW™WKšœI™I——K˜šΟn œžœžœžœ˜EK™MK™ŒK™—š  œžœžœ˜:K™FK™—K˜š  œžœmžœžœ žœžœ˜©K˜—š  œžœ&žœ]žœžœ žœžœ˜ΕK˜——™Kšœ žœžœ˜%šœžœžœ˜KšœΟc˜)Kšœžœ‘'˜4Kšœžœ‘˜šœ žœž˜Kšœ ‘#˜/Kšœ ‘˜(Kšœžœ‘#˜;Kšœžœžœ‘#˜?Kšœ žœ‘˜0Kšž˜—Kšœ˜Kšœˆ™ˆ—K™š  œžœžœžœ˜.Kšœ™K™—š œžœžœžœ˜+K™FK™—Kš œžœžœžœ˜;Kš œžœžœžœ˜<š œžœžœžœ˜Kšœ<™