From 5c75e00fefc86370d796843835606cbd0714370c Mon Sep 17 00:00:00 2001 From: Andy Carlson <2yinyang2@gmail.com> Date: Tue, 25 Feb 2025 10:51:05 -0500 Subject: [PATCH 1/4] add fallible font methods on Font struct --- src/font.rs | 61 ++++++++++++++++++++++++++++++++++++++++------------- 1 file changed, 46 insertions(+), 15 deletions(-) diff --git a/src/font.rs b/src/font.rs index 37b915d..a755077 100644 --- a/src/font.rs +++ b/src/font.rs @@ -87,49 +87,80 @@ impl Font { unsafe { mem::transmute::((*self.native.get()).GetSimulations()) } } + #[deprecated(note = "Use `try_family_name` instead.")] pub fn family_name(&self) -> String { + self.try_family_name().unwrap() + } + + pub fn try_family_name(&self) -> Result { + let mut family: *mut IDWriteFontFamily = ptr::null_mut(); unsafe { - let mut family: *mut IDWriteFontFamily = ptr::null_mut(); let hr = (*self.native.get()).GetFontFamily(&mut family); - assert!(hr == 0); + if hr != S_OK { + return Err(hr); + } - FontFamily::take(ComPtr::from_raw(family)).name() + FontFamily::take(ComPtr::from_raw(family)).family_name() } } + #[deprecated(note = "Use `try_face_name` instead.")] pub fn face_name(&self) -> String { + self.try_face_name().unwrap() + } + + pub fn try_face_name(&self) -> Result { + let mut names: *mut IDWriteLocalizedStrings = ptr::null_mut(); unsafe { - let mut names: *mut IDWriteLocalizedStrings = ptr::null_mut(); let hr = (*self.native.get()).GetFaceNames(&mut names); - assert!(hr == 0); + if hr != S_OK { + return Err(hr); + } - get_locale_string(&mut ComPtr::from_raw(names)) + Ok(get_locale_string(&mut ComPtr::from_raw(names))) } } + #[deprecated(note = "Use `try_informational_string` instead.")] pub fn informational_string(&self, id: InformationalStringId) -> Option { + self.try_informational_string(id).unwrap() + } + + pub fn try_informational_string( + &self, + id: InformationalStringId, + ) -> Result, HRESULT> { + let mut names: *mut IDWriteLocalizedStrings = ptr::null_mut(); + let mut exists = FALSE; + let id = id as DWRITE_INFORMATIONAL_STRING_ID; unsafe { - let mut names: *mut IDWriteLocalizedStrings = ptr::null_mut(); - let mut exists = FALSE; - let id = id as DWRITE_INFORMATIONAL_STRING_ID; let hr = (*self.native.get()).GetInformationalStrings(id, &mut names, &mut exists); - assert!(hr == S_OK); + if hr != S_OK { + return Err(hr); + } if exists == TRUE { - Some(get_locale_string(&mut ComPtr::from_raw(names))) + Ok(Some(get_locale_string(&mut ComPtr::from_raw(names)))) } else { - None + Ok(None) } } } + #[deprecated(note = "Use `try_create_font_face` instead.")] pub fn create_font_face(&self) -> FontFace { + self.try_create_font_face().unwrap() + } + + pub fn try_create_font_face(&self) -> Result { + let mut face: *mut IDWriteFontFace = ptr::null_mut(); // FIXME create_font_face should cache the FontFace and return it, // there's a 1:1 relationship unsafe { - let mut face: *mut IDWriteFontFace = ptr::null_mut(); let hr = (*self.native.get()).CreateFontFace(&mut face); - assert!(hr == 0); - FontFace::take(ComPtr::from_raw(face)) + if hr != S_OK { + return Err(hr); + } + Ok(FontFace::take(ComPtr::from_raw(face))) } } From f2b1b56d36df9aba4d26d68cfdb30abeb666d27d Mon Sep 17 00:00:00 2001 From: Andy Carlson <2yinyang2@gmail.com> Date: Sun, 23 Mar 2025 09:46:08 -0400 Subject: [PATCH 2/4] make naming consistent with other modules --- src/font.rs | 34 +++++++++++++++++----------------- 1 file changed, 17 insertions(+), 17 deletions(-) diff --git a/src/font.rs b/src/font.rs index a755077..033627d 100644 --- a/src/font.rs +++ b/src/font.rs @@ -57,7 +57,7 @@ impl Font { pub fn to_descriptor(&self) -> FontDescriptor { FontDescriptor { - family_name: self.family_name(), + family_name: self.get_family_name(), stretch: self.stretch(), style: self.style(), weight: self.weight(), @@ -87,12 +87,12 @@ impl Font { unsafe { mem::transmute::((*self.native.get()).GetSimulations()) } } - #[deprecated(note = "Use `try_family_name` instead.")] - pub fn family_name(&self) -> String { - self.try_family_name().unwrap() + #[deprecated(note = "Use `family_name` instead.")] + pub fn get_family_name(&self) -> String { + self.family_name().unwrap() } - pub fn try_family_name(&self) -> Result { + pub fn family_name(&self) -> Result { let mut family: *mut IDWriteFontFamily = ptr::null_mut(); unsafe { let hr = (*self.native.get()).GetFontFamily(&mut family); @@ -104,12 +104,12 @@ impl Font { } } - #[deprecated(note = "Use `try_face_name` instead.")] - pub fn face_name(&self) -> String { - self.try_face_name().unwrap() + #[deprecated(note = "Use `face_name` instead.")] + pub fn get_face_name(&self) -> String { + self.face_name().unwrap() } - pub fn try_face_name(&self) -> Result { + pub fn face_name(&self) -> Result { let mut names: *mut IDWriteLocalizedStrings = ptr::null_mut(); unsafe { let hr = (*self.native.get()).GetFaceNames(&mut names); @@ -121,12 +121,12 @@ impl Font { } } - #[deprecated(note = "Use `try_informational_string` instead.")] - pub fn informational_string(&self, id: InformationalStringId) -> Option { - self.try_informational_string(id).unwrap() + #[deprecated(note = "Use `informational_string` instead.")] + pub fn get_informational_string(&self, id: InformationalStringId) -> Option { + self.informational_string(id).unwrap() } - pub fn try_informational_string( + pub fn informational_string( &self, id: InformationalStringId, ) -> Result, HRESULT> { @@ -146,12 +146,12 @@ impl Font { } } - #[deprecated(note = "Use `try_create_font_face` instead.")] - pub fn create_font_face(&self) -> FontFace { - self.try_create_font_face().unwrap() + #[deprecated(note = "Use `create_font_face` instead.")] + pub fn get_create_font_face(&self) -> FontFace { + self.create_font_face().unwrap() } - pub fn try_create_font_face(&self) -> Result { + pub fn create_font_face(&self) -> Result { let mut face: *mut IDWriteFontFace = ptr::null_mut(); // FIXME create_font_face should cache the FontFace and return it, // there's a 1:1 relationship From f48d9729fcfc5cb12baef1aa8b1a62db8bc6e243 Mon Sep 17 00:00:00 2001 From: Andy Carlson <2yinyang2@gmail.com> Date: Mon, 22 Dec 2025 22:44:07 -0800 Subject: [PATCH 3/4] add fallible version of get_locale_string --- src/font.rs | 4 ++-- src/font_family.rs | 2 +- src/helpers.rs | 18 ++++++++++++++---- 3 files changed, 17 insertions(+), 7 deletions(-) diff --git a/src/font.rs b/src/font.rs index 033627d..d5d8c76 100644 --- a/src/font.rs +++ b/src/font.rs @@ -117,7 +117,7 @@ impl Font { return Err(hr); } - Ok(get_locale_string(&mut ComPtr::from_raw(names))) + locale_string(&mut ComPtr::from_raw(names)) } } @@ -139,7 +139,7 @@ impl Font { return Err(hr); } if exists == TRUE { - Ok(Some(get_locale_string(&mut ComPtr::from_raw(names)))) + Ok(Some(locale_string(&mut ComPtr::from_raw(names))?)) } else { Ok(None) } diff --git a/src/font_family.rs b/src/font_family.rs index 78dadaa..6f7d654 100644 --- a/src/font_family.rs +++ b/src/font_family.rs @@ -38,7 +38,7 @@ impl FontFamily { if hr != 0 { return Err(hr); } - Ok(get_locale_string(&mut ComPtr::from_raw(family_names))) + locale_string(&mut ComPtr::from_raw(family_names)) } } diff --git a/src/helpers.rs b/src/helpers.rs index 45bf005..2913da6 100644 --- a/src/helpers.rs +++ b/src/helpers.rs @@ -6,9 +6,10 @@ use std::ffi::OsStr; use std::os::windows::ffi::OsStrExt; use winapi::ctypes::wchar_t; use winapi::shared::minwindef::{BOOL, FALSE}; -use winapi::shared::winerror::S_OK; +use winapi::shared::winerror::{E_FAIL, S_OK}; use winapi::um::dwrite::IDWriteLocalizedStrings; use winapi::um::winnls::GetUserDefaultLocaleName; +use winapi::um::winnt::HRESULT; use wio::com::ComPtr; lazy_static! { @@ -22,7 +23,12 @@ lazy_static! { static ref EN_US_LOCALE: Vec = OsStr::new("en-us").to_wide_null(); } +#[deprecated(note = "Use `locale_string` instead.")] pub fn get_locale_string(strings: &mut ComPtr) -> String { + locale_string(strings).unwrap() +} + +pub fn locale_string(strings: &mut ComPtr) -> Result { unsafe { let mut index: u32 = 0; let mut exists: BOOL = FALSE; @@ -37,14 +43,18 @@ pub fn get_locale_string(strings: &mut ComPtr) -> Strin let mut length: u32 = 0; let hr = strings.GetStringLength(index, &mut length); - assert!(hr == 0); + if hr != S_OK { + return Err(hr); + } let mut name: Vec = Vec::with_capacity(length as usize + 1); let hr = strings.GetString(index, name.as_mut_ptr(), length + 1); - assert!(hr == 0); + if hr != S_OK { + return Err(hr); + } name.set_len(length as usize); - String::from_utf16(&name).ok().unwrap() + String::from_utf16(&name).map_err(|_| E_FAIL) } } From 0c307e826ac1d51af90bafbdfd81fc0675116c6f Mon Sep 17 00:00:00 2001 From: Andy Carlson <2yinyang2@gmail.com> Date: Tue, 23 Dec 2025 09:59:41 -0800 Subject: [PATCH 4/4] remove unneeded deprecated function --- src/font.rs | 6 +++--- src/font_family.rs | 2 +- src/helpers.rs | 7 +------ 3 files changed, 5 insertions(+), 10 deletions(-) diff --git a/src/font.rs b/src/font.rs index d5d8c76..dfa980b 100644 --- a/src/font.rs +++ b/src/font.rs @@ -57,7 +57,7 @@ impl Font { pub fn to_descriptor(&self) -> FontDescriptor { FontDescriptor { - family_name: self.get_family_name(), + family_name: self.family_name().unwrap_or_default(), stretch: self.stretch(), style: self.style(), weight: self.weight(), @@ -117,7 +117,7 @@ impl Font { return Err(hr); } - locale_string(&mut ComPtr::from_raw(names)) + get_locale_string(&mut ComPtr::from_raw(names)) } } @@ -139,7 +139,7 @@ impl Font { return Err(hr); } if exists == TRUE { - Ok(Some(locale_string(&mut ComPtr::from_raw(names))?)) + Ok(Some(get_locale_string(&mut ComPtr::from_raw(names))?)) } else { Ok(None) } diff --git a/src/font_family.rs b/src/font_family.rs index 6f7d654..786b0ce 100644 --- a/src/font_family.rs +++ b/src/font_family.rs @@ -38,7 +38,7 @@ impl FontFamily { if hr != 0 { return Err(hr); } - locale_string(&mut ComPtr::from_raw(family_names)) + get_locale_string(&mut ComPtr::from_raw(family_names)) } } diff --git a/src/helpers.rs b/src/helpers.rs index 2913da6..3f5c154 100644 --- a/src/helpers.rs +++ b/src/helpers.rs @@ -23,12 +23,7 @@ lazy_static! { static ref EN_US_LOCALE: Vec = OsStr::new("en-us").to_wide_null(); } -#[deprecated(note = "Use `locale_string` instead.")] -pub fn get_locale_string(strings: &mut ComPtr) -> String { - locale_string(strings).unwrap() -} - -pub fn locale_string(strings: &mut ComPtr) -> Result { +pub fn get_locale_string(strings: &mut ComPtr) -> Result { unsafe { let mut index: u32 = 0; let mut exists: BOOL = FALSE;