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