module Point = Path.Point module Make(Repr: Repr.PRINTER) = struct type t = Point.t type repr = { path: Repr.t ; close : Repr.t -> Repr.t } let create_path : (Repr.t -> Repr.t) -> repr = fun f -> { close = f ; path = Repr.create () } (* Start a new path. *) let start' : Gg.v2 -> Gg.v2 -> repr -> repr = fun p1 _ {close ; path } -> let path = Repr.move_to p1 path in { close ; path } let start : Path.Point.t -> repr -> repr = fun pt t -> let p = (Point.get_coord pt) in start' p p t let line_to' : (Gg.v2 * Gg.v2) -> (Gg.v2 * Gg.v2) -> repr -> repr = fun (p0, p1) (p0', p1') t -> let path = Repr.move_to p1 t.path |> Repr.line_to p1' |> Repr.line_to p0' |> Repr.line_to p0 |> Repr.line_to p1 |> Repr.close in let path = t.close path in { t with path} let line_to : Point.t -> Point.t -> repr -> repr = fun p0 p1 t -> line_to' ( Point.get_coord p0 , Point.get_coord p1 ) ( Point.get_coord' p0 , Point.get_coord' p1 ) t let quadratic_to' : (Gg.v2 * Gg.v2 * Gg.v2 * Gg.v2) -> (Gg.v2 * Gg.v2 * Gg.v2 * Gg.v2) -> repr -> repr = fun (p0, ctrl0, ctrl1, p1) (p0', ctrl0', ctrl1', p1') t -> let path = Repr.move_to p1 t.path |> Repr.line_to p1' (* Backward *) |> Repr.quadratic_to ctrl1' ctrl0' p0' |> Repr.line_to p0 (* Forward *) |> Repr.quadratic_to ctrl0 ctrl1 p1 |> Repr.close |> t.close in { t with path } let quadratic_to : (t * Gg.v2 * Gg.v2 * t) -> repr -> repr = fun (p0, ctrl0, ctrl1, p1) t -> let ctrl0' = Point.get_coord' @@ Point.copy p0 ctrl0 and ctrl1' = Point.get_coord' @@ Point.copy p1 ctrl1 in quadratic_to' (Point.get_coord p0, ctrl0, ctrl1, Point.get_coord p1) (Point.get_coord' p0, ctrl0', ctrl1', Point.get_coord' p1) t let stop : repr -> repr = fun t -> t let get : repr -> Repr.t = fun t -> t.path end