From 8702cddf44e48a5dcdb294a17fe353557ab58224 Mon Sep 17 00:00:00 2001 From: trimill Date: Fri, 30 Aug 2024 10:02:02 -0400 Subject: [PATCH] update --- Cargo.lock | 852 +++++++++++++++---------- Cargo.toml | 2 +- README.md | 9 + cxgraph-web/index.js | 20 +- libcxgraph/Cargo.toml | 1 + libcxgraph/src/language/ast.rs | 23 +- libcxgraph/src/language/builtins.rs | 104 ++- libcxgraph/src/language/compiler.rs | 44 +- libcxgraph/src/language/syntax.lalrpop | 43 +- libcxgraph/src/language/token.rs | 99 ++- libcxgraph/src/renderer/fragment.wgsl | 141 ++-- 11 files changed, 820 insertions(+), 518 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 66cedf3..5057768 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -4,9 +4,9 @@ version = 3 [[package]] name = "ab_glyph" -version = "0.2.21" +version = "0.2.28" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5110f1c78cf582855d895ecd0746b653db010cec6d9f5575293f27934d980a39" +checksum = "79faae4620f45232f599d9bc7b290f88247a0834162c4495ab2f02d60004adfb" dependencies = [ "ab_glyph_rasterizer", "owned_ttf_parser", @@ -20,9 +20,9 @@ checksum = "c71b1793ee61086797f5c80b6efa2b8ffa6d5dd703f118545808a7f2e27f7046" [[package]] name = "addr2line" -version = "0.19.0" +version = "0.22.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a76fd60b23679b7d19bd066031410fb7e458ccc5e958eb5c325888ce4baedc97" +checksum = "6e4503c46a5c0c7844e948c9a4d6acd9f50cccb4de1c48eb9e291ea17470c678" dependencies = [ "gimli", ] @@ -34,30 +34,43 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f26201604c87b1e01bd3d98f8d5d9a8fcbb815e8cedb41ffccbeb4bf593a35fe" [[package]] -name = "ahash" -version = "0.7.6" +name = "adler2" +version = "2.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fcb51a0695d8f838b1ee009b3fbf66bda078cd64590202a864a8f3e8c4315c47" +checksum = "512761e0bb2578dd7380c6baaa0f4ce03e84f95e960231d1dec8bf4d7d6e2627" + +[[package]] +name = "ahash" +version = "0.8.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e89da841a80418a9b391ebaea17f5c112ffaaa96f621d2c285b5174da76b9011" dependencies = [ - "getrandom", + "cfg-if", "once_cell", "version_check", + "zerocopy", ] [[package]] name = "aho-corasick" -version = "1.0.2" +version = "1.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "43f6cb1bf222025340178f382c426f13757b2960e89779dfcb319c32542a5a41" +checksum = "8e60d3430d3a69478ad0993f19238d2df97c507009a52b3c10addcd7f6bcb916" dependencies = [ "memchr", ] [[package]] -name = "android-activity" -version = "0.4.1" +name = "allocator-api2" +version = "0.2.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7c77a0045eda8b888c76ea473c2b0515ba6f471d318f8927c5c72240937035a6" +checksum = "5c6cb57a04249c6480766f7f7cef5467412af1490f8d1e243141daddada3264f" + +[[package]] +name = "android-activity" +version = "0.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "64529721f27c2314ced0890ce45e469574a73e5e6fdd6e9da1860eb29285f5e0" dependencies = [ "android-properties", "bitflags 1.3.2", @@ -68,7 +81,7 @@ dependencies = [ "ndk", "ndk-context", "ndk-sys", - "num_enum", + "num_enum 0.6.1", ] [[package]] @@ -88,15 +101,15 @@ dependencies = [ [[package]] name = "arrayref" -version = "0.3.7" +version = "0.3.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6b4930d2cb77ce62f89ee5d5289b4ac049559b1c45539271f5ed4fdc7db34545" +checksum = "9d151e35f61089500b617991b791fc8bfd237ae50cd5950803758a179b41e67a" [[package]] name = "arrayvec" -version = "0.7.2" +version = "0.7.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8da52d66c7071e2e3fa2a1e5c6d088fec47b593032b254f5e980de8ea54454d6" +checksum = "7c02d123df017efcdfbd739ef81735b36c5ba83ec3c59c80a9d7ecc718f92e50" [[package]] name = "ascii-canvas" @@ -118,21 +131,21 @@ dependencies = [ [[package]] name = "autocfg" -version = "1.1.0" +version = "1.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d468802bab17cbc0cc575e9b053f41e72aa36bfa6b7f55e3529ffa43161b97fa" +checksum = "0c4b4d0bd25bd0b74681c0ad21497610ce1b7c91b1022cd21c80c6fbdd9476b0" [[package]] name = "backtrace" -version = "0.3.67" +version = "0.3.73" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "233d376d6d185f2a3093e58f283f60f880315b6c60075b01f36b3b85154564ca" +checksum = "5cc23269a4f8976d0a4d2e7109211a419fe30e8d88d677cd60b6bc79c5732e0a" dependencies = [ "addr2line", "cc", "cfg-if", "libc", - "miniz_oxide 0.6.2", + "miniz_oxide 0.7.4", "object", "rustc-demangle", ] @@ -160,9 +173,9 @@ checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" [[package]] name = "bitflags" -version = "2.3.1" +version = "2.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6776fc96284a0bb647b615056fc496d1fe1644a7ab01829818a6d91cae888b84" +checksum = "b048fb63fd8b5923fc5aa7b340d8e156aec7ec02f0c78fa8a6ddc2613f6f71de" [[package]] name = "block" @@ -191,15 +204,15 @@ dependencies = [ [[package]] name = "bumpalo" -version = "3.13.0" +version = "3.16.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a3e2c3daef883ecc1b5d58c15adae93470a91d425f3532ba1695849656af3fc1" +checksum = "79296716171880943b8470b5f8d03aa55eb2e645a4874bdbb28adb49162e012c" [[package]] name = "bytemuck" -version = "1.13.1" +version = "1.17.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "17febce684fd15d89027105661fec94afb475cb995fbc59d2865198446ba2eea" +checksum = "773d90827bc3feecfb67fab12e24de0749aad83c74b9504ecde46237b5cd24e2" [[package]] name = "calloop" @@ -217,11 +230,13 @@ dependencies = [ [[package]] name = "cc" -version = "1.0.79" +version = "1.1.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "50d30906286121d95be3d479533b458f87493b30a4b5f79a607db8f5d11aa91f" +checksum = "57b6a275aa2903740dc87da01c62040406b8812552e97129a63ea8850a17c6e6" dependencies = [ "jobserver", + "libc", + "shlex", ] [[package]] @@ -274,9 +289,9 @@ dependencies = [ [[package]] name = "core-foundation" -version = "0.9.3" +version = "0.9.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "194a7a9e6de53fa55116934067c844d9d749312f75c6f6d0980e8c252f8c2146" +checksum = "91e195e091a93c46f7102ec7818a2aa394e1e1771c3ab4825963fa03e45afb8f" dependencies = [ "core-foundation-sys", "libc", @@ -284,9 +299,9 @@ dependencies = [ [[package]] name = "core-foundation-sys" -version = "0.8.4" +version = "0.8.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e496a50fda8aacccc86d7529e2c1e0892dbd0f898a6b5645b5561b89c3210efa" +checksum = "773648b94d0e5d620f64f280777445740e61fe701025087ec8b57f45c791888b" [[package]] name = "core-graphics" @@ -303,21 +318,20 @@ dependencies = [ [[package]] name = "core-graphics-types" -version = "0.1.1" +version = "0.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3a68b68b3446082644c91ac778bf50cd4104bfb002b5a6a7c44cca5a2c70788b" +checksum = "45390e6114f68f718cc7a830514a96f903cccd70d02a8f6d9f643ac4ba45afaf" dependencies = [ "bitflags 1.3.2", "core-foundation", - "foreign-types", "libc", ] [[package]] name = "crc32fast" -version = "1.3.2" +version = "1.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b540bd8bc810d3885c6ea91e2018302f68baba2129ab3e88f32389ee9370880d" +checksum = "a97769d94ddab943e4510d138150169a2758b5ef3eb191a9ee688de3e23ef7b3" dependencies = [ "cfg-if", ] @@ -364,12 +378,6 @@ dependencies = [ "winapi", ] -[[package]] -name = "diff" -version = "0.1.13" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "56254986775e3233ffa9c4d7d3faaf6d36a2c09d30b20687e9f88bc8bafc16c8" - [[package]] name = "dirs-next" version = "2.0.0" @@ -403,35 +411,35 @@ version = "0.5.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "330c60081dcc4c72131f8eb70510f1ac07223e5d4163db481a04a0befcffa412" dependencies = [ - "libloading 0.8.0", + "libloading 0.8.5", ] [[package]] name = "downcast-rs" -version = "1.2.0" +version = "1.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9ea835d29036a4087793836fa931b08837ad5e957da9e23886b29586fb9b6650" +checksum = "75b325c5dbd37f80359721ad39aca5a29fb04c89279657cffdda8736d0c0b9d2" [[package]] name = "either" -version = "1.8.1" +version = "1.13.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7fcaabb2fef8c910e7f4c7ce9f67a1283a1715879a7c230ca9d6d1ae31f16d91" +checksum = "60b1af1c220855b6ceac025d3f6ecdd2b7c4894bfe9cd9bda4fbb4bc7c0d4cf0" [[package]] name = "ena" -version = "0.14.2" +version = "0.14.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c533630cf40e9caa44bd91aadc88a75d75a4c3a12b4cfde353cbed41daa1e1f1" +checksum = "3d248bdd43ce613d87415282f69b9bb99d947d290b10962dd6c56233312c2ad5" dependencies = [ "log", ] [[package]] name = "env_logger" -version = "0.10.0" +version = "0.10.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "85cdab6a89accf66733ad5a1693a4dcced6aeff64602b634530dd73c1f3ee9f0" +checksum = "4cd405aab171cb85d6735e5c8d9db038c17d3ca007a4d2c25f337935c3d90580" dependencies = [ "humantime", "is-terminal", @@ -441,31 +449,16 @@ dependencies = [ ] [[package]] -name = "errno" -version = "0.3.1" +name = "equivalent" +version = "1.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4bcfec3a70f97c962c307b2d2c56e358cf1d00b558d74262b5f929ee8cc7e73a" -dependencies = [ - "errno-dragonfly", - "libc", - "windows-sys 0.48.0", -] - -[[package]] -name = "errno-dragonfly" -version = "0.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "aa68f1b12764fab894d2755d2518754e71b4fd80ecfb822714a1206c2aab39bf" -dependencies = [ - "cc", - "libc", -] +checksum = "5443807d6dff69373d433ab9ef5378ad8df50ca6298caf15de6e52e24aaf54d5" [[package]] name = "fdeflate" -version = "0.3.0" +version = "0.3.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d329bdeac514ee06249dabc27877490f17f5d371ec693360768b838e19f3ae10" +checksum = "4f9bfee30e4dedf0ab8b422f03af778d9612b63f502710fc500a334ebe2de645" dependencies = [ "simd-adler32", ] @@ -478,12 +471,12 @@ checksum = "0ce7134b9999ecaf8bcd65542e436736ef32ddca1b3e06094cb6ec5755203b80" [[package]] name = "flate2" -version = "1.0.26" +version = "1.0.33" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3b9429470923de8e8cbd4d2dc513535400b4b3fef0319fb5c4e1f520a7bef743" +checksum = "324a1be68054ef05ad64b861cc9eaf1d623d2d8cb25b4bf2cb9cdd902b4bf253" dependencies = [ "crc32fast", - "miniz_oxide 0.7.1", + "miniz_oxide 0.8.0", ] [[package]] @@ -503,9 +496,9 @@ checksum = "00b0228411908ca8685dba7fc2cdd70ec9990a6e753e89b6ac91a84c40fbaf4b" [[package]] name = "getrandom" -version = "0.2.10" +version = "0.2.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "be4136b2a15dd319360be1c07d9933517ccf0be8f16bf62a3bee4f0d618df427" +checksum = "c4567c8db10ae91089c99af84c68c38da3ec2f087c3f82960bcdbf3656b6f4d7" dependencies = [ "cfg-if", "libc", @@ -514,15 +507,15 @@ dependencies = [ [[package]] name = "gimli" -version = "0.27.2" +version = "0.29.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ad0a93d233ebf96623465aad4046a8d3aa4da22d4f4beba5388838c8a434bbb4" +checksum = "40ecd4077b5ae9fd2e9e169b102c6c330d0605168eb0e8bf79952b256dbefffd" [[package]] name = "glow" -version = "0.12.2" +version = "0.12.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "807edf58b70c0b5b2181dd39fe1839dbdb3ba02645630dc5f753e23da307f762" +checksum = "ca0fe580e4b60a8ab24a868bc08e2f03cbcb20d3d676601fa909386713333728" dependencies = [ "js-sys", "slotmap", @@ -564,22 +557,22 @@ dependencies = [ [[package]] name = "gpu-descriptor" -version = "0.2.3" +version = "0.2.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0b0c02e1ba0bdb14e965058ca34e09c020f8e507a760df1121728e0aef68d57a" +checksum = "cc11df1ace8e7e564511f53af41f3e42ddc95b56fd07b3f4445d2a6048bc682c" dependencies = [ - "bitflags 1.3.2", + "bitflags 2.6.0", "gpu-descriptor-types", - "hashbrown", + "hashbrown 0.14.5", ] [[package]] name = "gpu-descriptor-types" -version = "0.1.1" +version = "0.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "363e3677e55ad168fef68cf9de3a4a310b53124c5e784c53a1d70e92d23f2126" +checksum = "6bf0b36e6f090b7e1d8a4b49c0cb81c1f8376f72198c65dd3ad9ff3556b8b78c" dependencies = [ - "bitflags 1.3.2", + "bitflags 2.6.0", ] [[package]] @@ -587,8 +580,15 @@ name = "hashbrown" version = "0.12.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8a9ee70c43aaf417c914396645a0fa852624801b24ebb7ae78fe8272889ac888" + +[[package]] +name = "hashbrown" +version = "0.14.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e5274423e17b7c9fc20b6e7e208532f9b19825d82dfd615708b70edd83df41f1" dependencies = [ "ahash", + "allocator-api2", ] [[package]] @@ -608,9 +608,9 @@ dependencies = [ [[package]] name = "hermit-abi" -version = "0.3.1" +version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fed44880c466736ef9a5c5b5facefb5ed0785676d0c02d612db14e54f0d84286" +checksum = "fbf6a919d6cf397374f7dfeeea91d974c7c0a7221d0d0f4f20d859d329e53fcc" [[package]] name = "hexf-parse" @@ -631,14 +631,24 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "bd070e393353796e801d209ad339e89596eb4c8d430d18ede6a1cced8fafbd99" dependencies = [ "autocfg", - "hashbrown", + "hashbrown 0.12.3", +] + +[[package]] +name = "indexmap" +version = "2.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "93ead53efc7ea8ed3cfb0c79fc8023fbb782a5432b52830b6518941cebe6505c" +dependencies = [ + "equivalent", + "hashbrown 0.14.5", ] [[package]] name = "instant" -version = "0.1.12" +version = "0.1.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7a5bbe824c507c5da5956355e86a746d82e0e1464f65d862cc5e71da70e94b2c" +checksum = "e0242819d153cba4b4b05a5a8f2a7e9bbf97b6055b2a002b395c96b5ff3c0222" dependencies = [ "cfg-if", "js-sys", @@ -647,33 +657,21 @@ dependencies = [ ] [[package]] -name = "io-lifetimes" -version = "1.0.11" +name = "is-terminal" +version = "0.4.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eae7b9aee968036d54dce06cebaefd919e4472e753296daccd6d344e3e2df0c2" +checksum = "261f68e344040fbd0edea105bef17c66edf46f984ddb1115b775ce31be948f4b" dependencies = [ "hermit-abi", "libc", - "windows-sys 0.48.0", -] - -[[package]] -name = "is-terminal" -version = "0.4.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "adcf93614601c8129ddf72e2d5633df827ba6551541c6d8c59520a371475be1f" -dependencies = [ - "hermit-abi", - "io-lifetimes", - "rustix", - "windows-sys 0.48.0", + "windows-sys 0.52.0", ] [[package]] name = "itertools" -version = "0.10.5" +version = "0.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b0fd2260e829bddf4cb6ea802289de2f86d6a7a690192fbe91b3f46e0f2c8473" +checksum = "b1c173a5686ce8bfa551b3563d0c2170bf24ca44da99c7ca4bfdab5418c3fe57" dependencies = [ "either", ] @@ -686,18 +684,18 @@ checksum = "8eaf4bc02d17cbdd7ff4c7438cafcdf7fb9a4613313ad11b4f8fefe7d3fa0130" [[package]] name = "jobserver" -version = "0.1.26" +version = "0.1.32" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "936cfd212a0155903bcbc060e316fb6cc7cbf2e1907329391ebadc1fe0ce77c2" +checksum = "48d1dbcbbeb6a7fec7e059840aa538bd62aaccf972c7346c4d9d2059312853d0" dependencies = [ "libc", ] [[package]] name = "js-sys" -version = "0.3.63" +version = "0.3.70" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2f37a4a5928311ac501dee68b3c7613a1037d0edb30c8e5427bd832d55d1b790" +checksum = "1868808506b929d7b0cfa8f75951347aa71bb21144b7791bae35d9bccfcfe37a" dependencies = [ "wasm-bindgen", ] @@ -715,15 +713,13 @@ dependencies = [ [[package]] name = "lalrpop" -version = "0.20.0" +version = "0.20.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "da4081d44f4611b66c6dd725e6de3169f9f63905421e8626fcb86b6a898998b8" +checksum = "55cb077ad656299f160924eb2912aa147d7339ea7d69e1b5517326fdcec3c1ca" dependencies = [ "ascii-canvas", "bit-set", - "diff", "ena", - "is-terminal", "itertools", "lalrpop-util", "petgraph", @@ -734,28 +730,29 @@ dependencies = [ "term", "tiny-keccak", "unicode-xid", + "walkdir", ] [[package]] name = "lalrpop-util" -version = "0.20.0" +version = "0.20.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3f35c735096c0293d313e8f2a641627472b83d01b937177fe76e5e2708d31e0d" +checksum = "507460a910eb7b32ee961886ff48539633b788a36b65692b95f225b844c82553" dependencies = [ - "regex", + "regex-automata", ] [[package]] name = "lazy_static" -version = "1.4.0" +version = "1.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646" +checksum = "bbd2bcb4c963f2ddae06a2efc7e9f3591312473c50c6685e1f298068316e66fe" [[package]] name = "libc" -version = "0.2.146" +version = "0.2.158" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f92be4933c13fd498862a9e02a3055f8a8d9c039ce33db97306fd5a6caa7f29b" +checksum = "d8adc4bb1803a324070e64a98ae98f38934d91957a99cfb3a43dcbc01bc56439" [[package]] name = "libcxgraph" @@ -766,6 +763,7 @@ dependencies = [ "log", "num-complex", "raw-window-handle", + "unicode-xid", "wgpu", ] @@ -781,25 +779,40 @@ dependencies = [ [[package]] name = "libloading" -version = "0.8.0" +version = "0.8.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d580318f95776505201b28cf98eb1fa5e4be3b689633ba6a3e6cd880ff22d8cb" +checksum = "4979f22fdb869068da03c9f7528f8297c6fd2606bc3a4affe42e6a823fdb8da4" dependencies = [ "cfg-if", - "windows-sys 0.48.0", + "windows-targets 0.52.6", ] [[package]] -name = "linux-raw-sys" -version = "0.3.8" +name = "libredox" +version = "0.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ef53942eb7bf7ff43a617b3e2c1c4a5ecf5944a7c1bc12d7ee39bbb15e5c1519" +checksum = "3af92c55d7d839293953fcd0fda5ecfe93297cfde6ffbdec13b41d99c0ba6607" +dependencies = [ + "bitflags 2.6.0", + "libc", + "redox_syscall 0.4.1", +] + +[[package]] +name = "libredox" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c0ff37bd590ca25063e35af745c343cb7a0271906fb7b37e4813e8f79f00268d" +dependencies = [ + "bitflags 2.6.0", + "libc", +] [[package]] name = "lock_api" -version = "0.4.10" +version = "0.4.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c1cc9717a20b1bb222f333e6a92fd32f7d8a18ddc5a3191a11af45dcbf4dcd16" +checksum = "07af8b9cdd281b7915f413fa73f29ebd5d55d0d3f0155584dade1ff18cea1b17" dependencies = [ "autocfg", "scopeguard", @@ -807,9 +820,9 @@ dependencies = [ [[package]] name = "log" -version = "0.4.18" +version = "0.4.22" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "518ef76f2f87365916b142844c16d8fefd85039bc5699050210a7778ee1cd1de" +checksum = "a7a70ba024b9dc04c27ea2f0c0548feb474ec5c54bba33a7f72f873a39d07b24" [[package]] name = "malloc_buf" @@ -822,9 +835,9 @@ dependencies = [ [[package]] name = "memchr" -version = "2.5.0" +version = "2.7.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2dffe52ecf27772e601905b7522cb4ef790d2cc203488bbd0e2fe85fcb74566d" +checksum = "78ca9ab1a0babb1e7d5695e3530886289c18cf2f87ec19a575a0abdce112e3a3" [[package]] name = "memmap2" @@ -858,36 +871,30 @@ dependencies = [ "objc", ] -[[package]] -name = "minimal-lexical" -version = "0.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "68354c5c6bd36d73ff3feceb05efa59b6acb7626617f4962be322a825e61f79a" - [[package]] name = "miniz_oxide" -version = "0.6.2" +version = "0.7.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b275950c28b37e794e8c55d88aeb5e139d0ce23fdbbeda68f8d7174abdf9e8fa" -dependencies = [ - "adler", -] - -[[package]] -name = "miniz_oxide" -version = "0.7.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e7810e0be55b428ada41041c41f32c9f1a42817901b4ccf45fa3d4b6561e74c7" +checksum = "b8a240ddb74feaf34a79a7add65a741f3167852fba007066dcac1ca548d89c08" dependencies = [ "adler", "simd-adler32", ] [[package]] -name = "mio" -version = "0.8.8" +name = "miniz_oxide" +version = "0.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "927a765cd3fc26206e66b296465fa9d3e5ab003e651c1b3c060e7956d96b19d2" +checksum = "e2d80299ef12ff69b16a84bb182e3b9df68b5a91574d3d4fa6e41b65deec4df1" +dependencies = [ + "adler2", +] + +[[package]] +name = "mio" +version = "0.8.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a4a650543ca06a924e8b371db273b2756685faae30f8487da1b56505a8f78b0c" dependencies = [ "libc", "log", @@ -897,15 +904,15 @@ dependencies = [ [[package]] name = "naga" -version = "0.12.2" +version = "0.12.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "80cd00bd6180a8790f1c020ed258a46b8d73dd5bd6af104a238c9d71f806938e" +checksum = "bbcc2e0513220fd2b598e6068608d4462db20322c0e77e47f6f488dfcfc279cb" dependencies = [ "bit-set", "bitflags 1.3.2", "codespan-reporting", "hexf-parse", - "indexmap", + "indexmap 1.9.3", "log", "num-traits", "rustc-hash", @@ -924,7 +931,7 @@ dependencies = [ "bitflags 1.3.2", "jni-sys", "ndk-sys", - "num_enum", + "num_enum 0.5.11", "raw-window-handle", "thiserror", ] @@ -946,9 +953,9 @@ dependencies = [ [[package]] name = "new_debug_unreachable" -version = "1.0.4" +version = "1.0.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e4a24736216ec316047a1fc4252e27dabb04218aa4a3f37c6e7ddbf1f9782b54" +checksum = "650eef8c711430f1a879fdd01d4745a7deea475becfb90269c06775983bbf086" [[package]] name = "nix" @@ -975,30 +982,20 @@ dependencies = [ "memoffset", ] -[[package]] -name = "nom" -version = "7.1.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d273983c5a657a70a3e8f2a01329822f3b8c8172b73826411a55751e404a0a4a" -dependencies = [ - "memchr", - "minimal-lexical", -] - [[package]] name = "num-complex" -version = "0.4.3" +version = "0.4.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "02e0d21255c828d6f128a1e41534206671e8c3ea0c62f32291e808dc82cff17d" +checksum = "73f88a1307638156682bada9d7604135552957b7818057dcef22705b4d509495" dependencies = [ "num-traits", ] [[package]] name = "num-traits" -version = "0.2.15" +version = "0.2.19" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "578ede34cf02f8924ab9447f50c28075b4d3e5b269972345e7e0372b38c6cdcd" +checksum = "071dfc062690e90b734c0b2273ce72ad0ffa95f0c74596bc250dcfd960262841" dependencies = [ "autocfg", ] @@ -1009,7 +1006,16 @@ version = "0.5.11" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1f646caf906c20226733ed5b1374287eb97e3c2a5c227ce668c1f2ce20ae57c9" dependencies = [ - "num_enum_derive", + "num_enum_derive 0.5.11", +] + +[[package]] +name = "num_enum" +version = "0.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7a015b430d3c108a207fd776d2e2196aaf8b1cf8cf93253e3a097ff3085076a1" +dependencies = [ + "num_enum_derive 0.6.1", ] [[package]] @@ -1024,6 +1030,18 @@ dependencies = [ "syn 1.0.109", ] +[[package]] +name = "num_enum_derive" +version = "0.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "96667db765a921f7b295ffee8b60472b686a51d4f21c2ee4ffdb94c7013b65a6" +dependencies = [ + "proc-macro-crate", + "proc-macro2", + "quote", + "syn 2.0.76", +] + [[package]] name = "objc" version = "0.2.7" @@ -1071,42 +1089,42 @@ dependencies = [ [[package]] name = "object" -version = "0.30.4" +version = "0.36.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "03b4680b86d9cfafba8fc491dc9b6df26b68cf40e9e6cd73909194759a63c385" +checksum = "084f1a5821ac4c651660a94a7153d27ac9d8a53736203f58b31945ded098070a" dependencies = [ "memchr", ] [[package]] name = "once_cell" -version = "1.18.0" +version = "1.19.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dd8b5dd2ae5ed71462c540258bedcb51965123ad7e7ccf4b9a8cafaa4a63576d" +checksum = "3fdb12b2476b595f9358c5161aa467c2438859caa136dec86c26fdd2efe17b92" [[package]] name = "orbclient" -version = "0.3.45" +version = "0.3.47" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "221d488cd70617f1bd599ed8ceb659df2147d9393717954d82a0f5e8032a6ab1" +checksum = "52f0d54bde9774d3a51dcf281a5def240c71996bc6ca05d2c847ec8b2b216166" dependencies = [ - "redox_syscall 0.3.5", + "libredox 0.0.2", ] [[package]] name = "owned_ttf_parser" -version = "0.19.0" +version = "0.24.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "706de7e2214113d63a8238d1910463cfce781129a6f263d13fdb09ff64355ba4" +checksum = "490d3a563d3122bf7c911a59b0add9389e5ec0f5f0c3ac6b91ff235a0e6a7f90" dependencies = [ "ttf-parser", ] [[package]] name = "parking_lot" -version = "0.12.1" +version = "0.12.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3742b2c103b9f06bc9fff0a37ff4912935851bee6d36f3c02bcc755bcfec228f" +checksum = "f1bf18183cf54e8d6059647fc3063646a1801cf30896933ec2311622cc4b9a27" dependencies = [ "lock_api", "parking_lot_core", @@ -1114,31 +1132,31 @@ dependencies = [ [[package]] name = "parking_lot_core" -version = "0.9.8" +version = "0.9.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "93f00c865fe7cabf650081affecd3871070f26767e7b2070a3ffae14c654b447" +checksum = "1e401f977ab385c9e4e3ab30627d6f26d00e2c73eef317493c4ec6d468726cf8" dependencies = [ "cfg-if", "libc", - "redox_syscall 0.3.5", + "redox_syscall 0.5.3", "smallvec", - "windows-targets 0.48.0", + "windows-targets 0.52.6", ] [[package]] name = "percent-encoding" -version = "2.3.0" +version = "2.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9b2a4787296e9989611394c33f193f676704af1686e70b8f8033ab5ba9a35a94" +checksum = "e3148f5046208a5d56bcfc03053e3ca6334e51da8dfb19b6cdc8b306fae3283e" [[package]] name = "petgraph" -version = "0.6.3" +version = "0.6.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4dd7d28ee937e54fe3080c91faa1c3a46c06de6252988a7f4592ba2310ef22a4" +checksum = "b4c5cc86750666a3ed20bdaf5ca2a0344f9c67674cae0515bec2da16fbaa47db" dependencies = [ "fixedbitset", - "indexmap", + "indexmap 2.4.0", ] [[package]] @@ -1158,21 +1176,21 @@ checksum = "5be167a7af36ee22fe3115051bc51f6e6c7054c9348e28deb4f49bd6f705a315" [[package]] name = "pkg-config" -version = "0.3.27" +version = "0.3.30" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "26072860ba924cbfa98ea39c8c19b4dd6a4a25423dbdf219c1eca91aa0cf6964" +checksum = "d231b230927b5e4ad203db57bbcbee2802f6bce620b1e4a9024a07d94e2907ec" [[package]] name = "png" -version = "0.17.8" +version = "0.17.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "aaeebc51f9e7d2c150d3f3bfeb667f2aa985db5ef1e3d212847bdedb488beeaa" +checksum = "06e4b0d3d1312775e782c86c91a111aa1f910cbb65e1337f9975b5f9a554b5e1" dependencies = [ "bitflags 1.3.2", "crc32fast", "fdeflate", "flate2", - "miniz_oxide 0.7.1", + "miniz_oxide 0.7.4", ] [[package]] @@ -1199,24 +1217,24 @@ dependencies = [ [[package]] name = "proc-macro2" -version = "1.0.60" +version = "1.0.86" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dec2b086b7a862cf4de201096214fa870344cf922b2b30c167badb3af3195406" +checksum = "5e719e8df665df0d1c8fbfd238015744736151d4445ec0836b8e628aae103b77" dependencies = [ "unicode-ident", ] [[package]] name = "profiling" -version = "1.0.8" +version = "1.0.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "332cd62e95873ea4f41f3dfd6bbbfc5b52aec892d7e8d534197c4720a0bbbab2" +checksum = "43d84d1d7a6ac92673717f9f6d1518374ef257669c24ebc5ac25d5033828be58" [[package]] name = "quote" -version = "1.0.28" +version = "1.0.37" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1b9ab9c7eadfd8df19006f1cf1a4aed13540ed5cbc047010ece5826e10825488" +checksum = "b5b9d34b8991d19d98081b46eacdd8eb58c6f2b201139f7c5f643cc155a633af" dependencies = [ "proc-macro2", ] @@ -1233,15 +1251,6 @@ version = "0.5.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f2ff9a1f06a88b01621b7ae906ef0211290d1c8a168a15542486a8f61c0833b9" -[[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.3.5" @@ -1252,21 +1261,51 @@ dependencies = [ ] [[package]] -name = "redox_users" -version = "0.4.3" +name = "redox_syscall" +version = "0.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b033d837a7cf162d7993aded9304e30a83213c648b6e389db233191f891e5c2b" +checksum = "4722d768eff46b75989dd134e5c353f0d6296e5aaa3132e776cbdb56be7731aa" +dependencies = [ + "bitflags 1.3.2", +] + +[[package]] +name = "redox_syscall" +version = "0.5.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2a908a6e00f1fdd0dfd9c0eb08ce85126f6d8bbda50017e74bc4a4b7d4a926a4" +dependencies = [ + "bitflags 2.6.0", +] + +[[package]] +name = "redox_users" +version = "0.4.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ba009ff324d1fc1b900bd1fdb31564febe58a8ccc8a6fdbb93b543d33b13ca43" dependencies = [ "getrandom", - "redox_syscall 0.2.16", + "libredox 0.1.3", "thiserror", ] [[package]] name = "regex" -version = "1.8.4" +version = "1.10.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d0ab3ca65655bb1e41f2a8c8cd662eb4fb035e67c3f78da1d61dffe89d07300f" +checksum = "4219d74c6b67a3654a9fbebc4b419e22126d13d2f3c4a07ee0cb61ff79a79619" +dependencies = [ + "aho-corasick", + "memchr", + "regex-automata", + "regex-syntax", +] + +[[package]] +name = "regex-automata" +version = "0.4.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "38caf58cc5ef2fed281f89292ef23f6365465ed9a41b7a7754eb4e26496c92df" dependencies = [ "aho-corasick", "memchr", @@ -1275,21 +1314,21 @@ dependencies = [ [[package]] name = "regex-syntax" -version = "0.7.2" +version = "0.8.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "436b050e76ed2903236f032a59761c1eb99e1b0aead2c257922771dab1fc8c78" +checksum = "7a66a03ae7c801facd77a29370b4faec201768915ac14a721ba36f20bc9c209b" [[package]] name = "renderdoc-sys" -version = "1.0.0" +version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "216080ab382b992234dda86873c18d4c48358f5cfcb70fd693d7f6f2131b628b" +checksum = "19b30a45b0cd0bcca8037f3d0dc3421eaf95327a17cad11964fb8179b4fc4832" [[package]] name = "rustc-demangle" -version = "0.1.23" +version = "0.1.24" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d626bb9dae77e28219937af045c257c28bfd3f69333c512553507f5f9798cb76" +checksum = "719b953e2095829ee67db738b3bfa9fa368c94900df327b3f07fe6e794d2fe1f" [[package]] name = "rustc-hash" @@ -1298,24 +1337,19 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "08d43f7aa6b08d49f382cde6a7982047c3426db949b1424bc4b7ec9ae12c6ce2" [[package]] -name = "rustix" -version = "0.37.19" +name = "rustversion" +version = "1.0.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "acf8729d8542766f1b2cf77eb034d52f40d375bb8b615d0b147089946e16613d" -dependencies = [ - "bitflags 1.3.2", - "errno", - "io-lifetimes", - "libc", - "linux-raw-sys", - "windows-sys 0.48.0", -] +checksum = "955d28af4278de8121b7ebeb796b6a45735dc01436d898801014aced2773a3d6" [[package]] -name = "rustversion" -version = "1.0.12" +name = "same-file" +version = "1.0.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4f3208ce4d8448b3f3e7d168a73f5e0c43a61e32930de3bceeccedb388b6bf06" +checksum = "93fc1dc3aaa9bfed95e02e6eadabb4baf7e3078b0bd1b4d7b6b0b68378900502" +dependencies = [ + "winapi-util", +] [[package]] name = "scoped-tls" @@ -1325,9 +1359,9 @@ checksum = "e1cf6437eb19a8f4a6cc0f7dca544973b0b78843adbfeb3683d1a94a0024a294" [[package]] name = "scopeguard" -version = "1.1.0" +version = "1.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d29ab0c6d3fc0ee92fe66e2d99f700eab17a8d57d1c1d3b748380fb20baa78cd" +checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49" [[package]] name = "sctk-adwaita" @@ -1343,37 +1377,43 @@ dependencies = [ ] [[package]] -name = "simd-adler32" -version = "0.3.5" +name = "shlex" +version = "1.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "238abfbb77c1915110ad968465608b68e869e0772622c9656714e73e5a1a522f" +checksum = "0fda2ff0d084019ba4d7c6f371c95d8fd75ce3524c3cb8fb653a3023f6323e64" + +[[package]] +name = "simd-adler32" +version = "0.3.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d66dc143e6b11c1eddc06d5c423cfc97062865baf299914ab64caa38182078fe" [[package]] name = "siphasher" -version = "0.3.10" +version = "0.3.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7bd3e3206899af3f8b12af284fafc038cc1dc2b41d1b89dd17297221c5d225de" +checksum = "38b58827f4464d87d377d175e90bf58eb00fd8716ff0a62f80356b5e61555d0d" [[package]] name = "slotmap" -version = "1.0.6" +version = "1.0.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e1e08e261d0e8f5c43123b7adf3e4ca1690d655377ac93a03b2c9d3e98de1342" +checksum = "dbff4acf519f630b3a3ddcfaea6c06b42174d9a44bc70c620e9ed1649d58b82a" dependencies = [ "version_check", ] [[package]] name = "smallvec" -version = "1.10.0" +version = "1.13.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a507befe795404456341dfab10cef66ead4c041f62b8b11bbb92bffe5d0953e0" +checksum = "3c5e1a9a646d36c3599cd173a41282daf47c44583ad367b8e6837255952e5c67" [[package]] name = "smithay-client-toolkit" -version = "0.16.0" +version = "0.16.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f307c47d32d2715eb2e0ece5589057820e0e5e70d07c247d1063e844e107f454" +checksum = "870427e30b8f2cbe64bf43ec4b86e88fe39b0a84b3f15efd9c9c2d020bc86eb9" dependencies = [ "bitflags 1.3.2", "calloop", @@ -1436,9 +1476,9 @@ dependencies = [ [[package]] name = "syn" -version = "2.0.18" +version = "2.0.76" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "32d41677bcbe24c20c52e7c70b0d8db04134c5d1066bf98662e2871ad200ea3e" +checksum = "578e081a14e0cefc3279b0472138c513f37b41a08d5a3cca9b6e4e8ceb6cd525" dependencies = [ "proc-macro2", "quote", @@ -1458,31 +1498,31 @@ dependencies = [ [[package]] name = "termcolor" -version = "1.2.0" +version = "1.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "be55cf8942feac5c765c2c993422806843c9a9a45d4d5c407ad6dd2ea95eb9b6" +checksum = "06794f8f6c5c898b3275aebefa6b8a1cb24cd2c6c79397ab15774837a0bc5755" dependencies = [ "winapi-util", ] [[package]] name = "thiserror" -version = "1.0.40" +version = "1.0.63" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "978c9a314bd8dc99be594bc3c175faaa9794be04a5a5e153caba6915336cebac" +checksum = "c0342370b38b6a11b6cc11d6a805569958d54cfa061a29969c3b5ce2ea405724" dependencies = [ "thiserror-impl", ] [[package]] name = "thiserror-impl" -version = "1.0.40" +version = "1.0.63" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f9456a42c5b0d803c8cd86e73dd7cc9edd429499f37a3550d286d5e86720569f" +checksum = "a4558b58466b9ad7ca0f102865eccc95938dca1a74a856f2b57b6629050da261" dependencies = [ "proc-macro2", "quote", - "syn 2.0.18", + "syn 2.0.76", ] [[package]] @@ -1521,44 +1561,44 @@ dependencies = [ [[package]] name = "toml_datetime" -version = "0.6.2" +version = "0.6.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5a76a9312f5ba4c2dec6b9161fdf25d87ad8a09256ccea5a556fef03c706a10f" +checksum = "0dd7358ecb8fc2f8d014bf86f6f638ce72ba252a2c3a2572f2a795f1d23efb41" [[package]] name = "toml_edit" -version = "0.19.10" +version = "0.19.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2380d56e8670370eee6566b0bfd4265f65b3f432e8c6d85623f728d4fa31f739" +checksum = "1b5bb770da30e5cbfde35a2d7b9b8a2c4b8ef89548a7a6aeab5c9a576e3e7421" dependencies = [ - "indexmap", + "indexmap 2.4.0", "toml_datetime", "winnow", ] [[package]] name = "ttf-parser" -version = "0.19.0" +version = "0.24.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "44dcf002ae3b32cd25400d6df128c5babec3927cd1eb7ce813cfff20eb6c3746" +checksum = "5be21190ff5d38e8b4a2d3b6a3ae57f612cc39c96e83cedeaf7abc338a8bac4a" [[package]] name = "unicode-ident" -version = "1.0.9" +version = "1.0.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b15811caf2415fb889178633e7724bad2509101cde276048e013b9def5e51fa0" +checksum = "3354b9ac3fae1ff6755cb6db53683adb661634f67557942dea4facebec0fee4b" [[package]] name = "unicode-width" -version = "0.1.10" +version = "0.1.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c0edd1e5b14653f783770bce4a4dabb4a5108a5370a5f5d8cfe8710c361f6c8b" +checksum = "0336d538f7abc86d282a4189614dfaa90810dfc2c6f6427eaf88e16311dd225d" [[package]] name = "unicode-xid" -version = "0.2.4" +version = "0.2.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f962df74c8c05a667b5ee8bcf162993134c104e96440b663c8daa176dc772d8c" +checksum = "229730647fbc343e3a80e463c1db7f78f3855d3f3739bee0dda773c9a037c90a" [[package]] name = "vec_map" @@ -1568,9 +1608,19 @@ checksum = "f1bddf1187be692e79c5ffeab891132dfb0f236ed36a43c7ed39f1165ee20191" [[package]] name = "version_check" -version = "0.9.4" +version = "0.9.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "49874b5167b65d7193b8aba1567f5c7d93d001cafc34600cee003eda787e483f" +checksum = "0b928f33d975fc6ad9f86c8f283853ad26bdd5b10b7f1542aa2fa15e2289105a" + +[[package]] +name = "walkdir" +version = "2.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "29790946404f91d9c5d06f9874efddea1dc06c5efe94541a7d6863108e3a5e4b" +dependencies = [ + "same-file", + "winapi-util", +] [[package]] name = "wasi" @@ -1580,34 +1630,35 @@ checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" [[package]] name = "wasm-bindgen" -version = "0.2.86" +version = "0.2.93" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5bba0e8cb82ba49ff4e229459ff22a191bbe9a1cb3a341610c9c33efc27ddf73" +checksum = "a82edfc16a6c469f5f44dc7b571814045d60404b55a0ee849f9bcfa2e63dd9b5" dependencies = [ "cfg-if", + "once_cell", "wasm-bindgen-macro", ] [[package]] name = "wasm-bindgen-backend" -version = "0.2.86" +version = "0.2.93" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "19b04bc93f9d6bdee709f6bd2118f57dd6679cf1176a1af464fca3ab0d66d8fb" +checksum = "9de396da306523044d3302746f1208fa71d7532227f15e347e2d93e4145dd77b" dependencies = [ "bumpalo", "log", "once_cell", "proc-macro2", "quote", - "syn 2.0.18", + "syn 2.0.76", "wasm-bindgen-shared", ] [[package]] name = "wasm-bindgen-futures" -version = "0.4.36" +version = "0.4.43" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2d1985d03709c53167ce907ff394f5316aa22cb4e12761295c5dc57dacb6297e" +checksum = "61e9300f63a621e96ed275155c108eb6f843b6a26d053f122ab69724559dc8ed" dependencies = [ "cfg-if", "js-sys", @@ -1617,9 +1668,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro" -version = "0.2.86" +version = "0.2.93" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "14d6b024f1a526bb0234f52840389927257beb670610081360e5a03c5df9c258" +checksum = "585c4c91a46b072c92e908d99cb1dcdf95c5218eeb6f3bf1efa991ee7a68cccf" dependencies = [ "quote", "wasm-bindgen-macro-support", @@ -1627,22 +1678,22 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro-support" -version = "0.2.86" +version = "0.2.93" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e128beba882dd1eb6200e1dc92ae6c5dbaa4311aa7bb211ca035779e5efc39f8" +checksum = "afc340c74d9005395cf9dd098506f7f44e38f2b4a21c6aaacf9a105ea5e1e836" dependencies = [ "proc-macro2", "quote", - "syn 2.0.18", + "syn 2.0.76", "wasm-bindgen-backend", "wasm-bindgen-shared", ] [[package]] name = "wasm-bindgen-shared" -version = "0.2.86" +version = "0.2.93" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ed9d5b4305409d1fc9482fee2d7f9bcbf24b3972bf59817ef757e23982242a93" +checksum = "c62a0a307cb4a311d3a07867860911ca130c3494e8c2719593806c08bc5d0484" [[package]] name = "wayland-client" @@ -1719,9 +1770,9 @@ dependencies = [ [[package]] name = "web-sys" -version = "0.3.63" +version = "0.3.70" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3bdd9ef4e984da1187bf8110c5cf5b845fbc87a23602cdf912386a76fcd3a7c2" +checksum = "26fdeaafd9bd129f65e7c031593c24d62186301e0c72c8978fa1678be7d532c0" dependencies = [ "js-sys", "wasm-bindgen", @@ -1729,9 +1780,9 @@ dependencies = [ [[package]] name = "wgpu" -version = "0.16.1" +version = "0.16.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3059ea4ddec41ca14f356833e2af65e7e38c0a8f91273867ed526fb9bafcca95" +checksum = "480c965c9306872eb6255fa55e4b4953be55a8b64d57e61d7ff840d3dcc051cd" dependencies = [ "arrayvec", "cfg-if", @@ -1759,7 +1810,7 @@ checksum = "8f478237b4bf0d5b70a39898a66fa67ca3a007d79f2520485b8b0c3dfc46f8c2" dependencies = [ "arrayvec", "bit-vec", - "bitflags 2.3.1", + "bitflags 2.6.0", "codespan-reporting", "log", "naga", @@ -1776,15 +1827,15 @@ dependencies = [ [[package]] name = "wgpu-hal" -version = "0.16.1" +version = "0.16.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "74851c2c8e5d97652e74c241d41b0656b31c924a45dcdecde83975717362cfa4" +checksum = "1ecb3258078e936deee14fd4e0febe1cfe9bbb5ffef165cb60218d2ee5eb4448" dependencies = [ "android_system_properties", "arrayvec", "ash", "bit-set", - "bitflags 2.3.1", + "bitflags 2.6.0", "block", "core-graphics-types", "d3d12", @@ -1797,7 +1848,7 @@ dependencies = [ "js-sys", "khronos-egl", "libc", - "libloading 0.8.0", + "libloading 0.8.5", "log", "metal", "naga", @@ -1818,20 +1869,20 @@ dependencies = [ [[package]] name = "wgpu-types" -version = "0.16.0" +version = "0.16.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5bd33a976130f03dcdcd39b3810c0c3fc05daf86f0aaf867db14bfb7c4a9a32b" +checksum = "d0c153280bb108c2979eb5c7391cb18c56642dd3c072e55f52065e13e2a1252a" dependencies = [ - "bitflags 2.3.1", + "bitflags 2.6.0", "js-sys", "web-sys", ] [[package]] name = "widestring" -version = "1.0.2" +version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "653f141f39ec16bba3c5abe400a0c60da7468261cc2cbf36805022876bc721a8" +checksum = "7219d36b6eac893fa81e84ebe06485e7dcbb616177469b142df14f1f4deb1311" [[package]] name = "winapi" @@ -1851,11 +1902,11 @@ checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6" [[package]] name = "winapi-util" -version = "0.1.5" +version = "0.1.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "70ec6ce85bb158151cae5e5c87f95a8e97d2c0c4b001223f33a334e3ce5de178" +checksum = "cf221c93e13a30d793f7645a0e7762c55d169dbb0a49671918a2319d289b10bb" dependencies = [ - "winapi", + "windows-sys 0.59.0", ] [[package]] @@ -1888,7 +1939,25 @@ version = "0.48.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "677d2418bec65e3338edb076e806bc1ec15693c5d0104683f2efe857f61056a9" dependencies = [ - "windows-targets 0.48.0", + "windows-targets 0.48.5", +] + +[[package]] +name = "windows-sys" +version = "0.52.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "282be5f36a8ce781fad8c8ae18fa3f9beff57ec1b52cb3de0789201425d9a33d" +dependencies = [ + "windows-targets 0.52.6", +] + +[[package]] +name = "windows-sys" +version = "0.59.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e38bc4d79ed67fd075bcc251a1c39b32a1776bbe92e5bef1f0bf1f8c531853b" +dependencies = [ + "windows-targets 0.52.6", ] [[package]] @@ -1908,17 +1977,33 @@ dependencies = [ [[package]] name = "windows-targets" -version = "0.48.0" +version = "0.48.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7b1eb6f0cd7c80c79759c929114ef071b87354ce476d9d94271031c0497adfd5" +checksum = "9a2fa6e2155d7247be68c096456083145c183cbbbc2764150dda45a87197940c" dependencies = [ - "windows_aarch64_gnullvm 0.48.0", - "windows_aarch64_msvc 0.48.0", - "windows_i686_gnu 0.48.0", - "windows_i686_msvc 0.48.0", - "windows_x86_64_gnu 0.48.0", - "windows_x86_64_gnullvm 0.48.0", - "windows_x86_64_msvc 0.48.0", + "windows_aarch64_gnullvm 0.48.5", + "windows_aarch64_msvc 0.48.5", + "windows_i686_gnu 0.48.5", + "windows_i686_msvc 0.48.5", + "windows_x86_64_gnu 0.48.5", + "windows_x86_64_gnullvm 0.48.5", + "windows_x86_64_msvc 0.48.5", +] + +[[package]] +name = "windows-targets" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9b724f72796e036ab90c1021d4780d4d3d648aca59e491e6b98e725b84e99973" +dependencies = [ + "windows_aarch64_gnullvm 0.52.6", + "windows_aarch64_msvc 0.52.6", + "windows_i686_gnu 0.52.6", + "windows_i686_gnullvm", + "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]] @@ -1929,9 +2014,15 @@ checksum = "597a5118570b68bc08d8d59125332c54f1ba9d9adeedeef5b99b02ba2b0698f8" [[package]] name = "windows_aarch64_gnullvm" -version = "0.48.0" +version = "0.48.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "91ae572e1b79dba883e0d315474df7305d12f569b400fcf90581b06062f7e1bc" +checksum = "2b38e32f0abccf9987a4e3079dfb67dcd799fb61361e53e2882c3cbaf0d905d8" + +[[package]] +name = "windows_aarch64_gnullvm" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "32a4622180e7a0ec044bb555404c800bc9fd9ec262ec147edd5989ccd0c02cd3" [[package]] name = "windows_aarch64_msvc" @@ -1941,9 +2032,15 @@ checksum = "e08e8864a60f06ef0d0ff4ba04124db8b0fb3be5776a5cd47641e942e58c4d43" [[package]] name = "windows_aarch64_msvc" -version = "0.48.0" +version = "0.48.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b2ef27e0d7bdfcfc7b868b317c1d32c641a6fe4629c171b8928c7b08d98d7cf3" +checksum = "dc35310971f3b2dbbf3f0690a219f40e2d9afcf64f9ab7cc1be722937c26b4bc" + +[[package]] +name = "windows_aarch64_msvc" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "09ec2a7bb152e2252b53fa7803150007879548bc709c039df7627cabbd05d469" [[package]] name = "windows_i686_gnu" @@ -1953,9 +2050,21 @@ checksum = "c61d927d8da41da96a81f029489353e68739737d3beca43145c8afec9a31a84f" [[package]] name = "windows_i686_gnu" -version = "0.48.0" +version = "0.48.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "622a1962a7db830d6fd0a69683c80a18fda201879f0f447f065a3b7467daa241" +checksum = "a75915e7def60c94dcef72200b9a8e58e5091744960da64ec734a6c6e9b3743e" + +[[package]] +name = "windows_i686_gnu" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8e9b5ad5ab802e97eb8e295ac6720e509ee4c243f69d781394014ebfe8bbfa0b" + +[[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_msvc" @@ -1965,9 +2074,15 @@ checksum = "44d840b6ec649f480a41c8d80f9c65108b92d89345dd94027bfe06ac444d1060" [[package]] name = "windows_i686_msvc" -version = "0.48.0" +version = "0.48.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4542c6e364ce21bf45d69fdd2a8e455fa38d316158cfd43b3ac1c5b1b19f8e00" +checksum = "8f55c233f70c4b27f66c523580f78f1004e8b5a8b659e05a4eb49d4166cca406" + +[[package]] +name = "windows_i686_msvc" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "240948bc05c5e7c6dabba28bf89d89ffce3e303022809e73deaefe4f6ec56c66" [[package]] name = "windows_x86_64_gnu" @@ -1977,9 +2092,15 @@ checksum = "8de912b8b8feb55c064867cf047dda097f92d51efad5b491dfb98f6bbb70cb36" [[package]] name = "windows_x86_64_gnu" -version = "0.48.0" +version = "0.48.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ca2b8a661f7628cbd23440e50b05d705db3686f894fc9580820623656af974b1" +checksum = "53d40abd2583d23e4718fddf1ebec84dbff8381c07cae67ff7768bbf19c6718e" + +[[package]] +name = "windows_x86_64_gnu" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "147a5c80aabfbf0c7d901cb5895d1de30ef2907eb21fbbab29ca94c5b08b1a78" [[package]] name = "windows_x86_64_gnullvm" @@ -1989,9 +2110,15 @@ checksum = "26d41b46a36d453748aedef1486d5c7a85db22e56aff34643984ea85514e94a3" [[package]] name = "windows_x86_64_gnullvm" -version = "0.48.0" +version = "0.48.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7896dbc1f41e08872e9d5e8f8baa8fdd2677f29468c4e156210174edc7f7b953" +checksum = "0b7b52767868a23d5bab768e390dc5f5c55825b6d30b86c844ff2dc7414044cc" + +[[package]] +name = "windows_x86_64_gnullvm" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "24d5b23dc417412679681396f2b49f3de8c1473deb516bd34410872eff51ed0d" [[package]] name = "windows_x86_64_msvc" @@ -2001,15 +2128,21 @@ checksum = "9aec5da331524158c6d1a4ac0ab1541149c0b9505fde06423b02f5ef0106b9f0" [[package]] name = "windows_x86_64_msvc" -version = "0.48.0" +version = "0.48.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1a515f5799fe4961cb532f983ce2b23082366b898e52ffbce459c86f67c8378a" +checksum = "ed94fce61571a4006852b7389a063ab983c02eb1bb37b47f8272ce92d06d9538" + +[[package]] +name = "windows_x86_64_msvc" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec" [[package]] name = "winit" -version = "0.28.6" +version = "0.28.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "866db3f712fffba75d31bf0cdecf357c8aeafd158c5b7ab51dba2a2b2d47f196" +checksum = "9596d90b45384f5281384ab204224876e8e8bf7d58366d9b795ad99aa9894b94" dependencies = [ "android-activity", "bitflags 1.3.2", @@ -2042,9 +2175,9 @@ dependencies = [ [[package]] name = "winnow" -version = "0.4.6" +version = "0.5.40" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "61de7bac303dc551fe038e2b3cef0f571087a47571ea6e79a87692ac99b99699" +checksum = "f593a95398737aeed53e489c785df13f3618e41dbcd6718c6addbf1395aa6876" dependencies = [ "memchr", ] @@ -2062,15 +2195,32 @@ dependencies = [ [[package]] name = "xcursor" -version = "0.3.4" +version = "0.3.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "463705a63313cd4301184381c5e8042f0a7e9b4bb63653f216311d4ae74690b7" -dependencies = [ - "nom", -] +checksum = "0ef33da6b1660b4ddbfb3aef0ade110c8b8a781a3b6382fa5f2b5b040fd55f61" [[package]] name = "xml-rs" -version = "0.8.14" +version = "0.8.21" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "52839dc911083a8ef63efa4d039d1f58b5e409f923e44c80828f206f66e5541c" +checksum = "539a77ee7c0de333dcc6da69b177380a0b81e0dacfa4f7344c465a36871ee601" + +[[package]] +name = "zerocopy" +version = "0.7.35" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1b9b4fd18abc82b8136838da5d50bae7bdea537c574d8dc1a34ed098d6c166f0" +dependencies = [ + "zerocopy-derive", +] + +[[package]] +name = "zerocopy-derive" +version = "0.7.35" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fa4f8080344d4671fb4e831a13ad1e68092748387dfc4f55e356242fae12ce3e" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.76", +] diff --git a/Cargo.toml b/Cargo.toml index 1949363..f05ef5c 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -5,4 +5,4 @@ members = [ "cxgraph-desktop", "cxgraph-web", ] - +resolver = "2" diff --git a/README.md b/README.md index 13d07a8..bed7df7 100644 --- a/README.md +++ b/README.md @@ -3,6 +3,15 @@ cxgraph is a complex function graphing tool built around WebGPU available [on the web](https://cx.trimill.xyz/) or (slightly) for desktop. +## building (web) + +install `wasm-pack` through your package manager or with `cargo install wasm-pack`. + +```sh +cd cxgraph-web +wasm-pack build --no-typescript --no-pack --target web +``` + ## documentation - [language](docs/language.md) - [web interface](docs/web.md) diff --git a/cxgraph-web/index.js b/cxgraph-web/index.js index 935701b..7631e42 100644 --- a/cxgraph-web/index.js +++ b/cxgraph-web/index.js @@ -4,9 +4,9 @@ import init, * as cxgraph from "./pkg/cxgraph_web.js"; await init(); let graphView = { - xoff: 0, - yoff: 0, - scale: 3, + xoff: 0.00001, + yoff: 0.00001, + scale: 2.99932736, res_mult: 1, varNames: [], }; @@ -217,13 +217,23 @@ let charMap = { "Psi": "\u03a8", "Omega": "\u03a9", "vartheta": "\u03d1", + "0": "\u2080", + "1": "\u2081", + "2": "\u2082", + "3": "\u2083", + "4": "\u2084", + "5": "\u2085", + "6": "\u2086", + "7": "\u2087", + "8": "\u2088", + "9": "\u2089", }; let specialChars = new RegExp( `\\\\(${Object.keys(charMap).join("|")})` ); -console.log(specialChars); -source_text.addEventListener("input", () => { +source_text.addEventListener("input", (event) => { + if(event.isComposing) return; let e = source_text.selectionEnd; let amnt = 0; source_text.value = source_text.value.replace( diff --git a/libcxgraph/Cargo.toml b/libcxgraph/Cargo.toml index 1ccc914..9963a8c 100644 --- a/libcxgraph/Cargo.toml +++ b/libcxgraph/Cargo.toml @@ -13,6 +13,7 @@ lalrpop-util = { version = "0.20.0", features = ["lexer", "unicode"] } num-complex = "0.4" wgpu = "0.16" raw-window-handle = "0.5" +unicode-xid = "0.2" [build-dependencies] lalrpop = "0.20.0" diff --git a/libcxgraph/src/language/ast.rs b/libcxgraph/src/language/ast.rs index cddb959..8d776f6 100644 --- a/libcxgraph/src/language/ast.rs +++ b/libcxgraph/src/language/ast.rs @@ -5,6 +5,7 @@ use num_complex::Complex64 as Complex; #[derive(Clone, Copy, Debug)] pub enum BinaryOp { Add, Sub, Mul, Div, Pow, + Gt, Lt, Ge, Le, Eq, Ne, } #[derive(Clone, Copy, Debug)] @@ -21,6 +22,7 @@ pub enum ExpressionType<'a> { Unary(UnaryOp), FnCall(&'a str), Store(&'a str), + If, Sum { countvar: &'a str, min: i32, max: i32 }, Prod { countvar: &'a str, min: i32, max: i32 }, Iter { itervar: &'a str, count: i32 }, @@ -61,25 +63,31 @@ impl<'a> Expression<'a> { Self { ty: ExpressionType::Store(name), children: vec![expr] } } - pub fn new_sum(countvar: &'a str, min: i32, max: i32, body: Vec) -> Self { + pub fn new_if(cond: Self, t: Self, f: Self) -> Self { + Self { + ty: ExpressionType::If, + children: vec![cond, t, f], + } + } + + pub fn new_sum(countvar: &'a str, min: i32, max: i32, body: Self) -> Self { Self { ty: ExpressionType::Sum { countvar, min, max }, - children: body, + children: vec![body], } } - pub fn new_prod(accvar: &'a str, min: i32, max: i32, body: Vec) -> Self { + pub fn new_prod(accvar: &'a str, min: i32, max: i32, body: Self) -> Self { Self { ty: ExpressionType::Prod { countvar: accvar, min, max }, - children: body, + children: vec![body], } } - pub fn new_iter(itervar: &'a str, count: i32, init: Self, mut body: Vec) -> Self { - body.push(init); + pub fn new_iter(itervar: &'a str, count: i32, init: Self, body: Self) -> Self { Self { ty: ExpressionType::Iter { itervar, count }, - children: body, + children: vec![init, body], } } } @@ -99,6 +107,7 @@ fn display_expr(w: &mut impl fmt::Write, expr: &Expression, depth: usize) -> fmt ExpressionType::Unary(op) => write!(w, "{:indent$}OP {op:?}", "", indent=indent)?, ExpressionType::FnCall(f) => write!(w, "{:indent$}CALL {f}", "", indent=indent)?, ExpressionType::Store(n) => write!(w, "{:indent$}STORE {n}", "", indent=indent)?, + ExpressionType::If => write!(w, "{:indent$}IF", "", indent=indent)?, ExpressionType::Sum { countvar, min, max } => write!(w, "{:indent$}SUM {countvar} {min} {max}", "", indent=indent)?, ExpressionType::Prod { countvar, min, max } => write!(w, "{:indent$}PROD {countvar} {min} {max}", "", indent=indent)?, ExpressionType::Iter { itervar, count } => write!(w, "{:indent$}ITER {itervar} {count}", "", indent=indent)?, diff --git a/libcxgraph/src/language/builtins.rs b/libcxgraph/src/language/builtins.rs index 596349d..c3d9b74 100644 --- a/libcxgraph/src/language/builtins.rs +++ b/libcxgraph/src/language/builtins.rs @@ -5,65 +5,61 @@ use num_complex::Complex64 as Complex; thread_local! { pub static BUILTIN_FUNCS: HashMap<&'static str, (&'static str, usize)> = { let mut m = HashMap::new(); - m.insert("pos", ("c_pos", 1)); - m.insert("neg", ("c_neg", 1)); - m.insert("recip", ("c_recip", 1)); - m.insert("conj", ("c_conj", 1)); + m.insert("pos", ("c_pos", 1)); + m.insert("neg", ("c_neg", 1)); + m.insert("recip", ("c_recip", 1)); + m.insert("conj", ("c_conj", 1)); - m.insert("ifgt", ("c_ifgt", 4)); - m.insert("iflt", ("c_iflt", 4)); - m.insert("ifge", ("c_ifge", 4)); - m.insert("ifle", ("c_ifle", 4)); - m.insert("ifeq", ("c_ifeq", 4)); - m.insert("ifne", ("c_ifne", 4)); - m.insert("ifnan", ("c_ifnan", 3)); + m.insert("re", ("c_re", 1)); + m.insert("im", ("c_im", 1)); + m.insert("signre", ("c_signre", 1)); + m.insert("signim", ("c_signim", 1)); + m.insert("absre", ("c_absre", 1)); + m.insert("absim", ("c_absim", 1)); + m.insert("isnan", ("c_isnan", 1)); + m.insert("abs_sq", ("c_abs_sq", 1)); + m.insert("abs", ("c_abs", 1)); + m.insert("arg", ("c_arg", 1)); + m.insert("argbr", ("c_argbr", 2)); - m.insert("re", ("c_re", 1)); - m.insert("im", ("c_im", 1)); - m.insert("signre", ("c_signre", 1)); - m.insert("signim", ("c_signim", 1)); - m.insert("abs_sq", ("c_abs_sq", 1)); - m.insert("abs", ("c_abs", 1)); - m.insert("arg", ("c_arg", 1)); - m.insert("argbr", ("c_argbr", 2)); + m.insert("add", ("c_add", 2)); + m.insert("sub", ("c_sub", 2)); + m.insert("mul", ("c_mul", 2)); + m.insert("div", ("c_div", 2)); + m.insert("pow", ("c_pow", 2)); + m.insert("powbr", ("c_powbr", 3)); - m.insert("add", ("c_add", 2)); - m.insert("sub", ("c_sub", 2)); - m.insert("mul", ("c_mul", 2)); - m.insert("div", ("c_div", 2)); - m.insert("pow", ("c_pow", 2)); - m.insert("powbr", ("c_powbr", 3)); + m.insert("exp", ("c_exp", 1)); + m.insert("log", ("c_log", 1)); + m.insert("logbr", ("c_logbr", 2)); + m.insert("sqrt", ("c_sqrt", 1)); + m.insert("sqrtbr", ("c_sqrtbr", 2)); + m.insert("cbrt", ("c_cbrt", 1)); + m.insert("cbrtbr", ("c_cbrtbr", 2)); - m.insert("exp", ("c_exp", 1)); - m.insert("log", ("c_log", 1)); - m.insert("logbr", ("c_logbr", 2)); - m.insert("sqrt", ("c_sqrt", 1)); - m.insert("sqrtbr", ("c_sqrtbr", 2)); - m.insert("cbrt", ("c_cbrt", 1)); - m.insert("cbrtbr", ("c_cbrtbr", 2)); + m.insert("sin", ("c_sin", 1)); + m.insert("cos", ("c_cos", 1)); + m.insert("tan", ("c_tan", 1)); + m.insert("sinh", ("c_sinh", 1)); + m.insert("cosh", ("c_cosh", 1)); + m.insert("tanh", ("c_tanh", 1)); + m.insert("asin", ("c_asin", 1)); + m.insert("acos", ("c_acos", 1)); + m.insert("atan", ("c_atan", 1)); + m.insert("asinh", ("c_asinh", 1)); + m.insert("acosh", ("c_acosh", 1)); + m.insert("atanh", ("c_atanh", 1)); - m.insert("sin", ("c_sin", 1)); - m.insert("cos", ("c_cos", 1)); - m.insert("tan", ("c_tan", 1)); - m.insert("sinh", ("c_sinh", 1)); - m.insert("cosh", ("c_cosh", 1)); - m.insert("tanh", ("c_tanh", 1)); - - m.insert("asin", ("c_asin", 1)); - m.insert("acos", ("c_acos", 1)); - m.insert("atan", ("c_atan", 1)); - m.insert("asinh", ("c_asinh", 1)); - m.insert("acosh", ("c_acosh", 1)); - m.insert("atanh", ("c_atanh", 1)); - - m.insert("gamma", ("c_gamma", 1)); - m.insert("\u{0393}", ("c_gamma", 1)); - m.insert("invgamma", ("c_invgamma", 1)); - m.insert("inv\u{0393}", ("c_invgamma", 1)); - m.insert("loggamma", ("c_loggamma", 1)); - m.insert("log\u{0393}", ("c_loggamma", 1)); - m.insert("digamma", ("c_digamma", 1)); - m.insert("\u{03C8}", ("c_digamma", 1)); + m.insert("gamma", ("c_gamma", 1)); + m.insert("\u{0393}", ("c_gamma", 1)); + m.insert("invgamma", ("c_invgamma", 1)); + m.insert("inv\u{0393}", ("c_invgamma", 1)); + m.insert("loggamma", ("c_loggamma", 1)); + m.insert("log\u{0393}", ("c_loggamma", 1)); + m.insert("digamma", ("c_digamma", 1)); + m.insert("\u{03C8}", ("c_digamma", 1)); + m.insert("lambertw", ("c_lambertw", 1)); + m.insert("lambertwbr", ("c_lambertwbr", 2)); m }; diff --git a/libcxgraph/src/language/compiler.rs b/libcxgraph/src/language/compiler.rs index d76b4b1..178787e 100644 --- a/libcxgraph/src/language/compiler.rs +++ b/libcxgraph/src/language/compiler.rs @@ -29,6 +29,11 @@ fn format_char(buf: &mut String, c: char) { match c { '_' => buf.push_str("u_"), '\'' => buf.push_str("p_"), + '\u{2080}'..='\u{2089}' => { + buf.push('s'); + buf.push((c as u32 - 0x2080 + '0' as u32).try_into().expect("invalid codepoint")); + buf.push('_'); + } c => buf.push(c), } } @@ -190,6 +195,12 @@ impl<'w, 'i, W: fmt::Write> Compiler<'w, 'i, W> { BinaryOp::Mul => writeln!(self.buf, "var {name} = c_mul({a}, {b});")?, BinaryOp::Div => writeln!(self.buf, "var {name} = c_div({a}, {b});")?, BinaryOp::Pow => writeln!(self.buf, "var {name} = c_pow({a}, {b});")?, + BinaryOp::Gt => writeln!(self.buf, "var {name} = select(C_ZERO, C_ONE, {a}.x > {b}.x);")?, + BinaryOp::Lt => writeln!(self.buf, "var {name} = select(C_ZERO, C_ONE, {a}.x < {b}.x);")?, + BinaryOp::Ge => writeln!(self.buf, "var {name} = select(C_ZERO, C_ONE, {a}.x >= {b}.x);")?, + BinaryOp::Le => writeln!(self.buf, "var {name} = select(C_ZERO, C_ONE, {a}.x <= {b}.x);")?, + BinaryOp::Eq => writeln!(self.buf, "var {name} = select(C_ZERO, C_ONE, ({a}.x == {b}.x) && ({a}.y == {b}.y));")?, + BinaryOp::Ne => writeln!(self.buf, "var {name} = select(C_ZERO, C_ONE, ({a}.x != {b}.x) || ({a}.y != {b}.y));")?, } Ok(name) @@ -226,6 +237,19 @@ impl<'w, 'i, W: fmt::Write> Compiler<'w, 'i, W> { Ok(name) }, + ExpressionType::If => { + let cond = self.compile_expr(local, &expr.children[0])?; + let result = local.next_tmp(); + writeln!(self.buf, "var {result}: vec2f;")?; + writeln!(self.buf, "if {cond}.x > 0.0 {{")?; + let t = self.compile_expr(local, &expr.children[1])?; + writeln!(self.buf, "{result} = {t};")?; + writeln!(self.buf, "}} else {{")?; + let f = self.compile_expr(local, &expr.children[2])?; + writeln!(self.buf, "{result} = {f};")?; + writeln!(self.buf, "}}")?; + Ok(result) + }, ExpressionType::Sum { countvar, min, max } | ExpressionType::Prod { countvar, min, max } => { let acc = local.next_tmp(); @@ -239,19 +263,17 @@ impl<'w, 'i, W: fmt::Write> Compiler<'w, 'i, W> { writeln!(self.buf, "var {} = vec2f(f32({ivar}), 0.0);", format_local(countvar))?; let mut loop_local = local.clone(); loop_local.local_vars.insert(countvar); - let mut last = String::new(); - for child in &expr.children { - last = self.compile_expr(&mut loop_local, child)?; - } + let body = self.compile_expr(&mut loop_local, &expr.children[0])?; if matches!(expr.ty, ExpressionType::Sum { .. }) { - writeln!(self.buf, "{acc} = {acc} + {last};\n}}")?; + writeln!(self.buf, "{acc} = {acc} + {body};")?; } else { - writeln!(self.buf, "{acc} = c_mul({acc}, {last});\n}}")?; + writeln!(self.buf, "{acc} = c_mul({acc}, {body});")?; } + writeln!(self.buf, "}}")?; Ok(acc) }, ExpressionType::Iter { itervar, count } => { - let init = expr.children.last().unwrap(); + let init = &expr.children[0]; let itervar_fmt = format_local(itervar); let v = self.compile_expr(local, init)?; writeln!(self.buf, "var {itervar_fmt} = {v};")?; @@ -259,11 +281,9 @@ impl<'w, 'i, W: fmt::Write> Compiler<'w, 'i, W> { writeln!(self.buf, "for(var {ivar}: i32 = 0; {ivar} < {count}; {ivar}++) {{")?; let mut loop_local = local.clone(); loop_local.local_vars.insert(itervar); - let mut last = String::new(); - for child in &expr.children[..expr.children.len() - 1] { - last = self.compile_expr(&mut loop_local, child)?; - } - writeln!(self.buf, "{itervar_fmt} = {last};\n}}")?; + let body = self.compile_expr(&mut loop_local, &expr.children[1])?; + writeln!(self.buf, "{itervar_fmt} = {body};")?; + writeln!(self.buf, "}}")?; Ok(itervar_fmt) } } diff --git a/libcxgraph/src/language/syntax.lalrpop b/libcxgraph/src/language/syntax.lalrpop index 0c249f8..e7a377d 100644 --- a/libcxgraph/src/language/syntax.lalrpop +++ b/libcxgraph/src/language/syntax.lalrpop @@ -21,10 +21,17 @@ extern { "->" => Token::Arrow, "=" => Token::Equal, ":" => Token::Colon, + ">" => Token::Greater, + "<" => Token::Less, + ">=" => Token::GreaterEqual, + "<=" => Token::LessEqual, + "==" => Token::EqualEqual, + "!=" => Token::BangEqual, "\n" => Token::Newline, "sum" => Token::Sum, "prod" => Token::Prod, "iter" => Token::Iter, + "if" => Token::If, Float => Token::Float(), Int => Token::Int(), Name => Token::Name(<&'input str>), @@ -60,7 +67,21 @@ Exprs: Vec> = { Expr: Expression<'input> = Store; Store: Expression<'input> = { - "->" => Expression::new_store(a, n), + "->" => Expression::new_store(a, n), + Equality, +} + +Equality: Expression<'input> = { + "==" => Expression::new_binary(BinaryOp::Eq, a, b), + "!=" => Expression::new_binary(BinaryOp::Ne, a, b), + Compare, +} + +Compare: Expression<'input> = { + ">" => Expression::new_binary(BinaryOp::Gt, a, b), + "<" => Expression::new_binary(BinaryOp::Lt, a, b), + ">=" => Expression::new_binary(BinaryOp::Ge, a, b), + "<=" => Expression::new_binary(BinaryOp::Le, a, b), Sum, } @@ -105,17 +126,23 @@ PreJuxtapose: Expression<'input> = { "(" ")", } +Block: Expression<'input> = { + "{" "}" => Expression::new_block(exs), +} + Item: Expression<'input> = { Number, => Expression::new_name(n), "(" ")", - "{" "}" => Expression::new_block(exs), - "sum" "(" ":" "," ")" "{" "}" - => Expression::new_sum(name, min, max, exs), - "prod" "(" ":" "," ")" "{" "}" - => Expression::new_prod(name, min, max, exs), - "iter" "(" "," ":" ")" "{" "}" - => Expression::new_iter(name, count, init, exs), + Block, + "sum" "(" ":" "," ")" + => Expression::new_sum(name, min, max, body), + "prod" "(" ":" "," ")" + => Expression::new_prod(name, min, max, body), + "iter" "(" "," ":" ")" + => Expression::new_iter(name, count, init, body), + "if" "(" ")" + => Expression::new_if(cond, t, f), } Number: Expression<'input> = { diff --git a/libcxgraph/src/language/token.rs b/libcxgraph/src/language/token.rs index ef77304..858039c 100644 --- a/libcxgraph/src/language/token.rs +++ b/libcxgraph/src/language/token.rs @@ -1,15 +1,19 @@ use std::{str::CharIndices, iter::Peekable, fmt}; +use unicode_xid::UnicodeXID; + #[derive(Clone, Copy, Debug)] pub enum Token<'i> { Float(f64), Int(i32), Name(&'i str), - Sum, Prod, Iter, + Sum, Prod, Iter, If, LParen, RParen, LBrace, RBrace, Plus, Minus, Star, Slash, Caret, + Greater, Less, GreaterEqual, LessEqual, + EqualEqual, BangEqual, Comma, Arrow, Equal, Colon, Newline, } @@ -20,22 +24,29 @@ impl<'i> fmt::Display for Token<'i> { Token::Float(n) => write!(f, "{n}"), Token::Int(n) => write!(f, "{n}"), Token::Name(n) => write!(f, "{n}"), - Token::Sum => f.write_str("sum"), - Token::Prod => f.write_str("prod"), - Token::Iter => f.write_str("iter"), - Token::LParen => f.write_str("("), - Token::RParen => f.write_str(")"), - Token::LBrace => f.write_str("{"), - Token::RBrace => f.write_str("}"), - Token::Plus => f.write_str("+"), - Token::Minus => f.write_str("-"), - Token::Star => f.write_str("*"), - Token::Slash => f.write_str("/"), - Token::Caret => f.write_str("^"), - Token::Comma => f.write_str(","), - Token::Arrow => f.write_str("->"), - Token::Equal => f.write_str("="), - Token::Colon => f.write_str(":"), + Token::Sum => f.write_str("sum"), + Token::Prod => f.write_str("prod"), + Token::Iter => f.write_str("iter"), + Token::If => f.write_str("if"), + Token::LParen => f.write_str("("), + Token::RParen => f.write_str(")"), + Token::LBrace => f.write_str("{"), + Token::RBrace => f.write_str("}"), + Token::Plus => f.write_str("+"), + Token::Minus => f.write_str("-"), + Token::Star => f.write_str("*"), + Token::Slash => f.write_str("/"), + Token::Caret => f.write_str("^"), + Token::Comma => f.write_str(","), + Token::Arrow => f.write_str("->"), + Token::Equal => f.write_str("="), + Token::Colon => f.write_str(":"), + Token::Greater => f.write_str(">"), + Token::Less => f.write_str("<"), + Token::GreaterEqual => f.write_str(">="), + Token::LessEqual => f.write_str("<="), + Token::EqualEqual => f.write_str("=="), + Token::BangEqual => f.write_str("!="), Token::Newline => f.write_str("newline") } } @@ -44,12 +55,14 @@ impl<'i> fmt::Display for Token<'i> { #[derive(Clone, Copy, Debug)] pub enum LexerError { Unexpected(usize, char), + UnexpectedEof, InvalidNumber(usize, usize), } impl fmt::Display for LexerError { fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { match self { + LexerError::UnexpectedEof => write!(f, "Unexpected EOF during lexing"), LexerError::Unexpected(i, c) => write!(f, "Unexpected character {c:?} at {i}"), LexerError::InvalidNumber(i, j) => write!(f, "Invalid number at {i}:{j}"), } @@ -61,15 +74,15 @@ pub type Spanned = Result<(L, T, L), E>; pub struct Lexer<'i> { src: &'i str, chars: Peekable>, - bracket_depth: usize, + bracket_depth: isize, } fn is_ident_begin(c: char) -> bool { - c.is_alphabetic() + c.is_xid_start() } fn is_ident_middle(c: char) -> bool { - c.is_alphanumeric() || c == '_' || c == '\'' + c.is_xid_continue() || matches!(c, '\'' | '\u{2080}'..='\u{2089}') } impl<'i> Lexer<'i> { @@ -115,9 +128,10 @@ impl<'i> Lexer<'i> { let s = &self.src[i..j]; match s { - "sum" => Ok((i, Token::Sum, j)), - "prod" => Ok((i, Token::Prod, j)), - "iter" => Ok((i, Token::Iter, j)), + "sum" => Ok((i, Token::Sum, j)), + "prod" => Ok((i, Token::Prod, j)), + "iter" => Ok((i, Token::Iter, j)), + "if" => Ok((i, Token::If, j)), _ => Ok((i, Token::Name(s), j)), } } @@ -141,25 +155,48 @@ impl<'i> Lexer<'i> { } self.next_token()? } + + (i, '\n') => Ok((i, Token::Newline, i + 1)), + (i, '(') => { self.bracket_depth += 1; Ok((i, Token::LParen, i + 1)) }, (i, ')') => { self.bracket_depth -= 1; Ok((i, Token::RParen, i + 1)) }, (i, '{') => { self.bracket_depth += 1; Ok((i, Token::LBrace, i + 1)) }, (i, '}') => { self.bracket_depth -= 1; Ok((i, Token::RBrace, i + 1)) }, + (i, '+') => Ok((i, Token::Plus, i + 1)), - (i, '-') => match self.chars.peek() { - Some((_, '>')) => { - self.chars.next(); - Ok((i, Token::Arrow, i + 2)) - }, + (i, '-') => match self.chars.next_if(|(_, c)| *c == '>') { + Some(_) => Ok((i, Token::Arrow, i + 2)), _ => Ok((i, Token::Minus, i + 1)), - } + }, (i, '*') => Ok((i, Token::Star, i + 1)), + (i, '\u{22C5}') => Ok((i, Token::Star, i + '\u{22C5}'.len_utf8())), (i, '/') => Ok((i, Token::Slash, i + 1)), (i, '^') => Ok((i, Token::Caret, i + 1)), + + (i, '<') => match self.chars.next_if(|(_, c)| *c == '=') { + Some(_) => Ok((i, Token::LessEqual, i + 2)), + _ => Ok((i, Token::Less, i + 1)), + }, + (i, '\u{2264}') => Ok((i, Token::LessEqual, i + '\u{2264}'.len_utf8())), + (i, '>') => match self.chars.next_if(|(_, c)| *c == '=') { + Some(_) => Ok((i, Token::GreaterEqual, i + 2)), + _ => Ok((i, Token::Greater, i + 1)), + }, + (i, '\u{2265}') => Ok((i, Token::GreaterEqual, i + '\u{2265}'.len_utf8())), + (i, '=') => match self.chars.next_if(|(_, c)| *c == '=') { + Some(_) => Ok((i, Token::EqualEqual, i + 2)), + _ => Ok((i, Token::Equal, i + 1)), + } + (i, '!') => match self.chars.next() { + Some((_, '=')) => Ok((i, Token::BangEqual, i + 2)), + Some((_, c)) => Err(LexerError::Unexpected(i+1, c)), + None => Err(LexerError::UnexpectedEof), + } + (i, '\u{2260}') => Ok((i, Token::BangEqual, i + '\u{2260}'.len_utf8())), + (i, ',') => Ok((i, Token::Comma, i + 1)), - (i, '=') => Ok((i, Token::Equal, i + 1)), (i, ':') => Ok((i, Token::Colon, i + 1)), - (i, '\n') => Ok((i, Token::Newline, i + 1)), + (i, '0'..='9') => self.next_number(i, false), (i, '.') => self.next_number(i, true), (i, c) if is_ident_begin(c) => self.next_word(i, i + c.len_utf8()), diff --git a/libcxgraph/src/renderer/fragment.wgsl b/libcxgraph/src/renderer/fragment.wgsl index c407116..bac77b5 100644 --- a/libcxgraph/src/renderer/fragment.wgsl +++ b/libcxgraph/src/renderer/fragment.wgsl @@ -15,6 +15,26 @@ struct Uniforms { @group(0) @binding(1) var uniforms: Uniforms; +///////////////// +// constants // +///////////////// + +const TAU = 6.283185307179586; +const E = 2.718281828459045; +const RECIP_SQRT2 = 0.7071067811865475; +const LOG_TAU = 1.8378770664093453; +const LOG_2 = 0.6931471805599453; +const RECIP_SQRT29 = 0.18569533817705186; + +const C_TAU = vec2f(TAU, 0.0); +const C_E = vec2f(E, 0.0); +const C_I = vec2f(0.0, 1.0); +const C_EMGAMMA = vec2f(0.5772156649015329, 0.0); +const C_PHI = vec2f(1.618033988749895, 0.0); +const C_ZERO = vec2f(0.0, 0.0); +const C_ONE = vec2f(1.0, 0.0); + + /////////////// // utility // /////////////// @@ -43,23 +63,6 @@ fn vlength(v: vec2f) -> f32 { return max(max(a, b), max(c, d)); } -///////////////// -// constants // -///////////////// - -const TAU = 6.283185307179586; -const E = 2.718281828459045; -const RECIP_SQRT2 = 0.7071067811865475; -const LOG_TAU = 1.8378770664093453; -const LOG_2 = 0.6931471805599453; -const RECIP_SQRT29 = 0.18569533817705186; - -const C_TAU = vec2f(TAU, 0.0); -const C_E = vec2f(E, 0.0); -const C_I = vec2f(0.0, 1.0); -const C_EMGAMMA = vec2f(0.5772156649015329, 0.0); -const C_PHI = vec2f(1.618033988749895, 0.0); - ///////////////////////// // complex functions // ///////////////////////// @@ -80,32 +83,16 @@ fn c_signim(z: vec2f) -> vec2f { return vec2(sign(z.y), 0.0); } -fn c_ifgt(p: vec2f, q: vec2f, z: vec2f, w: vec2f) -> vec2f { - return select(w, z, p.x > q.x); +fn c_absre(z: vec2f) -> vec2f { + return vec2(abs(z.x), 0.0); } -fn c_iflt(p: vec2f, q: vec2f, z: vec2f, w: vec2f) -> vec2f { - return select(w, z, p.x < q.x); +fn c_absim(z: vec2f) -> vec2f { + return vec2(abs(z.y), 0.0); } -fn c_ifge(p: vec2f, q: vec2f, z: vec2f, w: vec2f) -> vec2f { - return select(w, z, p.x >= q.x); -} - -fn c_ifle(p: vec2f, q: vec2f, z: vec2f, w: vec2f) -> vec2f { - return select(w, z, p.x <= q.x); -} - -fn c_ifeq(p: vec2f, q: vec2f, z: vec2f, w: vec2f) -> vec2f { - return select(w, z, p.x == q.x); -} - -fn c_ifne(p: vec2f, q: vec2f, z: vec2f, w: vec2f) -> vec2f { - return select(w, z, p.x != q.x); -} - -fn c_ifnan(p: vec2f, z: vec2f, w: vec2f) -> vec2f { - return select(w, z, p.x != p.x && p.y != p.y); +fn c_isnan(z: vec2f) -> vec2f { + return select(C_ZERO, C_ONE, z.x != z.x || z.y != z.y); } fn c_conj(z: vec2f) -> vec2f { @@ -128,9 +115,12 @@ fn c_arg(z: vec2f) -> vec2f { } fn c_argbr(z: vec2f, br: vec2f) -> vec2f { + if z.x < 0.0 && z.y == 0.0 { + return vec2(TAU/2.0 + floor(br.x/TAU) * TAU, 0.0); + } let r = vec2(cos(-br.x), sin(-br.x)); let zr = c_mul(z, r); - return c_arg(zr) + vec2(br.x, 0.0); + return vec2(br.x + atan2(zr.y, zr.x), 0.0); } fn c_add(u: vec2f, v: vec2f) -> vec2f { @@ -222,15 +212,18 @@ fn c_tanh(z: vec2f) -> vec2f { } fn c_asin(z: vec2f) -> vec2f { + let m = select(-1.0, 1.0, z.y < 0.0 || (z.y == 0.0 && z.x > 0.0)); let u = c_sqrt(vec2(1.0, 0.0) - c_mul(z, z)); - let v = c_log(u + vec2(-z.y, z.x)); - return vec2(v.y, -v.x); + let v = c_log(u + m*vec2(-z.y, z.x)); + return m*vec2(v.y, -v.x); } +// TODO fix fn c_acos(z: vec2f) -> vec2f { + let m = select(-1.0, 1.0, z.y < 0.0 || (z.y == 0.0 && z.x > 0.0)); let u = c_sqrt(vec2(1.0, 0.0) - c_mul(z, z)); - let v = c_log(u + vec2(-z.y, z.x)); - return vec2(TAU*0.25 - v.y, v.x); + let v = c_log(u + m*vec2(-z.y, z.x)); + return C_TAU/4.0 + m*vec2(-v.y, v.x); } fn c_atan(z: vec2f) -> vec2f { @@ -241,19 +234,19 @@ fn c_atan(z: vec2f) -> vec2f { } fn c_asinh(z: vec2f) -> vec2f { + let m = select(-1.0, 1.0, z.x > 0.0 || (z.x == 0.0 && z.y > 0.0)); let u = c_sqrt(vec2(1.0, 0.0) + c_mul(z, z)); - return c_log(u + z); + return c_log(u + z*m) * m; } fn c_acosh(z: vec2f) -> vec2f { - let u = c_sqrt(vec2(-1.0, 0.0) + c_mul(z, z)); + let b = select(0.0, TAU, z.x < 0.0 || (z.x == 0.0 && z.y < 0.0)); + let u = c_sqrtbr(vec2(-1.0, 0.0) + c_mul(z, z), vec2(b, 0.0)); return c_log(u + z); } fn c_atanh(z: vec2f) -> vec2f { - let u = vec2(1.0, 0.0) + z; - let v = vec2(1.0, 0.0) - z; - return 0.5 * c_log(c_div(u, v)); + return 0.5 * (c_log(C_ONE + z) - c_log(C_ONE - z)); } // log gamma // @@ -321,6 +314,56 @@ fn c_digamma_inner2(z: vec2f) -> vec2f { return w - l; } +// lambert w // + +fn c_lambertw(z: vec2f) -> vec2f { + var w = c_lambertw_init(z, 0.0); + return c_lambertw_iter(z, w); +} + +fn c_lambertwbr(z: vec2f, br: vec2f) -> vec2f { + // branch number + let br_n = br.x / TAU; + + // if -TAU/2 < br < TAU/2 then use -1/e as the branch point, + // otherwise use 0 + let branch_point = select(C_ZERO, vec2(-1.0/E, 0.0), abs(br.x) < TAU / 2.0); + let arg = c_arg(z - branch_point).x; + + // if we're past the branch cut then take branch ceil(br_n), + // otherwise take branch floor(br_n) + let take_ceil = (br_n - floor(br_n) >= arg / TAU + 0.5); + var init_br = select(floor(br_n), ceil(br_n), take_ceil); + + var w = c_lambertw_init(z, init_br); + // newton's method + return c_lambertw_iter(z, w); +} + +fn c_lambertw_iter(z: vec2f, init: vec2f) -> vec2f { + var w = init; + for(var i = 0; i < 5; i++) { + w = c_div(c_mul(w, w) + c_mul(z, c_exp(-w)), w + C_ONE); + } + return w; +} + +fn c_lambertw_init(z: vec2f, br: f32) -> vec2f { + let b = vec2(TAU * br, 0.0); + let oz = z + vec2(1.25, 0.0); + if br == 0.0 && dot(z, z) <= 50.0 + || br == 1.0 && z.y < 0.0 && dot(oz, oz) < 1.0 + || br == -1.0 && z.y > 0.0 && dot(oz, oz) < 1.0 { + // accurate near 0, near principle branch + let w = C_ONE + c_sqrtbr(C_ONE + E*z, b); + return c_div(c_mul(E*z, c_log(w)), w + E*z); + } else { + // accurate asymptotically + let logz = c_logbr(z, b); + return logz - c_log(logz); + } +} + ///////////////// // rendering // /////////////////