diff --git a/Cargo.lock b/Cargo.lock index 4473520..2eb1fe9 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -24,17 +24,6 @@ version = "2.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "320119579fcad9c21884f5c4861d16174d0e06250625266f50fe6898340abefa" -[[package]] -name = "ahash" -version = "0.7.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "891477e0c6a8957309ee5c45a6368af3ae14bb510732d2684ffa19af310920f9" -dependencies = [ - "getrandom 0.2.16", - "once_cell", - "version_check", -] - [[package]] name = "ahash" version = "0.8.12" @@ -42,7 +31,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5a15f179cd60c4584b8a8c596927aadc462e27f2ca70c04e0071964a73ba7a75" dependencies = [ "cfg-if", - "getrandom 0.3.4", + "getrandom", "once_cell", "version_check", "zerocopy", @@ -64,10 +53,22 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "250f629c0161ad8107cf89319e990051fae62832fd343083bea452d93e2205fd" [[package]] -name = "allocator-api2" -version = "0.2.21" +name = "aligned" +version = "0.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "683d7910e743518b0e34f1186f92494becacb047c7b6bf616c96772180fef923" +checksum = "377e4c0ba83e4431b10df45c1d4666f178ea9c552cac93e60c3a88bf32785923" +dependencies = [ + "as-slice", +] + +[[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" @@ -85,11 +86,20 @@ dependencies = [ "log", "ndk", "ndk-context", - "ndk-sys 0.6.0+11769913", + "ndk-sys", "num_enum", "thiserror 1.0.69", ] +[[package]] +name = "android-build" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8cac4c64175d504608cf239756339c07f6384a476f97f20a7043f92920b0b8fd" +dependencies = [ + "windows-sys 0.52.0", +] + [[package]] name = "android-properties" version = "0.2.2" @@ -106,12 +116,26 @@ dependencies = [ ] [[package]] -name = "approx" -version = "0.5.1" +name = "anyhow" +version = "1.0.100" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cab112f0a86d568ea0e627cc1d6be74a1e9cd55214684db5561995f6dad897c6" +checksum = "a23eb6b1614318a8071c9b2521f36b424b2c83db5eb3a0fead4a6c0809af6e61" + +[[package]] +name = "arbitrary" +version = "1.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c3d036a3c4ab069c7b410a2ce876bd74808d2d0888a82667669f8e783a898bf1" + +[[package]] +name = "arg_enum_proc_macro" +version = "0.3.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0ae92a5119aa49cdbcf6b9f893fe4e1d98b04ccbf82ee0584ad948a44a734dea" dependencies = [ - "num-traits", + "proc-macro2", + "quote", + "syn", ] [[package]] @@ -133,12 +157,21 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "175571dd1d178ced59193a6fc02dde1b972eb0bc56c892cde9beeceac5bf0f6b" [[package]] -name = "ash" -version = "0.37.3+1.3.251" +name = "as-slice" +version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "39e9c3835d686b0a6084ab4234fcd1b07dbf6e4767dce60874b12356a25ecd4a" +checksum = "516b6b4f0e40d50dcda9365d53964ec74560ad4284da2e7fc97122cd83174516" dependencies = [ - "libloading 0.7.4", + "stable_deref_trait", +] + +[[package]] +name = "ash" +version = "0.38.0+1.3.281" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0bb44936d800fea8f016d7f2311c6a4f97aebd5dc86f09906139ec848cf3a46f" +dependencies = [ + "libloading", ] [[package]] @@ -179,17 +212,6 @@ dependencies = [ "slab", ] -[[package]] -name = "async-fs" -version = "2.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8034a681df4aed8b8edbd7fbe472401ecf009251c8b40556b304567052e294c5" -dependencies = [ - "async-lock", - "blocking", - "futures-lite", -] - [[package]] name = "async-io" version = "2.6.0" @@ -245,7 +267,7 @@ checksum = "3b43422f69d8ff38f95f1b2bb76517c91589a924d1559a0e935d7c8ce0274c11" dependencies = [ "proc-macro2", "quote", - "syn 2.0.108", + "syn", ] [[package]] @@ -280,7 +302,7 @@ checksum = "9035ad2d096bed7955a320ee7e2230574d28fd3c3a0f186cbea1ff3c7eed5dbb" dependencies = [ "proc-macro2", "quote", - "syn 2.0.108", + "syn", ] [[package]] @@ -296,19 +318,77 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c08606f8c3cbf4ce6ec8e28fb0014a2c086708fe954eaa885384a6165172e7e8" [[package]] -name = "bit-set" -version = "0.5.3" +name = "av-scenechange" +version = "0.14.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0700ddab506f33b20a03b13996eccd309a48e5ff77d0d95926aa0210fb4e95f1" +checksum = "0f321d77c20e19b92c39e7471cf986812cbb46659d2af674adc4331ef3f18394" +dependencies = [ + "aligned", + "anyhow", + "arg_enum_proc_macro", + "arrayvec", + "log", + "num-rational", + "num-traits", + "pastey", + "rayon", + "thiserror 2.0.17", + "v_frame", + "y4m", +] + +[[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", + "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 = "bincode" +version = "1.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b1f45e9417d87227c7a56d22e471c6206462cba514c7590c09aff4cf6d1ddcad" +dependencies = [ + "serde", +] + +[[package]] +name = "bit-set" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "08807e080ed7f9d5433fa9b275196cfc35414f66a0c79d864dc51a0d825231a3" dependencies = [ "bit-vec", ] [[package]] name = "bit-vec" -version = "0.6.3" +version = "0.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "349f9b6a179ed607305526ca489b34ad0a41aed5f7980fa90eb03160b69598fb" +checksum = "5e764a1d40d510daf35e07be9eb06e75770908c27d411ee6c92109c9840eaaf7" + +[[package]] +name = "bit_field" +version = "0.10.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e4b40c7323adcfc0a41c4b88143ed58346ff65a288fc144329c5c45e05d70c6" [[package]] name = "bitfield" @@ -327,7 +407,7 @@ checksum = "6115af052c7914c0cbb97195e5c72cb61c511527250074f5c041d1048b0d8b16" dependencies = [ "proc-macro2", "quote", - "syn 2.0.108", + "syn", ] [[package]] @@ -342,28 +422,37 @@ version = "2.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "812e12b5285cc515a9c72a5c1d3b6d46a19dac5acfef5265968c166106e31dd3" +[[package]] +name = "bitstream-io" +version = "4.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "60d4bd9d1db2c6bdf285e223a7fa369d5ce98ec767dec949c6ca62863ce61757" +dependencies = [ + "core2", +] + [[package]] name = "block" version = "0.1.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0d8c1fef690941d3e7788d328517591fecc684c084084702d6ff1641e993699a" -[[package]] -name = "block-buffer" -version = "0.10.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3078c7629b62d3f0439517fa394996acacc5cbc91c5a20d8c658e77abd503a71" -dependencies = [ - "generic-array", -] - [[package]] name = "block2" version = "0.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2c132eebf10f5cad5289222520a4a058514204aed6d791f1cf4fe8088b82d15f" dependencies = [ - "objc2", + "objc2 0.5.2", +] + +[[package]] +name = "block2" +version = "0.6.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cdeb9d870516001442e364c5220d3574d2da8dc765554b4a617230d33fa58ef5" +dependencies = [ + "objc2 0.6.3", ] [[package]] @@ -379,18 +468,18 @@ dependencies = [ "piper", ] +[[package]] +name = "built" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f4ad8f11f288f48ca24471bbd51ac257aaeaaa07adae295591266b792902ae64" + [[package]] name = "bumpalo" version = "3.19.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "46c5e41b57b8bba42a04676d81cb89e9ee8e859a1a66f80a5a72e1cb76b34d43" -[[package]] -name = "by_address" -version = "1.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "64fa3c856b712db6612c019f14756e64e4bcea13337a6b33b696333a9eaa2d06" - [[package]] name = "bytemuck" version = "1.24.0" @@ -408,14 +497,14 @@ checksum = "f9abbd1bc6865053c427f7198e6af43bfdedc55ab791faed4fbd361d789575ff" dependencies = [ "proc-macro2", "quote", - "syn 2.0.108", + "syn", ] [[package]] -name = "byteorder" -version = "1.5.0" +name = "byteorder-lite" +version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b" +checksum = "8f1fe948ff07f4bd06c30984e69f5b4899c516a3ef74f34df92a2df2ab535495" [[package]] name = "bytes" @@ -498,12 +587,6 @@ version = "1.0.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9330f8b2ff13f34540b44e946ef35111825727b38d33286ef986142615121801" -[[package]] -name = "cfg_aliases" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fd16c4719339c4530435d38e511904438d07cce7950afa3718a84ac36c10e89e" - [[package]] name = "cfg_aliases" version = "0.2.1" @@ -536,9 +619,9 @@ version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9b7f4aaa047ba3c3630b080bb9860894732ff23e2aee290a418909aa6d5df38f" dependencies = [ - "objc2", - "objc2-app-kit", - "objc2-foundation", + "objc2 0.5.2", + "objc2-app-kit 0.2.2", + "objc2-foundation 0.2.2", ] [[package]] @@ -562,10 +645,11 @@ dependencies = [ [[package]] name = "codespan-reporting" -version = "0.11.1" +version = "0.12.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3538270d33cc669650c4b093848450d380def10c331d38c768e34cac80576e6e" +checksum = "fe6d2e5af09e8c8ad56c969f2157a3d4238cebc7c55f0a517728c38f7b200f81" dependencies = [ + "serde", "termcolor", "unicode-width", ] @@ -576,37 +660,6 @@ version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3d7b894f5411737b7867f4827955924d7c254fc9f4d91a6aad6b097804b1018b" -[[package]] -name = "com" -version = "0.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7e17887fd17353b65b1b2ef1c526c83e26cd72e74f598a8dc1bee13a48f3d9f6" -dependencies = [ - "com_macros", -] - -[[package]] -name = "com_macros" -version = "0.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d375883580a668c7481ea6631fc1a8863e33cc335bf56bfad8d7e6d4b04b13a5" -dependencies = [ - "com_macros_support", - "proc-macro2", - "syn 1.0.109", -] - -[[package]] -name = "com_macros_support" -version = "0.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ad899a1087a9296d5644792d7cb72b8e34c1bec8e7d4fbc002230169a6e8710c" -dependencies = [ - "proc-macro2", - "quote", - "syn 1.0.109", -] - [[package]] name = "combine" version = "4.6.7" @@ -701,37 +754,47 @@ dependencies = [ ] [[package]] -name = "cosmic-text" -version = "0.12.1" +name = "core2" +version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "59fd57d82eb4bfe7ffa9b1cec0c05e2fd378155b47f255a67983cb4afe0e80c2" +checksum = "b49ba7ef1ad6107f8824dbe97de947cbaac53c44e7f9756a1fba0d37c1eec505" +dependencies = [ + "memchr", +] + +[[package]] +name = "core_maths" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "77745e017f5edba1a9c1d854f6f3a52dac8a12dd5af5d2f54aecf61e43d80d30" +dependencies = [ + "libm", +] + +[[package]] +name = "cosmic-text" +version = "0.15.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "173852283a9a57a3cbe365d86e74dc428a09c50421477d5ad6fe9d9509e37737" dependencies = [ "bitflags 2.10.0", "fontdb", + "harfrust", + "linebender_resource_handle", "log", "rangemap", - "rayon", "rustc-hash 1.1.0", - "rustybuzz", "self_cell", + "skrifa", + "smol_str", "swash", "sys-locale", - "ttf-parser 0.21.1", "unicode-bidi", "unicode-linebreak", "unicode-script", "unicode-segmentation", ] -[[package]] -name = "cpufeatures" -version = "0.2.17" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "59ed5838eebb26a2bb2e58f6d5b5316989ae9d08bab10e0e6d103e656d1b0280" -dependencies = [ - "libc", -] - [[package]] name = "crc32fast" version = "1.5.0" @@ -773,13 +836,16 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "460fbee9c2c2f33933d720630a6a0bac33ba7053db5344fac858d4b8952d77d5" [[package]] -name = "crypto-common" -version = "0.1.6" +name = "cryoglyph" +version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1bfb12502f3fc46cca1bb51ac28df9d618d813cdc3d2f25b9fe775a34af26bb3" +checksum = "08bc795bdbccdbd461736fb163930a009da6597b226d6f6fce33e7a8eb6ec519" dependencies = [ - "generic-array", - "typenum", + "cosmic-text", + "etagere", + "lru", + "rustc-hash 2.1.1", + "wgpu", ] [[package]] @@ -794,95 +860,39 @@ version = "1.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f27ae1dd37df86211c42e150270f82743308803d90a6f6e6651cd730d5e1732f" -[[package]] -name = "d3d12" -version = "0.19.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3e3d747f100290a1ca24b752186f61f6637e1deffe3bf6320de6fcb29510a307" -dependencies = [ - "bitflags 2.10.0", - "libloading 0.8.9", - "winapi", -] - -[[package]] -name = "dark-light" -version = "1.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2a76fa97167fa740dcdbfe18e8895601e1bc36525f09b044e00916e717c03a3c" -dependencies = [ - "dconf_rs", - "detect-desktop-environment", - "dirs", - "objc", - "rust-ini", - "web-sys", - "winreg", - "zbus", -] - -[[package]] -name = "dconf_rs" -version = "0.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7046468a81e6a002061c01e6a7c83139daf91b11c30e66795b13217c2d885c8b" - -[[package]] -name = "detect-desktop-environment" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "21d8ad60dd5b13a4ee6bd8fa2d5d88965c597c67bce32b5fc49c94f55cb50810" - -[[package]] -name = "digest" -version = "0.10.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9ed9a281f7bc9b7576e61468ba615a66a5c8cfdff42420a70aa82701a3b1e292" -dependencies = [ - "block-buffer", - "crypto-common", -] - -[[package]] -name = "dirs" -version = "4.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ca3aa72a6f96ea37bbc5aa912f6788242832f75369bdfdadcb0e38423f100059" -dependencies = [ - "dirs-sys", -] - -[[package]] -name = "dirs-sys" -version = "0.3.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1b1d1d91c932ef41c0f2663aa8b0ca0342d444d842c06914aa0a7e352d0bada6" -dependencies = [ - "libc", - "redox_users", - "winapi", -] - [[package]] name = "dispatch" version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "bd0c93bb4b0c6d9b77f4435b0ae98c24d17f1c45b2ff844c6151a07256ca923b" +[[package]] +name = "dispatch2" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "89a09f22a6c6069a18470eb92d2298acf25463f14256d24778e1230d789a2aec" +dependencies = [ + "bitflags 2.10.0", + "objc2 0.6.3", +] + [[package]] name = "dlib" version = "0.5.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "330c60081dcc4c72131f8eb70510f1ac07223e5d4163db481a04a0befcffa412" dependencies = [ - "libloading 0.8.9", + "libloading", ] [[package]] -name = "dlv-list" -version = "0.3.0" +name = "document-features" +version = "0.2.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0688c2a7f92e427f44895cd63841bff7b29f8d7a1648b9e7e07a4a365b2e1257" +checksum = "d4b8a88685455ed29a21542a33abd9cb6510b6b129abadabdcef0f4c55bc8f61" +dependencies = [ + "litrs", +] [[package]] name = "downcast-rs" @@ -896,45 +906,6 @@ version = "0.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d8b14ccef22fc6f5a8f4d7d768562a182c04ce9a3b3157b91390b52ddfdf1a76" -[[package]] -name = "drm" -version = "0.12.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "98888c4bbd601524c11a7ed63f814b8825f420514f78e96f752c437ae9cbb5d1" -dependencies = [ - "bitflags 2.10.0", - "bytemuck", - "drm-ffi", - "drm-fourcc", - "rustix 0.38.44", -] - -[[package]] -name = "drm-ffi" -version = "0.8.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "97c98727e48b7ccb4f4aea8cfe881e5b07f702d17b7875991881b41af7278d53" -dependencies = [ - "drm-sys", - "rustix 0.38.44", -] - -[[package]] -name = "drm-fourcc" -version = "2.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0aafbcdb8afc29c1a7ee5fbe53b5d62f4565b35a042a662ca9fecd0b54dae6f4" - -[[package]] -name = "drm-sys" -version = "0.7.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fd39dde40b6e196c2e8763f23d119ddb1a8714534bf7d77fa97a65b0feda3986" -dependencies = [ - "libc", - "linux-raw-sys 0.6.5", -] - [[package]] name = "either" version = "1.15.0" @@ -965,7 +936,27 @@ checksum = "67c78a4d8fdf9953a5c9d458f9efe940fd97a0cab0941c075a813ac594733827" dependencies = [ "proc-macro2", "quote", - "syn 2.0.108", + "syn", +] + +[[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]] @@ -1031,10 +1022,19 @@ dependencies = [ ] [[package]] -name = "fast-srgb8" -version = "1.0.0" +name = "exr" +version = "1.74.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dd2e7510819d6fbf51a5545c8f922716ecfb14df168a3242f7d33e0239efe6a1" +checksum = "4300e043a56aa2cb633c01af81ca8f699a321879a7854d3896a0ba89056363be" +dependencies = [ + "bit_field", + "half", + "lebe", + "miniz_oxide", + "rayon-core", + "smallvec", + "zune-inflate", +] [[package]] name = "fastrand" @@ -1042,6 +1042,26 @@ version = "2.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "37909eebbb50d72f9059c3b6d82c0463f2ff062c9e95845c43a6c9c0355411be" +[[package]] +name = "fax" +version = "0.2.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f05de7d48f37cd6730705cbca900770cab77a89f413d23e100ad7fad7795a0ab" +dependencies = [ + "fax_derive", +] + +[[package]] +name = "fax_derive" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a0aca10fb742cb43f9e7bb8467c91aa9bcb8e3ffbc6a6f7389bb93ffc920577d" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + [[package]] name = "fdeflate" version = "0.3.7" @@ -1074,10 +1094,22 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8bf7cc16383c4b8d58b9905a8509f02926ce3058053c056376248d958c9df1e8" [[package]] -name = "font-types" -version = "0.7.3" +name = "foldhash" +version = "0.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b3971f9a5ca983419cdc386941ba3b9e1feba01a0ab888adf78739feb2798492" +checksum = "d9c4f5dac5e15c24eb999c26181a6ca40b39fe946cbe4c263c7209467bc83af2" + +[[package]] +name = "foldhash" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "77ce24cb58228fbb8aa041425bb1050850ac19177686ea6e0f41a70416f56fdb" + +[[package]] +name = "font-types" +version = "0.10.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "39a654f404bbcbd48ea58c617c2993ee91d1cb63727a37bf2323a4edeed1b8c5" dependencies = [ "bytemuck", ] @@ -1093,16 +1125,16 @@ dependencies = [ [[package]] name = "fontdb" -version = "0.16.2" +version = "0.23.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b0299020c3ef3f60f526a4f64ab4a3d4ce116b1acbf24cdd22da0068e5d81dc3" +checksum = "457e789b3d1202543297a350643cf459f836cade38934e7a4cf6a39e7cde2905" dependencies = [ "fontconfig-parser", "log", "memmap2", "slotmap", "tinyvec", - "ttf-parser 0.20.0", + "ttf-parser", ] [[package]] @@ -1123,7 +1155,7 @@ checksum = "1a5c6c585bc94aaf2c7b51dd4c2ba22680844aba4c687be581871a6f518c5742" dependencies = [ "proc-macro2", "quote", - "syn 2.0.108", + "syn", ] [[package]] @@ -1202,7 +1234,7 @@ checksum = "162ee34ebcb7c64a8abebc059ce0fee27c2262618d7b60ed8faf72fef13c3650" dependencies = [ "proc-macro2", "quote", - "syn 2.0.108", + "syn", ] [[package]] @@ -1235,16 +1267,6 @@ dependencies = [ "slab", ] -[[package]] -name = "generic-array" -version = "0.14.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4bb6743198531e02858aeaea5398fcc883e71851fcbcb5a2f773e2fb6cb1edf2" -dependencies = [ - "typenum", - "version_check", -] - [[package]] name = "gethostname" version = "1.1.0" @@ -1255,17 +1277,6 @@ dependencies = [ "windows-link", ] -[[package]] -name = "getrandom" -version = "0.2.16" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "335ff9f135e4384c8150d6f27c6daed433577f86b4750418338c01a1a2528592" -dependencies = [ - "cfg-if", - "libc", - "wasi", -] - [[package]] name = "getrandom" version = "0.3.4" @@ -1278,6 +1289,16 @@ dependencies = [ "wasip2", ] +[[package]] +name = "gif" +version = "0.14.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f5df2ba84018d80c213569363bdcd0c64e6933c67fe4c1d60ecf822971a3c35e" +dependencies = [ + "color_quant", + "weezl", +] + [[package]] name = "gl_generator" version = "0.14.0" @@ -1297,9 +1318,9 @@ checksum = "151665d9be52f9bb40fc7966565d39666f2d1e69233571b71b87791c7e0528b3" [[package]] name = "glow" -version = "0.13.1" +version = "0.16.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bd348e04c43b32574f2de31c8bb397d96c9fcfa1371bd4ca6d8bdc464ab121b1" +checksum = "c5e5ea60d70410161c8bf5da3fdfeaa1c72ed2c15f8bbb9d19fe3a4fad085f08" dependencies = [ "js-sys", "slotmap", @@ -1309,9 +1330,9 @@ dependencies = [ [[package]] name = "glutin_wgl_sys" -version = "0.5.0" +version = "0.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6c8098adac955faa2d31079b65dc48841251f69efd3ac25477903fc424362ead" +checksum = "2c4ee00b289aba7a9e5306d57c2d05499b2e5dc427f84ac708bd2c090212cf3e" dependencies = [ "gl_generator", ] @@ -1337,33 +1358,32 @@ dependencies = [ [[package]] name = "gpu-allocator" -version = "0.25.0" +version = "0.27.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6f56f6318968d03c18e1bcf4857ff88c61157e9da8e47c5f29055d60e1228884" +checksum = "c151a2a5ef800297b4e79efa4f4bec035c5f51d5ae587287c9b952bdf734cacd" dependencies = [ "log", "presser", "thiserror 1.0.69", - "winapi", - "windows", + "windows 0.58.0", ] [[package]] name = "gpu-descriptor" -version = "0.2.4" +version = "0.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cc11df1ace8e7e564511f53af41f3e42ddc95b56fd07b3f4445d2a6048bc682c" +checksum = "b89c83349105e3732062a895becfc71a8f921bb71ecbbdd8ff99263e3b53a0ca" dependencies = [ "bitflags 2.10.0", "gpu-descriptor-types", - "hashbrown 0.14.5", + "hashbrown 0.15.5", ] [[package]] name = "gpu-descriptor-types" -version = "0.1.2" +version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6bf0b36e6f090b7e1d8a4b49c0cb81c1f8376f72198c65dd3ad9ff3556b8b78c" +checksum = "fdf242682df893b86f33a73828fb09ca4b2d3bb6cc95249707fc684d27484b91" dependencies = [ "bitflags 2.10.0", ] @@ -1386,26 +1406,30 @@ checksum = "6ea2d84b969582b4b1864a92dc5d27cd2b77b622a8d79306834f1be5ba20d84b" dependencies = [ "cfg-if", "crunchy", + "num-traits", "zerocopy", ] [[package]] -name = "hashbrown" -version = "0.12.3" +name = "harfrust" +version = "0.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8a9ee70c43aaf417c914396645a0fa852624801b24ebb7ae78fe8272889ac888" +checksum = "92c020db12c71d8a12a3fe7607873cade3a01a6287e29d540c8723276221b9d8" dependencies = [ - "ahash 0.7.8", + "bitflags 2.10.0", + "bytemuck", + "core_maths", + "read-fonts", + "smallvec", ] [[package]] name = "hashbrown" -version = "0.14.5" +version = "0.15.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e5274423e17b7c9fc20b6e7e208532f9b19825d82dfd615708b70edd83df41f1" +checksum = "9229cfe53dfd69f0609a49f65461bd93001ea1ef889cd5529dd176593f5338a1" dependencies = [ - "ahash 0.8.12", - "allocator-api2", + "foldhash 0.1.5", ] [[package]] @@ -1413,20 +1437,8 @@ name = "hashbrown" version = "0.16.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5419bdc4f6a9207fbeba6d11b604d481addf78ecd10c11ad51e76c2f6482748d" - -[[package]] -name = "hassle-rs" -version = "0.11.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "af2a7e73e1f34c48da31fb668a907f250794837e08faa144fd24f0b8b741e890" dependencies = [ - "bitflags 2.10.0", - "com", - "libc", - "libloading 0.8.9", - "thiserror 1.0.69", - "widestring", - "winapi", + "foldhash 0.2.0", ] [[package]] @@ -1479,43 +1491,74 @@ dependencies = [ [[package]] name = "iced" -version = "0.13.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "88acfabc84ec077eaf9ede3457ffa3a104626d79022a9bf7f296093b1d60c73f" +version = "0.14.0" dependencies = [ "iced_core", + "iced_debug", + "iced_devtools", "iced_futures", "iced_renderer", + "iced_runtime", "iced_widget", "iced_winit", - "thiserror 1.0.69", + "image", + "thiserror 2.0.17", +] + +[[package]] +name = "iced_beacon" +version = "0.14.0" +dependencies = [ + "bincode", + "futures", + "iced_core", + "log", + "semver", + "serde", + "thiserror 2.0.17", + "tokio", ] [[package]] name = "iced_core" -version = "0.13.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0013a238275494641bf8f1732a23a808196540dc67b22ff97099c044ae4c8a1c" +version = "0.14.0" dependencies = [ "bitflags 2.10.0", "bytes", - "dark-light", "glam", + "lilt", "log", "num-traits", - "once_cell", - "palette", "rustc-hash 2.1.1", + "serde", "smol_str", - "thiserror 1.0.69", + "thiserror 2.0.17", "web-time", ] +[[package]] +name = "iced_debug" +version = "0.14.0" +dependencies = [ + "iced_beacon", + "iced_core", + "iced_futures", + "log", +] + +[[package]] +name = "iced_devtools" +version = "0.14.0" +dependencies = [ + "iced_debug", + "iced_program", + "iced_widget", + "log", +] + [[package]] name = "iced_futures" -version = "0.13.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0c04a6745ba2e80f32cf01e034fd00d853aa4f4cd8b91888099cb7aaee0d5d7c" +version = "0.14.0" dependencies = [ "futures", "iced_core", @@ -1523,27 +1566,12 @@ dependencies = [ "rustc-hash 2.1.1", "tokio", "wasm-bindgen-futures", - "wasm-timer", -] - -[[package]] -name = "iced_glyphon" -version = "0.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "41c3bb56f1820ca252bc1d0994ece33d233a55657c0c263ea7cb16895adbde82" -dependencies = [ - "cosmic-text", - "etagere", - "lru", - "rustc-hash 2.1.1", - "wgpu", + "wasmtimer", ] [[package]] name = "iced_graphics" -version = "0.13.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ba25a18cfa6d5cc160aca7e1b34f73ccdff21680fa8702168c09739767b6c66f" +version = "0.14.0" dependencies = [ "bitflags 2.10.0", "bytemuck", @@ -1555,47 +1583,49 @@ dependencies = [ "kamadak-exif", "log", "lyon_path", - "once_cell", "raw-window-handle", "rustc-hash 2.1.1", - "thiserror 1.0.69", + "thiserror 2.0.17", "unicode-segmentation", ] +[[package]] +name = "iced_program" +version = "0.14.0" +dependencies = [ + "iced_graphics", + "iced_runtime", +] + [[package]] name = "iced_renderer" -version = "0.13.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "73558208059f9e622df2bf434e044ee2f838ce75201a023cf0ca3e1244f46c2a" +version = "0.14.0" dependencies = [ "iced_graphics", "iced_tiny_skia", "iced_wgpu", "log", - "thiserror 1.0.69", + "thiserror 2.0.17", ] [[package]] name = "iced_runtime" -version = "0.13.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "348b5b2c61c934d88ca3b0ed1ed913291e923d086a66fa288ce9669da9ef62b5" +version = "0.14.0" dependencies = [ "bytes", "iced_core", "iced_futures", "raw-window-handle", - "thiserror 1.0.69", + "thiserror 2.0.17", ] [[package]] name = "iced_tiny_skia" -version = "0.13.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c625d368284fcc43b0b36b176f76eff1abebe7959dd58bd8ce6897d641962a50" +version = "0.14.0" dependencies = [ "bytemuck", "cosmic-text", + "iced_debug", "iced_graphics", "kurbo", "log", @@ -1606,73 +1636,93 @@ dependencies = [ [[package]] name = "iced_wgpu" -version = "0.13.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "15708887133671d2bcc6c1d01d1f176f43a64d6cdc3b2bf893396c3ee498295f" +version = "0.14.0" dependencies = [ "bitflags 2.10.0", "bytemuck", + "cryoglyph", "futures", "glam", "guillotiere", - "iced_glyphon", + "iced_debug", "iced_graphics", "log", "lyon", - "once_cell", "rustc-hash 2.1.1", - "thiserror 1.0.69", + "thiserror 2.0.17", "wgpu", ] [[package]] name = "iced_widget" -version = "0.13.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "81429e1b950b0e4bca65be4c4278fea6678ea782030a411778f26fa9f8983e1d" +version = "0.14.2" dependencies = [ "iced_renderer", - "iced_runtime", + "log", "num-traits", - "once_cell", "ouroboros", "rustc-hash 2.1.1", - "thiserror 1.0.69", + "thiserror 2.0.17", "unicode-segmentation", ] [[package]] name = "iced_winit" -version = "0.13.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f44cd4e1c594b6334f409282937bf972ba14d31fedf03c23aa595d982a2fda28" +version = "0.14.0" dependencies = [ - "iced_futures", - "iced_graphics", - "iced_runtime", + "iced_debug", + "iced_program", "log", + "mundy", "rustc-hash 2.1.1", - "thiserror 1.0.69", + "thiserror 2.0.17", "tracing", "wasm-bindgen-futures", "web-sys", - "winapi", "window_clipboard", "winit", ] [[package]] name = "image" -version = "0.24.9" +version = "0.25.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5690139d2f55868e080017335e4b94cb7414274c74f1669c84fb5feba2c9f69d" +checksum = "e6506c6c10786659413faa717ceebcb8f70731c0a60cbae39795fdf114519c1a" dependencies = [ "bytemuck", - "byteorder", + "byteorder-lite", "color_quant", + "exr", + "gif", + "image-webp", + "moxcms", "num-traits", + "png", + "qoi", + "ravif", + "rayon", + "rgb", + "tiff", + "zune-core 0.5.0", + "zune-jpeg 0.5.6", ] +[[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.12.0" @@ -1684,12 +1734,23 @@ dependencies = [ ] [[package]] -name = "instant" -version = "0.1.13" +name = "interpolate_name" +version = "0.2.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e0242819d153cba4b4b05a5a8f2a7e9bbf97b6055b2a002b395c96b5ff3c0222" +checksum = "c34819042dc3d3971c46c2190835914dfbe0c3c13f61449b2997f4e9722dfa60" dependencies = [ - "cfg-if", + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "itertools" +version = "0.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2b192c782037fadd9cfa75548310488aabdbf3d2da73885b31bd0abd03351285" +dependencies = [ + "either", ] [[package]] @@ -1726,7 +1787,7 @@ version = "0.1.34" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9afb3de4395d6b3e67a780b6de64b51c978ecf11cb9a462c66be7d4ca9039d33" dependencies = [ - "getrandom 0.3.4", + "getrandom", "libc", ] @@ -1742,9 +1803,9 @@ dependencies = [ [[package]] name = "kamadak-exif" -version = "0.5.5" +version = "0.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ef4fc70d0ab7e5b6bafa30216a6b48705ea964cdfc29c050f2412295eba58077" +checksum = "1130d80c7374efad55a117d715a3af9368f0fa7a2c54573afc15a188cd984837" dependencies = [ "mutate_once", ] @@ -1756,7 +1817,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6aae1df220ece3c0ada96b8153459b67eebe9ae9212258bb0134ae60416fdf76" dependencies = [ "libc", - "libloading 0.8.9", + "libloading", "pkg-config", ] @@ -1782,6 +1843,12 @@ 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.177" @@ -1789,13 +1856,13 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2874a2af47a2325c2001a6e6fad9b16a53b802102b528163885171cf92b15976" [[package]] -name = "libloading" -version = "0.7.4" +name = "libfuzzer-sys" +version = "0.4.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b67380fd3b2fbe7527a606e18729d21c6f3951633d0500574c4dc22d2d638b9f" +checksum = "5037190e1f70cbeef565bd267599242926f724d3b8a9f510fd7e0b540cfa4404" dependencies = [ - "cfg-if", - "winapi", + "arbitrary", + "cc", ] [[package]] @@ -1825,24 +1892,39 @@ dependencies = [ "redox_syscall 0.5.18", ] +[[package]] +name = "lilt" +version = "0.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f67562e5eff6b20553fa9be1c503356768420994e28f67e3eafe6f41910e57ad" +dependencies = [ + "web-time", +] + +[[package]] +name = "linebender_resource_handle" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d4a5ff6bcca6c4867b1c4fd4ef63e4db7436ef363e0ad7531d1558856bae64f4" + [[package]] name = "linux-raw-sys" version = "0.4.15" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d26c52dbd32dccf2d10cac7725f8eae5296885fb5703b261f7d0a0739ec807ab" -[[package]] -name = "linux-raw-sys" -version = "0.6.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2a385b1be4e5c3e362ad2ffa73c392e53f031eaa5b7d648e64cd87f27f6063d7" - [[package]] name = "linux-raw-sys" version = "0.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "df1d3c3b53da64cf5760482273a98e575c651a67eec7f77df96b5b642de8f039" +[[package]] +name = "litrs" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "11d3d7f243d5c5a8b9bb5d6dd2b1602c0cb0b9db1621bafc7ed66e35ff9fe092" + [[package]] name = "lock_api" version = "0.4.14" @@ -1859,10 +1941,19 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "34080505efa8e45a4b816c349525ebe327ceaa8559756f0356cba97ef3bf7432" [[package]] -name = "lru" -version = "0.12.5" +name = "loop9" +version = "0.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "234cf4f4a04dc1f57e24b96cc0cd600cf2af460d4161ac5ecdd0af8e1f3b2a38" +checksum = "0fae87c125b03c1d2c0150c90365d7d6bcc53fb73a9acaef207d2d065860f062" +dependencies = [ + "imgref", +] + +[[package]] +name = "lru" +version = "0.16.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "96051b46fc183dc9cd4a223960ef37b9af631b55191852a8274bfef064cda20f" [[package]] name = "lyon" @@ -1934,6 +2025,16 @@ dependencies = [ "regex-automata", ] +[[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.6" @@ -1960,13 +2061,13 @@ dependencies = [ [[package]] name = "metal" -version = "0.27.0" +version = "0.32.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c43f73953f8cbe511f021b58f18c3ce1c3d1ae13fe953293e13345bf83217f25" +checksum = "00c15a6f673ff72ddcc22394663290f870fb224c1bfce55734a75c414150e605" dependencies = [ "bitflags 2.10.0", "block", - "core-graphics-types 0.1.3", + "core-graphics-types 0.2.0", "foreign-types", "log", "objc", @@ -1983,6 +2084,52 @@ dependencies = [ "simd-adler32", ] +[[package]] +name = "mio" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "69d83b0086dc8ecf3ce9ae2874b2d1290252e2a30720bea58a5c6639b0092873" +dependencies = [ + "libc", + "wasi", + "windows-sys 0.61.2", +] + +[[package]] +name = "moxcms" +version = "0.7.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "80986bbbcf925ebd3be54c26613d861255284584501595cf418320c078945608" +dependencies = [ + "num-traits", + "pxfm", +] + +[[package]] +name = "mundy" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "523813c9e194ec43693805214eb112551f99382115b67f38600d724a692e7e8b" +dependencies = [ + "android-build", + "async-io", + "cfg-if", + "dispatch", + "futures-channel", + "futures-lite", + "jni", + "ndk-context", + "objc2 0.6.3", + "objc2-app-kit 0.3.2", + "objc2-foundation 0.3.2", + "pin-project-lite", + "wasm-bindgen", + "wasm-bindgen-futures", + "web-sys", + "windows 0.62.2", + "zbus", +] + [[package]] name = "mutate_once" version = "0.1.2" @@ -1991,22 +2138,28 @@ checksum = "13d2233c9842d08cfe13f9eac96e207ca6a2ea10b80259ebe8ad0268be27d2af" [[package]] name = "naga" -version = "0.19.2" +version = "27.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "50e3524642f53d9af419ab5e8dd29d3ba155708267667c2f3f06c88c9e130843" +checksum = "066cf25f0e8b11ee0df221219010f213ad429855f57c494f995590c861a9a7d8" dependencies = [ + "arrayvec", "bit-set", "bitflags 2.10.0", + "cfg-if", + "cfg_aliases", "codespan-reporting", + "half", + "hashbrown 0.16.0", "hexf-parse", "indexmap", + "libm", "log", "num-traits", + "once_cell", "rustc-hash 1.1.0", "spirv", - "termcolor", - "thiserror 1.0.69", - "unicode-xid", + "thiserror 2.0.17", + "unicode-ident", ] [[package]] @@ -2018,7 +2171,7 @@ dependencies = [ "bitflags 2.10.0", "jni-sys", "log", - "ndk-sys 0.6.0+11769913", + "ndk-sys", "num_enum", "raw-window-handle", "thiserror 1.0.69", @@ -2030,15 +2183,6 @@ version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "27b02d87554356db9e9a873add8782d4ea6e3e58ea071a9adb9a2e8ddb884a8b" -[[package]] -name = "ndk-sys" -version = "0.5.0+25.2.9519653" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8c196769dd60fd4f363e11d948139556a344e79d451aeb2fa2fd040738ef7691" -dependencies = [ - "jni-sys", -] - [[package]] name = "ndk-sys" version = "0.6.0+11769913" @@ -2054,26 +2198,45 @@ version = "0.1.0" dependencies = [ "bitfield", "iced", - "iced_graphics", - "iced_widget", "thiserror 2.0.17", "tracing", "tracing-subscriber", ] [[package]] -name = "nix" -version = "0.29.0" +name = "new_debug_unreachable" +version = "1.0.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "71e2746dc3a24dd78b3cfcb7be93368c6de9963d30f43a6a73998a9cf4b17b46" +checksum = "650eef8c711430f1a879fdd01d4745a7deea475becfb90269c06775983bbf086" + +[[package]] +name = "nix" +version = "0.30.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "74523f3a35e05aba87a1d978330aef40f67b0304ac79c1c00b294c9830543db6" dependencies = [ "bitflags 2.10.0", "cfg-if", - "cfg_aliases 0.2.1", + "cfg_aliases", "libc", "memoffset", ] +[[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 = "nu-ansi-term" version = "0.50.3" @@ -2083,6 +2246,47 @@ dependencies = [ "windows-sys 0.61.2", ] +[[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" @@ -2122,7 +2326,7 @@ dependencies = [ "proc-macro-crate", "proc-macro2", "quote", - "syn 2.0.108", + "syn", ] [[package]] @@ -2132,7 +2336,6 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "915b1b472bc21c53464d6c8461c9d3af805ba1ef837e1cac254428f4a77177b1" dependencies = [ "malloc_buf", - "objc_exception", ] [[package]] @@ -2151,6 +2354,15 @@ dependencies = [ "objc2-encode", ] +[[package]] +name = "objc2" +version = "0.6.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b7c2599ce0ec54857b29ce62166b0ed9b4f6f1a70ccc9a71165b6154caca8c05" +dependencies = [ + "objc2-encode", +] + [[package]] name = "objc2-app-kit" version = "0.2.2" @@ -2158,13 +2370,34 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e4e89ad9e3d7d297152b17d39ed92cd50ca8063a89a9fa569046d41568891eff" dependencies = [ "bitflags 2.10.0", - "block2", + "block2 0.5.1", "libc", - "objc2", - "objc2-core-data", - "objc2-core-image", - "objc2-foundation", - "objc2-quartz-core", + "objc2 0.5.2", + "objc2-core-data 0.2.2", + "objc2-core-image 0.2.2", + "objc2-foundation 0.2.2", + "objc2-quartz-core 0.2.2", +] + +[[package]] +name = "objc2-app-kit" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d49e936b501e5c5bf01fda3a9452ff86dc3ea98ad5f283e1455153142d97518c" +dependencies = [ + "bitflags 2.10.0", + "block2 0.6.2", + "libc", + "objc2 0.6.3", + "objc2-cloud-kit 0.3.2", + "objc2-core-data 0.3.2", + "objc2-core-foundation", + "objc2-core-graphics", + "objc2-core-image 0.3.2", + "objc2-core-text", + "objc2-core-video", + "objc2-foundation 0.3.2", + "objc2-quartz-core 0.3.2", ] [[package]] @@ -2174,10 +2407,21 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "74dd3b56391c7a0596a295029734d3c1c5e7e510a4cb30245f8221ccea96b009" dependencies = [ "bitflags 2.10.0", - "block2", - "objc2", + "block2 0.5.1", + "objc2 0.5.2", "objc2-core-location", - "objc2-foundation", + "objc2-foundation 0.2.2", +] + +[[package]] +name = "objc2-cloud-kit" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "73ad74d880bb43877038da939b7427bba67e9dd42004a18b809ba7d87cee241c" +dependencies = [ + "bitflags 2.10.0", + "objc2 0.6.3", + "objc2-foundation 0.3.2", ] [[package]] @@ -2186,9 +2430,9 @@ version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a5ff520e9c33812fd374d8deecef01d4a840e7b41862d849513de77e44aa4889" dependencies = [ - "block2", - "objc2", - "objc2-foundation", + "block2 0.5.1", + "objc2 0.5.2", + "objc2-foundation 0.2.2", ] [[package]] @@ -2198,9 +2442,44 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "617fbf49e071c178c0b24c080767db52958f716d9eabdf0890523aeae54773ef" dependencies = [ "bitflags 2.10.0", - "block2", - "objc2", - "objc2-foundation", + "block2 0.5.1", + "objc2 0.5.2", + "objc2-foundation 0.2.2", +] + +[[package]] +name = "objc2-core-data" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0b402a653efbb5e82ce4df10683b6b28027616a2715e90009947d50b8dd298fa" +dependencies = [ + "bitflags 2.10.0", + "objc2 0.6.3", + "objc2-foundation 0.3.2", +] + +[[package]] +name = "objc2-core-foundation" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2a180dd8642fa45cdb7dd721cd4c11b1cadd4929ce112ebd8b9f5803cc79d536" +dependencies = [ + "bitflags 2.10.0", + "dispatch2", + "objc2 0.6.3", +] + +[[package]] +name = "objc2-core-graphics" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e022c9d066895efa1345f8e33e584b9f958da2fd4cd116792e15e07e4720a807" +dependencies = [ + "bitflags 2.10.0", + "dispatch2", + "objc2 0.6.3", + "objc2-core-foundation", + "objc2-io-surface", ] [[package]] @@ -2209,22 +2488,57 @@ version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "55260963a527c99f1819c4f8e3b47fe04f9650694ef348ffd2227e8196d34c80" dependencies = [ - "block2", - "objc2", - "objc2-foundation", + "block2 0.5.1", + "objc2 0.5.2", + "objc2-foundation 0.2.2", "objc2-metal", ] +[[package]] +name = "objc2-core-image" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e5d563b38d2b97209f8e861173de434bd0214cf020e3423a52624cd1d989f006" +dependencies = [ + "objc2 0.6.3", + "objc2-foundation 0.3.2", +] + [[package]] name = "objc2-core-location" version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "000cfee34e683244f284252ee206a27953279d370e309649dc3ee317b37e5781" dependencies = [ - "block2", - "objc2", + "block2 0.5.1", + "objc2 0.5.2", "objc2-contacts", - "objc2-foundation", + "objc2-foundation 0.2.2", +] + +[[package]] +name = "objc2-core-text" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0cde0dfb48d25d2b4862161a4d5fcc0e3c24367869ad306b0c9ec0073bfed92d" +dependencies = [ + "bitflags 2.10.0", + "objc2 0.6.3", + "objc2-core-foundation", + "objc2-core-graphics", +] + +[[package]] +name = "objc2-core-video" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d425caf1df73233f29fd8a5c3e5edbc30d2d4307870f802d18f00d83dc5141a6" +dependencies = [ + "bitflags 2.10.0", + "objc2 0.6.3", + "objc2-core-foundation", + "objc2-core-graphics", + "objc2-io-surface", ] [[package]] @@ -2240,10 +2554,34 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0ee638a5da3799329310ad4cfa62fbf045d5f56e3ef5ba4149e7452dcf89d5a8" dependencies = [ "bitflags 2.10.0", - "block2", + "block2 0.5.1", "dispatch", "libc", - "objc2", + "objc2 0.5.2", +] + +[[package]] +name = "objc2-foundation" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e3e0adef53c21f888deb4fa59fc59f7eb17404926ee8a6f59f5df0fd7f9f3272" +dependencies = [ + "bitflags 2.10.0", + "block2 0.6.2", + "libc", + "objc2 0.6.3", + "objc2-core-foundation", +] + +[[package]] +name = "objc2-io-surface" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "180788110936d59bab6bd83b6060ffdfffb3b922ba1396b312ae795e1de9d81d" +dependencies = [ + "bitflags 2.10.0", + "objc2 0.6.3", + "objc2-core-foundation", ] [[package]] @@ -2252,10 +2590,10 @@ version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a1a1ae721c5e35be65f01a03b6d2ac13a54cb4fa70d8a5da293d7b0020261398" dependencies = [ - "block2", - "objc2", - "objc2-app-kit", - "objc2-foundation", + "block2 0.5.1", + "objc2 0.5.2", + "objc2-app-kit 0.2.2", + "objc2-foundation 0.2.2", ] [[package]] @@ -2265,9 +2603,9 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "dd0cba1276f6023976a406a14ffa85e1fdd19df6b0f737b063b95f6c8c7aadd6" dependencies = [ "bitflags 2.10.0", - "block2", - "objc2", - "objc2-foundation", + "block2 0.5.1", + "objc2 0.5.2", + "objc2-foundation 0.2.2", ] [[package]] @@ -2277,20 +2615,31 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e42bee7bff906b14b167da2bac5efe6b6a07e6f7c0a21a7308d40c960242dc7a" dependencies = [ "bitflags 2.10.0", - "block2", - "objc2", - "objc2-foundation", + "block2 0.5.1", + "objc2 0.5.2", + "objc2-foundation 0.2.2", "objc2-metal", ] +[[package]] +name = "objc2-quartz-core" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "96c1358452b371bf9f104e21ec536d37a650eb10f7ee379fff67d2e08d537f1f" +dependencies = [ + "bitflags 2.10.0", + "objc2 0.6.3", + "objc2-foundation 0.3.2", +] + [[package]] name = "objc2-symbols" version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0a684efe3dec1b305badae1a28f6555f6ddd3bb2c2267896782858d5a78404dc" dependencies = [ - "objc2", - "objc2-foundation", + "objc2 0.5.2", + "objc2-foundation 0.2.2", ] [[package]] @@ -2300,15 +2649,15 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b8bb46798b20cd6b91cbd113524c490f1686f4c4e8f49502431415f3512e2b6f" dependencies = [ "bitflags 2.10.0", - "block2", - "objc2", - "objc2-cloud-kit", - "objc2-core-data", - "objc2-core-image", + "block2 0.5.1", + "objc2 0.5.2", + "objc2-cloud-kit 0.2.2", + "objc2-core-data 0.2.2", + "objc2-core-image 0.2.2", "objc2-core-location", - "objc2-foundation", + "objc2-foundation 0.2.2", "objc2-link-presentation", - "objc2-quartz-core", + "objc2-quartz-core 0.2.2", "objc2-symbols", "objc2-uniform-type-identifiers", "objc2-user-notifications", @@ -2320,9 +2669,9 @@ version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "44fa5f9748dbfe1ca6c0b79ad20725a11eca7c2218bceb4b005cb1be26273bfe" dependencies = [ - "block2", - "objc2", - "objc2-foundation", + "block2 0.5.1", + "objc2 0.5.2", + "objc2-foundation 0.2.2", ] [[package]] @@ -2332,19 +2681,10 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "76cfcbf642358e8689af64cee815d139339f3ed8ad05103ed5eaf73db8d84cb3" dependencies = [ "bitflags 2.10.0", - "block2", - "objc2", + "block2 0.5.1", + "objc2 0.5.2", "objc2-core-location", - "objc2-foundation", -] - -[[package]] -name = "objc_exception" -version = "0.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ad970fb455818ad6cba4c122ad012fae53ae8b4795f86378bce65e4f6bab2ca4" -dependencies = [ - "cc", + "objc2-foundation 0.2.2", ] [[package]] @@ -2363,13 +2703,12 @@ dependencies = [ ] [[package]] -name = "ordered-multimap" -version = "0.4.3" +name = "ordered-float" +version = "5.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ccd746e37177e1711c20dd619a1620f34f5c8b569c53590a72dedd5344d8924a" +checksum = "7f4779c6901a562440c3786d08192c6fbda7c1c2060edd10006b05ee35d10f2d" dependencies = [ - "dlv-list", - "hashbrown 0.12.3", + "num-traits", ] [[package]] @@ -2403,7 +2742,7 @@ dependencies = [ "proc-macro2", "proc-macro2-diagnostics", "quote", - "syn 2.0.108", + "syn", ] [[package]] @@ -2412,31 +2751,7 @@ version = "0.25.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "36820e9051aca1014ddc75770aab4d68bc1e9e632f0f5627c4086bc216fb583b" dependencies = [ - "ttf-parser 0.25.1", -] - -[[package]] -name = "palette" -version = "0.7.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4cbf71184cc5ecc2e4e1baccdb21026c20e5fc3dcf63028a086131b3ab00b6e6" -dependencies = [ - "approx", - "fast-srgb8", - "palette_derive", - "phf", -] - -[[package]] -name = "palette_derive" -version = "0.7.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f5030daf005bface118c096f510ffb781fc28f9ab6a32ab224d8631be6851d30" -dependencies = [ - "by_address", - "proc-macro2", - "quote", - "syn 2.0.108", + "ttf-parser", ] [[package]] @@ -2445,17 +2760,6 @@ version = "2.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f38d5652c16fde515bb1ecef450ab0f6a219d619a7274976324d5e377f7dceba" -[[package]] -name = "parking_lot" -version = "0.11.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7d17b78036a60663b797adeaee46f5c9dfebb86948d1255007a1d6be0271ff99" -dependencies = [ - "instant", - "lock_api", - "parking_lot_core 0.8.6", -] - [[package]] name = "parking_lot" version = "0.12.5" @@ -2463,21 +2767,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "93857453250e3077bd71ff98b6a65ea6621a19bb0f559a85248955ac12c45a1a" dependencies = [ "lock_api", - "parking_lot_core 0.9.12", -] - -[[package]] -name = "parking_lot_core" -version = "0.8.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "60a2cfe6f0ad2bfc16aefa463b497d5c7a5ecd44a23efa72aa342d90177356dc" -dependencies = [ - "cfg-if", - "instant", - "libc", - "redox_syscall 0.2.16", - "smallvec", - "winapi", + "parking_lot_core", ] [[package]] @@ -2499,54 +2789,18 @@ version = "1.0.15" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "57c0d7b74b563b49d38dae00a0c37d4d6de9b432382b2892f0574ddcae73fd0a" +[[package]] +name = "pastey" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "35fb2e5f958ec131621fdd531e9fc186ed768cbe395337403ae56c17a74c68ec" + [[package]] name = "percent-encoding" version = "2.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9b4f627cb1b25917193a259e49bdad08f671f8d9708acfd5fe0a8c1455d87220" -[[package]] -name = "phf" -version = "0.11.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1fd6780a80ae0c52cc120a26a1a42c1ae51b247a253e4e06113d23d2c2edd078" -dependencies = [ - "phf_macros", - "phf_shared", -] - -[[package]] -name = "phf_generator" -version = "0.11.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3c80231409c20246a13fddb31776fb942c38553c51e871f8cbd687a4cfb5843d" -dependencies = [ - "phf_shared", - "rand", -] - -[[package]] -name = "phf_macros" -version = "0.11.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f84ac04429c13a7ff43785d75ad27569f2951ce0ffd30a3321230db2fc727216" -dependencies = [ - "phf_generator", - "phf_shared", - "proc-macro2", - "quote", - "syn 2.0.108", -] - -[[package]] -name = "phf_shared" -version = "0.11.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "67eabc2ef2a60eb7faa00097bd1ffdb5bd28e62bf39990626a582201b7a754e5" -dependencies = [ - "siphasher", -] - [[package]] name = "pin-project" version = "1.1.10" @@ -2564,7 +2818,7 @@ checksum = "6e918e4ff8c4549eb882f14b3a4bc8c8bc93de829416eacf579f1207a8fbf861" dependencies = [ "proc-macro2", "quote", - "syn 2.0.108", + "syn", ] [[package]] @@ -2598,11 +2852,11 @@ checksum = "7edddbd0b52d732b21ad9a5fab5c704c14cd949e5e9a1ec5929a24fded1b904c" [[package]] name = "png" -version = "0.17.16" +version = "0.18.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "82151a2fc869e011c153adc57cf2789ccb8d9906ce52c0b39a6b5697749d7526" +checksum = "97baced388464909d42d89643fe4361939af9b7ce7a31ee32a168f832a70f2a0" dependencies = [ - "bitflags 1.3.2", + "bitflags 2.10.0", "crc32fast", "fdeflate", "flate2", @@ -2623,6 +2877,21 @@ dependencies = [ "windows-sys 0.61.2", ] +[[package]] +name = "portable-atomic" +version = "1.11.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f84267b20a16ea918e43c6a88433c2d54fa145c92a811b5b047ccbe153674483" + +[[package]] +name = "portable-atomic-util" +version = "0.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d8a2f0d8d040d7848a709caf78912debcc3f33ee4b3cac47d73d1e1069e83507" +dependencies = [ + "portable-atomic", +] + [[package]] name = "ppv-lite86" version = "0.2.21" @@ -2664,7 +2933,7 @@ checksum = "af066a9c399a26e020ada66a034357a868728e72cd426f3adcd35f80d88d88c8" dependencies = [ "proc-macro2", "quote", - "syn 2.0.108", + "syn", "version_check", "yansi", ] @@ -2674,6 +2943,43 @@ 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 = "pxfm" +version = "0.1.27" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7186d3822593aa4393561d186d1393b3923e9d6163d3fbfd6e825e3e6cf3e6a8" +dependencies = [ + "num-traits", +] + +[[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" @@ -2701,20 +3007,19 @@ checksum = "69cdb34c158ceb288df11e18b4bd39de994f6657d83847bdffdbd7f346754b0f" [[package]] name = "rand" -version = "0.8.5" +version = "0.9.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "34af8d1a0e25924bc5b7c43c079c942339d8f0a8b57c39049bef581b46327404" +checksum = "6db2770f06117d490610c7488547d543617b21bfa07796d7a12f6f1bd53850d1" dependencies = [ - "libc", "rand_chacha", "rand_core", ] [[package]] name = "rand_chacha" -version = "0.3.1" +version = "0.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e6c10a63a0fa32252be49d21e7709d4d4baf8d231c2dbce1eaa8141b9b127d88" +checksum = "d3022b5f1df60f26e1ffddd6c66e8aa15de382ae63b3a0c1bfc0e4d3e3f325cb" dependencies = [ "ppv-lite86", "rand_core", @@ -2722,11 +3027,11 @@ dependencies = [ [[package]] name = "rand_core" -version = "0.6.4" +version = "0.9.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c" +checksum = "99d9a13982dcf210057a8a78572b2217b667c3beacbf3a0d8b454f6f82837d38" dependencies = [ - "getrandom 0.2.16", + "getrandom", ] [[package]] @@ -2741,6 +3046,56 @@ version = "1.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f93e7e49bb0bf967717f7bd674458b3d6b0c5f48ec7e3038166026a69fc22223" +[[package]] +name = "rav1e" +version = "0.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "43b6dd56e85d9483277cde964fd1bdb0428de4fec5ebba7540995639a21cb32b" +dependencies = [ + "aligned-vec", + "arbitrary", + "arg_enum_proc_macro", + "arrayvec", + "av-scenechange", + "av1-grain", + "bitstream-io", + "built", + "cfg-if", + "interpolate_name", + "itertools", + "libc", + "libfuzzer-sys", + "log", + "maybe-rayon", + "new_debug_unreachable", + "noop_proc_macro", + "num-derive", + "num-traits", + "paste", + "profiling", + "rand", + "rand_chacha", + "simd_helpers", + "thiserror 2.0.17", + "v_frame", + "wasm-bindgen", +] + +[[package]] +name = "ravif" +version = "0.12.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ef69c1990ceef18a116855938e74793a5f7496ee907562bd0857b6ac734ab285" +dependencies = [ + "avif-serialize", + "imgref", + "loop9", + "quick-error", + "rav1e", + "rayon", + "rgb", +] + [[package]] name = "raw-window-handle" version = "0.6.2" @@ -2769,23 +3124,15 @@ dependencies = [ [[package]] name = "read-fonts" -version = "0.22.7" +version = "0.35.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "69aacb76b5c29acfb7f90155d39759a29496aebb49395830e928a9703d2eec2f" +checksum = "6717cf23b488adf64b9d711329542ba34de147df262370221940dfabc2c91358" dependencies = [ "bytemuck", + "core_maths", "font-types", ] -[[package]] -name = "redox_syscall" -version = "0.2.16" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fb5a58c1855b4b6819d59012155603f0b22ad30cad752600aadfcb695265519a" -dependencies = [ - "bitflags 1.3.2", -] - [[package]] name = "redox_syscall" version = "0.4.1" @@ -2804,17 +3151,6 @@ dependencies = [ "bitflags 2.10.0", ] -[[package]] -name = "redox_users" -version = "0.4.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ba009ff324d1fc1b900bd1fdb31564febe58a8ccc8a6fdbb93b543d33b13ca43" -dependencies = [ - "getrandom 0.2.16", - "libredox", - "thiserror 1.0.69", -] - [[package]] name = "regex-automata" version = "0.4.13" @@ -2838,22 +3174,18 @@ 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 = "roxmltree" version = "0.20.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6c20b6793b5c2fa6553b250154b78d6d0db37e72700ae35fad9387a46f487c97" -[[package]] -name = "rust-ini" -version = "0.18.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f6d5f2436026b4f6e79dc829837d467cc7e9a55ee40e750d716713540715a2df" -dependencies = [ - "cfg-if", - "ordered-multimap", -] - [[package]] name = "rustc-hash" version = "1.1.0" @@ -2898,23 +3230,6 @@ version = "1.0.22" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b39cdef0fa800fc44525c84ccb54a029961a8215f9619753635a9c0d2538d46d" -[[package]] -name = "rustybuzz" -version = "0.14.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cfb9cf8877777222e4a3bc7eb247e398b56baba500c38c1c46842431adc8b55c" -dependencies = [ - "bitflags 2.10.0", - "bytemuck", - "libm", - "smallvec", - "ttf-parser 0.21.1", - "unicode-bidi-mirroring", - "unicode-ccc", - "unicode-properties", - "unicode-script", -] - [[package]] name = "ryu" version = "1.0.20" @@ -2961,6 +3276,16 @@ version = "1.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "16c2f82143577edb4921b71ede051dac62ca3c16084e918bf7b40c96ae10eb33" +[[package]] +name = "semver" +version = "1.0.27" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d767eb0aabc880b29956c35734170f26ed551a859dbd361d140cdbeca61ab1e2" +dependencies = [ + "serde", + "serde_core", +] + [[package]] name = "serde" version = "1.0.228" @@ -2988,7 +3313,7 @@ checksum = "d540f220d3187173da220f885ab66608367b6574e925011a9353e4badda91d79" dependencies = [ "proc-macro2", "quote", - "syn 2.0.108", + "syn", ] [[package]] @@ -3012,18 +3337,7 @@ checksum = "175ee3e80ae9982737ca543e96133087cbd9a485eecc3bc4de9c1a37b47ea59c" dependencies = [ "proc-macro2", "quote", - "syn 2.0.108", -] - -[[package]] -name = "sha1" -version = "0.10.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e3bf829a2d51ab4a5ddf1352d8470c140cadc8301b2ae1789db023f01cedd6ba" -dependencies = [ - "cfg-if", - "cpufeatures", - "digest", + "syn", ] [[package]] @@ -3057,16 +3371,19 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d66dc143e6b11c1eddc06d5c423cfc97062865baf299914ab64caa38182078fe" [[package]] -name = "siphasher" -version = "1.0.1" +name = "simd_helpers" +version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "56199f7ddabf13fe5074ce809e7d3f42b42ae711800501b5b16ea82ad029c39d" +checksum = "95890f873bec569a0362c235787f3aca6e1e887302ba4840839bcc6459c42da6" +dependencies = [ + "quote", +] [[package]] name = "skrifa" -version = "0.22.3" +version = "0.37.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8e1c44ad1f6c5bdd4eefed8326711b7dbda9ea45dfd36068c427d332aa382cbe" +checksum = "8c31071dedf532758ecf3fed987cdb4bd9509f900e026ab684b4ecb81ea49841" dependencies = [ "bytemuck", "read-fonts", @@ -3165,6 +3482,16 @@ dependencies = [ "serde", ] +[[package]] +name = "socket2" +version = "0.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "17129e116933cf371d018bb80ae557e889637989d8638274fb25622827b03881" +dependencies = [ + "libc", + "windows-sys 0.60.2", +] + [[package]] name = "softbuffer" version = "0.4.6" @@ -3173,17 +3500,16 @@ checksum = "18051cdd562e792cad055119e0cdb2cfc137e44e3987532e0f9659a77931bb08" dependencies = [ "as-raw-xcb-connection", "bytemuck", - "cfg_aliases 0.2.1", + "cfg_aliases", "core-graphics 0.24.0", - "drm", "fastrand", "foreign-types", "js-sys", "log", "memmap2", - "objc2", - "objc2-foundation", - "objc2-quartz-core", + "objc2 0.5.2", + "objc2-foundation 0.2.2", + "objc2-quartz-core 0.2.2", "raw-window-handle", "redox_syscall 0.5.18", "rustix 0.38.44", @@ -3206,6 +3532,12 @@ dependencies = [ "bitflags 2.10.0", ] +[[package]] +name = "stable_deref_trait" +version = "1.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6ce2be8dc25455e1f91df71bfa12ad37d7af1092ae736f3a6cd0e37bc7810596" + [[package]] name = "static_assertions" version = "1.1.0" @@ -3226,26 +3558,15 @@ checksum = "0193cc4331cfd2f3d2011ef287590868599a2f33c3e69bc22c1a3d3acf9e02fb" [[package]] name = "swash" -version = "0.1.19" +version = "0.2.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cbd59f3f359ddd2c95af4758c18270eddd9c730dde98598023cdabff472c2ca2" +checksum = "47846491253e976bdd07d0f9cc24b7daf24720d11309302ccbbc6e6b6e53550a" dependencies = [ "skrifa", "yazi", "zeno", ] -[[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.108" @@ -3273,7 +3594,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2d31c77bdf42a745371d260a26ca7163f1e0924b64afa0b688e61b5a9fa02f16" dependencies = [ "fastrand", - "getrandom 0.3.4", + "getrandom", "once_cell", "rustix 1.1.2", "windows-sys 0.61.2", @@ -3314,7 +3635,7 @@ checksum = "4fee6c4efc90059e10f81e6d42c60a18f76588c3d74cb83a0b242a2b6c7504c1" dependencies = [ "proc-macro2", "quote", - "syn 2.0.108", + "syn", ] [[package]] @@ -3325,7 +3646,7 @@ checksum = "3ff15c8ecd7de3849db632e14d18d2571fa09dfc5ed93479bc4485c7a517c913" dependencies = [ "proc-macro2", "quote", - "syn 2.0.108", + "syn", ] [[package]] @@ -3337,6 +3658,20 @@ dependencies = [ "cfg-if", ] +[[package]] +name = "tiff" +version = "0.10.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "af9605de7fee8d9551863fd692cce7637f548dbd9db9180fcc07ccc6d26c336f" +dependencies = [ + "fax", + "flate2", + "half", + "quick-error", + "weezl", + "zune-jpeg 0.4.21", +] + [[package]] name = "tiny-skia" version = "0.11.4" @@ -3348,7 +3683,6 @@ dependencies = [ "bytemuck", "cfg-if", "log", - "png", "tiny-skia-path", ] @@ -3371,7 +3705,7 @@ checksum = "0324504befd01cab6e0c994f34b2ffa257849ee019d3fb3b64fb2c858887d89e" dependencies = [ "as-raw-xcb-connection", "ctor-lite", - "libloading 0.8.9", + "libloading", "pkg-config", "tracing", ] @@ -3397,7 +3731,24 @@ version = "1.48.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ff360e02eab121e0bc37a2d3b4d4dc622e6eda3a8e5253d5435ecf5bd4c68408" dependencies = [ + "bytes", + "libc", + "mio", "pin-project-lite", + "socket2", + "tokio-macros", + "windows-sys 0.61.2", +] + +[[package]] +name = "tokio-macros" +version = "2.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "af407857209536a95c8e56f8231ef2c2e2aff839b22e07a1ffcbc617e9db9fa5" +dependencies = [ + "proc-macro2", + "quote", + "syn", ] [[package]] @@ -3450,7 +3801,7 @@ checksum = "81383ab64e72a7a8b8e13130c49e3dab29def6d0c7d76a03087b3cf71c5c6903" dependencies = [ "proc-macro2", "quote", - "syn 2.0.108", + "syn", ] [[package]] @@ -3506,29 +3857,14 @@ dependencies = [ "tracing-serde", ] -[[package]] -name = "ttf-parser" -version = "0.20.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "17f77d76d837a7830fe1d4f12b7b4ba4192c1888001c7164257e4bc6d21d96b4" - -[[package]] -name = "ttf-parser" -version = "0.21.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2c591d83f69777866b9126b24c6dd9a18351f177e49d625920d19f989fd31cf8" - [[package]] name = "ttf-parser" version = "0.25.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d2df906b07856748fa3f6e0ad0cbaa047052d4a7dd609e231c4f72cee8c36f31" - -[[package]] -name = "typenum" -version = "1.19.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "562d481066bde0658276a35467c4af00bdc6ee726305698a55b86e61d7ad82bb" +dependencies = [ + "core_maths", +] [[package]] name = "uds_windows" @@ -3547,18 +3883,6 @@ version = "0.3.18" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5c1cb5db39152898a79168971543b1cb5020dff7fe43c8dc468b0885f5e29df5" -[[package]] -name = "unicode-bidi-mirroring" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "23cb788ffebc92c5948d0e997106233eeb1d8b9512f93f41651f52b6c5f5af86" - -[[package]] -name = "unicode-ccc" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1df77b101bcc4ea3d78dafc5ad7e4f58ceffe0b2b16bf446aeb50b6cb4157656" - [[package]] name = "unicode-ident" version = "1.0.20" @@ -3571,12 +3895,6 @@ version = "0.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3b09c83c3c29d37506a3e260c08c03743a6bb66a9cd432c6934ab501a190571f" -[[package]] -name = "unicode-properties" -version = "0.1.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7df058c713841ad818f1dc5d3fd88063241cc61f49f5fbea4b951e8cf5a8d71d" - [[package]] name = "unicode-script" version = "0.5.7" @@ -3596,10 +3914,26 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7dd6e30e90baa6f72411720665d41d89b9a3d039dc45b8faea1ddd07f617f6af" [[package]] -name = "unicode-xid" -version = "0.2.6" +name = "uuid" +version = "1.19.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ebc1c04c71510c7f702b52b7c350734c9ff1295c464a03335b00bb84fc54f853" +checksum = "e2e054861b4bd027cd373e18e8d8d8e6548085000e41290d95ce0c373a654b4a" +dependencies = [ + "js-sys", + "serde_core", + "wasm-bindgen", +] + +[[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 = "valuable" @@ -3661,7 +3995,7 @@ dependencies = [ "log", "proc-macro2", "quote", - "syn 2.0.108", + "syn", "wasm-bindgen-shared", ] @@ -3696,7 +4030,7 @@ checksum = "9f07d2f20d4da7b26400c9f4a0511e6e0345b040694e8a75bd41d578fa4421d7" dependencies = [ "proc-macro2", "quote", - "syn 2.0.108", + "syn", "wasm-bindgen-backend", "wasm-bindgen-shared", ] @@ -3711,18 +4045,17 @@ dependencies = [ ] [[package]] -name = "wasm-timer" -version = "0.2.5" +name = "wasmtimer" +version = "0.4.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "be0ecb0db480561e9a7642b5d3e4187c128914e58aa84330b9493e3eb68c5e7f" +checksum = "1c598d6b99ea013e35844697fc4670d08339d5cda15588f193c6beedd12f644b" dependencies = [ "futures", "js-sys", - "parking_lot 0.11.2", + "parking_lot", "pin-utils", + "slab", "wasm-bindgen", - "wasm-bindgen-futures", - "web-sys", ] [[package]] @@ -3881,18 +4214,28 @@ dependencies = [ ] [[package]] -name = "wgpu" -version = "0.19.4" +name = "weezl" +version = "0.1.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cbd7311dbd2abcfebaabf1841a2824ed7c8be443a0f29166e5d3c6a53a762c01" +checksum = "a28ac98ddc8b9274cb41bb4d9d4d5c425b6020c50c46f25559911905610b4a88" + +[[package]] +name = "wgpu" +version = "27.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bfe68bac7cde125de7a731c3400723cadaaf1703795ad3f4805f187459cd7a77" dependencies = [ "arrayvec", + "bitflags 2.10.0", "cfg-if", - "cfg_aliases 0.1.1", + "cfg_aliases", + "document-features", + "hashbrown 0.16.0", "js-sys", "log", "naga", - "parking_lot 0.12.5", + "parking_lot", + "portable-atomic", "profiling", "raw-window-handle", "smallvec", @@ -3907,35 +4250,68 @@ dependencies = [ [[package]] name = "wgpu-core" -version = "0.19.4" +version = "27.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "28b94525fc99ba9e5c9a9e24764f2bc29bad0911a7446c12f446a8277369bf3a" +checksum = "27a75de515543b1897b26119f93731b385a19aea165a1ec5f0e3acecc229cae7" dependencies = [ "arrayvec", + "bit-set", "bit-vec", "bitflags 2.10.0", - "cfg_aliases 0.1.1", - "codespan-reporting", + "bytemuck", + "cfg_aliases", + "document-features", + "hashbrown 0.16.0", "indexmap", "log", "naga", "once_cell", - "parking_lot 0.12.5", + "parking_lot", + "portable-atomic", "profiling", "raw-window-handle", "rustc-hash 1.1.0", "smallvec", - "thiserror 1.0.69", - "web-sys", + "thiserror 2.0.17", + "wgpu-core-deps-apple", + "wgpu-core-deps-emscripten", + "wgpu-core-deps-windows-linux-android", "wgpu-hal", "wgpu-types", ] [[package]] -name = "wgpu-hal" -version = "0.19.5" +name = "wgpu-core-deps-apple" +version = "27.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bfabcfc55fd86611a855816326b2d54c3b2fd7972c27ce414291562650552703" +checksum = "0772ae958e9be0c729561d5e3fd9a19679bcdfb945b8b1a1969d9bfe8056d233" +dependencies = [ + "wgpu-hal", +] + +[[package]] +name = "wgpu-core-deps-emscripten" +version = "27.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b06ac3444a95b0813ecfd81ddb2774b66220b264b3e2031152a4a29fda4da6b5" +dependencies = [ + "wgpu-hal", +] + +[[package]] +name = "wgpu-core-deps-windows-linux-android" +version = "27.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "71197027d61a71748e4120f05a9242b2ad142e3c01f8c1b47707945a879a03c3" +dependencies = [ + "wgpu-hal", +] + +[[package]] +name = "wgpu-hal" +version = "27.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5b21cb61c57ee198bc4aff71aeadff4cbb80b927beb912506af9c780d64313ce" dependencies = [ "android_system_properties", "arrayvec", @@ -3943,56 +4319,57 @@ dependencies = [ "bit-set", "bitflags 2.10.0", "block", - "cfg_aliases 0.1.1", - "core-graphics-types 0.1.3", - "d3d12", + "bytemuck", + "cfg-if", + "cfg_aliases", + "core-graphics-types 0.2.0", "glow", "glutin_wgl_sys", "gpu-alloc", "gpu-allocator", "gpu-descriptor", - "hassle-rs", + "hashbrown 0.16.0", "js-sys", "khronos-egl", "libc", - "libloading 0.8.9", + "libloading", "log", "metal", "naga", - "ndk-sys 0.5.0+25.2.9519653", + "ndk-sys", "objc", "once_cell", - "parking_lot 0.12.5", + "ordered-float", + "parking_lot", + "portable-atomic", + "portable-atomic-util", "profiling", "range-alloc", "raw-window-handle", "renderdoc-sys", - "rustc-hash 1.1.0", "smallvec", - "thiserror 1.0.69", + "thiserror 2.0.17", "wasm-bindgen", "web-sys", "wgpu-types", - "winapi", + "windows 0.58.0", + "windows-core 0.58.0", ] [[package]] name = "wgpu-types" -version = "0.19.2" +version = "27.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b671ff9fb03f78b46ff176494ee1ebe7d603393f42664be55b64dc8d53969805" +checksum = "afdcf84c395990db737f2dd91628706cb31e86d72e53482320d368e52b5da5eb" dependencies = [ "bitflags 2.10.0", + "bytemuck", "js-sys", + "log", + "thiserror 2.0.17", "web-sys", ] -[[package]] -name = "widestring" -version = "1.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "72069c3113ab32ab29e5584db3c6ec55d416895e60715417b5b883a357c3e471" - [[package]] name = "winapi" version = "0.3.9" @@ -4026,34 +4403,59 @@ checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" [[package]] name = "window_clipboard" -version = "0.4.1" +version = "0.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f6d692d46038c433f9daee7ad8757e002a4248c20b0a3fbc991d99521d3bcb6d" +checksum = "d5654226305eaf2dde8853fb482861d28e5dcecbbd40cb88e8393d94bb80d733" dependencies = [ "clipboard-win", "clipboard_macos", "clipboard_wayland", "clipboard_x11", "raw-window-handle", - "thiserror 1.0.69", + "thiserror 2.0.17", ] [[package]] name = "windows" -version = "0.52.0" +version = "0.58.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e48a53791691ab099e5e2ad123536d0fff50652600abaf43bbf952894110d0be" +checksum = "dd04d41d93c4992d421894c18c8b43496aa748dd4c081bac0dc93eb0489272b6" dependencies = [ - "windows-core 0.52.0", + "windows-core 0.58.0", "windows-targets 0.52.6", ] [[package]] -name = "windows-core" -version = "0.52.0" +name = "windows" +version = "0.62.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "33ab640c8d7e35bf8ba19b884ba838ceb4fba93a4e8c65a9059d08afcfc683d9" +checksum = "527fadee13e0c05939a6a05d5bd6eec6cd2e3dbd648b9f8e447c6518133d8580" dependencies = [ + "windows-collections", + "windows-core 0.62.2", + "windows-future", + "windows-numerics", +] + +[[package]] +name = "windows-collections" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "23b2d95af1a8a14a3c7367e1ed4fc9c20e0a26e79551b1454d72583c97cc6610" +dependencies = [ + "windows-core 0.62.2", +] + +[[package]] +name = "windows-core" +version = "0.58.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6ba6d44ec8c2591c134257ce647b7ea6b20335bf6379a27dac5f1641fcf59f99" +dependencies = [ + "windows-implement 0.58.0", + "windows-interface 0.58.0", + "windows-result 0.2.0", + "windows-strings 0.1.0", "windows-targets 0.52.6", ] @@ -4063,11 +4465,33 @@ version = "0.62.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b8e83a14d34d0623b51dce9581199302a221863196a1dde71a7663a4c2be9deb" dependencies = [ - "windows-implement", - "windows-interface", + "windows-implement 0.60.2", + "windows-interface 0.59.3", "windows-link", - "windows-result", - "windows-strings", + "windows-result 0.4.1", + "windows-strings 0.5.1", +] + +[[package]] +name = "windows-future" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e1d6f90251fe18a279739e78025bd6ddc52a7e22f921070ccdc67dde84c605cb" +dependencies = [ + "windows-core 0.62.2", + "windows-link", + "windows-threading", +] + +[[package]] +name = "windows-implement" +version = "0.58.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2bbd5b46c938e506ecbce286b6628a02171d56153ba733b6c741fc627ec9579b" +dependencies = [ + "proc-macro2", + "quote", + "syn", ] [[package]] @@ -4078,7 +4502,18 @@ checksum = "053e2e040ab57b9dc951b72c264860db7eb3b0200ba345b4e4c3b14f67855ddf" dependencies = [ "proc-macro2", "quote", - "syn 2.0.108", + "syn", +] + +[[package]] +name = "windows-interface" +version = "0.58.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "053c4c462dc91d3b1504c6fe5a726dd15e216ba718e84a0e46a88fbe5ded3515" +dependencies = [ + "proc-macro2", + "quote", + "syn", ] [[package]] @@ -4089,7 +4524,7 @@ checksum = "3f316c4a2570ba26bbec722032c4099d8c8bc095efccdc15688708623367e358" dependencies = [ "proc-macro2", "quote", - "syn 2.0.108", + "syn", ] [[package]] @@ -4098,6 +4533,25 @@ version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f0805222e57f7521d6a62e36fa9163bc891acd422f971defe97d64e70d0a4fe5" +[[package]] +name = "windows-numerics" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6e2e40844ac143cdb44aead537bbf727de9b044e107a0f1220392177d15b0f26" +dependencies = [ + "windows-core 0.62.2", + "windows-link", +] + +[[package]] +name = "windows-result" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1d1043d8214f791817bab27572aaa8af63732e11bf84aa21a45a78d6c317ae0e" +dependencies = [ + "windows-targets 0.52.6", +] + [[package]] name = "windows-result" version = "0.4.1" @@ -4107,6 +4561,16 @@ dependencies = [ "windows-link", ] +[[package]] +name = "windows-strings" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4cd9b125c486025df0eabcb585e62173c6c9eddcec5d117d3b6e8c30e2ee4d10" +dependencies = [ + "windows-result 0.2.0", + "windows-targets 0.52.6", +] + [[package]] name = "windows-strings" version = "0.5.1" @@ -4143,6 +4607,15 @@ dependencies = [ "windows-targets 0.52.6", ] +[[package]] +name = "windows-sys" +version = "0.60.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f2f500e4d28234f72040990ec9d39e3a6b950f9f22d3dba18416c35882612bcb" +dependencies = [ + "windows-targets 0.53.5", +] + [[package]] name = "windows-sys" version = "0.61.2" @@ -4176,13 +4649,39 @@ dependencies = [ "windows_aarch64_gnullvm 0.52.6", "windows_aarch64_msvc 0.52.6", "windows_i686_gnu 0.52.6", - "windows_i686_gnullvm", + "windows_i686_gnullvm 0.52.6", "windows_i686_msvc 0.52.6", "windows_x86_64_gnu 0.52.6", "windows_x86_64_gnullvm 0.52.6", "windows_x86_64_msvc 0.52.6", ] +[[package]] +name = "windows-targets" +version = "0.53.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4945f9f551b88e0d65f3db0bc25c33b8acea4d9e41163edf90dcd0b19f9069f3" +dependencies = [ + "windows-link", + "windows_aarch64_gnullvm 0.53.1", + "windows_aarch64_msvc 0.53.1", + "windows_i686_gnu 0.53.1", + "windows_i686_gnullvm 0.53.1", + "windows_i686_msvc 0.53.1", + "windows_x86_64_gnu 0.53.1", + "windows_x86_64_gnullvm 0.53.1", + "windows_x86_64_msvc 0.53.1", +] + +[[package]] +name = "windows-threading" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3949bd5b99cafdf1c7ca86b43ca564028dfe27d66958f2470940f73d86d75b37" +dependencies = [ + "windows-link", +] + [[package]] name = "windows_aarch64_gnullvm" version = "0.42.2" @@ -4195,6 +4694,12 @@ version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "32a4622180e7a0ec044bb555404c800bc9fd9ec262ec147edd5989ccd0c02cd3" +[[package]] +name = "windows_aarch64_gnullvm" +version = "0.53.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a9d8416fa8b42f5c947f8482c43e7d89e73a173cead56d044f6a56104a6d1b53" + [[package]] name = "windows_aarch64_msvc" version = "0.42.2" @@ -4207,6 +4712,12 @@ version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "09ec2a7bb152e2252b53fa7803150007879548bc709c039df7627cabbd05d469" +[[package]] +name = "windows_aarch64_msvc" +version = "0.53.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b9d782e804c2f632e395708e99a94275910eb9100b2114651e04744e9b125006" + [[package]] name = "windows_i686_gnu" version = "0.42.2" @@ -4219,12 +4730,24 @@ version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8e9b5ad5ab802e97eb8e295ac6720e509ee4c243f69d781394014ebfe8bbfa0b" +[[package]] +name = "windows_i686_gnu" +version = "0.53.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "960e6da069d81e09becb0ca57a65220ddff016ff2d6af6a223cf372a506593a3" + [[package]] name = "windows_i686_gnullvm" version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0eee52d38c090b3caa76c563b86c3a4bd71ef1a819287c19d586d7334ae8ed66" +[[package]] +name = "windows_i686_gnullvm" +version = "0.53.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fa7359d10048f68ab8b09fa71c3daccfb0e9b559aed648a8f95469c27057180c" + [[package]] name = "windows_i686_msvc" version = "0.42.2" @@ -4237,6 +4760,12 @@ version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "240948bc05c5e7c6dabba28bf89d89ffce3e303022809e73deaefe4f6ec56c66" +[[package]] +name = "windows_i686_msvc" +version = "0.53.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e7ac75179f18232fe9c285163565a57ef8d3c89254a30685b57d83a38d326c2" + [[package]] name = "windows_x86_64_gnu" version = "0.42.2" @@ -4249,6 +4778,12 @@ version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "147a5c80aabfbf0c7d901cb5895d1de30ef2907eb21fbbab29ca94c5b08b1a78" +[[package]] +name = "windows_x86_64_gnu" +version = "0.53.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9c3842cdd74a865a8066ab39c8a7a473c0778a3f29370b5fd6b4b9aa7df4a499" + [[package]] name = "windows_x86_64_gnullvm" version = "0.42.2" @@ -4261,6 +4796,12 @@ version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "24d5b23dc417412679681396f2b49f3de8c1473deb516bd34410872eff51ed0d" +[[package]] +name = "windows_x86_64_gnullvm" +version = "0.53.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0ffa179e2d07eee8ad8f57493436566c7cc30ac536a3379fdf008f47f6bb7ae1" + [[package]] name = "windows_x86_64_msvc" version = "0.42.2" @@ -4273,20 +4814,26 @@ version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec" +[[package]] +name = "windows_x86_64_msvc" +version = "0.53.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d6bbff5f0aada427a1e5a6da5f1f98158182f26556f345ac9e04d36d0ebed650" + [[package]] name = "winit" version = "0.30.12" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c66d4b9ed69c4009f6321f762d6e61ad8a2389cd431b97cb1e146812e9e6c732" dependencies = [ - "ahash 0.8.12", + "ahash", "android-activity", "atomic-waker", "bitflags 2.10.0", - "block2", + "block2 0.5.1", "bytemuck", "calloop 0.13.0", - "cfg_aliases 0.2.1", + "cfg_aliases", "concurrent-queue", "core-foundation 0.9.4", "core-graphics 0.23.2", @@ -4296,9 +4843,9 @@ dependencies = [ "libc", "memmap2", "ndk", - "objc2", - "objc2-app-kit", - "objc2-foundation", + "objc2 0.5.2", + "objc2-app-kit 0.2.2", + "objc2-foundation 0.2.2", "objc2-ui-kit", "orbclient", "percent-encoding", @@ -4334,15 +4881,6 @@ dependencies = [ "memchr", ] -[[package]] -name = "winreg" -version = "0.10.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "80d0f4e272c85def139476380b12f9ac60926689dd2e01d4923222f40580869d" -dependencies = [ - "winapi", -] - [[package]] name = "wit-bindgen" version = "0.46.0" @@ -4369,7 +4907,7 @@ dependencies = [ "as-raw-xcb-connection", "gethostname", "libc", - "libloading 0.8.9", + "libloading", "once_cell", "rustix 1.1.2", "x11rb-protocol", @@ -4387,16 +4925,6 @@ version = "0.3.10" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "bec9e4a500ca8864c5b47b8b482a73d62e4237670e5b5f1d6b9e3cae50f28f2b" -[[package]] -name = "xdg-home" -version = "1.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ec1cdab258fb55c0da61328dc52c8764709b249011b2cad0454c72f0bf10a1f6" -dependencies = [ - "libc", - "windows-sys 0.59.0", -] - [[package]] name = "xkbcommon-dl" version = "0.4.2" @@ -4422,6 +4950,12 @@ version = "0.8.28" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3ae8337f8a065cfc972643663ea4279e04e7256de865aa66fe25cec5fb912d3f" +[[package]] +name = "y4m" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7a5a4b21e1a62b67a2970e6831bc091d7b87e119e7f9791aef9702e3bef04448" + [[package]] name = "yansi" version = "1.0.1" @@ -4430,19 +4964,18 @@ checksum = "cfe53a6657fd280eaa890a3bc59152892ffa3e30101319d168b781ed6529b049" [[package]] name = "yazi" -version = "0.1.6" +version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c94451ac9513335b5e23d7a8a2b61a7102398b8cca5160829d313e84c9d98be1" +checksum = "e01738255b5a16e78bbb83e7fbba0a1e7dd506905cfc53f4622d89015a03fbb5" [[package]] name = "zbus" -version = "4.4.0" +version = "5.12.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bb97012beadd29e654708a0fdb4c84bc046f537aecfde2c3ee0a9e4b4d48c725" +checksum = "b622b18155f7a93d1cd2dc8c01d2d6a44e08fb9ebb7b3f9e6ed101488bad6c91" dependencies = [ "async-broadcast", "async-executor", - "async-fs", "async-io", "async-lock", "async-process", @@ -4453,20 +4986,17 @@ dependencies = [ "enumflags2", "event-listener", "futures-core", - "futures-sink", - "futures-util", + "futures-lite", "hex", "nix", "ordered-stream", - "rand", "serde", "serde_repr", - "sha1", - "static_assertions", "tracing", "uds_windows", - "windows-sys 0.52.0", - "xdg-home", + "uuid", + "windows-sys 0.61.2", + "winnow", "zbus_macros", "zbus_names", "zvariant", @@ -4474,33 +5004,36 @@ dependencies = [ [[package]] name = "zbus_macros" -version = "4.4.0" +version = "5.12.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "267db9407081e90bbfa46d841d3cbc60f59c0351838c4bc65199ecd79ab1983e" +checksum = "1cdb94821ca8a87ca9c298b5d1cbd80e2a8b67115d99f6e4551ac49e42b6a314" dependencies = [ "proc-macro-crate", "proc-macro2", "quote", - "syn 2.0.108", + "syn", + "zbus_names", + "zvariant", "zvariant_utils", ] [[package]] name = "zbus_names" -version = "3.0.0" +version = "4.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4b9b1fef7d021261cc16cba64c351d291b715febe0fa10dc3a443ac5a5022e6c" +checksum = "7be68e64bf6ce8db94f63e72f0c7eb9a60d733f7e0499e628dfab0f84d6bcb97" dependencies = [ "serde", "static_assertions", + "winnow", "zvariant", ] [[package]] name = "zeno" -version = "0.2.3" +version = "0.3.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dd15f8e0dbb966fd9245e7498c7e9e5055d9e5c8b676b95bd67091cd11a1e697" +checksum = "6df3dc4292935e51816d896edcd52aa30bc297907c26167fec31e2b0c6a32524" [[package]] name = "zerocopy" @@ -4519,42 +5052,84 @@ checksum = "88d2b8d9c68ad2b9e4340d7832716a4d21a22a1154777ad56ea55c51a9cf3831" dependencies = [ "proc-macro2", "quote", - "syn 2.0.108", + "syn", +] + +[[package]] +name = "zune-core" +version = "0.4.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3f423a2c17029964870cfaabb1f13dfab7d092a62a29a89264f4d36990ca414a" + +[[package]] +name = "zune-core" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "111f7d9820f05fd715df3144e254d6fc02ee4088b0644c0ffd0efc9e6d9d2773" + +[[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 0.4.12", +] + +[[package]] +name = "zune-jpeg" +version = "0.5.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f520eebad972262a1dde0ec455bce4f8b298b1e5154513de58c114c4c54303e8" +dependencies = [ + "zune-core 0.5.0", ] [[package]] name = "zvariant" -version = "4.2.0" +version = "5.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2084290ab9a1c471c38fc524945837734fbf124487e105daec2bb57fd48c81fe" +checksum = "2be61892e4f2b1772727be11630a62664a1826b62efa43a6fe7449521cb8744c" dependencies = [ "endi", "enumflags2", "serde", - "static_assertions", + "winnow", "zvariant_derive", + "zvariant_utils", ] [[package]] name = "zvariant_derive" -version = "4.2.0" +version = "5.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "73e2ba546bda683a90652bac4a279bc146adad1386f25379cf73200d2002c449" +checksum = "da58575a1b2b20766513b1ec59d8e2e68db2745379f961f86650655e862d2006" dependencies = [ "proc-macro-crate", "proc-macro2", "quote", - "syn 2.0.108", + "syn", "zvariant_utils", ] [[package]] name = "zvariant_utils" -version = "2.1.0" +version = "3.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c51bcff7cc3dbb5055396bcf774748c3dab426b4b8659046963523cee4808340" +checksum = "c6949d142f89f6916deca2232cf26a8afacf2b9fdc35ce766105e104478be599" dependencies = [ "proc-macro2", "quote", - "syn 2.0.108", + "serde", + "syn", + "winnow", ] diff --git a/Cargo.toml b/Cargo.toml index dfca184..dd16a74 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -5,9 +5,10 @@ edition = "2024" [dependencies] bitfield = "0.19.3" -iced = { version = "0.13.1", features = ["debug", "canvas", "tokio", "lazy"] } -iced_graphics = { version = "0.13.0", features = ["geometry", "image"] } -iced_widget = { version = "0.13.4", features = ["canvas", "image"] } +# iced = { version = "0.14.0", features = ["debug", "canvas", "tokio", "lazy", "image", "advanced"] } +iced = { path = "../iced", features = ["debug", "canvas", "tokio", "lazy", "image", "advanced"] } +# iced_graphics = { version = "0.14.0", features = ["geometry", "image"] } +# iced_widget = { version = "0.13.4", features = ["canvas", "image"] } thiserror = "2.0.17" tracing = "0.1.41" tracing-subscriber = { version = "0.3.20", features = ["ansi", "chrono", "env-filter", "json", "serde"] } diff --git a/images/ic_fluent_pause_24_filled.png b/images/ic_fluent_pause_24_filled.png new file mode 100644 index 0000000..35d40cc Binary files /dev/null and b/images/ic_fluent_pause_24_filled.png differ diff --git a/images/ic_fluent_pause_24_filled.svg b/images/ic_fluent_pause_24_filled.svg new file mode 100644 index 0000000..92aa8cc --- /dev/null +++ b/images/ic_fluent_pause_24_filled.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/images/ic_fluent_play_24_filled.png b/images/ic_fluent_play_24_filled.png new file mode 100644 index 0000000..a6fe7cd Binary files /dev/null and b/images/ic_fluent_play_24_filled.png differ diff --git a/images/ic_fluent_play_24_filled.svg b/images/ic_fluent_play_24_filled.svg new file mode 100644 index 0000000..59ccec0 --- /dev/null +++ b/images/ic_fluent_play_24_filled.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/src/apu.rs b/src/apu.rs index 734d48e..d208f93 100644 --- a/src/apu.rs +++ b/src/apu.rs @@ -105,9 +105,15 @@ impl APU { pub fn run_one_clock_cycle(&mut self) -> bool { false } + pub fn peek_nmi(&self) -> bool { + false + } pub fn nmi_waiting(&mut self) -> bool { false } + pub fn peek_irq(&self) -> bool { + false + } pub fn irq_waiting(&mut self) -> bool { // TODO: implement logic false diff --git a/src/debug.rs b/src/debug.rs index 18ad9b4..0968144 100644 --- a/src/debug.rs +++ b/src/debug.rs @@ -18,31 +18,49 @@ impl DebugLog { } pub fn rotate(&mut self) { - let rot = std::mem::take(&mut self.current); - if let Some(max) = self.max_history { - if self.history.len() < max.into() { - self.history.push(rot); - } else { - self.history[self.pos] = rot; - self.pos = (self.pos + 1) % max.get(); - } - } else { - self.history.push(rot); - } + // if self.current.len() > 500 { + let mut rot = std::mem::take(&mut self.current); + self.current = rot.split_off(rot.rfind('\n').unwrap_or(rot.len())); + // if let Some(max) = self.max_history { + // if self.history.len() < max.into() { + // self.history.extend(rot.lines().map(|s| s.to_owned())); + // } else { + // self.history[self.pos] = rot; + // self.pos = (self.pos + 1) % max.get(); + // } + // } else { + // self.history.push(rot); + self.history.extend(rot.lines().map(|s| s.to_owned())); + // } + // } + } + + // pub fn current(&self) -> &str { + // &self.current + // } + + pub fn history(&self) -> &[String] { + &self.history[self.history.len().saturating_sub(100)..] } } impl std::fmt::Write for DebugLog { fn write_str(&mut self, s: &str) -> std::fmt::Result { - self.current.write_str(s) + let tmp = self.current.write_str(s); + self.rotate(); + tmp } fn write_char(&mut self, c: char) -> std::fmt::Result { - self.current.write_char(c) + let tmp = self.current.write_char(c); + self.rotate(); + tmp } fn write_fmt(&mut self, args: std::fmt::Arguments<'_>) -> std::fmt::Result { - self.current.write_fmt(args) + let tmp = self.current.write_fmt(args); + self.rotate(); + tmp } } diff --git a/src/debugger.rs b/src/debugger.rs new file mode 100644 index 0000000..41e4782 --- /dev/null +++ b/src/debugger.rs @@ -0,0 +1,232 @@ +use iced::{ + Element, + Length::Fill, + widget::{ + self, button, checkbox, column, container::bordered_box, image, number_input, row, + scrollable, text, + }, +}; + +use crate::{CycleResult, NES}; + +#[derive(Debug, Clone)] +pub struct DebuggerState { + ppu_cycles: usize, + cpu_cycles: usize, + instructions: usize, + scan_lines: usize, + to_scan_line: usize, + frames: usize, +} + +#[derive(Debug, Clone)] +pub enum DebuggerMessage { + Run, + Pause, + SetPPUCycles(usize), + RunPPUCycles, + SetCPUCycles(usize), + RunCPUCycles, + SetInstructions(usize), + RunInstructions, + SetScanLines(usize), + RunScanLines, + SetToScanLine(usize), + RunToScanLine, + SetFrames(usize), + RunFrames, +} + +impl DebuggerState { + pub fn new() -> Self { + Self { + ppu_cycles: 1, + cpu_cycles: 1, + instructions: 1, + scan_lines: 1, + to_scan_line: 1, + frames: 1, + // cpu_cycles: 1, + } + } + + pub fn view<'s>(&'s self, nes: &'s NES) -> Element<'s, DebuggerMessage> { + column![ + row![ + button(image("./images/ic_fluent_play_24_filled.png")) + .on_press(DebuggerMessage::Run), + button(image("./images/ic_fluent_pause_24_filled.png")) + .on_press(DebuggerMessage::Pause), + ], + iced::widget::rule::horizontal(2.), + row![column![ + text("Status"), + row![ + labelled("A:", text(format!("{:02X}", nes.cpu.a))), + labelled("X:", text(format!("{:02X}", nes.cpu.x))), + labelled("Y:", text(format!("{:02X}", nes.cpu.y))), + labelled("PC:", text(format!("{:04X}", nes.cpu.pc))), + labelled("Cycle:", text(format!("{}", nes.cycle))), + labelled("SP:", text(format!("{:02X}", nes.cpu.sp))), + ] + .spacing(5.), + row![ + labelled("P:", text(format!("{:02X}", nes.cpu.status.0))), + labelled_box("Carry", nes.cpu.status.carry()), + labelled_box("Zero", nes.cpu.status.zero()), + labelled_box("Interrupt", nes.cpu.status.interrupt_disable()), + labelled_box("--", false), + labelled_box("--", false), + labelled_box("Overflow", nes.cpu.status.overflow()), + labelled_box("Negative", nes.cpu.status.negative()), + ] + .spacing(5.), + row![ + text("IRQs:"), + labelled_box("NMI", nes.peek_nmi()), + labelled_box("Cart", false), + labelled_box("Frame Counter", false), + labelled_box("DMC", false), + ] + .spacing(5.), + row![ + column![ + labelled("Cycle", text(nes.ppu.pixel)), + labelled("Scanline", text(nes.ppu.scanline)), + labelled("PPU Cycle", text(nes.ppu.cycle)), + ], + column![ + labelled_box("Sprite 0 Hit", false), + labelled_box("Sprite 0 Overflow", false), + labelled_box("Vertical Blank", nes.ppu.vblank), + labelled_box("Write Toggle", false), + labelled_box("", false), + labelled_box("Large Sprites", false), + labelled_box("Vertical Write", false), + labelled_box("NMI on VBlank", false), + labelled_box("BG at $1000", false), + labelled_box("Sprites at $1000", false), + ], + column![ + run_type( + "PPU Cycles:", + self.ppu_cycles, + DebuggerMessage::SetPPUCycles, + DebuggerMessage::RunPPUCycles + ), + run_type( + "CPU Cycles:", + self.cpu_cycles, + DebuggerMessage::SetCPUCycles, + DebuggerMessage::RunCPUCycles + ), + run_type( + "Instructions:", + self.instructions, + DebuggerMessage::SetInstructions, + DebuggerMessage::RunInstructions + ), + run_type( + "Scanlines:", + self.scan_lines, + DebuggerMessage::SetScanLines, + DebuggerMessage::RunScanLines + ), + run_type( + "To Scanline:", + self.to_scan_line, + DebuggerMessage::SetToScanLine, + DebuggerMessage::RunToScanLine + ), + run_type( + "Frames:", + self.frames, + DebuggerMessage::SetFrames, + DebuggerMessage::RunFrames + ), + ], + ] + .spacing(5.), + scrollable(column( + nes.debug_log() + .history() + .into_iter() + .rev() + .map(|s| text(s).line_height(0.9).into()) + ).spacing(0)) + .width(Fill), + ],], + ] + .width(Fill) + .height(Fill) + .into() + } + + fn run_n_clock_cycles(nes: &mut NES, n: usize) { + for _ in 0..n { + nes.run_one_clock_cycle(); + } + } + fn run_until(nes: &mut NES, mut f: impl FnMut(CycleResult, &NES) -> bool) { + loop { + if f(nes.run_one_clock_cycle(), nes) { + break; + } + } + } + + pub fn update(&mut self, message: DebuggerMessage, nes: &mut NES) { + match message { + DebuggerMessage::SetPPUCycles(n) => self.ppu_cycles = n, + DebuggerMessage::SetCPUCycles(n) => self.cpu_cycles = n, + DebuggerMessage::SetInstructions(n) => self.instructions = n, + DebuggerMessage::SetScanLines(n) => self.scan_lines = n, + DebuggerMessage::SetToScanLine(n) => self.to_scan_line = n, + DebuggerMessage::SetFrames(n) => self.frames = n, + DebuggerMessage::RunPPUCycles => Self::run_n_clock_cycles(nes, self.ppu_cycles), + DebuggerMessage::RunCPUCycles => Self::run_n_clock_cycles(nes, self.cpu_cycles * 3), + DebuggerMessage::RunInstructions => Self::run_until(nes, |c, _| c.cpu_exec), + DebuggerMessage::RunScanLines => Self::run_n_clock_cycles(nes, self.scan_lines * 341), + DebuggerMessage::RunToScanLine => { + Self::run_until(nes, |_, n| n.ppu.scanline == self.to_scan_line) + } + DebuggerMessage::RunFrames => Self::run_n_clock_cycles(nes, self.frames * 341 * 261), + DebuggerMessage::Run => todo!(), + DebuggerMessage::Pause => todo!(), + } + } +} + +fn run_type<'a, Message: Clone + 'a>( + label: &'a str, + val: usize, + update: impl Fn(usize) -> Message + 'a, + run: Message, +) -> Element<'a, Message> { + row![ + widget::container(text(label)).padding(2.), + widget::container(number_input(val).on_input(update)).padding(2.), + widget::container(button(image("./images/ic_fluent_play_24_filled.png")).on_press(run)) + .padding(2.), + ] + .spacing(1.) + .into() +} + +pub fn labelled<'a, Message: 'a>( + label: &'a str, + content: impl Into>, +) -> Element<'a, Message> { + row![ + widget::container(text(label)).padding(2.), + widget::container(content).style(bordered_box).padding(2.), + ] + .spacing(1.) + .into() +} + +pub fn labelled_box<'a, Message: 'a>(label: &'a str, value: bool) -> Element<'a, Message> { + row![checkbox(value), widget::container(text(label)),] + .spacing(1.) + .into() +} diff --git a/src/header_menu.rs b/src/header_menu.rs index 8fcf958..d408108 100644 --- a/src/header_menu.rs +++ b/src/header_menu.rs @@ -1,163 +1,36 @@ -//! Pick lists display a dropdown list of selectable options. -//! -//! # Example -//! ```no_run -//! # mod iced { pub mod widget { pub use iced_widget::*; } pub use iced_widget::Renderer; pub use iced_widget::core::*; } -//! # pub type Element<'a, Message> = iced_widget::core::Element<'a, Message, iced_widget::Theme, iced_widget::Renderer>; -//! # -//! use iced::widget::pick_list; -//! -//! struct State { -//! favorite: Option, -//! } -//! -//! #[derive(Debug, Clone, Copy, PartialEq, Eq)] -//! enum Fruit { -//! Apple, -//! Orange, -//! Strawberry, -//! Tomato, -//! } -//! -//! #[derive(Debug, Clone)] -//! enum Message { -//! FruitSelected(Fruit), -//! } -//! -//! fn view(state: &State) -> Element<'_, Message> { -//! let fruits = [ -//! Fruit::Apple, -//! Fruit::Orange, -//! Fruit::Strawberry, -//! Fruit::Tomato, -//! ]; -//! -//! pick_list( -//! fruits, -//! state.favorite, -//! Message::FruitSelected, -//! ) -//! .placeholder("Select your favorite fruit...") -//! .into() -//! } -//! -//! fn update(state: &mut State, message: Message) { -//! match message { -//! Message::FruitSelected(fruit) => { -//! state.favorite = Some(fruit); -//! } -//! } -//! } -//! -//! impl std::fmt::Display for Fruit { -//! fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { -//! f.write_str(match self { -//! Self::Apple => "Apple", -//! Self::Orange => "Orange", -//! Self::Strawberry => "Strawberry", -//! Self::Tomato => "Tomato", -//! }) -//! } -//! } -//! ``` -use iced::alignment; -use iced::event::{self, Event}; -use iced::keyboard; -// use iced::layout; -use iced::mouse; -use iced::overlay; -// use iced::renderer; -// use iced::text::paragraph; -// use iced::text::{self, Text}; -use iced::touch; -// use iced::widget::tree::{self, Tree}; -use iced::overlay::menu::{self, Menu}; -use iced::{ - Background, Border, Color, Element, Length, Padding, Pixels, Point, Rectangle, Size, Theme, - Vector, +use iced::advanced::graphics::core::{keyboard, touch, window}; +use iced::advanced::text::paragraph; +use iced::advanced::widget::{Tree, tree}; +use iced::advanced::{ + Clipboard, Layout, Shell, Text, Widget, layout, mouse, overlay, renderer, text, +}; +use iced::overlay::menu::Menu; +use iced::{ + Background, Border, Color, Element, Event, Point, Rectangle, Size, Theme, Vector, alignment, +}; +use iced::{ + Length, Padding, Pixels, + widget::{button, overlay::menu}, }; -use iced_graphics::core::text::paragraph; -use iced_graphics::core::widget::{Tree, tree}; -use iced_graphics::core::{Clipboard, Layout, Shell, Text, Widget, layout, renderer, text}; - use std::borrow::Borrow; use std::f32; -/// A widget for selecting a single value from a list of options. -/// -/// # Example -/// ```no_run -/// # mod iced { pub mod widget { pub use iced_widget::*; } pub use iced_widget::Renderer; pub use iced_widget::core::*; } -/// # pub type Element<'a, Message> = iced_widget::core::Element<'a, Message, iced_widget::Theme, iced_widget::Renderer>; -/// # -/// use iced::widget::pick_list; -/// -/// struct State { -/// favorite: Option, -/// } -/// -/// #[derive(Debug, Clone, Copy, PartialEq, Eq)] -/// enum Fruit { -/// Apple, -/// Orange, -/// Strawberry, -/// Tomato, -/// } -/// -/// #[derive(Debug, Clone)] -/// enum Message { -/// FruitSelected(Fruit), -/// } -/// -/// fn view(state: &State) -> Element<'_, Message> { -/// let fruits = [ -/// Fruit::Apple, -/// Fruit::Orange, -/// Fruit::Strawberry, -/// Fruit::Tomato, -/// ]; -/// -/// pick_list( -/// fruits, -/// state.favorite, -/// Message::FruitSelected, -/// ) -/// .placeholder("Select your favorite fruit...") -/// .into() -/// } -/// -/// fn update(state: &mut State, message: Message) { -/// match message { -/// Message::FruitSelected(fruit) => { -/// state.favorite = Some(fruit); -/// } -/// } -/// } -/// -/// impl std::fmt::Display for Fruit { -/// fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { -/// f.write_str(match self { -/// Self::Apple => "Apple", -/// Self::Orange => "Orange", -/// Self::Strawberry => "Strawberry", -/// Self::Tomato => "Tomato", -/// }) -/// } -/// } -/// ``` -#[allow(missing_debug_implementations)] -pub struct HeaderMenu< - 'a, - T, - L, - // V, - Message, - Theme = iced::Theme, - Renderer = iced::Renderer, -> where - T: ToString + PartialEq + Clone, +pub fn header_menu<'a, T, L, Message: Clone>( + title: impl ToString, + options: L, + f: impl Fn(T) -> Message + 'a, +) -> HeaderMenu<'a, T, L, Message> +where + T: ToString + Clone, + L: Borrow<[T]> + 'a, +{ + HeaderMenu::new(title, options, f) +} + +pub struct HeaderMenu<'a, T, L, Message, Theme = iced::Theme, Renderer = iced::Renderer> +where + T: ToString + Clone, L: Borrow<[T]> + 'a, - // V: Borrow + 'a, Theme: Catalog, Renderer: text::Renderer, { @@ -176,35 +49,30 @@ pub struct HeaderMenu< handle: Handle, class: ::Class<'a>, menu_class: ::Class<'a>, + last_status: Option, + menu_height: Length, } impl<'a, T, L, Message, Theme, Renderer> HeaderMenu<'a, T, L, Message, Theme, Renderer> where - T: ToString + PartialEq + Clone, + T: ToString + Clone, L: Borrow<[T]> + 'a, - // V: Borrow + 'a, Message: Clone, Theme: Catalog, Renderer: text::Renderer, { /// Creates a new [`PickList`] with the given list of options, the current /// selected value, and the message to produce when an option is selected. - pub fn new( - title: impl Into, - options: L, - // selected: Option, - on_click: impl Fn(T) -> Message + 'a, - ) -> Self { + pub fn new(title: impl ToString, options: L, on_select: impl Fn(T) -> Message + 'a) -> Self { Self { - title: title.into(), - on_select: Box::new(on_click), + title: title.to_string(), + on_select: Box::new(on_select), on_open: None, on_close: None, options, placeholder: None, - // selected, width: Length::Shrink, - padding: Padding::new(0.1), + padding: button::DEFAULT_PADDING, text_size: None, text_line_height: text::LineHeight::default(), text_shaping: text::Shaping::default(), @@ -212,6 +80,8 @@ where handle: Handle::default(), class: ::default(), menu_class: ::default_menu(), + last_status: None, + menu_height: Length::Shrink, } } @@ -227,6 +97,12 @@ where self } + /// Sets the height of the [`Menu`]. + pub fn menu_height(mut self, menu_height: impl Into) -> Self { + self.menu_height = menu_height.into(); + self + } + /// Sets the [`Padding`] of the [`PickList`]. pub fn padding>(mut self, padding: P) -> Self { self.padding = padding.into(); @@ -294,14 +170,27 @@ where self.menu_class = (Box::new(style) as menu::StyleFn<'a, Theme>).into(); self } + + /// Sets the style class of the [`PickList`]. + #[must_use] + pub fn class(mut self, class: impl Into<::Class<'a>>) -> Self { + self.class = class.into(); + self + } + + /// Sets the style class of the [`Menu`]. + #[must_use] + pub fn menu_class(mut self, class: impl Into<::Class<'a>>) -> Self { + self.menu_class = class.into(); + self + } } impl<'a, T, L, Message, Theme, Renderer> Widget for HeaderMenu<'a, T, L, Message, Theme, Renderer> where - T: Clone + ToString + PartialEq + 'a, + T: Clone + ToString + 'a, L: Borrow<[T]>, - // V: Borrow, Message: Clone + 'a, Theme: Catalog + 'a, Renderer: text::Renderer + 'a, @@ -322,7 +211,7 @@ where } fn layout( - &self, + &mut self, tree: &mut Tree, renderer: &Renderer, limits: &layout::Limits, @@ -344,8 +233,8 @@ where size: text_size, line_height: self.text_line_height, font, - horizontal_alignment: alignment::Horizontal::Left, - vertical_alignment: alignment::Vertical::Center, + align_x: text::Alignment::Default, + align_y: alignment::Vertical::Center, shaping: self.text_shaping, wrapping: text::Wrapping::default(), }; @@ -353,14 +242,14 @@ where for (option, paragraph) in options.iter().zip(state.options.iter_mut()) { let label = option.to_string(); - paragraph.update(Text { + let _ = paragraph.update(Text { content: &label, ..option_text }); } if let Some(placeholder) = &self.placeholder { - state.placeholder.update(Text { + let _ = state.placeholder.update(Text { content: placeholder, ..option_text }); @@ -398,22 +287,22 @@ where layout::Node::new(size) } - fn on_event( + fn update( &mut self, tree: &mut Tree, - event: Event, + event: &Event, layout: Layout<'_>, cursor: mouse::Cursor, _renderer: &Renderer, _clipboard: &mut dyn Clipboard, shell: &mut Shell<'_, Message>, _viewport: &Rectangle, - ) -> event::Status { + ) { + let state = tree.state.downcast_mut::>(); + match event { Event::Mouse(mouse::Event::ButtonPressed(mouse::Button::Left)) | Event::Touch(touch::Event::FingerPressed { .. }) => { - let state = tree.state.downcast_mut::>(); - if state.is_open { // Event wasn't processed by overlay, so cursor was clicked either outside its // bounds or on the drop-down, either way we close the overlay. @@ -423,58 +312,30 @@ where shell.publish(on_close.clone()); } - event::Status::Captured + shell.capture_event(); } else if cursor.is_over(layout.bounds()) { - // let selected = self.selected.as_ref().map(Borrow::borrow); - state.is_open = true; - // state.hovered_option = self - // .options - // .borrow() - // .iter() - // .position(|option| Some(option) == selected); if let Some(on_open) = &self.on_open { shell.publish(on_open.clone()); } - event::Status::Captured - } else { - event::Status::Ignored + + shell.capture_event(); } } Event::Mouse(mouse::Event::WheelScrolled { delta: mouse::ScrollDelta::Lines { y, .. }, }) => { - let state = tree.state.downcast_mut::>(); - if state.keyboard_modifiers.command() && cursor.is_over(layout.bounds()) && !state.is_open { - fn find_next<'a, T: PartialEq>( - selected: &'a T, - mut options: impl Iterator, - ) -> Option<&'a T> { - let _ = options.find(|&option| option == selected); - - options.next() - } - let options = self.options.borrow(); - let selected = None; // self.selected.as_ref().map(Borrow::borrow); - let next_option = if y < 0.0 { - if let Some(selected) = selected { - find_next(selected, options.iter()) - } else { - options.first() - } - } else if y > 0.0 { - if let Some(selected) = selected { - find_next(selected, options.iter().rev()) - } else { - options.last() - } + let next_option = if *y < 0.0 { + options.first() + } else if *y > 0.0 { + options.last() } else { None }; @@ -483,19 +344,34 @@ where shell.publish((self.on_select)(next_option.clone())); } - event::Status::Captured - } else { - event::Status::Ignored + shell.capture_event(); } } Event::Keyboard(keyboard::Event::ModifiersChanged(modifiers)) => { - let state = tree.state.downcast_mut::>(); - - state.keyboard_modifiers = modifiers; - - event::Status::Ignored + state.keyboard_modifiers = *modifiers; } - _ => event::Status::Ignored, + _ => {} + }; + + let status = { + let is_hovered = cursor.is_over(layout.bounds()); + + if state.is_open { + Status::Opened { is_hovered } + } else if is_hovered { + Status::Hovered + } else { + Status::Active + } + }; + + if let Event::Window(window::Event::RedrawRequested(_now)) = event { + self.last_status = Some(status); + } else if self + .last_status + .is_some_and(|last_status| last_status != status) + { + shell.request_redraw(); } } @@ -524,26 +400,19 @@ where theme: &Theme, _style: &renderer::Style, layout: Layout<'_>, - cursor: mouse::Cursor, + _cursor: mouse::Cursor, viewport: &Rectangle, ) { let font = self.font.unwrap_or_else(|| renderer.default_font()); - // let selected = None; // self.selected.as_ref().map(Borrow::borrow); let state = tree.state.downcast_ref::>(); let bounds = layout.bounds(); - let is_mouse_over = cursor.is_over(bounds); - // let is_selected = selected.is_some(); - let status = if state.is_open { - Status::Opened - } else if is_mouse_over { - Status::Hovered - } else { - Status::Active - }; - - let style = Catalog::style(theme, &self.class, status); + let style = Catalog::style( + theme, + &self.class, + self.last_status.unwrap_or(Status::Active), + ); renderer.fill_quad( renderer::Quad { @@ -601,8 +470,8 @@ where line_height, font, bounds: Size::new(bounds.width, f32::from(line_height.to_absolute(size))), - horizontal_alignment: alignment::Horizontal::Right, - vertical_alignment: alignment::Vertical::Center, + align_x: text::Alignment::Right, + align_y: alignment::Vertical::Center, shaping, wrapping: text::Wrapping::default(), }, @@ -610,13 +479,11 @@ where bounds.x + bounds.width - self.padding.right, bounds.center_y(), ), - style.text_color, + style.handle_color, *viewport, ); } - // let label = None; // selected.map(ToString::to_string); - let text_size = self.text_size.unwrap_or_else(|| renderer.default_size()); renderer.fill_text( @@ -626,20 +493,16 @@ where line_height: self.text_line_height, font, bounds: Size::new( - bounds.width - self.padding.horizontal(), + bounds.width - self.padding.x(), f32::from(self.text_line_height.to_absolute(text_size)), ), - horizontal_alignment: alignment::Horizontal::Left, - vertical_alignment: alignment::Vertical::Center, + align_x: text::Alignment::Default, + align_y: alignment::Vertical::Center, shaping: self.text_shaping, wrapping: text::Wrapping::default(), }, Point::new(bounds.x + self.padding.left, bounds.center_y()), - // if is_selected { - // style.text_color - // } else { - style.placeholder_color, - // }, + style.text_color, *viewport, ); } @@ -649,6 +512,7 @@ where tree: &'b mut Tree, layout: Layout<'_>, renderer: &Renderer, + viewport: &Rectangle, translation: Vector, ) -> Option> { let state = tree.state.downcast_mut::>(); @@ -680,7 +544,12 @@ where menu = menu.text_size(text_size); } - Some(menu.overlay(layout.position() + translation, bounds.height)) + Some(menu.overlay( + layout.position() + translation, + *viewport, + bounds.height, + self.menu_height, + )) } else { None } @@ -690,9 +559,8 @@ where impl<'a, T, L, Message, Theme, Renderer> From> for Element<'a, Message, Theme, Renderer> where - T: Clone + ToString + PartialEq + 'a, + T: Clone + ToString + 'a, L: Borrow<[T]> + 'a, - // V: Borrow + 'a, Message: Clone + 'a, Theme: Catalog + 'a, Renderer: text::Renderer + 'a, @@ -784,11 +652,14 @@ pub enum Status { /// The [`PickList`] is being hovered. Hovered, /// The [`PickList`] is open. - Opened, + Opened { + /// Whether the [`PickList`] is hovered, while open. + is_hovered: bool, + }, } /// The appearance of a pick list. -#[derive(Debug, Clone, Copy)] +#[derive(Debug, Clone, Copy, PartialEq)] pub struct Style { /// The text [`Color`] of the pick list. pub text_color: Color, @@ -843,7 +714,7 @@ pub fn default(theme: &Theme, status: Status) -> Style { let active = Style { text_color: palette.background.weak.text, background: palette.background.weak.color.into(), - placeholder_color: palette.background.strong.color, + placeholder_color: palette.secondary.base.color, handle_color: palette.background.weak.text, border: Border { radius: 2.0.into(), @@ -854,7 +725,7 @@ pub fn default(theme: &Theme, status: Status) -> Style { match status { Status::Active => active, - Status::Hovered | Status::Opened => Style { + Status::Hovered | Status::Opened { .. } => Style { border: Border { color: palette.primary.strong.color, ..active.border @@ -863,82 +734,3 @@ pub fn default(theme: &Theme, status: Status) -> Style { }, } } - -/// Creates a new [`PickList`]. -/// -/// Pick lists display a dropdown list of selectable options. -/// -/// # Example -/// ```no_run -/// # mod iced { pub mod widget { pub use iced_widget::*; } pub use iced_widget::Renderer; pub use iced_widget::core::*; } -/// # pub type Element<'a, Message> = iced_widget::core::Element<'a, Message, iced_widget::Theme, iced_widget::Renderer>; -/// # -/// use iced::widget::pick_list; -/// -/// struct State { -/// favorite: Option, -/// } -/// -/// #[derive(Debug, Clone, Copy, PartialEq, Eq)] -/// enum Fruit { -/// Apple, -/// Orange, -/// Strawberry, -/// Tomato, -/// } -/// -/// #[derive(Debug, Clone)] -/// enum Message { -/// FruitSelected(Fruit), -/// } -/// -/// fn view(state: &State) -> Element<'_, Message> { -/// let fruits = [ -/// Fruit::Apple, -/// Fruit::Orange, -/// Fruit::Strawberry, -/// Fruit::Tomato, -/// ]; -/// -/// pick_list( -/// fruits, -/// state.favorite, -/// Message::FruitSelected, -/// ) -/// .placeholder("Select your favorite fruit...") -/// .into() -/// } -/// -/// fn update(state: &mut State, message: Message) { -/// match message { -/// Message::FruitSelected(fruit) => { -/// state.favorite = Some(fruit); -/// } -/// } -/// } -/// -/// impl std::fmt::Display for Fruit { -/// fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { -/// f.write_str(match self { -/// Self::Apple => "Apple", -/// Self::Orange => "Orange", -/// Self::Strawberry => "Strawberry", -/// Self::Tomato => "Tomato", -/// }) -/// } -/// } -/// ``` -pub fn header_menu<'a, T, L, Message, Theme, Renderer>( - title: impl Into, - options: L, - on_selected: impl Fn(T) -> Message + 'a, -) -> HeaderMenu<'a, T, L, Message, Theme, Renderer> -where - T: ToString + PartialEq + Clone + 'a, - L: Borrow<[T]> + 'a, - Message: Clone, - Theme: Catalog + overlay::menu::Catalog, - Renderer: text::Renderer, -{ - HeaderMenu::new(title, options, on_selected) -} diff --git a/src/lib.rs b/src/lib.rs index 21088c8..c2d9696 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -1,17 +1,17 @@ mod apu; mod controllers; pub mod debug; +pub mod debugger; pub mod header_menu; pub mod hex_view; mod mem; mod ppu; - #[cfg(test)] mod test_roms; pub use ppu::{Color, PPU, RenderBuffer}; -use std::{fmt::{Arguments, Write as _}, fs::File, io::Read, path::Path}; +use std::{fmt::Write as _, fs::File, io::Read, path::Path}; use thiserror::Error; use tracing::{debug, info}; @@ -115,14 +115,14 @@ impl std::fmt::Debug for NES { bitfield::bitfield! { pub struct CpuStatus(u8); - carry, set_carry: 0; - zero, set_zero: 1; - interrupt_disable, set_interrupt_disable: 2; - decimal, set_decimal: 3; - brk, set_brk: 4; - php, set_php: 5; - overflow, set_overflow: 6; - negative, set_negative: 7; + pub carry, set_carry: 0; + pub zero, set_zero: 1; + pub interrupt_disable, set_interrupt_disable: 2; + pub decimal, set_decimal: 3; + pub brk, set_brk: 4; + pub php, set_php: 5; + pub overflow, set_overflow: 6; + pub negative, set_negative: 7; } impl std::fmt::Debug for CpuStatus { @@ -151,16 +151,16 @@ impl std::fmt::Debug for CpuStatus { #[derive(Debug)] pub struct Cpu { - a: u8, - x: u8, - y: u8, - pc: u16, - sp: u8, - status: CpuStatus, - clock_state: ClockState, + pub a: u8, + pub x: u8, + pub y: u8, + pub pc: u16, + pub sp: u8, + pub status: CpuStatus, + pub clock_state: ClockState, } -enum ClockState { +pub enum ClockState { ReadInstruction, ReadOperands { instruction: u8, @@ -499,22 +499,38 @@ impl NES { }), 0x48 => inst!("PHA", 2, || { - log!("{addr:04X}: PHA | {:02X} -> 01{:02X}", self.cpu.a, self.cpu.sp); + log!( + "{addr:04X}: PHA | {:02X} -> 01{:02X}", + self.cpu.a, + self.cpu.sp + ); self.push(self.cpu.a); }), 0x08 => inst!("PHP", 2, || { - log!("{addr:04X}: PHP | {:02X} -> 01{:02X}", self.cpu.status.0, self.cpu.sp); + log!( + "{addr:04X}: PHP | {:02X} -> 01{:02X}", + self.cpu.status.0, + self.cpu.sp + ); self.push(self.cpu.status.0 | 0b0011_0000); }), 0x68 => inst!("PLA", 3, || { self.cpu.a = self.pop(); self.cpu.status.set_zero(self.cpu.a == 0); self.cpu.status.set_negative(self.cpu.a & 0x80 == 0x80); - log!("{addr:04X}: PLA | {:02X} <- 01{:02X}", self.cpu.a, self.cpu.sp); + log!( + "{addr:04X}: PLA | {:02X} <- 01{:02X}", + self.cpu.a, + self.cpu.sp + ); }), 0x28 => inst!("PLP", 3, || { self.cpu.status.0 = self.pop() & 0b1100_1111; - log!("{addr:04X}: PLP | {:02X} <- 01{:02X}", self.cpu.status.0, self.cpu.sp); + log!( + "{addr:04X}: PLP | {:02X} <- 01{:02X}", + self.cpu.status.0, + self.cpu.sp + ); }), // Loads @@ -540,19 +556,34 @@ impl NES { self.cpu.a = self.read_abs(low, high); self.cpu.status.set_zero(self.cpu.a == 0); self.cpu.status.set_negative(self.cpu.a & 0x80 == 0x80); - log!("{addr:04X}: LDA ${:02X}{:02X} | {:02X}", high, low, self.cpu.a); + log!( + "{addr:04X}: LDA ${:02X}{:02X} | {:02X}", + high, + low, + self.cpu.a + ); }), 0xBD => inst!("LDA abs,x", 1, |low, high| { self.cpu.a = self.read_abs_x(low, high); self.cpu.status.set_zero(self.cpu.a == 0); self.cpu.status.set_negative(self.cpu.a & 0x80 == 0x80); - log!("{addr:04X}: LDA ${:02X}{:02X},x | {:02X}", high, low, self.cpu.a); + log!( + "{addr:04X}: LDA ${:02X}{:02X},x | {:02X}", + high, + low, + self.cpu.a + ); }), 0xB9 => inst!("LDA abs,y", 1, |low, high| { self.cpu.a = self.read_abs_y(low, high); self.cpu.status.set_zero(self.cpu.a == 0); self.cpu.status.set_negative(self.cpu.a & 0x80 == 0x80); - log!("{addr:04X}: LDA ${:02X}{:02X},y | {:02X}", high, low, self.cpu.a); + log!( + "{addr:04X}: LDA ${:02X}{:02X},y | {:02X}", + high, + low, + self.cpu.a + ); }), 0xA1 => inst!("LDA (ind,x)", 4, |off| { let low = self.read_zp_x(off); @@ -592,13 +623,23 @@ impl NES { self.cpu.x = self.read_abs(low, high); self.cpu.status.set_zero(self.cpu.x == 0); self.cpu.status.set_negative(self.cpu.x & 0x80 == 0x80); - log!("{addr:04X}: LDX ${:02X}{:02X} | {:02X}", high, low, self.cpu.x); + log!( + "{addr:04X}: LDX ${:02X}{:02X} | {:02X}", + high, + low, + self.cpu.x + ); }), 0xBE => inst!("LDX abs,y", 1, |low, high| { self.cpu.x = self.read_abs_y(low, high); self.cpu.status.set_zero(self.cpu.x == 0); self.cpu.status.set_negative(self.cpu.x & 0x80 == 0x80); - log!("{addr:04X}: LDX ${:02X}{:02X},y | {:02X}", high, low, self.cpu.x); + log!( + "{addr:04X}: LDX ${:02X}{:02X},y | {:02X}", + high, + low, + self.cpu.x + ); }), 0xA0 => inst!("LDY imm", 0, |y| { self.cpu.y = y; @@ -622,13 +663,23 @@ impl NES { self.cpu.y = self.read_abs(low, high); self.cpu.status.set_zero(self.cpu.y == 0); self.cpu.status.set_negative(self.cpu.y & 0x80 == 0x80); - log!("{addr:04X}: LDY ${:02X}{:02X} | {:02X}", high, low, self.cpu.y); + log!( + "{addr:04X}: LDY ${:02X}{:02X} | {:02X}", + high, + low, + self.cpu.y + ); }), 0xBC => inst!("LDX abs,x", 1, |low, high| { self.cpu.y = self.read_abs_x(low, high); self.cpu.status.set_zero(self.cpu.y == 0); self.cpu.status.set_negative(self.cpu.y & 0x80 == 0x80); - log!("{addr:04X}: LDY ${:02X}{:02X},x | {:02X}", high, low, self.cpu.y); + log!( + "{addr:04X}: LDY ${:02X}{:02X},x | {:02X}", + high, + low, + self.cpu.y + ); }), // Stores @@ -642,15 +693,30 @@ impl NES { }), 0x8D => inst!("STA abs", 1, |low, high| { self.write_abs(low, high, self.cpu.a); - log!("{addr:04X}: STA ${:02X}{:02X} | {:02X}", high, low, self.cpu.a); + log!( + "{addr:04X}: STA ${:02X}{:02X} | {:02X}", + high, + low, + self.cpu.a + ); }), 0x9D => inst!("STA abs,x", 1, |low, high| { self.write_abs_x(low, high, self.cpu.a); - log!("{addr:04X}: STA ${:02X}{:02X},x | {:02X}", high, low, self.cpu.a); + log!( + "{addr:04X}: STA ${:02X}{:02X},x | {:02X}", + high, + low, + self.cpu.a + ); }), 0x99 => inst!("STA abs,y", 1, |low, high| { self.write_abs_y(low, high, self.cpu.a); - log!("{addr:04X}: STA ${:02X}{:02X},y | {:02X}", high, low, self.cpu.a); + log!( + "{addr:04X}: STA ${:02X}{:02X},y | {:02X}", + high, + low, + self.cpu.a + ); }), 0x81 => inst!("STA (ind,x)", 4, |off| { let low = self.read_zp_x(off); @@ -677,7 +743,12 @@ impl NES { }), 0x8E => inst!("STX abs", 1, |low, high| { self.write_abs(low, high, self.cpu.x); - log!("{addr:04X}: STX ${:02X}{:02X} | {:02X}", high, low, self.cpu.x); + log!( + "{addr:04X}: STX ${:02X}{:02X} | {:02X}", + high, + low, + self.cpu.x + ); }), 0x84 => inst!("STY zp", 1, |off| { self.write(off as u16, self.cpu.y); @@ -689,7 +760,12 @@ impl NES { }), 0x8C => inst!("STY abs", 1, |low, high| { self.write_abs(low, high, self.cpu.y); - log!("{addr:04X}: STY ${:02X}{:02X} | {:02X}", high, low, self.cpu.y); + log!( + "{addr:04X}: STY ${:02X}{:02X} | {:02X}", + high, + low, + self.cpu.y + ); }), // Transfers @@ -804,7 +880,13 @@ impl NES { self.cpu.status.set_zero(v == 0); self.cpu.status.set_negative(v & 0x80 == 0x80); self.cpu.status.set_carry(self.cpu.a >= val); - log!("{addr:04X}: CMP #${:02X} | {:02X} - {:02X} -> {:?}", val, self.cpu.a, val, self.cpu.status); + log!( + "{addr:04X}: CMP #${:02X} | {:02X} - {:02X} -> {:?}", + val, + self.cpu.a, + val, + self.cpu.status + ); }), 0xC5 => inst!("CMP zp", 1, |off| { let val = self.read_abs(off, 0); @@ -812,7 +894,13 @@ impl NES { self.cpu.status.set_zero(v == 0); self.cpu.status.set_negative(v & 0x80 == 0x80); self.cpu.status.set_carry(self.cpu.a >= val); - log!("{addr:04X}: CMP ${:02X} | {:02X} - {:02X} -> {:?}", off, self.cpu.a, val, self.cpu.status); + log!( + "{addr:04X}: CMP ${:02X} | {:02X} - {:02X} -> {:?}", + off, + self.cpu.a, + val, + self.cpu.status + ); }), 0xD5 => inst!("CMP zp,x", 2, |off| { let val = self.read_zp_x(off); @@ -820,7 +908,13 @@ impl NES { self.cpu.status.set_zero(v == 0); self.cpu.status.set_negative(v & 0x80 == 0x80); self.cpu.status.set_carry(self.cpu.a >= val); - log!("{addr:04X}: CMP ${:02X},x | {:02X} - {:02X} -> {:?}", off, self.cpu.a, val, self.cpu.status); + log!( + "{addr:04X}: CMP ${:02X},x | {:02X} - {:02X} -> {:?}", + off, + self.cpu.a, + val, + self.cpu.status + ); }), 0xCD => inst!("CMP abs", 1, |low, high| { let val = self.read_abs(low, high); @@ -828,7 +922,14 @@ impl NES { self.cpu.status.set_zero(v == 0); self.cpu.status.set_negative(v & 0x80 == 0x80); self.cpu.status.set_carry(self.cpu.a >= val); - log!("{addr:04X}: CMP ${:02X}{:02X} | {:02X} - {:02X} -> {:?}", high, low, self.cpu.a, val, self.cpu.status); + log!( + "{addr:04X}: CMP ${:02X}{:02X} | {:02X} - {:02X} -> {:?}", + high, + low, + self.cpu.a, + val, + self.cpu.status + ); }), 0xDD => inst!("CMP abs,x", 1, |low, high| { let val = self.read_abs_x(low, high); @@ -836,7 +937,14 @@ impl NES { self.cpu.status.set_zero(v == 0); self.cpu.status.set_negative(v & 0x80 == 0x80); self.cpu.status.set_carry(self.cpu.a >= val); - log!("{addr:04X}: CMP ${:02X}{:02X},x | {:02X} - {:02X} -> {:?}", high, low, self.cpu.a, val, self.cpu.status); + log!( + "{addr:04X}: CMP ${:02X}{:02X},x | {:02X} - {:02X} -> {:?}", + high, + low, + self.cpu.a, + val, + self.cpu.status + ); }), 0xD9 => inst!("CMP abs,y", 1, |low, high| { let val = self.read_abs_y(low, high); @@ -844,14 +952,27 @@ impl NES { self.cpu.status.set_zero(v == 0); self.cpu.status.set_negative(v & 0x80 == 0x80); self.cpu.status.set_carry(self.cpu.a >= val); - log!("{addr:04X}: CMP ${:02X}{:02X},y | {:02X} - {:02X} -> {:?}", high, low, self.cpu.a, val, self.cpu.status); + log!( + "{addr:04X}: CMP ${:02X}{:02X},y | {:02X} - {:02X} -> {:?}", + high, + low, + self.cpu.a, + val, + self.cpu.status + ); }), 0xE0 => inst!("CPX imm", 0, |val| { let v = self.cpu.x.wrapping_sub(val); self.cpu.status.set_zero(v == 0); self.cpu.status.set_negative(v & 0x80 == 0x80); self.cpu.status.set_carry(self.cpu.x >= val); - log!("{addr:04X}: CPX #${:02X} | {:02X} - {:02X} -> {:?}", val, self.cpu.x, val, self.cpu.status); + log!( + "{addr:04X}: CPX #${:02X} | {:02X} - {:02X} -> {:?}", + val, + self.cpu.x, + val, + self.cpu.status + ); }), 0xE4 => inst!("CPX zp", 1, |off| { let val = self.read_abs(off, 0); @@ -859,7 +980,13 @@ impl NES { self.cpu.status.set_zero(v == 0); self.cpu.status.set_negative(v & 0x80 == 0x80); self.cpu.status.set_carry(self.cpu.x >= val); - log!("{addr:04X}: CPX ${:02X} | {:02X} - {:02X} -> {:?}", off, self.cpu.x, val, self.cpu.status); + log!( + "{addr:04X}: CPX ${:02X} | {:02X} - {:02X} -> {:?}", + off, + self.cpu.x, + val, + self.cpu.status + ); }), 0xEC => inst!("CPX abs", 1, |low, high| { let val = self.read_abs(low, high); @@ -867,14 +994,27 @@ impl NES { self.cpu.status.set_zero(v == 0); self.cpu.status.set_negative(v & 0x80 == 0x80); self.cpu.status.set_carry(self.cpu.x >= val); - log!("{addr:04X}: CPX ${:02X}{:02X} | {:02X} - {:02X} -> {:?}", high, low, self.cpu.x, val, self.cpu.status); + log!( + "{addr:04X}: CPX ${:02X}{:02X} | {:02X} - {:02X} -> {:?}", + high, + low, + self.cpu.x, + val, + self.cpu.status + ); }), 0xC0 => inst!("CPY imm", 0, |val| { let v = self.cpu.y.wrapping_sub(val); self.cpu.status.set_zero(v == 0); self.cpu.status.set_negative(v & 0x80 == 0x80); self.cpu.status.set_carry(self.cpu.y >= val); - log!("{addr:04X}: CPY #${:02X} | {:02X} - {:02X} -> {:?}", val, self.cpu.y, val, self.cpu.status); + log!( + "{addr:04X}: CPY #${:02X} | {:02X} - {:02X} -> {:?}", + val, + self.cpu.y, + val, + self.cpu.status + ); }), 0xC4 => inst!("CPY zp", 1, |off| { let val = self.read_abs(off, 0); @@ -882,7 +1022,13 @@ impl NES { self.cpu.status.set_zero(v == 0); self.cpu.status.set_negative(v & 0x80 == 0x80); self.cpu.status.set_carry(self.cpu.y >= val); - log!("{addr:04X}: CPY ${:02X} | {:02X} - {:02X} -> {:?}", off, self.cpu.y, val, self.cpu.status); + log!( + "{addr:04X}: CPY ${:02X} | {:02X} - {:02X} -> {:?}", + off, + self.cpu.y, + val, + self.cpu.status + ); }), 0xCC => inst!("CPY zp", 1, |low, high| { let val = self.read_abs(low, high); @@ -890,7 +1036,14 @@ impl NES { self.cpu.status.set_zero(v == 0); self.cpu.status.set_negative(v & 0x80 == 0x80); self.cpu.status.set_carry(self.cpu.y >= val); - log!("{addr:04X}: CPY ${:02X}{:02X} | {:02X} - {:02X} -> {:?}", high, low, self.cpu.y, val, self.cpu.status); + log!( + "{addr:04X}: CPY ${:02X}{:02X} | {:02X} - {:02X} -> {:?}", + high, + low, + self.cpu.y, + val, + self.cpu.status + ); }), // Arithmetic @@ -943,7 +1096,12 @@ impl NES { self.cpu.status.set_carry(carry_1 | carry_2); self.cpu.status.set_zero(self.cpu.a == 0); self.cpu.status.set_negative(self.cpu.a & 0x80 == 0x80); - log!("{addr:04X}: ADC ${:02X}{:02X} | {:02X}", high, low, self.cpu.a); + log!( + "{addr:04X}: ADC ${:02X}{:02X} | {:02X}", + high, + low, + self.cpu.a + ); }), 0x7D => inst!("ADC abs,x", 0, |low, high| { let val = self.read_abs_x(low, high); @@ -956,7 +1114,12 @@ impl NES { self.cpu.status.set_carry(carry_1 | carry_2); self.cpu.status.set_zero(self.cpu.a == 0); self.cpu.status.set_negative(self.cpu.a & 0x80 == 0x80); - log!("{addr:04X}: ADC ${:02X}{:02X},x | {:02X}", high, low, self.cpu.a); + log!( + "{addr:04X}: ADC ${:02X}{:02X},x | {:02X}", + high, + low, + self.cpu.a + ); }), 0x79 => inst!("ADC abs,y", 0, |low, high| { let val = self.read_abs_y(low, high); @@ -969,7 +1132,12 @@ impl NES { self.cpu.status.set_carry(carry_1 | carry_2); self.cpu.status.set_zero(self.cpu.a == 0); self.cpu.status.set_negative(self.cpu.a & 0x80 == 0x80); - log!("{addr:04X}: ADC ${:02X}{:02X},y | {:02X}", high, low, self.cpu.a); + log!( + "{addr:04X}: ADC ${:02X}{:02X},y | {:02X}", + high, + low, + self.cpu.a + ); }), 0x61 => inst!("ADC (ind,x)", 0, |off| { let low = self.read_abs(off, 0); @@ -984,7 +1152,12 @@ impl NES { self.cpu.status.set_carry(carry_1 | carry_2); self.cpu.status.set_zero(self.cpu.a == 0); self.cpu.status.set_negative(self.cpu.a & 0x80 == 0x80); - log!("{addr:04X}: ADC (${:02X}{:02X},x) | {:02X}", high, low, self.cpu.a); + log!( + "{addr:04X}: ADC (${:02X}{:02X},x) | {:02X}", + high, + low, + self.cpu.a + ); }), 0x71 => inst!("ADC (ind),y", 0, |off| { let low = self.read_abs(off, 0); @@ -999,7 +1172,12 @@ impl NES { self.cpu.status.set_carry(carry_1 | carry_2); self.cpu.status.set_zero(self.cpu.a == 0); self.cpu.status.set_negative(self.cpu.a & 0x80 == 0x80); - log!("{addr:04X}: ADC (${:02X}{:02X}),y | {:02X}", high, low, self.cpu.a); + log!( + "{addr:04X}: ADC (${:02X}{:02X}),y | {:02X}", + high, + low, + self.cpu.a + ); }), 0xE9 => inst!("SBC imm", 0, |val| { let (a, carry_1) = self.cpu.a.overflowing_add(!val); @@ -1050,7 +1228,12 @@ impl NES { self.cpu.status.set_carry(carry_1 | carry_2); self.cpu.status.set_zero(self.cpu.a == 0); self.cpu.status.set_negative(self.cpu.a & 0x80 == 0x80); - log!("{addr:04X}: SBC ${:02X}{:02X} | {:02X}", high, low, self.cpu.a); + log!( + "{addr:04X}: SBC ${:02X}{:02X} | {:02X}", + high, + low, + self.cpu.a + ); }), 0xFD => inst!("SBC abs,x", 0, |low, high| { let val = self.read_abs_x(low, high); @@ -1063,7 +1246,12 @@ impl NES { self.cpu.status.set_carry(carry_1 | carry_2); self.cpu.status.set_zero(self.cpu.a == 0); self.cpu.status.set_negative(self.cpu.a & 0x80 == 0x80); - log!("{addr:04X}: SBC ${:02X}{:02X},x | {:02X}", high, low, self.cpu.a); + log!( + "{addr:04X}: SBC ${:02X}{:02X},x | {:02X}", + high, + low, + self.cpu.a + ); }), 0xF9 => inst!("SBC abs,y", 0, |low, high| { let val = self.read_abs_y(low, high); @@ -1076,7 +1264,12 @@ impl NES { self.cpu.status.set_carry(carry_1 | carry_2); self.cpu.status.set_zero(self.cpu.a == 0); self.cpu.status.set_negative(self.cpu.a & 0x80 == 0x80); - log!("{addr:04X}: SBC ${:02X}{:02X},y | {:02X}", high, low, self.cpu.a); + log!( + "{addr:04X}: SBC ${:02X}{:02X},y | {:02X}", + high, + low, + self.cpu.a + ); }), 0xE1 => inst!("SBC (ind,x)", 0, |off| { let low = self.read_abs(off, 0); @@ -1091,7 +1284,12 @@ impl NES { self.cpu.status.set_carry(carry_1 | carry_2); self.cpu.status.set_zero(self.cpu.a == 0); self.cpu.status.set_negative(self.cpu.a & 0x80 == 0x80); - log!("{addr:04X}: SBC (${:02X}{:02X},x) | {:02X}", high, low, self.cpu.a); + log!( + "{addr:04X}: SBC (${:02X}{:02X},x) | {:02X}", + high, + low, + self.cpu.a + ); }), 0xF1 => inst!("SBC (ind),y", 0, |off| { let low = self.read_abs(off, 0); @@ -1106,7 +1304,12 @@ impl NES { self.cpu.status.set_carry(carry_1 | carry_2); self.cpu.status.set_zero(self.cpu.a == 0); self.cpu.status.set_negative(self.cpu.a & 0x80 == 0x80); - log!("{addr:04X}: SBC (${:02X}{:02X}),y | {:02X}", high, low, self.cpu.a); + log!( + "{addr:04X}: SBC (${:02X}{:02X}),y | {:02X}", + high, + low, + self.cpu.a + ); }), 0xC6 => inst!("DEC zp", 3, |off| { let val = self.read_abs(off, 0).wrapping_sub(1); @@ -1127,14 +1330,24 @@ impl NES { self.write_abs(low, high, val); self.cpu.status.set_zero(val == 0); self.cpu.status.set_negative(val & 0x80 == 0x80); - log!("{addr:04X}: DEC ${:02X}{:02X} | {:02X}", high, low, self.cpu.a); + log!( + "{addr:04X}: DEC ${:02X}{:02X} | {:02X}", + high, + low, + self.cpu.a + ); }), 0xDE => inst!("DEC abs,x", 3, |low, high| { let val = self.read_abs_x(low, high).wrapping_sub(1); self.write_abs_x(low, high, val); self.cpu.status.set_zero(val == 0); self.cpu.status.set_negative(val & 0x80 == 0x80); - log!("{addr:04X}: DEC ${:02X}{:02X},x | {:02X}", high, low, self.cpu.a); + log!( + "{addr:04X}: DEC ${:02X}{:02X},x | {:02X}", + high, + low, + self.cpu.a + ); }), 0xCA => inst!("DEX", 1, || { self.cpu.x = self.cpu.x.wrapping_sub(1); @@ -1167,14 +1380,24 @@ impl NES { self.write_abs(low, high, val); self.cpu.status.set_zero(val == 0); self.cpu.status.set_negative(val & 0x80 == 0x80); - log!("{addr:04X}: INC ${:02X}{:02X} | {:02X}", high, low, self.cpu.a); + log!( + "{addr:04X}: INC ${:02X}{:02X} | {:02X}", + high, + low, + self.cpu.a + ); }), 0xFE => inst!("INC abs,x", 3, |low, high| { let val = self.read_abs_x(low, high).wrapping_add(1); self.write_abs_x(low, high, val); self.cpu.status.set_zero(val == 0); self.cpu.status.set_negative(val & 0x80 == 0x80); - log!("{addr:04X}: INC ${:02X}{:02X},x | {:02X}", high, low, self.cpu.a); + log!( + "{addr:04X}: INC ${:02X}{:02X},x | {:02X}", + high, + low, + self.cpu.a + ); }), 0xE8 => inst!("INX", 1, || { self.cpu.x = self.cpu.x.wrapping_add(1); @@ -1212,19 +1435,34 @@ impl NES { self.cpu.a |= self.read_abs(low, high); self.cpu.status.set_zero(self.cpu.a == 0); self.cpu.status.set_negative(self.cpu.a & 0x80 == 0x80); - log!("{addr:04X}: ORA ${:02X}{:02X} | {:02X}", high, low, self.cpu.a); + log!( + "{addr:04X}: ORA ${:02X}{:02X} | {:02X}", + high, + low, + self.cpu.a + ); }), 0x1D => inst!("ORA abs,x", 2, |low, high| { self.cpu.a |= self.read_abs_x(low, high); self.cpu.status.set_zero(self.cpu.a == 0); self.cpu.status.set_negative(self.cpu.a & 0x80 == 0x80); - log!("{addr:04X}: ORA ${:02X}{:02X},x | {:02X}", high, low, self.cpu.a); + log!( + "{addr:04X}: ORA ${:02X}{:02X},x | {:02X}", + high, + low, + self.cpu.a + ); }), 0x19 => inst!("ORA abs,y", 1, |low, high| { self.cpu.a |= self.read_abs_y(low, high); self.cpu.status.set_zero(self.cpu.a == 0); self.cpu.status.set_negative(self.cpu.a & 0x80 == 0x80); - log!("{addr:04X}: ORA ${:02X}{:02X},y | {:02X}", high, low, self.cpu.a); + log!( + "{addr:04X}: ORA ${:02X}{:02X},y | {:02X}", + high, + low, + self.cpu.a + ); }), 0x01 => inst!("ORA (ind,x)", 4, |off| { let low = self.read_zp_x(off); @@ -1232,7 +1470,12 @@ impl NES { self.cpu.a |= self.read_abs(low, high); self.cpu.status.set_zero(self.cpu.a == 0); self.cpu.status.set_negative(self.cpu.a & 0x80 == 0x80); - log!("{addr:04X}: ORA (${:02X}{:02X},x) | {:02X}", high, low, self.cpu.a); + log!( + "{addr:04X}: ORA (${:02X}{:02X},x) | {:02X}", + high, + low, + self.cpu.a + ); }), 0x11 => inst!("ORA (ind),y", 4, |off| { let low = self.read_abs(off, 0); @@ -1240,7 +1483,12 @@ impl NES { self.cpu.a |= self.read(u16::from_le_bytes([low, high]) + self.cpu.y as u16); self.cpu.status.set_zero(self.cpu.a == 0); self.cpu.status.set_negative(self.cpu.a & 0x80 == 0x80); - log!("{addr:04X}: ORA (${:02X}{:02X}),y | {:02X}", high, low, self.cpu.a); + log!( + "{addr:04X}: ORA (${:02X}{:02X}),y | {:02X}", + high, + low, + self.cpu.a + ); }), 0x29 => inst!("AND imm", 0, |val| { self.cpu.a &= val; @@ -1264,19 +1512,34 @@ impl NES { self.cpu.a &= self.read_abs(low, high); self.cpu.status.set_zero(self.cpu.a == 0); self.cpu.status.set_negative(self.cpu.a & 0x80 == 0x80); - log!("{addr:04X}: AND ${:02X}{:02X} | {:02X}", high, low, self.cpu.a); + log!( + "{addr:04X}: AND ${:02X}{:02X} | {:02X}", + high, + low, + self.cpu.a + ); }), 0x3D => inst!("AND abs,x", 2, |low, high| { self.cpu.a &= self.read_abs_x(low, high); self.cpu.status.set_zero(self.cpu.a == 0); self.cpu.status.set_negative(self.cpu.a & 0x80 == 0x80); - log!("{addr:04X}: AND ${:02X}{:02X},x | {:02X}", high, low, self.cpu.a); + log!( + "{addr:04X}: AND ${:02X}{:02X},x | {:02X}", + high, + low, + self.cpu.a + ); }), 0x39 => inst!("AND abs,y", 1, |low, high| { self.cpu.a &= self.read_abs_y(low, high); self.cpu.status.set_zero(self.cpu.a == 0); self.cpu.status.set_negative(self.cpu.a & 0x80 == 0x80); - log!("{addr:04X}: AND ${:02X}{:02X},y | {:02X}", high, low, self.cpu.a); + log!( + "{addr:04X}: AND ${:02X}{:02X},y | {:02X}", + high, + low, + self.cpu.a + ); }), 0x21 => inst!("AND (ind,x)", 4, |off| { let low = self.read_zp_x(off); @@ -1284,7 +1547,12 @@ impl NES { self.cpu.a &= self.read_abs(low, high); self.cpu.status.set_zero(self.cpu.a == 0); self.cpu.status.set_negative(self.cpu.a & 0x80 == 0x80); - log!("{addr:04X}: AND (${:02X}{:02X},x) | {:02X}", high, low, self.cpu.a); + log!( + "{addr:04X}: AND (${:02X}{:02X},x) | {:02X}", + high, + low, + self.cpu.a + ); }), 0x31 => inst!("AND (ind),y", 4, |off| { let low = self.read_abs(off, 0); @@ -1292,7 +1560,12 @@ impl NES { self.cpu.a &= self.read(u16::from_le_bytes([low, high]) + self.cpu.y as u16); self.cpu.status.set_zero(self.cpu.a == 0); self.cpu.status.set_negative(self.cpu.a & 0x80 == 0x80); - log!("{addr:04X}: AND (${:02X}{:02X}),y | {:02X}", high, low, self.cpu.a); + log!( + "{addr:04X}: AND (${:02X}{:02X}),y | {:02X}", + high, + low, + self.cpu.a + ); }), 0x49 => inst!("EOR imm", 0, |val| { self.cpu.a ^= val; @@ -1316,19 +1589,34 @@ impl NES { self.cpu.a ^= self.read_abs(low, high); self.cpu.status.set_zero(self.cpu.a == 0); self.cpu.status.set_negative(self.cpu.a & 0x80 == 0x80); - log!("{addr:04X}: EOR ${:02X}{:02X} | {:02X}", high, low, self.cpu.a); + log!( + "{addr:04X}: EOR ${:02X}{:02X} | {:02X}", + high, + low, + self.cpu.a + ); }), 0x5D => inst!("EOR abs,x", 1, |low, high| { self.cpu.a ^= self.read_abs_x(low, high); self.cpu.status.set_zero(self.cpu.a == 0); self.cpu.status.set_negative(self.cpu.a & 0x80 == 0x80); - log!("{addr:04X}: EOR ${:02X}{:02X},x | {:02X}", high, low, self.cpu.a); + log!( + "{addr:04X}: EOR ${:02X}{:02X},x | {:02X}", + high, + low, + self.cpu.a + ); }), 0x59 => inst!("EOR abs,y", 1, |low, high| { self.cpu.a ^= self.read_abs_y(low, high); self.cpu.status.set_zero(self.cpu.a == 0); self.cpu.status.set_negative(self.cpu.a & 0x80 == 0x80); - log!("{addr:04X}: EOR ${:02X}{:02X},y | {:02X}", high, low, self.cpu.a); + log!( + "{addr:04X}: EOR ${:02X}{:02X},y | {:02X}", + high, + low, + self.cpu.a + ); }), 0x41 => inst!("EOR (ind,x)", 4, |off| { let low = self.read_zp_x(off); @@ -1336,7 +1624,12 @@ impl NES { self.cpu.a ^= self.read_abs(low, high); self.cpu.status.set_zero(self.cpu.a == 0); self.cpu.status.set_negative(self.cpu.a & 0x80 == 0x80); - log!("{addr:04X}: EOR (${:02X}{:02X},x) | {:02X}", high, low, self.cpu.a); + log!( + "{addr:04X}: EOR (${:02X}{:02X},x) | {:02X}", + high, + low, + self.cpu.a + ); }), 0x51 => inst!("EOR (ind),y", 3, |off| { let low = self.read_abs(off, 0); @@ -1344,21 +1637,31 @@ impl NES { self.cpu.a ^= self.read(u16::from_le_bytes([low, high]) + self.cpu.y as u16); self.cpu.status.set_zero(self.cpu.a == 0); self.cpu.status.set_negative(self.cpu.a & 0x80 == 0x80); - log!("{addr:04X}: EOR (${:02X}{:02X}),y | {:02X}", high, low, self.cpu.a); + log!( + "{addr:04X}: EOR (${:02X}{:02X}),y | {:02X}", + high, + low, + self.cpu.a + ); }), 0x24 => inst!("BIT zp", 1, |off| { - let val = self.cpu.a & self.read_abs(off, 0); + let val = self.read_abs(off, 0); self.cpu.status.set_zero(val == 0); self.cpu.status.set_overflow(val & 0x40 == 0x40); self.cpu.status.set_negative(val & 0x80 == 0x80); - log!("{addr:04X}: BIT ${:02X} | {:02X}", off, self.cpu.a); + log!("{addr:04X}: BIT ${:02X} | {:02X}", off, val); }), 0x2C => inst!("BIT abs", 1, |low, high| { - let val = self.cpu.a & self.read_abs(low, high); + let val = self.read_abs(low, high); self.cpu.status.set_zero(val == 0); self.cpu.status.set_overflow(val & 0x40 == 0x40); self.cpu.status.set_negative(val & 0x80 == 0x80); - log!("{addr:04X}: BIT ${:02X}{:02X} | {:02X}", high, low, self.cpu.a); + log!( + "{addr:04X}: BIT ${:02X}{:02X} | {:02X}", + high, + low, + val + ); }), // Shifts @@ -1394,7 +1697,12 @@ impl NES { self.cpu.status.set_zero(val == 0); self.cpu.status.set_negative(false); self.write_abs(low, high, val); - log!("{addr:04X}: LSR ${:02X}{:02X} | {:02X}", high, low, self.cpu.a); + log!( + "{addr:04X}: LSR ${:02X}{:02X} | {:02X}", + high, + low, + self.cpu.a + ); }), 0x5E => inst!("LSR abs,x", 4, |low, high| { let val = self.read_abs_x(low, high); @@ -1403,7 +1711,12 @@ impl NES { self.cpu.status.set_zero(val == 0); self.cpu.status.set_negative(false); self.write_abs_x(low, high, val); - log!("{addr:04X}: LSR ${:02X}{:02X},x | {:02X}", high, low, self.cpu.a); + log!( + "{addr:04X}: LSR ${:02X}{:02X},x | {:02X}", + high, + low, + self.cpu.a + ); }), 0x0A => inst!("ASL A", 1, || { self.cpu.status.set_carry(self.cpu.a & 0x80 == 0x80); @@ -1437,7 +1750,12 @@ impl NES { self.cpu.status.set_zero(val == 0); self.cpu.status.set_negative(false); self.write_abs(low, high, val); - log!("{addr:04X}: ASL ${:02X}{:02X} | {:02X}", high, low, self.cpu.a); + log!( + "{addr:04X}: ASL ${:02X}{:02X} | {:02X}", + high, + low, + self.cpu.a + ); }), 0x1E => inst!("ASL abs,x", 4, |low, high| { let val = self.read_abs_x(low, high); @@ -1446,7 +1764,12 @@ impl NES { self.cpu.status.set_zero(val == 0); self.cpu.status.set_negative(false); self.write_abs_x(low, high, val); - log!("{addr:04X}: ASL ${:02X}{:02X},x | {:02X}", high, low, self.cpu.a); + log!( + "{addr:04X}: ASL ${:02X}{:02X},x | {:02X}", + high, + low, + self.cpu.a + ); }), 0x6A => inst!("ROR A", 1, || { let old_carry = if self.cpu.status.carry() { 0x80 } else { 0x00 }; @@ -1484,7 +1807,12 @@ impl NES { self.cpu.status.set_zero(val == 0); self.cpu.status.set_negative(false); self.write_abs(low, high, val); - log!("{addr:04X}: ROR ${:02X}{:02X} | {:02X}", high, low, self.cpu.a); + log!( + "{addr:04X}: ROR ${:02X}{:02X} | {:02X}", + high, + low, + self.cpu.a + ); }), 0x7E => inst!("ROR abs,x", 4, |low, high| { let old_carry = if self.cpu.status.carry() { 0x80 } else { 0x00 }; @@ -1494,7 +1822,12 @@ impl NES { self.cpu.status.set_zero(val == 0); self.cpu.status.set_negative(false); self.write_abs_x(low, high, val); - log!("{addr:04X}: ROR ${:02X}{:02X},x | {:02X}", high, low, self.cpu.a); + log!( + "{addr:04X}: ROR ${:02X}{:02X},x | {:02X}", + high, + low, + self.cpu.a + ); }), 0x2A => inst!("ROL A", 1, || { let old_carry = if self.cpu.status.carry() { 0x01 } else { 0x00 }; @@ -1532,7 +1865,12 @@ impl NES { self.cpu.status.set_zero(val == 0); self.cpu.status.set_negative(false); self.write_abs(low, high, val); - log!("{addr:04X}: ROL ${:02X}{:02X} | {:02X}", high, low, self.cpu.a); + log!( + "{addr:04X}: ROL ${:02X}{:02X} | {:02X}", + high, + low, + self.cpu.a + ); }), 0x3E => inst!("ROL abs,x", 4, |low, high| { let old_carry = if self.cpu.status.carry() { 0x01 } else { 0x00 }; @@ -1542,7 +1880,12 @@ impl NES { self.cpu.status.set_zero(val == 0); self.cpu.status.set_negative(false); self.write_abs_x(low, high, val); - log!("{addr:04X}: ROL ${:02X}{:02X},x | {:02X}", high, low, self.cpu.a); + log!( + "{addr:04X}: ROL ${:02X}{:02X},x | {:02X}", + high, + low, + self.cpu.a + ); }), 0xEA => inst!("NOP", 1, || { @@ -1556,6 +1899,13 @@ impl NES { self.peek(self.cpu.pc) } + pub fn peek_nmi(&self) -> bool { + self.ppu.peek_nmi() || self.apu.peek_nmi() + } + pub fn peek_irq(&self) -> bool { + self.ppu.peek_irq() || self.apu.peek_irq() + } + fn clock_cpu(&mut self) { self.cpu.clock_state = match self.cpu.clock_state { ClockState::HoldNmi { cycles } => { diff --git a/src/main.rs b/src/main.rs index d3f5ac8..570f73c 100644 --- a/src/main.rs +++ b/src/main.rs @@ -1,15 +1,12 @@ use std::{ collections::HashMap, fmt, - io::{Read, stdin}, }; use iced::{ Color, Element, Font, Length::Fill, - Point, Renderer, Size, Subscription, Task, Theme, Vector, - futures::io::Window, - mouse, + Point, Renderer, Size, Subscription, Task, Theme, mouse, widget::{ Canvas, button, canvas::{Frame, Program}, @@ -18,13 +15,13 @@ use iced::{ window::{self, Id, Settings}, }; use nes_emu::{ - NES, PPU, RenderBuffer, - header_menu::header_menu, - hex_view::{self, HexEvent, HexView}, + debugger::{DebuggerMessage, DebuggerState}, header_menu::header_menu, hex_view::{HexEvent, HexView}, NES, PPU }; -use tracing::{debug, info}; use tracing_subscriber::EnvFilter; +const ROM_FILE: &str = concat!(env!("ROM_DIR"), "/", "basic_init_1.nes"); +// const ROM_FILE: &str = "./Super Mario Bros. (World).nes"; + extern crate nes_emu; fn main() -> Result<(), iced::Error> { @@ -32,16 +29,11 @@ fn main() -> Result<(), iced::Error> { .with_env_filter(EnvFilter::from_default_env()) .init(); - iced::daemon(Emulator::title, Emulator::update, Emulator::view) + iced::daemon(Emulator::new, Emulator::update, Emulator::view) .subscription(Emulator::subscriptions) - .theme(|_, _| Theme::Dark) - .run_with(Emulator::new) - - // iced::application(title, Emulator::update, Emulator::view) - // .subscription(Emulator::subscriptions) - // .theme(|_| Theme::Dark) - // .centered() - // .run() + .theme(Theme::Dark) + .title(Emulator::title) + .run() } enum MemoryTy { @@ -53,6 +45,7 @@ enum WindowType { Memory(MemoryTy, HexView), TileMap, TileViewer, + Debugger, } #[derive(Debug, Clone, PartialEq, Eq)] @@ -60,6 +53,7 @@ enum HeaderButton { OpenMemory, OpenTileMap, OpenTileViewer, + OpenDebugger, Reset, PowerCycle, } @@ -70,6 +64,7 @@ impl fmt::Display for HeaderButton { Self::OpenMemory => write!(f, "Open Memory Viewer"), Self::OpenTileMap => write!(f, "Open TileMap Viewer"), Self::OpenTileViewer => write!(f, "Open Tile Viewer"), + Self::OpenDebugger => write!(f, "Open Debugger"), Self::Reset => write!(f, "Reset"), Self::PowerCycle => write!(f, "Power Cycle"), } @@ -79,6 +74,7 @@ impl fmt::Display for HeaderButton { struct Emulator { nes: NES, windows: HashMap, + debugger: DebuggerState, } #[derive(Debug, Clone)] @@ -92,13 +88,12 @@ enum Message { WindowClosed(Id), Header(HeaderButton), Hex(Id, HexEvent), + Debugger(DebuggerMessage), } impl Emulator { fn new() -> (Self, Task) { - let rom_file = concat!(env!("ROM_DIR"), "/", "basic_init_1.nes"); - // let rom_file = "./Super Mario Bros. (World).nes"; - let mut nes = nes_emu::NES::load_nes_file(rom_file) + let mut nes = nes_emu::NES::load_nes_file(ROM_FILE) .expect("Failed to load nes file"); nes.reset(); let (win, task) = iced::window::open(Settings::default()); @@ -106,6 +101,7 @@ impl Emulator { Self { nes, windows: HashMap::from_iter([(win, WindowType::Main)]), + debugger: DebuggerState::new(), }, task.map(Message::WindowOpened), ) @@ -116,6 +112,7 @@ impl Emulator { Some(WindowType::Memory(_, _)) => "NES MemoryView".into(), Some(WindowType::TileMap) => "NES TileMap".into(), Some(WindowType::TileViewer) => "NES Tile Viewer".into(), + Some(WindowType::Debugger) => "NES Debugger".into(), None => todo!(), } } @@ -129,38 +126,42 @@ impl Emulator { fn update(&mut self, message: Message) -> Task { match message { Message::Tick(count) => { - for _ in 0..count { - self.nes.run_one_clock_cycle(); - } - } + for _ in 0..count { + self.nes.run_one_clock_cycle(); + } + } Message::Frame => while !self.nes.run_one_clock_cycle().ppu_frame {}, Message::DMA => while !self.nes.run_one_clock_cycle().dma {}, Message::CPU => while !self.nes.run_one_clock_cycle().cpu_exec {}, Message::DebugInt => while !self.nes.run_one_clock_cycle().dbg_int {}, - Message::WindowOpened(id) => { - // Window - } + Message::WindowOpened(_id) => { + // Window + } Message::WindowClosed(id) => { - if let Some(WindowType::Main) = self.windows.remove(&id) { - return iced::exit(); - } - } + if let Some(WindowType::Main) = self.windows.remove(&id) { + return iced::exit(); + } + } Message::Header(HeaderButton::OpenMemory) => { - return self.open(WindowType::Memory(MemoryTy::Cpu, HexView::new())); - } + return self.open(WindowType::Memory(MemoryTy::Cpu, HexView::new())); + } Message::Header(HeaderButton::OpenTileMap) => { - return self.open(WindowType::TileMap); - } + return self.open(WindowType::TileMap); + } Message::Header(HeaderButton::OpenTileViewer) => { - return self.open(WindowType::TileViewer); - } + return self.open(WindowType::TileViewer); + } + Message::Header(HeaderButton::OpenDebugger) => { + return self.open(WindowType::Debugger); + } Message::Hex(id, val) => { - if let Some(WindowType::Memory(_, view)) = self.windows.get_mut(&id) { - return view.update(val).map(move |e| Message::Hex(id, e)); - } - } + if let Some(WindowType::Memory(_, view)) = self.windows.get_mut(&id) { + return view.update(val).map(move |e| Message::Hex(id, e)); + } + } Message::Header(HeaderButton::Reset) => { self.nes.reset(); } Message::Header(HeaderButton::PowerCycle) => { self.nes.power_cycle(); } + Message::Debugger(debugger_message) => self.debugger.update(debugger_message, &mut self.nes), } // self.image.0.clone_from(self.nes.image()); Task::none() @@ -197,7 +198,11 @@ impl Emulator { Some(WindowType::TileViewer) => { container(Canvas::new(DbgImage::NameTable(self.nes.ppu()))).width(Fill).height(Fill).into() } - _ => todo!(), + Some(WindowType::Debugger) => { + container(self.debugger.view(&self.nes).map(Message::Debugger)).width(Fill).height(Fill).into() + } + None => panic!("Window not found"), + // _ => todo!(), } } @@ -235,6 +240,7 @@ impl Emulator { header_menu( "Debugging", [ + HeaderButton::OpenDebugger, HeaderButton::OpenMemory, HeaderButton::OpenTileMap, HeaderButton::OpenTileViewer, @@ -252,13 +258,13 @@ impl Program for Emulator { fn draw( &self, - state: &Self::State, + _state: &Self::State, renderer: &Renderer, - theme: &Theme, - bounds: iced::Rectangle, + _theme: &Theme, + _bounds: iced::Rectangle, _cursor: mouse::Cursor, ) -> Vec> { - const SIZE: f32 = 2.; + // const SIZE: f32 = 2.; let mut frame = Frame::new( renderer, iced::Size { @@ -291,13 +297,13 @@ impl Program for DbgImage<'_> { fn draw( &self, - state: &Self::State, + _state: &Self::State, renderer: &Renderer, - theme: &Theme, - bounds: iced::Rectangle, + _theme: &Theme, + _bounds: iced::Rectangle, _cursor: mouse::Cursor, ) -> Vec> { - const SIZE: f32 = 2.; + // const SIZE: f32 = 2.; let mut name_table_frame = Frame::new(renderer, Size::new(256. * 4. + 260. * 2., 256. * 4.)); name_table_frame.scale(2.); diff --git a/src/ppu.rs b/src/ppu.rs index de6b093..8eb0c24 100644 --- a/src/ppu.rs +++ b/src/ppu.rs @@ -1,5 +1,4 @@ -use iced::{Point, Size, widget::canvas::Frame}; -use iced_graphics::geometry::{Fill, Renderer}; +use iced::{advanced::graphics::geometry::Renderer, widget::canvas::{Fill, Frame}, Point, Size}; use crate::{hex_view::Memory, mem::{MemoryMap, Segment}}; @@ -81,7 +80,7 @@ pub struct Background { cur_shift_low: u8, } -struct Mask { +pub struct Mask { grayscale: bool, background_on_left_edge: bool, sprites_on_left_edge: bool, @@ -97,12 +96,12 @@ pub struct PPU { frame_count: usize, nmi_enabled: bool, nmi_waiting: bool, - even: bool, - scanline: usize, - pixel: usize, + pub even: bool, + pub scanline: usize, + pub pixel: usize, - mask: Mask, - vblank: bool, + pub mask: Mask, + pub vblank: bool, pub(crate) memory: MemoryMap, background: Background, @@ -191,6 +190,7 @@ impl PPU { let tmp = if self.vblank { 0b1000_0000 } else { 0 }; self.vblank = false; self.background.w = false; + println!("Reading status: {:02X}", tmp); tmp } 3 => panic!("oamaddr is write-only"), @@ -357,6 +357,9 @@ impl PPU { return false; } + pub fn peek_nmi(&self) -> bool { + self.nmi_waiting + } pub fn nmi_waiting(&mut self) -> bool { if self.nmi_waiting { self.nmi_waiting = false; @@ -365,6 +368,9 @@ impl PPU { return false; } } + pub fn peek_irq(&self) -> bool { + self.nmi_waiting + } pub fn irq_waiting(&mut self) -> bool { false } diff --git a/src/test_roms/mod.rs b/src/test_roms/mod.rs index 51a44f4..1f302e3 100644 --- a/src/test_roms/mod.rs +++ b/src/test_roms/mod.rs @@ -54,9 +54,10 @@ rom_test!(basic_init_0, "basic_init_0.nes", |nes| { }); rom_test!(basic_init_1, "basic_init_1.nes", |nes| { - assert_eq!(nes.last_instruction, "0x8017 HLT :2 []"); - assert_eq!(nes.cycle, 41); - assert_eq!(nes.cpu.pc, 0x8018); + assert_eq!(nes.last_instruction, "0x801C HLT :2 []"); + assert_eq!(nes.cycle, 27403); + assert_eq!(nes.ppu.pixel, 30); + assert_eq!(nes.cpu.pc, 0x801D); assert_eq!(nes.cpu.sp, 0xFF); assert_eq!(nes.cpu.a, 0x00); assert_eq!(nes.cpu.x, 0x00);