diff --git a/src/documents/diagram.rs b/src/documents/diagram.rs index e4bea73..115b890 100644 --- a/src/documents/diagram.rs +++ b/src/documents/diagram.rs @@ -107,10 +107,27 @@ pub fn diagram_svg(source: &str) -> Result { flatten(&svg(&chart)?) } -/// usvg reading with the system's fonts. +/// usvg reading with the system's fonts, chosen as gpui draws. pub(crate) fn options() -> usvg::Options<'static> { + let named = usvg::FontResolver::default_font_selector(); + let select_font = Box::new( + move |font: &usvg::Font, db: &mut Arc| { + // A missing family falls to sans-serif, then any face. + let sans = usvg::fontdb::Query { + families: &[usvg::fontdb::Family::SansSerif], + ..Default::default() + }; + named(font, db) + .or_else(|| db.query(&sans)) + .or_else(|| db.faces().next().map(|face| face.id)) + }, + ); usvg::Options { fontdb: fonts(), + font_resolver: usvg::FontResolver { + select_font, + select_fallback: usvg::FontResolver::default_fallback_selector(), + }, ..usvg::Options::default() } } diff --git a/src/typography/math/tests.rs b/src/typography/math/tests.rs index b874a29..f29f3b2 100644 --- a/src/typography/math/tests.rs +++ b/src/typography/math/tests.rs @@ -36,7 +36,9 @@ fn every_glyph_lies_inside_the_picture() { r"\left(\frac{a}{b}\right)", ] { let (svg, shape) = svg(&formula(source, false)).expect("typesets"); - let tree = usvg::Tree::from_data(svg.as_bytes(), &usvg::Options::default()).expect("svg"); + // Measured with the fonts it draws with. + let options = crate::documents::svg_options(); + let tree = usvg::Tree::from_data(svg.as_bytes(), &options).expect("svg"); let ink = tree.root().abs_stroke_bounding_box(); let (w, h) = (shape.width.as_f32(), shape.height.as_f32()); let near = |a: f32, b: f32| (a - b).abs() < 0.01;