use super::*;
use crate::color::Color;
pub(crate) fn segment_highlight(
text: &str,
spans: &[(usize, usize, Color)],
base_color: Color,
) -> Vec<(usize, usize, Color)> {
let len = text.len();
let mut valid: Vec<(usize, usize, Color)> = spans
.iter()
.copied()
.filter(|&(s, e, _)| {
s < e && e <= len && text.is_char_boundary(s) && text.is_char_boundary(e)
})
.collect();
valid.sort_by_key(|&(s, _, _)| s);
let mut out: Vec<(usize, usize, Color)> = Vec::new();
let mut pos = 0usize;
for (s, e, color) in valid {
if e <= pos {
continue;
}
let s = s.max(pos);
if s > pos {
out.push((pos, s, base_color)); }
out.push((s, e, color));
pos = e;
}
if pos < len {
out.push((pos, len, base_color));
}
out
}
impl TextArea {
pub(super) fn paint_highlighted_line(
&self,
ctx: &mut dyn DrawCtx,
text: &str,
spans: &[(usize, usize, Color)],
x0: f64,
baseline_y: f64,
base_color: Color,
) {
for (s, e, color) in segment_highlight(text, spans, base_color) {
let x = x0 + measure_advance(&self.font, &text[..s], self.font_size);
ctx.set_fill_color(color);
ctx.fill_text(&text[s..e], x, baseline_y);
}
}
}