diff --git a/epaint/src/text/font.rs b/epaint/src/text/font.rs index 6f3f39db..aba978e6 100644 --- a/epaint/src/text/font.rs +++ b/epaint/src/text/font.rs @@ -192,7 +192,8 @@ type FontIndex = usize; pub struct Font { text_style: TextStyle, fonts: Vec>, - characters: std::collections::BTreeSet, + /// Lazily calculated. + characters: RwLock>>, replacement_glyph: (FontIndex, GlyphInfo), pixels_per_point: f32, row_height: f32, @@ -201,16 +202,11 @@ pub struct Font { impl Font { pub fn new(text_style: TextStyle, fonts: Vec>) -> Self { - let mut characters = BTreeSet::new(); - for font in &fonts { - characters.extend(font.characters()); - } - if fonts.is_empty() { return Self { text_style, fonts, - characters, + characters: RwLock::new(None), replacement_glyph: Default::default(), pixels_per_point: 0.0, row_height: 0.0, @@ -224,7 +220,7 @@ impl Font { let mut slf = Self { text_style, fonts, - characters, + characters: RwLock::new(None), replacement_glyph: Default::default(), pixels_per_point, row_height, @@ -258,8 +254,15 @@ impl Font { } /// All supported characters - pub fn characters(&self) -> &BTreeSet { - &self.characters + pub fn characters(&self) -> BTreeSet { + if self.characters.read().is_none() { + let mut characters = BTreeSet::new(); + for font in &self.fonts { + characters.extend(font.characters()); + } + self.characters.write().replace(characters); + } + self.characters.read().clone().unwrap() } #[inline(always)]