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