diff options
-rw-r--r-- | .travis.yml | 10 | ||||
-rw-r--r-- | Cargo.lock | 68 | ||||
-rw-r--r-- | Cargo.toml | 3 | ||||
-rw-r--r-- | src/list_fonts.rs | 57 | ||||
-rw-r--r-- | src/main.rs | 6 |
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)", +] + @@ -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!"); } |