1use rust_fontconfig::{FcFontCache, FcPattern, FcWeight, PatternMatch};
6
7fn main() {
8 println!("Building font cache...");
10 let cache = FcFontCache::build();
11 println!("Font cache built with {} fonts\n", cache.list().len());
12
13 println!("=== Query by Family Name ===");
15 let mut trace = Vec::new();
16 let pattern = FcPattern {
17 family: Some("Arial".to_string()),
18 ..Default::default()
19 };
20
21 if let Some(match_result) = cache.query(&pattern, &mut trace) {
22 println!("Found Arial:");
23 println!(" Font ID: {:?}", match_result.id);
24 if let Some(meta) = cache.get_metadata_by_id(&match_result.id) {
25 println!(" Family: {:?}", meta.family);
26 println!(" Weight: {:?}", meta.weight);
27 println!(" Italic: {:?}", meta.italic);
28 }
29 if let Some(source) = cache.get_font_by_id(&match_result.id) {
31 match source {
32 rust_fontconfig::FontSource::Disk(path) => {
33 println!(" Path: {}", path.path);
34 }
35 rust_fontconfig::FontSource::Memory(font) => {
36 println!(" Memory font: {}", font.id);
37 }
38 }
39 }
40 } else {
41 println!("Arial not found, trace:");
42 for t in &trace {
43 println!(" {:?}", t);
44 }
45 }
46
47 println!("\n=== Query Generic 'serif' ===");
49 trace.clear();
50 let pattern = FcPattern {
51 family: Some("serif".to_string()),
52 ..Default::default()
53 };
54
55 if let Some(match_result) = cache.query(&pattern, &mut trace) {
56 println!("Found serif font:");
57 if let Some(meta) = cache.get_metadata_by_id(&match_result.id) {
58 println!(" Name: {:?}", meta.name.as_ref().or(meta.family.as_ref()));
59 }
60 }
61
62 println!("\n=== Query Bold Italic ===");
64 trace.clear();
65 let pattern = FcPattern {
66 family: Some("sans-serif".to_string()),
67 weight: FcWeight::Bold,
68 italic: PatternMatch::True,
69 ..Default::default()
70 };
71
72 if let Some(match_result) = cache.query(&pattern, &mut trace) {
73 println!("Found bold italic sans-serif:");
74 if let Some(meta) = cache.get_metadata_by_id(&match_result.id) {
75 println!(" Name: {:?}", meta.name);
76 println!(" Family: {:?}", meta.family);
77 println!(" Weight: {:?}", meta.weight);
78 println!(" Italic: {:?}", meta.italic);
79 }
80 }
81
82 println!("\n=== Listing Bold Fonts ===");
84 let bold_fonts: Vec<_> = cache.list().into_iter()
85 .filter(|(meta, _id)| {
86 matches!(meta.weight, FcWeight::Bold | FcWeight::ExtraBold | FcWeight::Black)
87 })
88 .take(5)
89 .collect();
90
91 println!("First 5 bold fonts:");
92 for (meta, id) in bold_fonts {
93 println!(" {:?}: {:?}", id, meta.name.as_ref().or(meta.family.as_ref()));
94 }
95
96 println!("\n=== Fonts with 'Mono' in name ===");
98 let mono_fonts: Vec<_> = cache.list().into_iter()
99 .filter(|(meta, _id)| {
100 meta.name.as_ref().map(|n| n.contains("Mono")).unwrap_or(false) ||
101 meta.family.as_ref().map(|f| f.contains("Mono")).unwrap_or(false)
102 })
103 .take(5)
104 .collect();
105
106 println!("First 5 monospace fonts:");
107 for (meta, id) in mono_fonts {
108 println!(" {:?}: {:?}", id, meta.name.as_ref().or(meta.family.as_ref()));
109 }
110}