1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124
#![crate_type = "lib"] #![crate_name = "bmfont"] extern crate xml; #[derive(Debug)] pub struct BmChar { id: i32, page: i32, x: i32, y: i32, xoffset: i32, yoffset: i32, width:i32, height: i32, xadvance: i32, chnl: i32 } impl BmChar { pub fn new() -> Self { BmChar { id: 0, page: 0, x: 0, y: 0, xoffset: 0, yoffset: 0, width: 0, height: 0, xadvance: 0, chnl: 0 } } } #[derive(Debug)] pub struct BmPage { id: i32, file: String } impl BmPage { pub fn new() -> Self { BmPage { id: 0, file: String::new() } } } #[derive(Debug)] pub struct BmFont { pages: Vec<BmPage>, chars: Vec<BmChar> } pub fn parse(xmlstr: String) -> BmFont { use xml::reader::{ EventReader, XmlEvent }; let mut chars : Vec<BmChar> = Vec::new(); let mut pages : Vec<BmPage> = Vec::new(); let parser = EventReader::new(xmlstr.as_bytes()); for e in parser { match e { Ok(XmlEvent::StartElement { name, attributes, .. }) => { match &name.local_name.as_ref() { &"char" => { let mut chr: BmChar = BmChar::new(); for attr in attributes { let name = attr.name.local_name; let value = attr.value; match &name.as_ref() { &"id" => chr.id = value.parse::<i32>().unwrap(), &"page" => chr.page = value.parse::<i32>().unwrap(), &"x" => chr.x = value.parse::<i32>().unwrap(), &"y" => chr.y = value.parse::<i32>().unwrap(), &"xoffset" => chr.xoffset = value.parse::<i32>().unwrap(), &"yoffset" => chr.yoffset = value.parse::<i32>().unwrap(), &"width" => chr.width = value.parse::<i32>().unwrap(), &"height" => chr.height = value.parse::<i32>().unwrap(), &"xadvance" => chr.xadvance = value.parse::<i32>().unwrap(), &"chnl" => chr.chnl = value.parse::<i32>().unwrap(), _ => {} } } chars.push(chr); } &"page" => { let mut page: BmPage = BmPage::new(); for attr in attributes { let name = attr.name.local_name; let value = attr.value; match &name.as_ref() { &"id" => page.id = value.parse::<i32>().unwrap(), &"file" => page.file = value, _ => {} } } pages.push(page); } _ => {} } } Err(e) => { println!("Error: {}", e); break; } _ => {} } } BmFont { pages: pages, chars: chars } }