diff options
Diffstat (limited to 'font/src/ft/fc/char_set.rs')
-rw-r--r-- | font/src/ft/fc/char_set.rs | 43 |
1 files changed, 41 insertions, 2 deletions
diff --git a/font/src/ft/fc/char_set.rs b/font/src/ft/fc/char_set.rs index 89554458..4bba4818 100644 --- a/font/src/ft/fc/char_set.rs +++ b/font/src/ft/fc/char_set.rs @@ -13,15 +13,19 @@ // limitations under the License. use std::ptr::NonNull; -use foreign_types::{foreign_type, ForeignTypeRef}; +use foreign_types::{foreign_type, ForeignType, ForeignTypeRef}; use super::ffi::FcCharSetCreate; -use super::ffi::{FcCharSet, FcCharSetAddChar, FcCharSetDestroy}; +use super::ffi::{ + FcBool, FcCharSet, FcCharSetAddChar, FcCharSetCopy, FcCharSetCount, FcCharSetDestroy, + FcCharSetHasChar, FcCharSetMerge, FcCharSetSubtract, FcCharSetUnion, +}; foreign_type! { pub unsafe type CharSet { type CType = FcCharSet; fn drop = FcCharSetDestroy; + fn clone = FcCharSetCopy; } } @@ -41,4 +45,39 @@ impl CharSetRef { pub fn add(&mut self, glyph: char) -> bool { unsafe { FcCharSetAddChar(self.as_ptr(), glyph as _) == 1 } } + + pub fn has_char(&self, glyph: char) -> bool { + unsafe { FcCharSetHasChar(self.as_ptr(), glyph as _) == 1 } + } + + pub fn count(&self) -> u32 { + unsafe { FcCharSetCount(self.as_ptr()) as u32 } + } + + pub fn union(&self, other: &CharSetRef) -> CharSet { + unsafe { + let ptr = FcCharSetUnion(self.as_ptr() as _, other.as_ptr() as _); + CharSet::from_ptr(ptr) + } + } + + pub fn subtract(&self, other: &CharSetRef) -> CharSet { + unsafe { + let ptr = FcCharSetSubtract(self.as_ptr() as _, other.as_ptr() as _); + CharSet::from_ptr(ptr) + } + } + + pub fn merge(&self, other: &CharSetRef) -> Result<bool, ()> { + unsafe { + // Value is just an indicator whether something was added or not + let mut value: FcBool = 0; + let res = FcCharSetMerge(self.as_ptr() as _, other.as_ptr() as _, &mut value); + if res == 0 { + Err(()) + } else { + Ok(value != 0) + } + } + } } |