fontconfig: Branch 'main' - 2 commits
GitLab Mirror
gitlab-mirror at kemper.freedesktop.org
Thu May 1 08:43:36 UTC 2025
fc-fontations/foundries.rs | 69 +++++++++++++++++++++++++++++++++++++++
fc-fontations/mod.rs | 13 ++++++-
test/test_fontations_ft_query.py | 1
3 files changed, 81 insertions(+), 2 deletions(-)
New commits:
commit 86fd90c69117b327b6ec42da4ce32de877908684
Merge: 83f34e1 40d8ed9
Author: Akira TAGOH <akira at tagoh.org>
Date: Thu May 1 08:43:32 2025 +0000
Merge branch 'foundries' into 'main'
[Fontations] Add support for "foundry" pattern element
See merge request fontconfig/fontconfig!394
commit 40d8ed917aec9e27288398a653c315681a665364
Author: Dominik Röttsches <drott at chromium.org>
Date: Fri Apr 25 15:51:37 2025 +0300
[Fontations] Add support for "foundry" pattern element
Parse foundry from OS/2 with fallback to name table entries.
diff --git a/fc-fontations/foundries.rs b/fc-fontations/foundries.rs
new file mode 100644
index 0000000..d416d9f
--- /dev/null
+++ b/fc-fontations/foundries.rs
@@ -0,0 +1,69 @@
+/*
+ * fontconfig/fc-fontations/foundries.rs
+ *
+ * Copyright 2025 Google LLC.
+ *
+ * Permission to use, copy, modify, distribute, and sell this software and its
+ * documentation for any purpose is hereby granted without fee, provided that
+ * the above copyright notice appear in all copies and that both that
+ * copyright notice and this permission notice appear in supporting
+ * documentation, and that the name of the author(s) not be used in
+ * advertising or publicity pertaining to distribution of the software without
+ * specific, written prior permission. The authors make no
+ * representations about the suitability of this software for any purpose. It
+ * is provided "as is" without express or implied warranty.
+ *
+ * THE AUTHOR(S) DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
+ * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO
+ * EVENT SHALL THE AUTHOR(S) BE LIABLE FOR ANY SPECIAL, INDIRECT OR
+ * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE,
+ * DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
+ * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
+ * PERFORMANCE OF THIS SOFTWARE.
+ */
+
+use read_fonts::TableProvider;
+use skrifa::{
+ string::{LocalizedStrings, StringId},
+ FontRef, MetadataProvider,
+};
+use std::ffi::CString;
+
+fn foundry_name_to_taglike(foundry: &str) -> Option<&'static str> {
+ match foundry {
+ "Adobe" => Some("adobe"),
+ "Bigelow" => Some("b&h"),
+ "Bitstream" => Some("bitstream"),
+ "Gnat" | "Iorsh" => Some("culmus"),
+ "HanYang System" => Some("hanyang"),
+ "Font21" => Some("hwan"),
+ "IBM" => Some("ibm"),
+ "International Typeface Corporation" => Some("itc"),
+ "Linotype" | "LINOTYPE-HELL" => Some("linotype"),
+ "Microsoft" => Some("microsoft"),
+ "Monotype" => Some("monotype"),
+ "Omega" => Some("omega"),
+ "Tiro Typeworks" => Some("tiro"),
+ "URW" => Some("urw"),
+ "XFree86" => Some("xfree86"),
+ "Xorg" => Some("xorg"),
+ _ => None,
+ }
+}
+
+fn map_foundry_from_name_entry(localized_strings: &mut LocalizedStrings) -> Option<CString> {
+ localized_strings.into_iter().find_map(|foundry_name| {
+ foundry_name_to_taglike(foundry_name.to_string().as_str())
+ .map(|foundry| CString::new(foundry).unwrap())
+ })
+}
+
+pub fn make_foundry(font: &FontRef) -> Option<CString> {
+ if let Ok(os2) = font.os2() {
+ return CString::new(os2.ach_vend_id().to_be_bytes()).ok();
+ }
+
+ return map_foundry_from_name_entry(&mut font.localized_strings(StringId::TRADEMARK)).or_else(
+ || map_foundry_from_name_entry(&mut font.localized_strings(StringId::MANUFACTURER)),
+ );
+}
diff --git a/fc-fontations/mod.rs b/fc-fontations/mod.rs
index f039471..272b8d3 100644
--- a/fc-fontations/mod.rs
+++ b/fc-fontations/mod.rs
@@ -24,13 +24,15 @@
mod names;
mod pattern_bindings;
+mod foundries;
+use foundries::make_foundry;
use names::add_names;
use fc_fontations_bindgen::{
fcint::{
- FC_COLOR_OBJECT, FC_FONTFORMAT_OBJECT, FC_FONT_HAS_HINT_OBJECT, FC_OUTLINE_OBJECT,
- FC_SCALABLE_OBJECT,
+ FC_COLOR_OBJECT, FC_FONTFORMAT_OBJECT, FC_FONT_HAS_HINT_OBJECT, FC_FOUNDRY_OBJECT,
+ FC_OUTLINE_OBJECT, FC_SCALABLE_OBJECT,
},
FcFontSet, FcFontSetAdd, FcPattern,
};
@@ -179,6 +181,13 @@ fn build_patterns_for_font(
}
}
+ let foundry_string = make_foundry(font).unwrap_or(CString::new("unknown").unwrap());
+
+ pattern.append_element(PatternElement::new(
+ FC_FOUNDRY_OBJECT as i32,
+ foundry_string.into(),
+ ));
+
pattern
.create_fc_pattern()
.map(|p| p.into_raw() as *mut FcPattern)
diff --git a/test/test_fontations_ft_query.py b/test/test_fontations_ft_query.py
index 6a678aa..706b564 100644
--- a/test/test_fontations_ft_query.py
+++ b/test/test_fontations_ft_query.py
@@ -60,6 +60,7 @@ def test_fontations_freetype_fcquery_equal(font_file):
"fontformat",
"color",
"fonthashint",
+ "foundry",
]
format_string = ":".join(
"%{" + entity + "}" for entity in supported_format_entitites
More information about the Fontconfig
mailing list