diff --git a/Cargo.lock b/Cargo.lock index 30bdec4..4fc1d75 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -8,6 +8,15 @@ version = "1.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f26201604c87b1e01bd3d98f8d5d9a8fcbb815e8cedb41ffccbeb4bf593a35fe" +[[package]] +name = "aho-corasick" +version = "1.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8e60d3430d3a69478ad0993f19238d2df97c507009a52b3c10addcd7f6bcb916" +dependencies = [ + "memchr", +] + [[package]] name = "aligned-vec" version = "0.5.0" @@ -68,12 +77,6 @@ version = "1.0.81" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0952808a6c2afd1aa8947271f3a60f1a6763c7b912d210184c5149b5cf147247" -[[package]] -name = "arbitrary" -version = "0.4.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "db55d72333851e17d572bec876e390cd3b11eb1ef53ae821dd9f3b653d2b4569" - [[package]] name = "arbitrary" version = "1.3.2" @@ -88,7 +91,7 @@ checksum = "0ae92a5119aa49cdbcf6b9f893fe4e1d98b04ccbf82ee0584ad948a44a734dea" dependencies = [ "proc-macro2", "quote", - "syn 2.0.52", + "syn", ] [[package]] @@ -96,9 +99,6 @@ name = "arrayvec" version = "0.7.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "96d30a06541fbafbc7f82ed10c06164cfbd2c401138f6addd8404629c4b16711" -dependencies = [ - "serde", -] [[package]] name = "autocfg" @@ -117,7 +117,6 @@ dependencies = [ "log", "nom", "num-rational", - "serde", "v_frame", ] @@ -142,27 +141,12 @@ version = "1.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" -[[package]] -name = "bitstream-io" -version = "1.10.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e445576659fd04a57b44cbd00aa37aaa815ebefa0aa3cb677a6b5e63d883074f" - [[package]] name = "bitstream-io" version = "2.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "06c9989a51171e2e81038ab168b6ae22886fe9ded214430dbb4f41c28cf176da" -[[package]] -name = "built" -version = "0.5.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5b9c056b9ed43aee5e064b683aa1ec783e19c6acec7559e3ae931b7490472fbe" -dependencies = [ - "cargo-lock", -] - [[package]] name = "built" version = "0.7.1" @@ -187,18 +171,6 @@ version = "1.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b" -[[package]] -name = "cargo-lock" -version = "8.0.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "031718ddb8f78aa5def78a09e90defe30151d1f6c672f937af4dd916429ed996" -dependencies = [ - "semver", - "serde", - "toml 0.5.11", - "url", -] - [[package]] name = "cc" version = "1.0.90" @@ -253,10 +225,10 @@ version = "4.5.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "90239a040c80f5e14809ca132ddc4176ab33d5e17e49691793296e3fcb34d72f" dependencies = [ - "heck 0.5.0", + "heck", "proc-macro2", "quote", - "syn 2.0.52", + "syn", ] [[package]] @@ -323,6 +295,19 @@ version = "1.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "11157ac094ffbdde99aa67b23417ebdd801842852b500e395a45a9c0aac03e4a" +[[package]] +name = "env_logger" +version = "0.10.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4cd405aab171cb85d6735e5c8d9db038c17d3ca007a4d2c25f337935c3d90580" +dependencies = [ + "humantime", + "is-terminal", + "log", + "regex", + "termcolor", +] + [[package]] name = "equivalent" version = "1.0.1" @@ -383,15 +368,6 @@ dependencies = [ "spin", ] -[[package]] -name = "form_urlencoded" -version = "1.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e13624c2627564efccf4934284bdd98cbaa14e79b0b5a141218e507b3a823456" -dependencies = [ - "percent-encoding", -] - [[package]] name = "getrandom" version = "0.2.12" @@ -431,25 +407,21 @@ checksum = "290f1a1d9242c78d09ce40a5e87e7554ee637af1351968159f4952f028f75604" [[package]] name = "heck" -version = "0.4.1" +version = "0.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "95505c38b4572b2d910cecb0281560f54b440a19336cbbcb27bf6ce6adc6f5a8" +checksum = "2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea" [[package]] -name = "heck" -version = "0.5.0" +name = "hermit-abi" +version = "0.3.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea" +checksum = "d231dfb89cfffdbc30e7fc41579ed6066ad03abda9e567ccafae602b97ec5024" [[package]] -name = "idna" -version = "0.5.0" +name = "humantime" +version = "2.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "634d9b1461af396cad843f47fdba5597a4f9e6ddd4bfb6ff5d85028c25cb12f6" -dependencies = [ - "unicode-bidi", - "unicode-normalization", -] +checksum = "9a3a5bfb195931eeb336b2a7b4d761daec841b97f947d34394601737a7bba5e4" [[package]] name = "image" @@ -476,9 +448,9 @@ dependencies = [ [[package]] name = "image-webp" -version = "0.1.0" +version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ba6107a25f04af48ceeb4093eebc9b405ee5a1813a0bab5ecf1805d3eabb3337" +checksum = "7a84a25dcae3ac487bc24ef280f9e20c79c9b1a3e5e32cbed3041d1c514aa87c" dependencies = [ "byteorder", "thiserror", @@ -508,16 +480,18 @@ checksum = "c34819042dc3d3971c46c2190835914dfbe0c3c13f61449b2997f4e9722dfa60" dependencies = [ "proc-macro2", "quote", - "syn 2.0.52", + "syn", ] [[package]] -name = "itertools" -version = "0.10.5" +name = "is-terminal" +version = "0.4.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b0fd2260e829bddf4cb6ea802289de2f86d6a7a690192fbe91b3f46e0f2c8473" +checksum = "f23ff5ef2b80d608d61efee834934d862cd92461afc0560dedf493e4c033738b" dependencies = [ - "either", + "hermit-abi", + "libc", + "windows-sys", ] [[package]] @@ -556,23 +530,13 @@ version = "0.2.153" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9c198f91728a82281a64e1f4f9eeb25d82cb32a5de251c6bd1b5154d63a8e7bd" -[[package]] -name = "libfuzzer-sys" -version = "0.3.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fcf184a4b6b274f82a5df6b357da6055d3e82272327bba281c28bbba6f1664ef" -dependencies = [ - "arbitrary 0.4.7", - "cc", -] - [[package]] name = "libfuzzer-sys" version = "0.4.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a96cfd5557eb82f2b83fed4955246c988d331975a002961b07c81584d107e7f7" dependencies = [ - "arbitrary 1.3.2", + "arbitrary", "cc", "once_cell", ] @@ -636,9 +600,9 @@ dependencies = [ [[package]] name = "new_debug_unreachable" -version = "1.0.4" +version = "1.0.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e4a24736216ec316047a1fc4252e27dabb04218aa4a3f37c6e7ddbf1f9782b54" +checksum = "650eef8c711430f1a879fdd01d4745a7deea475becfb90269c06775983bbf086" [[package]] name = "nom" @@ -667,17 +631,6 @@ dependencies = [ "num-traits", ] -[[package]] -name = "num-derive" -version = "0.3.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "876a53fff98e03a936a674b29568b0e605f06b29372c2489ff4de23f1949743d" -dependencies = [ - "proc-macro2", - "quote", - "syn 1.0.109", -] - [[package]] name = "num-derive" version = "0.4.2" @@ -686,7 +639,7 @@ checksum = "ed3955f1a9c7c0c15e092f9c887db08b1fc683305fdf6eb6684f22555355e202" dependencies = [ "proc-macro2", "quote", - "syn 2.0.52", + "syn", ] [[package]] @@ -731,12 +684,6 @@ version = "1.0.14" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "de3145af08024dea9fa9914f381a17b8fc6034dfb00f3a84013f7ff43f29ed4c" -[[package]] -name = "percent-encoding" -version = "2.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e3148f5046208a5d56bcfc03053e3ca6334e51da8dfb19b6cdc8b306fae3283e" - [[package]] name = "pkg-config" version = "0.3.30" @@ -787,7 +734,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8021cf59c8ec9c432cfc2526ac6b8aa508ecaf29cd415f271b8406c1b851c3fd" dependencies = [ "quote", - "syn 2.0.52", + "syn", ] [[package]] @@ -844,64 +791,28 @@ dependencies = [ "getrandom", ] -[[package]] -name = "rav1e" -version = "0.6.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "16c383692a5e7abd9f6d1eddb1a5e0269f859392387883361bb09e5555852ec1" -dependencies = [ - "arbitrary 0.4.7", - "arg_enum_proc_macro", - "arrayvec", - "av1-grain", - "bitstream-io 1.10.0", - "built 0.5.2", - "cfg-if", - "interpolate_name", - "itertools 0.10.5", - "libc", - "libfuzzer-sys 0.3.5", - "log", - "maybe-rayon", - "new_debug_unreachable", - "noop_proc_macro", - "num-derive 0.3.3", - "num-traits", - "once_cell", - "paste", - "rand", - "rand_chacha", - "rust_hawktracer", - "rustc_version", - "simd_helpers", - "system-deps", - "thiserror", - "v_frame", - "wasm-bindgen", -] - [[package]] name = "rav1e" version = "0.7.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "cd87ce80a7665b1cce111f8a16c1f3929f6547ce91ade6addf4ec86a8dda5ce9" dependencies = [ - "arbitrary 1.3.2", + "arbitrary", "arg_enum_proc_macro", "arrayvec", "av1-grain", - "bitstream-io 2.2.0", - "built 0.7.1", + "bitstream-io", + "built", "cfg-if", "interpolate_name", - "itertools 0.12.1", + "itertools", "libc", - "libfuzzer-sys 0.4.7", + "libfuzzer-sys", "log", "maybe-rayon", "new_debug_unreachable", "noop_proc_macro", - "num-derive 0.4.2", + "num-derive", "num-traits", "once_cell", "paste", @@ -912,20 +823,20 @@ dependencies = [ "system-deps", "thiserror", "v_frame", + "wasm-bindgen", ] [[package]] name = "ravif" -version = "0.11.4" +version = "0.11.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d44feba0b8a381a5efa2c0baf8dace8418904403260233f4a614503b018fc288" +checksum = "bc13288f5ab39e6d7c9d501759712e6969fcc9734220846fc9ed26cae2cc4234" dependencies = [ "avif-serialize", "imgref", "loop9", "quick-error", - "rav1e 0.6.6", - "rav1e 0.7.1", + "rav1e", "rayon", "rgb", ] @@ -951,35 +862,42 @@ dependencies = [ ] [[package]] -name = "rgb" -version = "0.8.37" +name = "regex" +version = "1.10.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "05aaa8004b64fd573fc9d002f4e632d51ad4f026c2b5ba95fcb6c2f32c2c47d8" +checksum = "b62dbe01f0b06f9d8dc7d49e05a0785f153b00b2c227856282f671e0318c9b15" dependencies = [ - "bytemuck", + "aho-corasick", + "memchr", + "regex-automata", + "regex-syntax", ] [[package]] -name = "rust_hawktracer" -version = "0.7.0" +name = "regex-automata" +version = "0.4.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e3480a29b927f66c6e06527be7f49ef4d291a01d694ec1fe85b0de71d6b02ac1" +checksum = "86b83b8b9847f9bf95ef68afb0b8e6cdb80f498442f5179a29fad448fcc1eaea" dependencies = [ - "rust_hawktracer_normal_macro", - "rust_hawktracer_proc_macro", + "aho-corasick", + "memchr", + "regex-syntax", ] [[package]] -name = "rust_hawktracer_normal_macro" -version = "0.4.1" +name = "regex-syntax" +version = "0.8.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8a570059949e1dcdc6f35228fa389f54c2c84dfe0c94c05022baacd56eacd2e9" +checksum = "c08c74e62047bb2de4ff487b251e4a92e24f48745648451635cec7d591162d9f" [[package]] -name = "rust_hawktracer_proc_macro" -version = "0.4.1" +name = "rgb" +version = "0.8.37" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cb626abdbed5e93f031baae60d72032f56bc964e11ac2ff65f2ba3ed98d6d3e1" +checksum = "05aaa8004b64fd573fc9d002f4e632d51ad4f026c2b5ba95fcb6c2f32c2c47d8" +dependencies = [ + "bytemuck", +] [[package]] name = "rustc_version" @@ -1001,9 +919,6 @@ name = "semver" version = "1.0.22" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "92d43fe69e652f3df9bdc2b85b2854a0825b86e4fb76bc44d945137d053639ca" -dependencies = [ - "serde", -] [[package]] name = "serde" @@ -1022,7 +937,7 @@ checksum = "7eb0b34b42edc17f6b7cac84a52a1c5f0e1bb2227e997ca9011ea3dd34e8610b" dependencies = [ "proc-macro2", "quote", - "syn 2.0.52", + "syn", ] [[package]] @@ -1066,11 +981,13 @@ dependencies = [ [[package]] name = "spritter" -version = "0.1.1" +version = "0.2.0" dependencies = [ "clap", + "env_logger", "error-stack", "image", + "log", "thiserror", ] @@ -1082,20 +999,9 @@ checksum = "5ee073c9e4cd00e28217186dbe12796d692868f432bf2e97ee73bed0c56dfa01" [[package]] name = "syn" -version = "1.0.109" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "72b64191b275b66ffe2469e8af2c1cfe3bafa67b529ead792a6d0160888b4237" -dependencies = [ - "proc-macro2", - "quote", - "unicode-ident", -] - -[[package]] -name = "syn" -version = "2.0.52" +version = "2.0.53" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b699d15b36d1f02c3e7c69f8ffef53de37aefae075d8488d4ba1a7788d574a07" +checksum = "7383cd0e49fff4b6b90ca5670bfd3e9d6a733b3f90c686605aa7eec8c4996032" dependencies = [ "proc-macro2", "quote", @@ -1104,14 +1010,14 @@ dependencies = [ [[package]] name = "system-deps" -version = "6.2.0" +version = "6.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2a2d580ff6a20c55dfb86be5f9c238f67835d0e81cbdea8bf5680e0897320331" +checksum = "a3e535eb8dded36d55ec13eddacd30dec501792ff23a0b1682c38601b8cf2349" dependencies = [ "cfg-expr", - "heck 0.4.1", + "heck", "pkg-config", - "toml 0.8.11", + "toml", "version-compare", ] @@ -1121,6 +1027,15 @@ version = "0.12.14" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e1fc403891a21bcfb7c37834ba66a547a8f402146eba7265b5a6d88059c9ff2f" +[[package]] +name = "termcolor" +version = "1.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "06794f8f6c5c898b3275aebefa6b8a1cb24cd2c6c79397ab15774837a0bc5755" +dependencies = [ + "winapi-util", +] + [[package]] name = "thiserror" version = "1.0.58" @@ -1138,7 +1053,7 @@ checksum = "c61f3ba182994efc43764a46c018c347bc492c79f024e705f46567b418f6d4f7" dependencies = [ "proc-macro2", "quote", - "syn 2.0.52", + "syn", ] [[package]] @@ -1152,35 +1067,11 @@ dependencies = [ "weezl", ] -[[package]] -name = "tinyvec" -version = "1.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "87cc5ceb3875bb20c2890005a4e226a4651264a5c75edb2421b52861a0a0cb50" -dependencies = [ - "tinyvec_macros", -] - -[[package]] -name = "tinyvec_macros" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" - -[[package]] -name = "toml" -version = "0.5.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f4f7f0dd8d50a853a531c426359045b1998f04219d88799810762cd4ad314234" -dependencies = [ - "serde", -] - [[package]] name = "toml" -version = "0.8.11" +version = "0.8.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "af06656561d28735e9c1cd63dfd57132c8155426aa6af24f36a00a351f88c48e" +checksum = "e9dd1545e8208b4a5af1aa9bbd0b4cf7e9ea08fabc5d0a5c67fcaafa17433aa3" dependencies = [ "serde", "serde_spanned", @@ -1199,9 +1090,9 @@ dependencies = [ [[package]] name = "toml_edit" -version = "0.22.7" +version = "0.22.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "18769cd1cec395d70860ceb4d932812a0b4d06b1a4bb336745a4d21b9496e992" +checksum = "8e40bb779c5187258fd7aad0eb68cb8706a0a81fa712fbea808ab43c4b8374c4" dependencies = [ "indexmap", "serde", @@ -1210,38 +1101,12 @@ dependencies = [ "winnow", ] -[[package]] -name = "unicode-bidi" -version = "0.3.15" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "08f95100a766bf4f8f28f90d77e0a5461bbdb219042e7679bebe79004fed8d75" - [[package]] name = "unicode-ident" version = "1.0.12" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3354b9ac3fae1ff6755cb6db53683adb661634f67557942dea4facebec0fee4b" -[[package]] -name = "unicode-normalization" -version = "0.1.23" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a56d1686db2308d901306f92a263857ef59ea39678a5458e7cb17f01415101f5" -dependencies = [ - "tinyvec", -] - -[[package]] -name = "url" -version = "2.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "31e6302e3bb753d46e83516cae55ae196fc0c309407cf11ab35cc51a4c2a4633" -dependencies = [ - "form_urlencoded", - "idna", - "percent-encoding", -] - [[package]] name = "utf8parse" version = "0.2.1" @@ -1261,9 +1126,9 @@ dependencies = [ [[package]] name = "version-compare" -version = "0.1.1" +version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "579a42fc0b8e0c63b76519a339be31bed574929511fa53c1a3acae26eb258f29" +checksum = "852e951cb7832cb45cb1169900d19760cfa39b82bc0ea9c0e5a14ae88411c98b" [[package]] name = "wasi" @@ -1292,7 +1157,7 @@ dependencies = [ "once_cell", "proc-macro2", "quote", - "syn 2.0.52", + "syn", "wasm-bindgen-shared", ] @@ -1314,7 +1179,7 @@ checksum = "e94f17b526d0a461a191c78ea52bbce64071ed5c04c9ffe424dcb38f74171bb7" dependencies = [ "proc-macro2", "quote", - "syn 2.0.52", + "syn", "wasm-bindgen-backend", "wasm-bindgen-shared", ] @@ -1331,6 +1196,37 @@ version = "0.1.8" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "53a85b86a771b1c87058196170769dd264f66c0782acf1ae6cc51bfd64b39082" +[[package]] +name = "winapi" +version = "0.3.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5c839a674fcd7a98952e593242ea400abe93992746761e38641405d28b00f419" +dependencies = [ + "winapi-i686-pc-windows-gnu", + "winapi-x86_64-pc-windows-gnu", +] + +[[package]] +name = "winapi-i686-pc-windows-gnu" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6" + +[[package]] +name = "winapi-util" +version = "0.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f29e6f9198ba0d26b4c9f07dbe6f9ed633e1f3d5b8b414090084349e46a52596" +dependencies = [ + "winapi", +] + +[[package]] +name = "winapi-x86_64-pc-windows-gnu" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" + [[package]] name = "windows-sys" version = "0.52.0" diff --git a/Cargo.toml b/Cargo.toml index b8ea340..5d8dd27 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "spritter" -version = "0.1.1" +version = "0.2.0" edition = "2021" authors = ["fgardt "] description = "Spritesheet generator for factorio" @@ -20,6 +20,8 @@ expect_used = "warn" [dependencies] clap = { version = "4.5", features = ["derive"] } +env_logger = "0.10" error-stack = "0.4" image = "0.25" +log = "0.4" thiserror = "1.0" diff --git a/src/image_util.rs b/src/image_util.rs index 593e048..96ecd93 100644 --- a/src/image_util.rs +++ b/src/image_util.rs @@ -16,8 +16,8 @@ pub enum ImgUtilError { #[error("all images must be the same size")] NotSameSize, - #[error("can not crop empty image")] - ImageEmpty, + #[error("unable to crop, all images are empty")] + AllImagesEmpty, } type Result = std::result::Result; @@ -100,7 +100,7 @@ pub fn crop_images(images: &mut Vec) -> Result<(i32, i32)> { // ensure image is not empty if x.is_empty() || y.is_empty() { - return Err(ImgUtilError::ImageEmpty); + continue; } let local_min_x = x[0]; @@ -121,6 +121,15 @@ pub fn crop_images(images: &mut Vec) -> Result<(i32, i32)> { } } + // are all images are empty? (or some other edge case?) + if min_x == std::u32::MAX + || min_y == std::u32::MAX + || max_x == std::u32::MIN + || max_y == std::u32::MIN + { + return Err(ImgUtilError::AllImagesEmpty); + } + // do we need to crop? if min_x == 0 && min_y == 0 && max_x == (raw_width - 1) && max_y == (raw_height - 1) { // no cropping needed @@ -130,7 +139,7 @@ pub fn crop_images(images: &mut Vec) -> Result<(i32, i32)> { let cropped_width = max_x - min_x + 1; let cropped_height = max_y - min_y + 1; - // println!("cropping from {raw_width}x{raw_height} to {cropped_width}x{cropped_height}"); + debug!("cropping from {raw_width}x{raw_height} to {cropped_width}x{cropped_height}"); // crop images for image in images { @@ -147,7 +156,7 @@ pub fn crop_images(images: &mut Vec) -> Result<(i32, i32)> { let shift_x = i32::try_from(cropped_right_by).unwrap() - i32::try_from(min_x).unwrap(); let shift_y = i32::try_from(cropped_bottom_by).unwrap() - i32::try_from(min_y).unwrap(); - // println!("shifted by ({shift_x}, {shift_y})"); + trace!("shifted by ({shift_x}, {shift_y})"); Ok((shift_x, shift_y)) } diff --git a/src/logger.rs b/src/logger.rs new file mode 100644 index 0000000..27df7fa --- /dev/null +++ b/src/logger.rs @@ -0,0 +1,85 @@ +// This is a modified version of pretty_env_logger v0.4.0 that uses Builder::from_env() + +use std::fmt; +use std::sync::atomic::{AtomicUsize, Ordering}; + +use env_logger::{ + fmt::{Color, Style, StyledValue}, + Builder, Env, +}; +use log::Level; + +pub fn init(level: &str) { + let env = Env::default().filter_or("LOG_LEVEL", level); + + Builder::from_env(env) + .format(|buf, record| { + use std::io::Write; + + let target = record.target(); + let max_width = max_target_width(target); + + let mut style = buf.style(); + let level = colored_level(&mut style, record.level()); + + let mut style = buf.style(); + let target = style.set_bold(true).value(Padded { + value: target, + width: max_width, + }); + + let time = buf.timestamp_millis(); + let text = record.args().to_string(); + + let target_pad = Padded { + value: " ", + width: max_width, + }; + + // 24 (timestamp) + 5 (level) + 1 space = 30 + let newline_padding = format!("{:30} {}", " ", target_pad); + let lines: Vec<_> = text.lines().collect(); + + writeln!(buf, "{} {} {} > {}", time, level, target, lines[0])?; + + for line in &lines[1..] { + writeln!(buf, "{newline_padding} {line}")?; + } + + Ok(()) + }) + .init(); +} + +struct Padded { + value: T, + width: usize, +} + +impl fmt::Display for Padded { + fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { + write!(f, "{: usize { + let max_width = MAX_MODULE_WIDTH.load(Ordering::Relaxed); + if max_width < target.len() { + MAX_MODULE_WIDTH.store(target.len(), Ordering::Relaxed); + target.len() + } else { + max_width + } +} + +fn colored_level(style: &mut Style, level: Level) -> StyledValue<&'static str> { + match level { + Level::Trace => style.set_color(Color::Magenta).value("TRACE"), + Level::Debug => style.set_color(Color::Blue).value("DEBUG"), + Level::Info => style.set_color(Color::Green).value("INFO "), + Level::Warn => style.set_color(Color::Yellow).value("WARN "), + Level::Error => style.set_color(Color::Red).value("ERROR"), + } +} diff --git a/src/main.rs b/src/main.rs index eab80e1..08bda53 100644 --- a/src/main.rs +++ b/src/main.rs @@ -6,7 +6,11 @@ use std::{ use clap::{Args, Parser, Subcommand}; use image::{ImageBuffer, RgbaImage}; +#[macro_use] +extern crate log; + mod image_util; +mod logger; #[derive(Parser, Debug)] #[command(version, about, long_about=None)] @@ -117,6 +121,8 @@ impl std::error::Error for Error {} fn main() { let args = Cli::parse(); + logger::init("info"); + info!("{} v{}", env!("CARGO_PKG_NAME"), env!("CARGO_PKG_VERSION")); match args.command { GenerationCommand::Spritesheet { args } => { @@ -154,14 +160,14 @@ fn generate_mipmap_icon(args: &IconArgs) { fs::create_dir_all(&args.output).unwrap(); if !args.output.is_dir() { - println!("output path is not a directory"); + error!("output path is not a directory"); return; } let mut images = image_util::load_from_path(&args.source).unwrap(); if images.is_empty() { - println!("no source images found"); + warn!("no source images found"); return; } @@ -170,7 +176,7 @@ fn generate_mipmap_icon(args: &IconArgs) { let (base_width, base_height) = images.first().unwrap().dimensions(); if base_width != base_height { - println!("source image is not square"); + error!("source image is not square"); return; } @@ -178,7 +184,7 @@ fn generate_mipmap_icon(args: &IconArgs) { let max_mipmap_levels = (f64::from(base_width)).log2().floor() as usize; if images.len() > max_mipmap_levels { - println!("unable to generate {} mipmap levels, max possible for this icon is {max_mipmap_levels}", images.len()); + error!("unable to generate {} mipmap levels, max possible for this icon is {max_mipmap_levels}", images.len()); return; } @@ -190,17 +196,17 @@ fn generate_mipmap_icon(args: &IconArgs) { for (idx, sprite) in images.iter().enumerate() { if next_width.rem_euclid(2) != 0 { - println!("unable to divide image size by 2 for mipmap level {idx}"); + error!("unable to divide image size by 2 for mipmap level {idx}"); return; } if sprite.width() != sprite.height() { - println!("source image is not square"); + error!("source image is not square"); return; } if sprite.width() != next_width { - println!( + error!( "source image has wrong size, {} != {next_width}", sprite.width() ); @@ -229,7 +235,7 @@ fn generate_spritesheet(args: &SpritesheetArgs) { fs::create_dir_all(&args.output).unwrap(); if !args.output.is_dir() { - println!("output path is not a directory"); + error!("output path is not a directory"); return; } @@ -251,22 +257,28 @@ fn generate_spritesheet(args: &SpritesheetArgs) { }; if sources.is_empty() { - println!("no source directories found"); + warn!("no source directories found"); return; } - for source in sources { + 'recursive: for source in sources { let mut images = image_util::load_from_path(&source).unwrap(); if images.is_empty() { - println!("no source images found"); - return; + warn!("{}: no source images found", source.display()); + continue 'recursive; } let (shift_x, shift_y) = if args.no_crop { (0, 0) } else { - image_util::crop_images(&mut images).unwrap() + match image_util::crop_images(&mut images) { + Ok(shift) => shift, + Err(err) => { + error!("{}: {err:?}", source.display()); + continue 'recursive; + } + } }; let sprite_count = u32::try_from(images.len()).unwrap(); @@ -344,8 +356,11 @@ fn generate_spritesheet(args: &SpritesheetArgs) { // arrange sprites on sheets for (idx, sprite) in images.iter().enumerate() { if sprite.width() != sprite_width || sprite.height() != sprite_height { - println!("all source images must be the same size"); - return; + error!( + "{}: all source images must be the same size", + source.display() + ); + continue 'recursive; } let sheet_idx = idx / max_per_sheet as usize; @@ -367,20 +382,14 @@ fn generate_spritesheet(args: &SpritesheetArgs) { .unwrap(); } - print!( - "completed {}", - output_name(&source, &args.output, None, "") - .file_name() - .unwrap() - .to_str() - .unwrap() - ); + let name = output_name(&source, &args.output, None, ""); + let name = name.file_name().unwrap().to_str().unwrap(); if args.no_crop { - println!(); + info!("completed {name}"); } else { - println!( - ", size: ({sprite_width}px, {sprite_height}px), shift: ({shift_x}px, {shift_y}px)" + info!( + "completed {name}, size: ({sprite_width}px, {sprite_height}px), shift: ({shift_x}px, {shift_y}px)" ); } }