aboutsummaryrefslogtreecommitdiff
path: root/layer/svg.ml
diff options
context:
space:
mode:
Diffstat (limited to 'layer/svg.ml')
-rwxr-xr-xlayer/svg.ml68
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")
+