diff --git a/crates/gpui/src/platform/mac/text_system.rs b/crates/gpui/src/platform/mac/text_system.rs index 83d4fce909..083e9cc1d8 100644 --- a/crates/gpui/src/platform/mac/text_system.rs +++ b/crates/gpui/src/platform/mac/text_system.rs @@ -51,13 +51,19 @@ const kCGImageAlphaOnly: u32 = 7; pub(crate) struct MacTextSystem(RwLock); +#[derive(Clone, PartialEq, Eq, Hash)] +struct FontKey { + font_family: SharedString, + font_features: FontFeatures, +} + struct MacTextSystemState { memory_source: MemSource, system_source: SystemSource, fonts: Vec, font_selections: HashMap, font_ids_by_postscript_name: HashMap, - font_ids_by_family_name: HashMap>, + font_ids_by_font_key: HashMap>, postscript_names_by_font_id: HashMap, } @@ -69,7 +75,7 @@ impl MacTextSystem { fonts: Vec::new(), font_selections: HashMap::default(), font_ids_by_postscript_name: HashMap::default(), - font_ids_by_family_name: HashMap::default(), + font_ids_by_font_key: HashMap::default(), postscript_names_by_font_id: HashMap::default(), })) } @@ -115,14 +121,16 @@ impl PlatformTextSystem for MacTextSystem { Ok(*font_id) } else { let mut lock = RwLockUpgradableReadGuard::upgrade(lock); - let candidates = if let Some(font_ids) = lock.font_ids_by_family_name.get(&font.family) - { + let font_key = FontKey { + font_family: font.family.clone(), + font_features: font.features, + }; + let candidates = if let Some(font_ids) = lock.font_ids_by_font_key.get(&font_key) { font_ids.as_slice() } else { let font_ids = lock.load_family(&font.family, font.features)?; - lock.font_ids_by_family_name - .insert(font.family.clone(), font_ids); - lock.font_ids_by_family_name[&font.family].as_ref() + lock.font_ids_by_font_key.insert(font_key.clone(), font_ids); + lock.font_ids_by_font_key[&font_key].as_ref() }; let candidate_properties = candidates