@@ -47,6 +47,9 @@ module Make (C : CANVAS) = struct
4747
4848 let running_fiber cr =
4949 C. set_source_rgb cr ~r: 0.4 ~g: 0.8 ~b: 0.4
50+
51+ let suspended_fiber cr =
52+ C. set_source_rgb cr ~r: 0.4 ~g: 0.4 ~b: 0.4
5053 end
5154
5255 (* * Draw [msg] in the area (min_x, max_x) and ideally centred at [x]. *)
@@ -155,7 +158,7 @@ module Make (C : CANVAS) = struct
155158 let x1 = View. x_of_time v t1 in
156159 let w = x1 -. x0 in
157160 begin match stack with
158- | `Suspend _ :: _ -> C. set_source_rgb cr ~r: 0.4 ~g: 0.4 ~b: 0.4
161+ | `Suspend _ :: _ -> Style. suspended_fiber cr
159162 | `Span _ :: _ -> C. set_source_rgb cr ~r: 0.5 ~g: 0.9 ~b: 0.5
160163 | [] -> Style. running_fiber cr
161164 end ;
@@ -210,7 +213,7 @@ module Make (C : CANVAS) = struct
210213 done ;
211214 fn (v.View. layout.duration, [] )
212215
213- let render_gc_events v cr (ring : Layout.Ring.t ) =
216+ let render_gc_events v cr (ring : Layout.Ring.t ) layer =
214217 let y = y_of_row v ring.y in
215218 let h = float ring.height *. Style. line_spacing in
216219 let prev_stack = ref [] in
@@ -227,23 +230,52 @@ module Make (C : CANVAS) = struct
227230 | [] -> ()
228231 | op :: p ->
229232 let g = 1.0 -. min 1.0 (0.1 *. float (List. length stack)) in
230- C. set_source_rgba cr ~r: g ~g: g ~b: (g /. 2. ) ~a: 0.9 ;
231- C. rectangle cr ~x: x0 ~y ~w ~h ;
232- C. fill cr;
233- if p == ! prev_stack then (
234- let clip_area = (w -. 0.2 , v.height) in
235- if g < 0.5 then C. set_source_rgb cr ~r: 1.0 ~g: 1.0 ~b: 1.0
236- else C. set_source_rgb cr ~r: 0.0 ~g: 0.0 ~b: 0.0 ;
237- C. paint_text cr ~x: (x0 +. 2. ) ~y: (y +. 12. ) op
238- ~clip_area
239- )
233+ match layer with
234+ | `Bg ->
235+ C. set_source_rgb cr ~r: g ~g: g ~b: (g /. 2. );
236+ C. rectangle cr ~x: x0 ~y ~w ~h ;
237+ C. fill cr
238+ | `Fg ->
239+ if p == ! prev_stack then (
240+ let clip_area = (w -. 0.2 , v.height) in
241+ if g < 0.5 then C. set_source_rgb cr ~r: 1.0 ~g: 1.0 ~b: 1.0
242+ else C. set_source_rgb cr ~r: 0.0 ~g: 0.0 ~b: 0.0 ;
243+ C. paint_text cr ~x: (x0 +. 2. ) ~y: (y +. 12. ) op
244+ ~clip_area
245+ )
240246 end ;
241247 prev_stack := stack
242248 )
243249
244- let render_ring v cr ring =
245- render_gc_events v cr ring;
246- List. iter (fun (_ts , cc ) -> render_events v cr cc) ring.roots
250+ let link_domain v cr ~x (fiber : Layout.item ) (ring : Layout.Ring.t ) =
251+ let fiber_y = y_of_row v fiber.y +. Style. fiber_padding_top in
252+ let ring_y = y_of_row v ring.y in
253+ let (y1, y2) =
254+ if fiber.y < ring.y then (
255+ (fiber_y +. Style. fiber_height, ring_y +. float ring.height *. View. pixels_per_row)
256+ ) else (
257+ fiber_y, ring_y
258+ )
259+ in
260+ Style. suspended_fiber cr;
261+ C. move_to cr ~x ~y: y1;
262+ C. line_to cr ~x ~y: y2;
263+ C. stroke cr
264+
265+ let render_ring_bg v cr ring =
266+ render_gc_events v cr ring `Bg ;
267+ ring.roots |> List. iter @@ fun (root : Layout.Ring.root ) ->
268+ C. set_line_width cr 4.0 ;
269+ root.parent |> Option. iter (fun (ts , parent ) ->
270+ Layout. get v.layout parent |> Option. iter @@ fun (parent : Layout.item ) ->
271+ let x = View. x_of_time v ts in
272+ link_domain v cr ~x parent ring
273+ )
274+
275+ let render_ring v cr (ring : Layout.Ring.t ) =
276+ render_gc_events v cr ring `Fg ;
277+ ring.roots |> List. iter @@ fun (root : Layout.Ring.root ) ->
278+ root.cc |> Option. iter (fun (_ts , cc ) -> render_events v cr cc)
247279
248280 let render_grid v cr =
249281 C. set_line_width cr 1.0 ;
@@ -272,6 +304,7 @@ module Make (C : CANVAS) = struct
272304 let render (v : View.t ) cr =
273305 C. set_source_rgb cr ~r: 0.9 ~g: 0.9 ~b: 0.9 ;
274306 C. paint cr;
307+ v.layout.rings |> Trace.Rings. iter (fun _id -> render_ring_bg v cr);
275308 render_grid v cr;
276309 C. set_source_rgb cr ~r: 0.0 ~g: 0.0 ~b: 0.0 ;
277310 v.layout.rings |> Trace.Rings. iter (fun _id -> render_ring v cr)
0 commit comments