fontconfig: Branch 'main' - 2 commits
GitLab Mirror
gitlab-mirror at kemper.freedesktop.org
Wed Apr 23 00:55:14 UTC 2025
fc-fontations/meson.build | 2
fc-fontations/pattern_bindings/fc_wrapper.rs | 55 +++++++++++++++++-
fc-fontations/pattern_bindings/mod.rs | 82 ++++++++++++++++++++++++---
3 files changed, 127 insertions(+), 12 deletions(-)
New commits:
commit 9e61da483a12a4d832034b4e8165624805f3ca54
Merge: 3897e1f 27582d4
Author: Akira TAGOH <akira at tagoh.org>
Date: Wed Apr 23 00:55:10 2025 +0000
Merge branch 'langSetCharSet' into 'main'
[Fontations] Pattern Bindings for CharSet and LangSet
See merge request fontconfig/fontconfig!385
commit 27582d4e64cb680f7e8922c50e2c8244943d4a28
Author: Dominik Röttsches <drott at chromium.org>
Date: Tue Apr 15 11:07:08 2025 +0300
[Fontations] Pattern Bindings for CharSet and LangSet
* Add wrappers and pattern bindings for FcCharSet and FcLangSet.
* Add a basic test to check that adding each of these to a
pattern correctly roundtrips.
Changelog: added
diff --git a/fc-fontations/meson.build b/fc-fontations/meson.build
index 821cf4e..567dc24 100644
--- a/fc-fontations/meson.build
+++ b/fc-fontations/meson.build
@@ -9,7 +9,7 @@ if (fontations.enabled())
include_directories : [ '../' ],
args : [
'--merge-extern-blocks',
- '--allowlist-item=(FcCharSet.*|FC_(SLANT|WEIGHT|WIDTH)_.*|FcFontSet(Add|Create|Destroy).*|FcLangSet(Destroy|Copy)|FcWeightFromOpenType.*)',
+ '--allowlist-item=(FcCharSet.*|FC_(SLANT|WEIGHT|WIDTH)_.*|FcFontSet(Add|Create|Destroy).*|FcLangSet(Create|Destroy|Copy|Add|HasLang)|FcWeightFromOpenType.*)',
'--raw-line=#![allow(nonstandard_style,unused)]',
'--raw-line= ',
'--raw-line=pub mod fcint;',
diff --git a/fc-fontations/pattern_bindings/fc_wrapper.rs b/fc-fontations/pattern_bindings/fc_wrapper.rs
index d7f034c..125b172 100644
--- a/fc-fontations/pattern_bindings/fc_wrapper.rs
+++ b/fc-fontations/pattern_bindings/fc_wrapper.rs
@@ -22,9 +22,12 @@
* PERFORMANCE OF THIS SOFTWARE.
*/
-use fc_fontations_bindgen::fcint::{
- FcPattern, FcPatternCreate, FcPatternDestroy, FcRange, FcRangeCopy, FcRangeCreateDouble,
- FcRangeDestroy,
+use fc_fontations_bindgen::{
+ fcint::{
+ FcCharSet, FcCharSetCreate, FcCharSetDestroy, FcLangSet, FcPattern, FcPatternCreate,
+ FcPatternDestroy, FcRange, FcRangeCopy, FcRangeCreateDouble, FcRangeDestroy,
+ },
+ FcLangSetCreate, FcLangSetDestroy,
};
macro_rules! wrap_fc_object {
@@ -121,3 +124,49 @@ impl FcPatternWrapper {
}
}
}
+
+wrap_fc_object! {
+ FcCharSetWrapper,
+ FcCharSet,
+ FcCharSetDestroy
+}
+
+impl FcCharSetWrapper {
+ #[allow(unused)]
+ pub fn new() -> Option<Self> {
+ let created_charset: *mut FcCharSet;
+ unsafe {
+ created_charset = FcCharSetCreate();
+ }
+ if created_charset.is_null() {
+ None
+ } else {
+ Some(Self {
+ inner: created_charset,
+ })
+ }
+ }
+}
+
+wrap_fc_object! {
+ FcLangSetWrapper,
+ FcLangSet,
+ FcLangSetDestroy
+}
+
+impl FcLangSetWrapper {
+ #[allow(unused)]
+ pub fn new() -> Option<Self> {
+ let created_langset: *mut FcLangSet;
+ unsafe {
+ created_langset = FcLangSetCreate();
+ }
+ if created_langset.is_null() {
+ None
+ } else {
+ Some(Self {
+ inner: created_langset,
+ })
+ }
+ }
+}
diff --git a/fc-fontations/pattern_bindings/mod.rs b/fc-fontations/pattern_bindings/mod.rs
index 62efe16..623b8bb 100644
--- a/fc-fontations/pattern_bindings/mod.rs
+++ b/fc-fontations/pattern_bindings/mod.rs
@@ -30,11 +30,12 @@ use std::ffi::CString;
use std::fmt::Debug;
use fc_fontations_bindgen::fcint::{
- FcPattern, FcPatternObjectAddBool, FcPatternObjectAddDouble, FcPatternObjectAddInteger,
- FcPatternObjectAddRange, FcPatternObjectAddString, FC_FAMILY_OBJECT,
+ FcPattern, FcPatternObjectAddBool, FcPatternObjectAddCharSet, FcPatternObjectAddDouble,
+ FcPatternObjectAddInteger, FcPatternObjectAddLangSet, FcPatternObjectAddRange,
+ FcPatternObjectAddString, FC_FAMILY_OBJECT,
};
-use self::fc_wrapper::{FcPatternWrapper, FcRangeWrapper};
+use self::fc_wrapper::{FcCharSetWrapper, FcLangSetWrapper, FcPatternWrapper, FcRangeWrapper};
#[allow(unused)]
#[derive(Debug)]
@@ -44,6 +45,8 @@ pub enum PatternValue {
Integer(i32),
Double(f64),
Range(FcRangeWrapper),
+ LangSet(FcLangSetWrapper),
+ CharSet(FcCharSetWrapper),
}
impl From<CString> for PatternValue {
@@ -98,6 +101,12 @@ impl PatternElement {
PatternValue::Range(value) => unsafe {
FcPatternObjectAddRange(pattern, self.object_id, value.into_raw())
},
+ PatternValue::CharSet(value) => unsafe {
+ FcPatternObjectAddCharSet(pattern, self.object_id, value.into_raw())
+ },
+ PatternValue::LangSet(value) => unsafe {
+ FcPatternObjectAddLangSet(pattern, self.object_id, value.into_raw())
+ },
} == 1;
if pattern_add_success {
return Ok(());
@@ -154,11 +163,21 @@ impl FcPatternBuilder {
mod test {
use std::ffi::CString;
- use super::{FcPatternBuilder, FcRangeWrapper, PatternElement, PatternValue};
- use fc_fontations_bindgen::fcint::{
- FcPatternObjectGetBool, FcPatternObjectGetDouble, FcPatternObjectGetInteger,
- FcPatternObjectGetRange, FcPatternObjectGetString, FcRange, FC_COLOR_OBJECT,
- FC_FAMILY_OBJECT, FC_SLANT_OBJECT, FC_WEIGHT_OBJECT, FC_WIDTH_OBJECT,
+ use crate::pattern_bindings::fc_wrapper::FcLangSetWrapper;
+
+ use super::{
+ fc_wrapper::FcCharSetWrapper, FcPatternBuilder, FcRangeWrapper, PatternElement,
+ PatternValue,
+ };
+ use fc_fontations_bindgen::{
+ fcint::{
+ FcPatternObjectGetBool, FcPatternObjectGetCharSet, FcPatternObjectGetDouble,
+ FcPatternObjectGetInteger, FcPatternObjectGetLangSet, FcPatternObjectGetRange,
+ FcPatternObjectGetString, FcRange, FC_CHARSET_OBJECT, FC_COLOR_OBJECT,
+ FC_FAMILY_OBJECT, FC_LANG_OBJECT, FC_SLANT_OBJECT, FC_WEIGHT_OBJECT, FC_WIDTH_OBJECT,
+ },
+ FcCharSet, FcCharSetAddChar, FcCharSetHasChar, FcLangSet, FcLangSetAdd, FcLangSetHasLang,
+ _FcLangResult_FcLangEqual,
};
#[test]
@@ -189,6 +208,28 @@ mod test {
PatternValue::String(CString::new("TestFont").unwrap()),
));
+ let test_charset = FcCharSetWrapper::new().unwrap();
+ const BIANG: u32 = 0x30EDE;
+ unsafe {
+ assert!(FcCharSetAddChar(test_charset.as_ptr(), BIANG) != 0);
+ }
+
+ pattern_builder.append_element(PatternElement::new(
+ FC_CHARSET_OBJECT as i32,
+ PatternValue::CharSet(test_charset),
+ ));
+
+ let test_langset = FcLangSetWrapper::new().unwrap();
+ const LANG_EN: &[u8] = b"en\0";
+ unsafe {
+ assert!(FcLangSetAdd(test_langset.as_ptr(), LANG_EN.as_ptr()) != 0);
+ }
+
+ pattern_builder.append_element(PatternElement::new(
+ FC_LANG_OBJECT as i32,
+ PatternValue::LangSet(test_langset),
+ ));
+
let pattern = pattern_builder.create_fc_pattern().unwrap();
let fontconfig_pattern = pattern.as_ptr();
@@ -261,6 +302,31 @@ mod test {
.unwrap(),
"TestFont"
);
+
+ // Verify CharSet.
+ let mut retrieved_charset: *mut FcCharSet = std::mem::zeroed();
+ let get_result = FcPatternObjectGetCharSet(
+ fontconfig_pattern,
+ FC_CHARSET_OBJECT as i32,
+ 0,
+ &mut retrieved_charset,
+ );
+ assert_eq!(get_result, 0);
+ assert_eq!(FcCharSetHasChar(retrieved_charset, BIANG), 1);
+
+ // Verify LangSet.
+ let mut retrieved_langset: *mut FcLangSet = std::mem::zeroed();
+ let get_result = FcPatternObjectGetLangSet(
+ fontconfig_pattern,
+ FC_LANG_OBJECT as i32,
+ 0,
+ &mut retrieved_langset,
+ );
+ assert_eq!(get_result, 0);
+ assert_eq!(
+ FcLangSetHasLang(retrieved_langset, LANG_EN.as_ptr()),
+ _FcLangResult_FcLangEqual
+ );
}
}
}
More information about the Fontconfig
mailing list