You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
57 lines
1.6 KiB
57 lines
1.6 KiB
5 years ago
|
use std::fs;
|
||
|
use std::process::Command;
|
||
|
use std::string::ToString;
|
||
|
|
||
|
fn main() {
|
||
|
for entry in fs::read_dir(".").unwrap() {
|
||
|
let entry = entry.unwrap();
|
||
|
let path = entry.path();
|
||
|
|
||
|
if !path.display().to_string().ends_with(".ico") {
|
||
|
continue;
|
||
|
}
|
||
|
|
||
|
let name = path.file_stem().unwrap().to_str().unwrap();
|
||
|
|
||
|
Command::new("/bin/convert").arg(&path).arg("./tmp.xbm").output().unwrap();
|
||
|
|
||
|
let content = fs::read_to_string("./tmp.xbm").unwrap();
|
||
|
|
||
|
let a = content.find('{').unwrap() + 1;
|
||
|
let b = content.find('}').unwrap();
|
||
|
|
||
|
let bytes = &content[a..b].trim();
|
||
|
|
||
|
let bytes = bytes.split(",")
|
||
|
.map(|s| s.trim())
|
||
|
.filter(|s| !s.is_empty())
|
||
|
.map(|s| u8::from_str_radix(&s[2..], 16).unwrap())
|
||
|
.collect::<Vec<_>>();
|
||
|
|
||
|
assert!(bytes.len() == 8);
|
||
|
|
||
|
let mut columns : [u8; 5] = [0,0,0,0,0];
|
||
|
|
||
|
for (n, r) in bytes.iter().enumerate() {
|
||
|
for i in 0..5 {
|
||
|
if 0 != *r & (1<<i) {
|
||
|
columns[i] |= 1 << n;
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
fn testchar(c : char) -> bool {
|
||
|
c.is_alphanumeric() || c=='_'
|
||
|
}
|
||
|
|
||
|
let mut name = name.replace(|c:char|!testchar(c), "_");
|
||
|
if !name.starts_with(testchar) {
|
||
|
name = format!("_{}", name);
|
||
|
}
|
||
|
|
||
|
println!("const uint8_t {}[5] = {{ {} }};", name, columns.iter().map(|c| format!("{:#04x}", !c)).collect::<Vec<_>>().join(", "));
|
||
|
}
|
||
|
|
||
|
let _ = fs::remove_file("./tmp.xbm");
|
||
|
}
|