<> <> <> <<>> 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.