From 90cc3ce7810feeca41194b24e7f07a8a8d109a51 Mon Sep 17 00:00:00 2001 From: bokobelin Date: Mon, 10 Nov 2025 16:59:07 +0100 Subject: [PATCH] [cosmetic] Add a splash screen --- Cargo.lock | 529 ++++++++++++++++++++++++++++++++++++- assets/oboromi_logo.png | Bin 0 -> 22583 bytes oboromi-gui/Cargo.toml | 1 + oboromi-gui/src/gui/gui.rs | 137 ++++++++-- 4 files changed, 642 insertions(+), 25 deletions(-) create mode 100644 assets/oboromi_logo.png diff --git a/Cargo.lock b/Cargo.lock index 68addc9..bd998ce 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -121,7 +121,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5a15f179cd60c4584b8a8c596927aadc462e27f2ca70c04e0071964a73ba7a75" dependencies = [ "cfg-if", - "getrandom", + "getrandom 0.3.3", "once_cell", "version_check", "zerocopy", @@ -136,6 +136,15 @@ dependencies = [ "memchr", ] +[[package]] +name = "aligned-vec" +version = "0.6.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dc890384c8602f339876ded803c97ad529f3842aba97f6392b3dba0dd171769b" +dependencies = [ + "equator", +] + [[package]] name = "android-activity" version = "0.6.0" @@ -228,6 +237,18 @@ dependencies = [ "windows-sys 0.59.0", ] +[[package]] +name = "anyhow" +version = "1.0.100" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a23eb6b1614318a8071c9b2521f36b424b2c83db5eb3a0fead4a6c0809af6e61" + +[[package]] +name = "arbitrary" +version = "1.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c3d036a3c4ab069c7b410a2ce876bd74808d2d0888a82667669f8e783a898bf1" + [[package]] name = "arboard" version = "3.6.1" @@ -248,6 +269,17 @@ dependencies = [ "x11rb", ] +[[package]] +name = "arg_enum_proc_macro" +version = "0.3.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0ae92a5119aa49cdbcf6b9f893fe4e1d98b04ccbf82ee0584ad948a44a734dea" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + [[package]] name = "arrayref" version = "0.3.9" @@ -470,6 +502,29 @@ version = "1.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c08606f8c3cbf4ce6ec8e28fb0014a2c086708fe954eaa885384a6165172e7e8" +[[package]] +name = "av1-grain" +version = "0.2.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8cfddb07216410377231960af4fcab838eaa12e013417781b78bd95ee22077f8" +dependencies = [ + "anyhow", + "arrayvec", + "log", + "nom 8.0.0", + "num-rational", + "v_frame", +] + +[[package]] +name = "avif-serialize" +version = "0.8.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "47c8fbc0f831f4519fe8b810b6a7a91410ec83031b8233f730a0480029f6a23f" +dependencies = [ + "arrayvec", +] + [[package]] name = "bindgen" version = "0.71.1" @@ -479,7 +534,7 @@ dependencies = [ "bitflags 2.9.4", "cexpr", "clang-sys", - "itertools", + "itertools 0.13.0", "log", "prettyplease", "proc-macro2", @@ -505,6 +560,12 @@ version = "0.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5e764a1d40d510daf35e07be9eb06e75770908c27d411ee6c92109c9840eaaf7" +[[package]] +name = "bit_field" +version = "0.10.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e4b40c7323adcfc0a41c4b88143ed58346ff65a288fc144329c5c45e05d70c6" + [[package]] name = "bitflags" version = "1.3.2" @@ -517,6 +578,12 @@ version = "2.9.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2261d10cca569e4643e526d8dc2e62e433cc8aba21ab764233731f8d369bf394" +[[package]] +name = "bitstream-io" +version = "2.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6099cdc01846bc367c4e7dd630dc5966dccf36b652fae7a74e17b640411a91b2" + [[package]] name = "block" version = "0.1.6" @@ -545,6 +612,12 @@ dependencies = [ "piper", ] +[[package]] +name = "built" +version = "0.7.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "56ed6191a7e78c36abdb16ab65341eefd73d64d303fffccdbb00d51e4205967b" + [[package]] name = "bumpalo" version = "3.19.0" @@ -639,7 +712,17 @@ version = "0.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6fac387a98bb7c37292057cffc56d62ecb629900026402633ae9160df93a8766" dependencies = [ - "nom", + "nom 7.1.3", +] + +[[package]] +name = "cfg-expr" +version = "0.15.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d067ad48b8650848b989a59a86c6c36a995d02d2bf778d45c3c5d57bc2718f02" +dependencies = [ + "smallvec", + "target-lexicon", ] [[package]] @@ -755,6 +838,12 @@ dependencies = [ "unicode-width", ] +[[package]] +name = "color_quant" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3d7b894f5411737b7867f4827955924d7c254fc9f4d91a6aad6b097804b1018b" + [[package]] name = "colorchoice" version = "1.0.4" @@ -871,7 +960,7 @@ dependencies = [ "ciborium", "clap", "criterion-plot", - "itertools", + "itertools 0.13.0", "num-traits", "oorandom", "plotters", @@ -890,7 +979,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9b1bcc0dc7dfae599d84ad0b1a55f80cde8af3725da8313b528da95ef783e338" dependencies = [ "cast", - "itertools", + "itertools 0.13.0", ] [[package]] @@ -1207,6 +1296,26 @@ version = "0.33.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "66054d943c66715c6003a27a3dc152d87cadf714ef2597ccd79f550413009b97" +[[package]] +name = "equator" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4711b213838dfee0117e3be6ac926007d7f433d7bbe33595975d4190cb07e6fc" +dependencies = [ + "equator-macro", +] + +[[package]] +name = "equator-macro" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "44f23cf4b44bfce11a86ace86f8a73ffdec849c9fd00a386a53d278bd9e81fb3" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + [[package]] name = "equivalent" version = "1.0.2" @@ -1250,6 +1359,21 @@ dependencies = [ "pin-project-lite", ] +[[package]] +name = "exr" +version = "1.73.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f83197f59927b46c04a183a619b7c29df34e63e63c7869320862268c0ef687e0" +dependencies = [ + "bit_field", + "half", + "lebe", + "miniz_oxide", + "rayon-core", + "smallvec", + "zune-inflate", +] + [[package]] name = "fastrand" version = "2.3.0" @@ -1405,6 +1529,17 @@ dependencies = [ "windows-targets 0.48.5", ] +[[package]] +name = "getrandom" +version = "0.2.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "335ff9f135e4384c8150d6f27c6daed433577f86b4750418338c01a1a2528592" +dependencies = [ + "cfg-if", + "libc", + "wasi 0.11.1+wasi-snapshot-preview1", +] + [[package]] name = "getrandom" version = "0.3.3" @@ -1414,7 +1549,17 @@ dependencies = [ "cfg-if", "libc", "r-efi", - "wasi", + "wasi 0.14.2+wasi-0.2.4", +] + +[[package]] +name = "gif" +version = "0.13.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4ae047235e33e2829703574b54fdec96bfbad892062d97fed2f76022287de61b" +dependencies = [ + "color_quant", + "weezl", ] [[package]] @@ -1731,11 +1876,37 @@ checksum = "db35664ce6b9810857a38a906215e75a9c879f0696556a39f59c62829710251a" dependencies = [ "bytemuck", "byteorder-lite", + "color_quant", + "exr", + "gif", + "image-webp", "num-traits", "png", + "qoi", + "ravif", + "rayon", + "rgb", "tiff", + "zune-core", + "zune-jpeg", ] +[[package]] +name = "image-webp" +version = "0.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "525e9ff3e1a4be2fbea1fdf0e98686a6d98b4d8f937e1bf7402245af1909e8c3" +dependencies = [ + "byteorder-lite", + "quick-error", +] + +[[package]] +name = "imgref" +version = "1.12.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e7c5cedc30da3a610cac6b4ba17597bdf7152cf974e8aab3afb3d54455e371c8" + [[package]] name = "indexmap" version = "2.10.0" @@ -1746,12 +1917,32 @@ dependencies = [ "hashbrown 0.15.4", ] +[[package]] +name = "interpolate_name" +version = "0.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c34819042dc3d3971c46c2190835914dfbe0c3c13f61449b2997f4e9722dfa60" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + [[package]] name = "is_terminal_polyfill" version = "1.70.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7943c866cc5cd64cbc25b2e01621d07fa8eb2a1a23160ee81ce38704e97b8ecf" +[[package]] +name = "itertools" +version = "0.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ba291022dbbd398a455acf126c1e341954079855bc60dfdda641363bd6922569" +dependencies = [ + "either", +] + [[package]] name = "itertools" version = "0.13.0" @@ -1819,7 +2010,7 @@ version = "0.1.33" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "38f262f097c174adebe41eb73d66ae9c06b2844fb0da69969647bbddd9b0538a" dependencies = [ - "getrandom", + "getrandom 0.3.3", "libc", ] @@ -1862,12 +2053,28 @@ version = "1.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "bbd2bcb4c963f2ddae06a2efc7e9f3591312473c50c6685e1f298068316e66fe" +[[package]] +name = "lebe" +version = "0.5.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7a79a3332a6609480d7d0c9eab957bca6b455b91bb84e66d19f5ff66294b85b8" + [[package]] name = "libc" version = "0.2.174" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1171693293099992e19cddea4e8b849964e9846f4acee11b3948bcc337be8776" +[[package]] +name = "libfuzzer-sys" +version = "0.4.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5037190e1f70cbeef565bd267599242926f724d3b8a9f510fd7e0b540cfa4404" +dependencies = [ + "arbitrary", + "cc", +] + [[package]] name = "libloading" version = "0.8.8" @@ -1934,6 +2141,15 @@ version = "0.4.28" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "34080505efa8e45a4b816c349525ebe327ceaa8559756f0356cba97ef3bf7432" +[[package]] +name = "loop9" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0fae87c125b03c1d2c0150c90365d7d6bcc53fb73a9acaef207d2d065860f062" +dependencies = [ + "imgref", +] + [[package]] name = "malloc_buf" version = "0.0.6" @@ -1943,6 +2159,16 @@ dependencies = [ "libc", ] +[[package]] +name = "maybe-rayon" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8ea1f30cedd69f0a2954655f7188c6a834246d2bcf1e315e2ac40c4b24dc9519" +dependencies = [ + "cfg-if", + "rayon", +] + [[package]] name = "memchr" version = "2.7.5" @@ -2054,6 +2280,12 @@ dependencies = [ "jni-sys", ] +[[package]] +name = "new_debug_unreachable" +version = "1.0.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "650eef8c711430f1a879fdd01d4745a7deea475becfb90269c06775983bbf086" + [[package]] name = "nix" version = "0.30.1" @@ -2083,6 +2315,62 @@ dependencies = [ "minimal-lexical", ] +[[package]] +name = "nom" +version = "8.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "df9761775871bdef83bee530e60050f7e54b1105350d6884eb0fb4f46c2f9405" +dependencies = [ + "memchr", +] + +[[package]] +name = "noop_proc_macro" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0676bb32a98c1a483ce53e500a81ad9c3d5b3f7c920c28c24e9cb0980d0b5bc8" + +[[package]] +name = "num-bigint" +version = "0.4.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a5e44f723f1133c9deac646763579fdb3ac745e418f2a7af9cd0c431da1f20b9" +dependencies = [ + "num-integer", + "num-traits", +] + +[[package]] +name = "num-derive" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ed3955f1a9c7c0c15e092f9c887db08b1fc683305fdf6eb6684f22555355e202" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "num-integer" +version = "0.1.46" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7969661fd2958a5cb096e56c8e1ad0444ac2bbcd0061bd28660485a44879858f" +dependencies = [ + "num-traits", +] + +[[package]] +name = "num-rational" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f83d14da390562dca69fc84082e73e548e1ad308d24accdedd2720017cb37824" +dependencies = [ + "num-bigint", + "num-integer", + "num-traits", +] + [[package]] name = "num-traits" version = "0.2.19" @@ -2417,6 +2705,7 @@ dependencies = [ "eframe", "egui", "fern", + "image", "log", "oboromi-core", ] @@ -2646,6 +2935,15 @@ dependencies = [ "zerovec", ] +[[package]] +name = "ppv-lite86" +version = "0.2.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "85eae3c4ed2f50dcfe72643da4befc30deadb458a9b590d720cde2f2b1e97da9" +dependencies = [ + "zerocopy", +] + [[package]] name = "presser" version = "0.3.1" @@ -2685,6 +2983,34 @@ name = "profiling" version = "1.0.17" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3eb8486b569e12e2c32ad3e204dbaba5e4b5b216e9367044f25f1dba42341773" +dependencies = [ + "profiling-procmacros", +] + +[[package]] +name = "profiling-procmacros" +version = "1.0.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "52717f9a02b6965224f95ca2a81e2e0c5c43baacd28ca057577988930b6c3d5b" +dependencies = [ + "quote", + "syn", +] + +[[package]] +name = "qoi" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7f6d64c71eb498fe9eae14ce4ec935c555749aef511cca85b5568910d6e48001" +dependencies = [ + "bytemuck", +] + +[[package]] +name = "quick-error" +version = "2.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a993555f31e5a609f617c12db6250dedcac1b0a85076912c436e6fc9b2c8e6a3" [[package]] name = "quick-xml" @@ -2720,12 +3046,92 @@ version = "5.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "69cdb34c158ceb288df11e18b4bd39de994f6657d83847bdffdbd7f346754b0f" +[[package]] +name = "rand" +version = "0.8.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "34af8d1a0e25924bc5b7c43c079c942339d8f0a8b57c39049bef581b46327404" +dependencies = [ + "libc", + "rand_chacha", + "rand_core", +] + +[[package]] +name = "rand_chacha" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e6c10a63a0fa32252be49d21e7709d4d4baf8d231c2dbce1eaa8141b9b127d88" +dependencies = [ + "ppv-lite86", + "rand_core", +] + +[[package]] +name = "rand_core" +version = "0.6.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c" +dependencies = [ + "getrandom 0.2.16", +] + [[package]] name = "range-alloc" version = "0.1.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c3d6831663a5098ea164f89cff59c6284e95f4e3c76ce9848d4529f5ccca9bde" +[[package]] +name = "rav1e" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cd87ce80a7665b1cce111f8a16c1f3929f6547ce91ade6addf4ec86a8dda5ce9" +dependencies = [ + "arbitrary", + "arg_enum_proc_macro", + "arrayvec", + "av1-grain", + "bitstream-io", + "built", + "cfg-if", + "interpolate_name", + "itertools 0.12.1", + "libc", + "libfuzzer-sys", + "log", + "maybe-rayon", + "new_debug_unreachable", + "noop_proc_macro", + "num-derive", + "num-traits", + "once_cell", + "paste", + "profiling", + "rand", + "rand_chacha", + "simd_helpers", + "system-deps", + "thiserror 1.0.69", + "v_frame", + "wasm-bindgen", +] + +[[package]] +name = "ravif" +version = "0.11.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5825c26fddd16ab9f515930d49028a630efec172e903483c94796cfe31893e6b" +dependencies = [ + "avif-serialize", + "imgref", + "loop9", + "quick-error", + "rav1e", + "rayon", + "rgb", +] + [[package]] name = "raw-window-handle" version = "0.6.2" @@ -2805,6 +3211,12 @@ version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "19b30a45b0cd0bcca8037f3d0dc3421eaf95327a17cad11964fb8179b4fc4832" +[[package]] +name = "rgb" +version = "0.8.52" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0c6a884d2998352bb4daf0183589aec883f16a6da1f4dde84d8e2e9a5409a1ce" + [[package]] name = "rustc-hash" version = "1.1.0" @@ -2942,6 +3354,15 @@ dependencies = [ "syn", ] +[[package]] +name = "serde_spanned" +version = "0.6.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bf41e0cfaf7226dca15e8197172c295a782857fcb97fad1808a166870dee75a3" +dependencies = [ + "serde", +] + [[package]] name = "shlex" version = "1.3.0" @@ -2963,6 +3384,15 @@ version = "0.3.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d66dc143e6b11c1eddc06d5c423cfc97062865baf299914ab64caa38182078fe" +[[package]] +name = "simd_helpers" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "95890f873bec569a0362c235787f3aca6e1e887302ba4840839bcc6459c42da6" +dependencies = [ + "quote", +] + [[package]] name = "slab" version = "0.4.11" @@ -3078,6 +3508,25 @@ dependencies = [ "syn", ] +[[package]] +name = "system-deps" +version = "6.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a3e535eb8dded36d55ec13eddacd30dec501792ff23a0b1682c38601b8cf2349" +dependencies = [ + "cfg-expr", + "heck", + "pkg-config", + "toml", + "version-compare", +] + +[[package]] +name = "target-lexicon" +version = "0.12.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "61c41af27dd6d1e27b1b16b489db798443478cef1f06a660c96db617ba5de3b1" + [[package]] name = "tempfile" version = "3.20.0" @@ -3085,7 +3534,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e8a64e3985349f2441a1a9ef0b853f869006c3855f2cda6862a94d26ebb9d6a1" dependencies = [ "fastrand", - "getrandom", + "getrandom 0.3.3", "once_cell", "rustix 1.0.7", "windows-sys 0.59.0", @@ -3196,11 +3645,26 @@ dependencies = [ "serde_json", ] +[[package]] +name = "toml" +version = "0.8.23" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dc1beb996b9d83529a9e75c17a1686767d148d70663143c7854d8b4a09ced362" +dependencies = [ + "serde", + "serde_spanned", + "toml_datetime", + "toml_edit", +] + [[package]] name = "toml_datetime" version = "0.6.11" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "22cddaf88f4fbc13c51aebbf5f8eceb5c7c5a9da2ac40a13519eb5b0a0e8f11c" +dependencies = [ + "serde", +] [[package]] name = "toml_edit" @@ -3209,6 +3673,8 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "41fe8c660ae4257887cf66394862d21dbca4a6ddd26f04a3560410406a2f819a" dependencies = [ "indexmap", + "serde", + "serde_spanned", "toml_datetime", "winnow", ] @@ -3337,6 +3803,23 @@ version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "06abde3611657adf66d383f00b093d7faecc7fa57071cce2578660c9f1010821" +[[package]] +name = "v_frame" +version = "0.3.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "666b7727c8875d6ab5db9533418d7c764233ac9c0cff1d469aec8fa127597be2" +dependencies = [ + "aligned-vec", + "num-traits", + "wasm-bindgen", +] + +[[package]] +name = "version-compare" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "03c2856837ef78f57382f06b2b8563a2f512f7185d732608fd9176cb3b8edf0e" + [[package]] name = "version_check" version = "0.9.5" @@ -3353,6 +3836,12 @@ dependencies = [ "winapi-util", ] +[[package]] +name = "wasi" +version = "0.11.1+wasi-snapshot-preview1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ccf3ec651a847eb01de73ccad15eb7d99f80485de043efb2f370cd654f4ea44b" + [[package]] name = "wasi" version = "0.14.2+wasi-0.2.4" @@ -4568,6 +5057,30 @@ dependencies = [ "syn", ] +[[package]] +name = "zune-core" +version = "0.4.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3f423a2c17029964870cfaabb1f13dfab7d092a62a29a89264f4d36990ca414a" + +[[package]] +name = "zune-inflate" +version = "0.2.54" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "73ab332fe2f6680068f3582b16a24f90ad7096d5d39b974d1c0aff0125116f02" +dependencies = [ + "simd-adler32", +] + +[[package]] +name = "zune-jpeg" +version = "0.4.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "29ce2c8a9384ad323cf564b67da86e21d3cfdff87908bc1223ed5c99bc792713" +dependencies = [ + "zune-core", +] + [[package]] name = "zvariant" version = "5.6.0" diff --git a/assets/oboromi_logo.png b/assets/oboromi_logo.png new file mode 100644 index 0000000000000000000000000000000000000000..1484ee6dfc3430c1c0811b79678bcdebe27c5e96 GIT binary patch literal 22583 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, pub test_thread: Option>>, + pub splash_start: Instant, + pub logo: Option, } impl Default for GUI { fn default() -> Self { - Self { - logs: vec![ - "click 'Run CPU Tests' to begin".to_string(), - ], + Self { + logs: vec!["click 'Run CPU Tests' to begin".to_string()], test_thread: None, + splash_start: Instant::now(), + logo: None, } } } impl eframe::App for GUI { fn update(&mut self, ctx: &egui::Context, _frame: &mut eframe::Frame) { + if self.logo.is_none() { + let bytes = include_bytes!("../../../assets/oboromi_logo.png"); + let image = image::load_from_memory(bytes).expect("failed to load image").to_rgba8(); + let size = [image.width() as usize, image.height() as usize]; + let tex = ctx.load_texture( + "logo", + egui::ColorImage::from_rgba_unmultiplied(size, image.as_raw()), + egui::TextureOptions::LINEAR, + ); + self.logo = Some(tex); + } + + let now = Instant::now(); + let elapsed = now.duration_since(self.splash_start); + let fade_in = Duration::from_millis(700); + let hold = Duration::from_millis(1200); + let fade_out = Duration::from_millis(700); + let total = fade_in + hold + fade_out; + + let (phase, progress) = if elapsed < fade_in { + ("fade_in", elapsed.as_secs_f32() / fade_in.as_secs_f32()) + } else if elapsed < fade_in + hold { + ("hold", 1.0) + } else if elapsed < total { + ("fade_out", 1.0 - (elapsed - fade_in - hold).as_secs_f32() / fade_out.as_secs_f32()) + } else { + ("done", 0.0) + }; + + if phase != "done" { + CentralPanel::default().show(ctx, |ui| { + let rect = ui.max_rect(); + let painter = ui.painter(); + + let bg_color = match phase { + "fade_in" => Color32::from_rgb(25, 25, 25), + "hold" => Color32::from_rgb(25, 25, 25), + "fade_out" => Color32::from_rgb(25, 25, 25), + _ => Color32::BLACK, + }; + painter.rect_filled(rect, 0.0, bg_color); + + let Some(tex) = &self.logo else { return; }; + let center = rect.center(); + let logo_size = tex.size_vec2() * 0.3; + let logo_rect = Rect::from_center_size(center + Vec2::new(0.0, -20.0), logo_size); + + painter.image( + tex.id(), + logo_rect, + Rect::from_min_max(Pos2::ZERO, Pos2::new(1.0, 1.0)), + Color32::from_rgba_premultiplied(255, 255, 255, (progress * 255.0) as u8), + ); + + let time = elapsed.as_secs_f32(); + let _logo_middle = logo_rect.left() + logo_rect.width() * 0.5; + let glint_center_x = logo_rect.left() + logo_rect.width() * ((time * 0.6).sin() * 0.45 + 0.5); + let glint_width = logo_rect.width() * 0.11; + let num_steps = 70; + + for step in 0..num_steps { + let t = step as f32 / (num_steps as f32 - 1.0); + let x = glint_center_x + (t - 0.5) * glint_width; + let dist = x - glint_center_x; + let gauss = (-dist * dist / (2.0 * (glint_width * 0.32).powi(2))).exp(); + let fade = gauss.powf(1.2); + let alpha = (progress * 78.0 * fade).min(94.0).max(0.0) as u8; + let _color = Color32::from_rgba_premultiplied( + 200, + (220.0 - 40.0 * (1.0 - fade)).max(180.0) as u8, + 255, + alpha, + ); + } + + let text_color = Color32::from_rgba_premultiplied(120, 180, 255, (progress * 255.0) as u8); + painter.text( + center + Vec2::new(0.0, logo_size.y / 2.0 + 24.0), + Align2::CENTER_TOP, + "oboromi", + egui::TextStyle::Heading.resolve(ui.style()), + text_color, + ); + }); + + ctx.request_repaint(); + return; + } + CentralPanel::default().show(ctx, |ui| { + egui::MenuBar::new().ui(ui, |ui| { + ui.menu_button("File", |ui| { + if ui.button("Quit").clicked() { + ui.ctx().send_viewport_cmd(egui::ViewportCommand::Close); + } + }); + ui.menu_button("About", |ui| { + ui.hyperlink_to("See the code", "https://git.eden-emu.dev/Nikilite/oboromi/"); + }); + }); + ui.heading("oboromi"); ui.separator(); - + if let Some(handle) = self.test_thread.take() { self.logs = handle.join().unwrap(); } - + if self.test_thread.is_none() { if ui.button("Run CPU Tests").clicked() { let ctx = ctx.clone(); @@ -36,7 +141,7 @@ impl eframe::App for GUI { })); self.logs = vec![ "Warming up JIT compiler...".to_string(), - "Running ARM64 tests...".to_string() + "Running ARM64 tests...".to_string(), ]; } } else { @@ -47,16 +152,14 @@ impl eframe::App for GUI { ui.label(RichText::new("Results:").color(Color32::from_rgb(200, 200, 200))); ScrollArea::vertical().show(ui, |ui| { for line in &self.logs { - if line.contains("PASS") { - ui.colored_label(egui::Color32::from_rgb(50, 255, 50), line); + let color = if line.contains("PASS") { + Color32::from_rgb(50, 255, 50) + } else if line.contains("FAIL") { + Color32::from_rgb(255, 50, 50) } else { - if line.contains("FAIL") { - ui.colored_label(egui::Color32::from_rgb(255, 50, 50), line); - } - else { - ui.colored_label(egui::Color32::from_rgb(200, 200, 200), line); - } - } + Color32::from_rgb(200, 200, 200) + }; + ui.colored_label(color, line); } }); });