blob: 9455765e4aba952729642cd0f54a0a433cca400d (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
|
open Js_of_ocaml
module Path = Script_path
let ( let=? ) : 'a option -> ('a -> unit) -> unit =
fun f opt -> Option.iter opt f
let post_message : Worker_messages.from_worker -> unit = Worker.post_message
let rebuild outline =
let path = outline.Outline.path in
let=? path = Path.Fixed.rebuild path in
let back =
Path.Fixed.map path (fun pt ->
Path.Point.copy pt @@ Path.Point.get_coord' pt )
in
let=? back = Path.Fixed.rebuild back in
post_message (`Complete { outline with path; back })
let execute (command : Worker_messages.to_worker) =
match command with
(* Full rebuild, evaluate the whole path *)
| `Complete outline -> rebuild outline
(* Remove the point from the main line, and reevaluate the whole path *)
| `DeletePoint (point, outline) ->
let=? path = Path.Fixed.remove_point outline.Outline.path point in
rebuild { outline with path }
(* Only evaluate the interior *)
| `Back outline ->
let back =
Path.Fixed.map outline.Outline.path (fun pt ->
Path.Point.copy pt @@ Path.Point.get_coord' pt )
in
let=? back = Path.Fixed.rebuild back in
post_message (`Complete { outline with back })
| `TranslatePath (outline, delta) ->
let path =
Path.Fixed.map outline.path (fun pt ->
Path.Point.get_coord pt |> Gg.V2.add delta |> Path.Point.copy pt )
and back =
Path.Fixed.map outline.back (fun pt ->
Path.Point.get_coord pt |> Gg.V2.add delta |> Path.Point.copy pt )
in
post_message (`Complete { outline with path; back })
| `TranslatePoint (point, outline) ->
(* I do not use the function Path.Fixed.replace_point here, I just
replace the point position and run a full rebuild *)
let path =
Path.Fixed.map outline.path (fun pt ->
match Path.Point.id pt = Path.Point.id point with
| true -> point
| false -> pt )
in
rebuild { outline with path }
let () = Worker.set_onmessage execute
|