use std::ops::Range;
use crate::shaping::run::ShapedRun;
pub struct LayoutLine {
pub runs: Vec<PositionedRun>,
pub y: f32,
pub ascent: f32,
pub descent: f32,
pub leading: f32,
pub line_height: f32,
pub width: f32,
pub char_range: Range<usize>,
}
impl LayoutLine {
pub fn x_for_offset(&self, offset: usize) -> f32 {
for (i, run) in self.runs.iter().enumerate() {
let mut glyph_x = run.x;
for glyph in &run.shaped_run.glyphs {
if glyph.cluster as usize >= offset {
return glyph_x;
}
glyph_x += glyph.x_advance;
}
let next_run_start = self
.runs
.get(i + 1)
.and_then(|r| r.shaped_run.glyphs.first())
.map(|g| g.cluster as usize);
match next_run_start {
Some(next_start) if offset >= next_start => continue,
_ => return glyph_x,
}
}
self.runs
.last()
.map(|r| r.x + r.shaped_run.advance_width)
.unwrap_or(0.0)
}
}
pub struct PositionedRun {
pub shaped_run: ShapedRun,
pub x: f32,
pub decorations: RunDecorations,
}
#[derive(Clone, Debug, Default)]
pub struct RunDecorations {
pub underline_style: crate::types::UnderlineStyle,
pub overline: bool,
pub strikeout: bool,
pub is_link: bool,
pub foreground_color: Option<[f32; 4]>,
pub underline_color: Option<[f32; 4]>,
pub background_color: Option<[f32; 4]>,
pub anchor_href: Option<String>,
pub tooltip: Option<String>,
pub vertical_alignment: crate::types::VerticalAlignment,
}