Skip to content

Commit 4bb1490

Browse files
committed
Jump over background events too close to see
1 parent 4510379 commit 4bb1490

File tree

1 file changed

+33
-16
lines changed

1 file changed

+33
-16
lines changed

lib/render.ml

Lines changed: 33 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)