From ec812521b31471ce9ac3d9bdf1288b1569defbc8 Mon Sep 17 00:00:00 2001 From: Sébastien Dailly Date: Wed, 23 Dec 2020 19:11:31 +0100 Subject: Add svg output --- layer/svg.ml | 68 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 68 insertions(+) create mode 100755 layer/svg.ml (limited to 'layer/svg.ml') 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") + -- cgit v1.2.3