From 4fdda7d5d0def2f06611291444697fc1baa64bee Mon Sep 17 00:00:00 2001 From: Laurenz Stampfl <47084093+LaurenzV@users.noreply.github.com> Date: Wed, 26 Mar 2025 22:24:03 +0100 Subject: [PATCH] Memoize font creation --- crates/typst-pdf/src/text.rs | 25 +++++++++++++++---------- 1 file changed, 15 insertions(+), 10 deletions(-) diff --git a/crates/typst-pdf/src/text.rs b/crates/typst-pdf/src/text.rs index 03739926e..a4df0681c 100644 --- a/crates/typst-pdf/src/text.rs +++ b/crates/typst-pdf/src/text.rs @@ -68,16 +68,7 @@ fn convert_font( if let Some(font) = gc.fonts_forward.get(&typst_font) { Ok(font.clone()) } else { - let font_data: Arc + Send + Sync> = - Arc::new(typst_font.data().clone()); - let font = - match krilla::text::Font::new(font_data.into(), typst_font.index(), true) { - None => { - let font_str = display_font(&typst_font); - bail!(Span::detached(), "failed to process font {font_str}"); - } - Some(f) => f, - }; + let font = build_font(typst_font.clone())?; gc.fonts_forward.insert(typst_font.clone(), font.clone()); gc.fonts_backward.insert(font.clone(), typst_font.clone()); @@ -86,6 +77,20 @@ fn convert_font( } } +#[comemo::memoize] +fn build_font(typst_font: Font) -> SourceResult { + let font_data: Arc + Send + Sync> = + Arc::new(typst_font.data().clone()); + + match krilla::text::Font::new(font_data.into(), typst_font.index(), true) { + None => { + let font_str = display_font(&typst_font); + bail!(Span::detached(), "failed to process font {font_str}"); + } + Some(f) => Ok(f), + } +} + #[derive(TransparentWrapper)] #[repr(transparent)] struct PdfGlyph(Glyph);