module Make(Repr: Repr.PRINTER) = struct type t = Path.Point.t type repr = { path: (Repr.t) } let create_path : 'b -> repr = fun _ -> { path = Repr.create () } (* Start a new path. *) let start : Path.Point.t -> repr -> repr = fun t {path} -> let path = Repr.move_to (Path.Point.get_coord t) path in let path = Repr.line_to (Path.Point.get_coord' t) path in { path } let line_to : Path.Point.t -> Path.Point.t -> repr -> repr = fun _ t {path} -> let path = Repr.move_to (Path.Point.get_coord t) path in let path = Repr.line_to (Path.Point.get_coord' t) path in { path } let quadratic_to : Path.Point.t -> Gg.v2 -> Gg.v2 -> Path.Point.t -> repr -> repr = fun p0 ctrl0 ctrl1 p1 { path } -> let path = ref path in let bezier = { Shapes.Bezier.p0 = Path.Point.get_coord p0 ; ctrl0 ; ctrl1 ; p1 = Path.Point.get_coord p1 } in (* Mark each point on the bezier curve. The first point is the most recent point *) let delay = ((Path.Point.get_stamp p0) -. (Path.Point.get_stamp p1)) *. 20. in for i = 0 to ((Int.of_float delay) -1) do let ratio = (Float.of_int i) /. delay in let bezier', _ = Shapes.Bezier.slice ratio bezier in let point = Path.Point.mix ratio bezier'.Shapes.Bezier.p1 p0 p1 in path := Repr.move_to (Path.Point.get_coord point) !path; path := Repr.line_to (Path.Point.get_coord' point) !path; done; { path = !path } let stop : repr -> repr = fun path -> path let get : repr -> Repr.t = fun {path; _} -> path end