diff options
Diffstat (limited to 'layer')
-rwxr-xr-x | layer/svg.ml | 68 |
1 files changed, 68 insertions, 0 deletions
diff --git a/layer/svg.ml b/layer/svg.ml new file mode 100755 index 0000000..f174acc --- /dev/null +++ b/layer/svg.ml @@ -0,0 +1,68 @@ +(** SVG representation *) + +open Brr + +module Path = Brr_canvas.C2d.Path +module V2 = Gg.V2 + + +let svg : El.cons + = fun ?d ?at childs -> + El.v ?d ?at (Jstr.v "svg") childs + +let path: El.cons + = fun ?d ?at childs -> + El.v ?d ?at (Jstr.v "path") childs + +type 'a t = Jstr.t + +let create + : unit -> 'a t + = fun () -> Jstr.empty + +(* Start a new path. *) +let move_to + : Gg.v2 -> 'a t -> 'a t + = fun point path -> + let x, y = V2.to_tuple point in + + Jstr.append path @@ + Jstr.concat ~sep:(Jstr.v " ") + [ Jstr.v " M" + ; Jstr.of_float x + ; Jstr.of_float y ] + + +let line_to + : Gg.v2 -> 'a t -> 'a t + = fun point path -> + let x, y = V2.to_tuple point in + Jstr.append path @@ + Jstr.concat ~sep:(Jstr.v " ") + [ (Jstr.v " L") + ; (Jstr.of_float x) + ; (Jstr.of_float y) ] + +let quadratic_to + : Gg.v2 -> Gg.v2 -> Gg.v2 -> 'a t -> 'a t + = fun ctrl0 ctrl1 p1 path -> + let cx, cy = V2.to_tuple ctrl0 + and cx', cy' = V2.to_tuple ctrl1 + and x, y = V2.to_tuple p1 in + Jstr.append path @@ + Jstr.concat ~sep:(Jstr.v " ") + [ (Jstr.v " C") + ; (Jstr.of_float cx) + ; (Jstr.of_float cy) + ; (Jstr.v ",") + ; (Jstr.of_float cx') + ; (Jstr.of_float cy') + ; (Jstr.v ",") + ; (Jstr.of_float x) + ; (Jstr.of_float y) ] + +let close + : 'a t -> 'a t + = fun path -> + Jstr.append path (Jstr.v " Z") + |