katana-document-viewer 0.1.4

KatanA document viewer artifact, render evaluation, and export foundation.
Documentation
use super::SpanVisualRange;

pub(super) fn span_visual_ranges(
    buffer: &cosmic_text::Buffer,
    span_count: usize,
) -> Vec<Option<SpanVisualRange>> {
    let mut ranges: Vec<Option<SpanVisualRange>> = vec![None; span_count];
    for run in buffer.layout_runs() {
        for glyph in run.glyphs {
            SpanVisualRangeCollector::collect_glyph(&mut ranges, span_count, glyph);
        }
    }
    ranges
}

struct SpanVisualRangeCollector;

impl SpanVisualRangeCollector {
    fn collect_glyph(
        ranges: &mut [Option<SpanVisualRange>],
        span_count: usize,
        glyph: &cosmic_text::LayoutGlyph,
    ) {
        if glyph.metadata == 0 {
            return;
        }
        let span_index = glyph.metadata.saturating_sub(1);
        if span_index >= span_count {
            return;
        }
        let start_x = glyph.x;
        let end_x = glyph.x + glyph.w;
        ranges[span_index] = Some(match ranges[span_index] {
            Some(range) => range.extend(start_x, end_x),
            None => SpanVisualRange::new(start_x, end_x),
        });
    }
}

#[cfg(test)]
#[path = "export_surface_font_rendering_ranges_tests.rs"]
mod tests;