diff --git a/.gitignore b/.gitignore index 74a7157..35022e0 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,3 @@ /target /font -/res +font.sff diff --git a/Cargo.lock b/Cargo.lock index 1cf0e7e..aa4b812 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -386,6 +386,12 @@ dependencies = [ "either", ] +[[package]] +name = "itoa" +version = "1.0.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4a5f13b858c8d314ee3e8f639011f7ccefe71f97f96e50151fb991f267928e2c" + [[package]] name = "jobserver" version = "0.1.33" @@ -407,6 +413,8 @@ name = "karlos-helper" version = "0.1.0" dependencies = [ "image", + "serde", + "serde_json", ] [[package]] @@ -760,6 +768,12 @@ version = "1.0.21" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8a0d197bd2c9dc6e53b84da9556a69ba4cdfab8619eb41a8bd1cc2027a0f6b1d" +[[package]] +name = "ryu" +version = "1.0.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "28d3b2b1366ec20994f1fd18c3c594f05c5dd4bc44d8bb0c1c632c8d6829481f" + [[package]] name = "serde" version = "1.0.219" @@ -780,6 +794,18 @@ dependencies = [ "syn", ] +[[package]] +name = "serde_json" +version = "1.0.141" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "30b9eff21ebe718216c6ec64e1d9ac57087aad11efc64e32002bce4a0d4c03d3" +dependencies = [ + "itoa", + "memchr", + "ryu", + "serde", +] + [[package]] name = "serde_spanned" version = "0.6.9" diff --git a/Cargo.toml b/Cargo.toml index e8cd968..099585d 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -5,3 +5,5 @@ edition = "2021" [dependencies] image = "0.25.6" +serde = { version="1.0.219", features=["derive"] } +serde_json = "1.0.141" diff --git a/example/ascii.png b/example/ascii.png new file mode 100644 index 0000000..fb24902 Binary files /dev/null and b/example/ascii.png differ diff --git a/example/german.png b/example/german.png new file mode 100644 index 0000000..a9ffda9 Binary files /dev/null and b/example/german.png differ diff --git a/example/index.json b/example/index.json new file mode 100644 index 0000000..d7ea5fb --- /dev/null +++ b/example/index.json @@ -0,0 +1,26 @@ +{ + "char_width": 8, + "char_height": 18, + "splitters": [ + { + "Table": { + "path": "example/ascii.png", + "nrows": 6, + "ncols": 16, + "start_number": 32 + } + }, + { + "Individual": { + "path": "example/german.png", + "numbers": [228, 196, 246, 214, 252, 220, 223] + } + }, + { + "Single": { + "path": "example/replacement.png", + "number": 65533 + } + } + ] +} diff --git a/example/replacement.png b/example/replacement.png new file mode 100644 index 0000000..3abb3e2 Binary files /dev/null and b/example/replacement.png differ diff --git a/src/main.rs b/src/main.rs index 0862bbc..db4aa1c 100644 --- a/src/main.rs +++ b/src/main.rs @@ -41,7 +41,7 @@ fn load_font_dir>(dir_with_images: P) -> HashMap { fn image_split_table( src_image: P, dst_dir: Q, - start_number: usize, + start_number: u32, nrows: usize, ncols: usize, width_per_elem: usize, @@ -76,7 +76,7 @@ fn image_split_table( fn image_split_individual( src_image: P, dst_dir: Q, - numbers: &[usize], + numbers: &[u32], width_per_elem: usize, height_per_elem: usize, ) where @@ -126,15 +126,75 @@ fn sorted_numbers_into_ranges(sorted_numbers: &[u32]) -> Vec { out } +#[derive(Debug, serde::Deserialize)] +enum Splitter { + Table { + path: String, + nrows: usize, + ncols: usize, + start_number: u32, + }, + Individual { + path: String, + numbers: Vec, + }, + Single { + path: String, + number: u32, + }, +} + +#[derive(Debug, serde::Deserialize)] +struct Index { + char_width: usize, + char_height: usize, + splitters: Vec, +} + fn main() { - image_split_table("res/ascii.png", "font", 32, 6, 16, 8, 18); - image_split_individual( - "res/german.png", - "font", - &[0x00e4, 0x00c4, 0x00f6, 0x00d6, 0x00fc, 0x00dc, 0x00df][..], - 8, - 18, - ); + std::fs::remove_dir_all("font").unwrap(); + std::fs::create_dir("font").unwrap(); + let args: Vec = std::env::args().collect(); + let index: Index = serde_json::from_str(&std::fs::read_to_string(&args[1]).unwrap()).unwrap(); + for splitter in index.splitters { + match splitter { + Splitter::Table { + path, + nrows, + ncols, + start_number, + } => { + image_split_table( + path, + "font", + start_number, + nrows, + ncols, + index.char_width, + index.char_height, + ); + } + Splitter::Individual { path, numbers } => { + image_split_individual( + path, + "font", + &numbers[..], + index.char_width, + index.char_height, + ); + } + Splitter::Single { path, number } => { + image_split_individual( + path, + "font", + &[number][..], + index.char_width, + index.char_height, + ); + } + } + } + let map = load_font_dir("font"); let mut sorted_keys: Vec = map.keys().copied().collect(); sorted_keys.sort();