bitmapfont_creator/
xml_generator.rs1use crate::error::Result;
4use crate::packer::PackedChar;
5
6#[derive(Debug, Clone)]
8pub struct CharMetrics {
9 pub char: String,
11 pub x: u32,
13 pub y: u32,
15 pub width: u32,
17 pub height: u32,
19 pub xoffset: i32,
21 pub yoffset: i32,
23 pub xadvance: u32,
25 pub padding: u32,
27}
28
29impl From<PackedChar> for CharMetrics {
30 fn from(packed: PackedChar) -> Self {
31 CharMetrics {
34 char: packed.char,
35 x: packed.x + packed.padding, y: packed.y + packed.padding,
37 width: packed.original_width,
38 height: packed.original_height,
39 xoffset: 0, yoffset: 0, xadvance: packed.original_width, padding: packed.padding,
43 }
44 }
45}
46
47pub fn generate_xml(
49 font_name: &str,
50 atlas_width: u32,
51 atlas_height: u32,
52 chars: &[CharMetrics],
53) -> Result<String> {
54 let mut xml = String::new();
55
56 xml.push_str("<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n");
58
59 xml.push_str(&format!(
61 "<font>\n"
62 ));
63
64 let padding = chars.first().map(|c| c.padding).unwrap_or(4);
66 xml.push_str(&format!(
67 " <info face=\"{}\" size=\"32\" bold=\"0\" italic=\"0\" charset=\"\" unicode=\"1\" stretchH=\"100\" smooth=\"1\" aa=\"1\" padding=\"{},{},{},{}\" spacing=\"1,1\" outline=\"0\"/>\n",
68 escape_xml(font_name),
69 padding, padding, padding, padding
70 ));
71
72 let max_height = chars.iter().map(|c| c.height).max().unwrap_or(32);
74 let line_height = max_height;
75 let base = max_height; xml.push_str(&format!(
79 " <common lineHeight=\"{}\" base=\"{}\" scaleW=\"{}\" scaleH=\"{}\" pages=\"1\" packed=\"0\" alphaChnl=\"0\" redChnl=\"4\" greenChnl=\"4\" blueChnl=\"4\"/>\n",
80 line_height, base, atlas_width, atlas_height
81 ));
82
83 xml.push_str(" <pages>\n");
85 xml.push_str(&format!(" <page id=\"0\" file=\"{}.png\"/>\n", escape_xml(font_name)));
86 xml.push_str(" </pages>\n");
87
88 xml.push_str(&format!(" <chars count=\"{}\">\n", chars.len()));
90
91 for char_metrics in chars {
92 let char_code = char_metrics.char.chars().next()
94 .map(|c| c as u32)
95 .unwrap_or(0);
96
97 xml.push_str(&format!(
98 " <char id=\"{}\" x=\"{}\" y=\"{}\" width=\"{}\" height=\"{}\" xoffset=\"{}\" yoffset=\"{}\" xadvance=\"{}\" page=\"0\" chnl=\"15\"/>\n",
99 char_code,
100 char_metrics.x,
101 char_metrics.y,
102 char_metrics.width,
103 char_metrics.height,
104 char_metrics.xoffset,
105 char_metrics.yoffset,
106 char_metrics.xadvance
107 ));
108 }
109
110 xml.push_str(" </chars>\n");
111 xml.push_str("</font>\n");
112
113 Ok(xml)
114}
115
116fn escape_xml(s: &str) -> String {
118 s.replace('&', "&")
119 .replace('<', "<")
120 .replace('>', ">")
121 .replace('"', """)
122 .replace('\'', "'")
123}