@@ -230,29 +230,47 @@ module Make (C : CANVAS) = struct
230230 in
231231 C. paint_text cr ~x: (x +. 2. ) ~y: (y +. 8. ) ~clip_area: (clip_width -. 2. , v.height) label
232232
233+ let min_render_width = 0.2
234+
235+ (* Call [fn] for each event in the visible region, plus one on each side (if any).
236+ Very close events (at the current zoom level) are skipped.
237+ The caller will typically render the region ending in this event. *)
233238 let iter_gc_spans v fn ring =
234239 let arr = ring.Layout.Ring. events in
235- let time i = fst arr.(i) in
236- let start = max 0 (find_first arr (fun i -> time i -. v.View. start_time) - 1 ) in
240+ let time_of i = fst arr.(i) in
241+ let start = max 0 (find_first arr (fun i -> time_of i -. v.View. start_time) - 1 ) in
237242 let stop_time = View. time_of_x v v.width in
238- let stop = find_first arr (fun i -> time i -. stop_time) ~start in
239- for i = start to min stop (Array. length arr - 1 ) do
240- let time, e = arr.(i) in
241- fn (time, e)
242- done ;
243+ let stop = min (Array. length arr) (1 + find_first arr (fun i -> time_of i -. stop_time) ~start ) in
244+ let visible_time = View. timespan_of_width v min_render_width in
245+ let rec visit ~prev i =
246+ if i < stop then (
247+ let time, e = arr.(i) in
248+ let next_useful_time = prev +. visible_time in
249+ if time < next_useful_time then (
250+ let i = find_first arr (fun i -> time_of i -. next_useful_time) ~start: (i + 1 ) - 1 in
251+ let time, e = arr.(i) in
252+ fn (i, time, e);
253+ visit ~prev: time (i + 1 )
254+ ) else (
255+ fn (i, time, e);
256+ visit ~prev: time (i + 1 )
257+ )
258+ )
259+ in
260+ visit ~prev: (-. visible_time) start;
243261 if stop = Array. length arr then
244- fn (v.View. layout.duration, [] )
262+ fn (stop, v.View. layout.duration, [] )
245263
246264 let render_gc_events v cr (ring : Layout.Ring.t ) layer =
247265 let y = y_of_row v ring.y in
248266 let h = float ring.height *. Style. line_spacing in
249- let prev_stack = ref [] in
250- let event = ref (0.0 , [] ) in
267+ let event = ref (0 , 0.0 , [] ) in
251268 C. set_font_size cr Style. big_text;
252269 ring |> iter_gc_spans v (fun event' ->
253- let t0, stack = ! event in
270+ let i, t0, stack = ! event in
271+ let prev_stack = if i = 0 then [] else snd (ring.events.(i - 1 )) in
254272 event := event';
255- let t1 = fst event' in
273+ let _, t1, _ = event' in
256274 let x0 = View. x_of_time v t0 in
257275 let x1 = View. x_of_time v t1 in
258276 let w = x1 -. x0 in
@@ -266,7 +284,7 @@ module Make (C : CANVAS) = struct
266284 C. rectangle cr ~x: x0 ~y ~w ~h ;
267285 C. fill cr
268286 | `Fg ->
269- if p == ! prev_stack then (
287+ if p == prev_stack then (
270288 let clip_area = (w -. 0.2 , v.height) in
271289 C. set_source_rgb cr ~r: 0.0 ~g: 0.0 ~b: 0.0 ;
272290 C. paint_text cr ~x: (x0 +. 2. ) ~y: (y +. 12. ) op
@@ -281,15 +299,14 @@ module Make (C : CANVAS) = struct
281299 C. rectangle cr ~x: x0 ~y ~w ~h ;
282300 C. fill cr
283301 | `Fg ->
284- if p == ! prev_stack then (
302+ if p == prev_stack then (
285303 let clip_area = (w -. 0.2 , v.height) in
286304 if g < 0.5 then C. set_source_rgb cr ~r: 1.0 ~g: 1.0 ~b: 1.0
287305 else C. set_source_rgb cr ~r: 0.0 ~g: 0.0 ~b: 0.0 ;
288306 C. paint_text cr ~x: (x0 +. 2. ) ~y: (y +. 12. ) op
289307 ~clip_area
290308 )
291- end ;
292- prev_stack := stack
309+ end
293310 )
294311
295312 let link_domain v cr ~x (fiber : Layout.item ) (ring : Layout.Ring.t ) =
0 commit comments