From 3f48f819d5647c188de8adaf759666797ea1cd32 Mon Sep 17 00:00:00 2001 From: uosfz Date: Thu, 31 Jul 2025 00:59:35 +0200 Subject: [PATCH] make splitting functionality dynamic with json-ized data structure --- .gitignore | 2 +- Cargo.lock | 26 +++++++++++++ Cargo.toml | 2 + example/ascii.png | Bin 0 -> 26188 bytes example/german.png | Bin 0 -> 1423 bytes example/index.json | 26 +++++++++++++ example/replacement.png | Bin 0 -> 384 bytes src/main.rs | 80 +++++++++++++++++++++++++++++++++++----- 8 files changed, 125 insertions(+), 11 deletions(-) create mode 100644 example/ascii.png create mode 100644 example/german.png create mode 100644 example/index.json create mode 100644 example/replacement.png 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 0000000000000000000000000000000000000000..fb249029e025ce3dd1cfcd1aaa93c431f3a510b7 GIT binary patch literal 26188 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 NjWaqbxk?uP{{xKI(+L0o literal 0 HcmV?d00001 diff --git a/example/german.png b/example/german.png new file mode 100644 index 0000000000000000000000000000000000000000..a9ffda9f3d407bd10027ac6374183abdc681ee32 GIT binary patch literal 1423 zcmV;A1#tR_P)t1LDq00u#ClKE13tuKp){KYz|GTeeV96poCH7_h>^LPjDHCX-2On#PWf4w}to zgU$Z^`&m|2MvuqC#>Pei7K_E`^?HTw@pueAPMkQwo}L~qSg?RQckbl)_;`MT|MXN< zRdHZofG=OZpILzb6kMq!>Lk7%d zv+>-yb4(->)HIEqot?B=tpq?>mYK`tSY2H$>{qQ?#p&s3mX?+h0Kb0y%F4=0frmmN z_V)J9JHer$A#U2Vi2&H$-OX?~EHD!Q_^Z5{q#jtJLHeuv;yJ5H6F)}iOf`S69Sg`_5rxRmi zW3XDS2!%p$yWNDKeQ%UND(V1{D<*zcj&#i3v!OguQ$B z;`;ULf2|3J!+~qpuHnv|J7{ihhS_X}&1MtC#>PgtTrMP&NhA^p$g+&xyLSTsJRT2n zxg1idl(2vI?i~PN`SRuX@Zkd-4o6-v4u=DyqoeZ*T-SA&&1RvS&1UGjo@bZMW)TPk z(B9sT8#iu1lBC%+aqr$e9yoA7e774mY+yVd7y848582SrAaq4hc>n%=0$@>55p`Xs z)9Ex!xo_XTQIaIu?RMsJIo8zF2;A@Yb82deB_$;Uz^SPz*45P+ChFWC92y$p_U+q+ z9tZ^Z?Af!Q_8eZ|9|L3#zK( z{Q2|9X0rf*H*ek`6bhlZxELEZZbWNqtD!Q{XcXaa7_uxwmSwcHwTZTxD@&Fvf!%J0 zuIu>t@gvI0%4RDV3Wb=<U?R^I6D@9$?zON&^v7cN|& zrfJkPjc3oEWl>R)VGo`?NMQuIw+_EaloalUnuZeNRofSWvX zqK5^8qW}y03l^TP0ujH!w-aL+E>C|T7r`>=L1D%%QDJHWzK|zLD z%O0L$%Te0&w&TRM`JcD{P_z|Yf2mu455u(7g{!n4S*YLczSt96N){$!Vd Z{S50_GIx_E83KLC;OXk;vd$@?2>=A`ikSca literal 0 HcmV?d00001 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();