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[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, m: Transformation _ NIL] RETURNS[Outline]; END. ΤImagerPath.mesa Copyright c 1985 by Xerox Corporation. All rights reserved. Doug Wyatt, March 8, 1985 8:59:57 am 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 œžœ žœžœ˜DK™MK™ŒK™—š  œžœ žœ˜9K™FK™—K˜š  œžœlžœžœ žœžœ˜¨K˜—š  œžœ%žœ]žœžœ žœžœ˜ΔK˜——™Kšœ žœžœ˜%šœžœžœ˜KšœΟc˜)Kšœžœ‘'˜4Kšœžœ‘˜šœ žœž˜Kšœ ‘#˜/Kšœ ‘˜(Kšœžœ‘#˜;Kšœžœžœ‘#˜?Kšœ žœ‘˜0Kšž˜—Kšœ˜Kšœˆ™ˆ—K™š  œžœžœžœ˜,Kšœ™K™—š œžœžœžœ ˜)K™FK™—Kš œžœžœžœ ˜9Kš œžœžœžœ ˜:š œžœžœžœ ˜:K™FK™6K™6K™—š œžœžœžœ ˜BKšœE™EK˜—š  œžœžœžœžœ ˜GKšœL™LK˜—š œžœžœžœ ˜