diff --git a/crates/egui/src/context.rs b/crates/egui/src/context.rs index 7e7eff2eb74..915aa3b52e3 100644 --- a/crates/egui/src/context.rs +++ b/crates/egui/src/context.rs @@ -9,7 +9,7 @@ use epaint::{ pos2, stats::PaintStats, tessellator, - text::{FontInsert, FontPriority, Fonts}, + text::{FontData, FontInsert, FontPriority, Fonts}, util::OrderedFloat, vec2, ClippedPrimitive, ClippedShape, Color32, ImageData, ImageDelta, Pos2, Rect, TessellationOptions, TextureAtlas, TextureId, Vec2, @@ -597,7 +597,9 @@ impl ContextImpl { FontPriority::Lowest => fam.push(font.name.clone()), } } - self.font_definitions.font_data.insert(font.name, font.data); + self.font_definitions + .font_data + .insert(font.name, Arc::new(font.data)); } #[cfg(feature = "log")] @@ -2940,7 +2942,13 @@ impl Context { for (name, data) in &mut font_definitions.font_data { ui.collapsing(name, |ui| { - if data.tweak.ui(ui).changed() { + let mut tweak = data.tweak; + if tweak.ui(ui).changed() { + *data = Arc::new(FontData { + font: data.font.clone(), + index: data.index, + tweak, + }); changed = true; } }); diff --git a/crates/epaint/src/text/fonts.rs b/crates/epaint/src/text/fonts.rs index 3cb8e854d9c..388b65cf520 100644 --- a/crates/epaint/src/text/fonts.rs +++ b/crates/epaint/src/text/fonts.rs @@ -243,7 +243,7 @@ pub struct FontDefinitions { /// List of font names and their definitions. /// /// `epaint` has built-in-default for these, but you can override them if you like. - pub font_data: BTreeMap, + pub font_data: BTreeMap>, /// Which fonts (names) to use for each [`FontFamily`]. /// @@ -310,33 +310,36 @@ impl Default for FontDefinitions { /// otherwise this is the same as [`Self::empty`]. #[cfg(feature = "default_fonts")] fn default() -> Self { - let mut font_data: BTreeMap = BTreeMap::new(); + let mut font_data: BTreeMap> = BTreeMap::new(); let mut families = BTreeMap::new(); - font_data.insert("Hack".to_owned(), FontData::from_static(HACK_REGULAR)); + font_data.insert( + "Hack".to_owned(), + Arc::new(FontData::from_static(HACK_REGULAR)), + ); // Some good looking emojis. Use as first priority: font_data.insert( "NotoEmoji-Regular".to_owned(), - FontData::from_static(NOTO_EMOJI_REGULAR).tweak(FontTweak { + Arc::new(FontData::from_static(NOTO_EMOJI_REGULAR).tweak(FontTweak { scale: 0.81, // Make smaller ..Default::default() - }), + })), ); font_data.insert( "Ubuntu-Light".to_owned(), - FontData::from_static(UBUNTU_LIGHT), + Arc::new(FontData::from_static(UBUNTU_LIGHT)), ); // Bigger emojis, and more. : font_data.insert( "emoji-icon-font".to_owned(), - FontData::from_static(EMOJI_ICON).tweak(FontTweak { + Arc::new(FontData::from_static(EMOJI_ICON).tweak(FontTweak { scale: 0.90, // Make smaller ..Default::default() - }), + })), ); families.insert( @@ -795,7 +798,7 @@ impl FontImplCache { pub fn new( atlas: Arc>, pixels_per_point: f32, - font_data: &BTreeMap, + font_data: &BTreeMap>, ) -> Self { let ab_glyph_fonts = font_data .iter() diff --git a/examples/custom_font/src/main.rs b/examples/custom_font/src/main.rs index 99c98a6e158..c487b6714c0 100644 --- a/examples/custom_font/src/main.rs +++ b/examples/custom_font/src/main.rs @@ -48,9 +48,9 @@ fn replace_fonts(ctx: &egui::Context) { // .ttf and .otf files supported. fonts.font_data.insert( "my_font".to_owned(), - egui::FontData::from_static(include_bytes!( + std::sync::Arc::new(egui::FontData::from_static(include_bytes!( "../../../crates/epaint_default_fonts/fonts/Hack-Regular.ttf" - )), + ))), ); // Put my font first (highest priority) for proportional text: