summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJoe Wilm <joe@jwilm.com>2016-02-21 15:20:03 -0800
committerJoe Wilm <joe@jwilm.com>2016-02-21 15:20:03 -0800
commit2a7dc1deb825f9f1db6de8b50656ef420ff41a44 (patch)
treee7206c9a4187232bccee88ee7cfa5e1d14ecbad4
parent621776cd94890936b24f3abb8b7ec1f36dad9150 (diff)
Add function for listing font names on linux
This function isn't exactly useful, but it's working ffi with the fontconfig library. Woo! Next step will be returning some objects with more information (like font path so we can start rendering glyphs!).
-rw-r--r--.travis.yml10
-rw-r--r--Cargo.lock68
-rw-r--r--Cargo.toml3
-rw-r--r--src/list_fonts.rs57
-rw-r--r--src/main.rs6
5 files changed, 144 insertions, 0 deletions
diff --git a/.travis.yml b/.travis.yml
new file mode 100644
index 00000000..e0aa2236
--- /dev/null
+++ b/.travis.yml
@@ -0,0 +1,10 @@
+language: rust
+sudo: false
+
+rust:
+ # There's currently a cargo bug on stable which prevents libfontconfig_sys
+ # from building properly.
+ - nightly
+
+script:
+ - cargo test
diff --git a/Cargo.lock b/Cargo.lock
new file mode 100644
index 00000000..5afbf7ed
--- /dev/null
+++ b/Cargo.lock
@@ -0,0 +1,68 @@
+[root]
+name = "alacritty"
+version = "0.1.0"
+dependencies = [
+ "freetype 0.1.0 (git+https://github.com/servo/rust-freetype.git)",
+ "libc 0.2.7 (registry+https://github.com/rust-lang/crates.io-index)",
+ "servo-fontconfig 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)",
+]
+
+[[package]]
+name = "expat-sys"
+version = "2.1.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+dependencies = [
+ "make-cmd 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)",
+ "pkg-config 0.3.7 (registry+https://github.com/rust-lang/crates.io-index)",
+]
+
+[[package]]
+name = "freetype"
+version = "0.1.0"
+source = "git+https://github.com/servo/rust-freetype.git#d564ff90a3c69d987f5c015d7ec034cfaee21aff"
+dependencies = [
+ "libc 0.2.7 (registry+https://github.com/rust-lang/crates.io-index)",
+]
+
+[[package]]
+name = "libc"
+version = "0.2.7"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+
+[[package]]
+name = "make-cmd"
+version = "0.1.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+
+[[package]]
+name = "pkg-config"
+version = "0.3.7"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+
+[[package]]
+name = "servo-fontconfig"
+version = "0.2.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+dependencies = [
+ "libc 0.2.7 (registry+https://github.com/rust-lang/crates.io-index)",
+ "servo-fontconfig-sys 2.11.3 (registry+https://github.com/rust-lang/crates.io-index)",
+]
+
+[[package]]
+name = "servo-fontconfig-sys"
+version = "2.11.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+dependencies = [
+ "expat-sys 2.1.2 (registry+https://github.com/rust-lang/crates.io-index)",
+ "pkg-config 0.3.7 (registry+https://github.com/rust-lang/crates.io-index)",
+ "servo-freetype-sys 2.4.11 (registry+https://github.com/rust-lang/crates.io-index)",
+]
+
+[[package]]
+name = "servo-freetype-sys"
+version = "2.4.11"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+dependencies = [
+ "pkg-config 0.3.7 (registry+https://github.com/rust-lang/crates.io-index)",
+]
+
diff --git a/Cargo.toml b/Cargo.toml
index e970b9ea..d2aa21e5 100644
--- a/Cargo.toml
+++ b/Cargo.toml
@@ -4,3 +4,6 @@ version = "0.1.0"
authors = ["Joe Wilm <joe@jwilm.com>"]
[dependencies]
+servo-fontconfig = "0.2"
+freetype = { git = "https://github.com/servo/rust-freetype.git" }
+libc = "*"
diff --git a/src/list_fonts.rs b/src/list_fonts.rs
new file mode 100644
index 00000000..9b15ea3d
--- /dev/null
+++ b/src/list_fonts.rs
@@ -0,0 +1,57 @@
+use std::ffi::CStr;
+use std::ptr;
+use std::str;
+
+use libc::{c_char, c_int};
+
+use fontconfig::fontconfig::{FcConfigGetCurrent, FcConfigGetFonts, FcSetSystem};
+use fontconfig::fontconfig::{FcPatternGetString};
+use fontconfig::fontconfig::{FcResultMatch};
+use fontconfig::fontconfig::{FcChar8};
+
+pub fn list_font_names() -> Vec<String> {
+ let mut fonts = Vec::new();
+ unsafe {
+ // https://www.freedesktop.org/software/fontconfig/fontconfig-devel/fcconfiggetcurrent.html
+ let config = FcConfigGetCurrent(); // *mut FcConfig
+
+ // https://www.freedesktop.org/software/fontconfig/fontconfig-devel/fcconfiggetfonts.html
+ let font_set = FcConfigGetFonts(config, FcSetSystem); // *mut FcFontSet
+
+ let nfont = (*font_set).nfont as isize;
+ for i in 0..nfont {
+ let font = (*font_set).fonts.offset(i); // *mut FcPattern
+ let id = 0 as c_int;
+ let mut fullname: *mut FcChar8 = ptr::null_mut();
+
+ // The second parameter here (fullname) is from the "FONT PROPERTIES" table:
+ // https://www.freedesktop.org/software/fontconfig/fontconfig-devel/x19.html
+ let result = FcPatternGetString(*font,
+ b"fullname\0".as_ptr() as *mut c_char,
+ id,
+ &mut fullname);
+ if result != FcResultMatch {
+ continue;
+ }
+
+ let s = str::from_utf8(CStr::from_ptr(fullname as *const c_char).to_bytes())
+ .unwrap().to_owned();
+ fonts.push(s);
+ }
+ }
+
+ fonts
+}
+
+#[cfg(test)]
+mod tests {
+ use super::list_font_names;
+
+ #[test]
+ fn list_fonts() {
+ let fonts = list_font_names();
+ assert!(!fonts.is_empty());
+
+ println!("fonts: {:?}", fonts);
+ }
+}
diff --git a/src/main.rs b/src/main.rs
index e7a11a96..66be9b34 100644
--- a/src/main.rs
+++ b/src/main.rs
@@ -1,3 +1,9 @@
+extern crate fontconfig;
+extern crate freetype;
+extern crate libc;
+
+mod list_fonts;
+
fn main() {
println!("Hello, world!");
}