From 29784618f0bb3cc9e0e2c00313d8369e0e9aebb8 Mon Sep 17 00:00:00 2001 From: Andy Carlson <2yinyang2@gmail.com> Date: Tue, 25 Feb 2025 11:01:49 -0500 Subject: [PATCH 1/3] Avoid panics when calling into dwrote --- Cargo.toml | 2 +- src/loaders/directwrite.rs | 4 +++- src/sources/directwrite.rs | 12 ++++++++---- 3 files changed, 12 insertions(+), 6 deletions(-) diff --git a/Cargo.toml b/Cargo.toml index 43e1d8c..f273f66 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -45,7 +45,7 @@ pbr = "1.0" prettytable-rs = "0.10" [target.'cfg(target_family = "windows")'.dependencies] -dwrote = { version = "0.11", default-features = false } +dwrote = { git = "https://github.com/servo/dwrote-rs", rev = "dbce1fbdaf98d0903637fca33ddf25f5c6627269", default-features = false } [target.'cfg(target_family = "windows")'.dependencies.winapi] version = "0.3" diff --git a/src/loaders/directwrite.rs b/src/loaders/directwrite.rs index b39b7d9..4f77fd9 100644 --- a/src/loaders/directwrite.rs +++ b/src/loaders/directwrite.rs @@ -105,7 +105,9 @@ impl Font { font_index -= 1; continue; } - let dwrite_font = family.get_font(family_font_index); + let Ok(dwrite_font) = family.font(family_font_index) else { + continue; + }; let dwrite_font_face = dwrite_font.create_font_face(); return Ok(Font { dwrite_font, diff --git a/src/sources/directwrite.rs b/src/sources/directwrite.rs index 16a8f9f..6f1aaaa 100644 --- a/src/sources/directwrite.rs +++ b/src/sources/directwrite.rs @@ -41,7 +41,9 @@ impl DirectWriteSource { for dwrite_family in self.system_font_collection.families_iter() { for font_index in 0..dwrite_family.get_font_count() { - let dwrite_font = dwrite_family.get_font(font_index); + let Ok(dwrite_font) = dwrite_family.font(font_index) else { + continue; + }; handles.push(self.create_handle_from_dwrite_font(dwrite_font)) } } @@ -54,7 +56,7 @@ impl DirectWriteSource { Ok(self .system_font_collection .families_iter() - .map(|dwrite_family| dwrite_family.name()) + .filter_map(|dwrite_family| dwrite_family.family_name().ok()) .collect()) } @@ -71,8 +73,10 @@ impl DirectWriteSource { None => return Err(SelectionError::NotFound), }; for font_index in 0..dwrite_family.get_font_count() { - let dwrite_font = dwrite_family.get_font(font_index); - family.push(self.create_handle_from_dwrite_font(dwrite_font)) + let Ok(dwrite_font) = dwrite_family.font(font_index) else { + continue; + }; + family.push(self.create_handle_from_dwrite_font(dwrite_font)); } Ok(family) } From 88acee7ed0c5ab79a85904e56bc1cdeaae73b926 Mon Sep 17 00:00:00 2001 From: Andy Carlson <2yinyang2@gmail.com> Date: Sat, 29 Mar 2025 15:32:52 -0400 Subject: [PATCH 2/3] bump dwrote version --- Cargo.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Cargo.toml b/Cargo.toml index f273f66..1fe32a1 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -45,7 +45,7 @@ pbr = "1.0" prettytable-rs = "0.10" [target.'cfg(target_family = "windows")'.dependencies] -dwrote = { git = "https://github.com/servo/dwrote-rs", rev = "dbce1fbdaf98d0903637fca33ddf25f5c6627269", default-features = false } +dwrote = { version = "^0.11.3", default-features = false } [target.'cfg(target_family = "windows")'.dependencies.winapi] version = "0.3" From f4a8d8e137a4b702268174a9ef1586a9dd611c38 Mon Sep 17 00:00:00 2001 From: Andy Carlson <2yinyang2@gmail.com> Date: Sat, 29 Mar 2025 15:35:43 -0400 Subject: [PATCH 3/3] migrate another method call --- src/sources/directwrite.rs | 9 +++------ 1 file changed, 3 insertions(+), 6 deletions(-) diff --git a/src/sources/directwrite.rs b/src/sources/directwrite.rs index 6f1aaaa..b295279 100644 --- a/src/sources/directwrite.rs +++ b/src/sources/directwrite.rs @@ -65,12 +65,9 @@ impl DirectWriteSource { /// TODO(pcwalton): Case-insensitivity. pub fn select_family_by_name(&self, family_name: &str) -> Result { let mut family = FamilyHandle::new(); - let dwrite_family = match self - .system_font_collection - .get_font_family_by_name(family_name) - { - Some(dwrite_family) => dwrite_family, - None => return Err(SelectionError::NotFound), + let dwrite_family = match self.system_font_collection.font_family_by_name(family_name) { + Ok(Some(dwrite_family)) => dwrite_family, + Err(_) | Ok(None) => return Err(SelectionError::NotFound), }; for font_index in 0..dwrite_family.get_font_count() { let Ok(dwrite_font) = dwrite_family.font(font_index) else {