From 6d2ffe6902331282d0d9331f2f27a7bf25bbd608 Mon Sep 17 00:00:00 2001 From: enricobuehler Date: Tue, 27 Jun 2023 15:05:46 +0200 Subject: [PATCH] move rust code to own library for targeting multiple environments like wasm, tauri and more put non wasm compatible features like rayon multithreading behind feature flags --- .github/workflows/test.yml | 2 - lib/creator_rs/.gitignore | 1 + lib/creator_rs/Cargo.lock | 3834 +++++++++++++++++ lib/creator_rs/Cargo.toml | 31 + lib/creator_rs/src/animation/mod.rs | 2 + .../src/animation/primitives/circular_text.rs | 36 + .../animation/primitives/entities/common.rs | 78 + .../animation/primitives/entities/ellipse.rs | 92 + .../src/animation/primitives/entities/mod.rs | 5 + .../src/animation/primitives/entities/rect.rs | 90 + .../primitives/entities/staggered_text.rs | 112 + .../src/animation/primitives/entities/text.rs | 82 + .../animation/primitives/interpolations.rs | 170 + .../src/animation/primitives/keyframe.rs | 158 + .../src/animation/primitives/mod.rs | 8 + .../src/animation/primitives/paint.rs | 70 + .../src/animation/primitives/tests.rs | 183 + .../src/animation/primitives/transform.rs | 64 + .../src/animation/primitives/utils.rs | 29 + .../primitives/values/animated_values.rs | 268 ++ .../src/animation/primitives/values/mod.rs | 2 + .../src/animation/primitives/values/values.rs | 4 + lib/creator_rs/src/animation/timeline.rs | 318 ++ lib/creator_rs/src/fonts/fonts.rs | 58 + lib/creator_rs/src/fonts/mod.rs | 1 + lib/creator_rs/src/lib.rs | 3 + lib/something/Cargo.toml | 8 + lib/something/src/lib.rs | 14 + 28 files changed, 5721 insertions(+), 2 deletions(-) create mode 100644 lib/creator_rs/.gitignore create mode 100644 lib/creator_rs/Cargo.lock create mode 100644 lib/creator_rs/Cargo.toml create mode 100644 lib/creator_rs/src/animation/mod.rs create mode 100644 lib/creator_rs/src/animation/primitives/circular_text.rs create mode 100644 lib/creator_rs/src/animation/primitives/entities/common.rs create mode 100644 lib/creator_rs/src/animation/primitives/entities/ellipse.rs create mode 100644 lib/creator_rs/src/animation/primitives/entities/mod.rs create mode 100644 lib/creator_rs/src/animation/primitives/entities/rect.rs create mode 100644 lib/creator_rs/src/animation/primitives/entities/staggered_text.rs create mode 100644 lib/creator_rs/src/animation/primitives/entities/text.rs create mode 100644 lib/creator_rs/src/animation/primitives/interpolations.rs create mode 100644 lib/creator_rs/src/animation/primitives/keyframe.rs create mode 100644 lib/creator_rs/src/animation/primitives/mod.rs create mode 100644 lib/creator_rs/src/animation/primitives/paint.rs create mode 100644 lib/creator_rs/src/animation/primitives/tests.rs create mode 100644 lib/creator_rs/src/animation/primitives/transform.rs create mode 100644 lib/creator_rs/src/animation/primitives/utils.rs create mode 100644 lib/creator_rs/src/animation/primitives/values/animated_values.rs create mode 100644 lib/creator_rs/src/animation/primitives/values/mod.rs create mode 100644 lib/creator_rs/src/animation/primitives/values/values.rs create mode 100644 lib/creator_rs/src/animation/timeline.rs create mode 100644 lib/creator_rs/src/fonts/fonts.rs create mode 100644 lib/creator_rs/src/fonts/mod.rs create mode 100644 lib/creator_rs/src/lib.rs create mode 100644 lib/something/Cargo.toml create mode 100644 lib/something/src/lib.rs diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index 53ebbd3..23b691d 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -10,8 +10,6 @@ jobs: runs-on: ${{ matrix.platform }} - env: - defaults: run: working-directory: app diff --git a/lib/creator_rs/.gitignore b/lib/creator_rs/.gitignore new file mode 100644 index 0000000..eb5a316 --- /dev/null +++ b/lib/creator_rs/.gitignore @@ -0,0 +1 @@ +target diff --git a/lib/creator_rs/Cargo.lock b/lib/creator_rs/Cargo.lock new file mode 100644 index 0000000..d90f51a --- /dev/null +++ b/lib/creator_rs/Cargo.lock @@ -0,0 +1,3834 @@ +# This file is automatically @generated by Cargo. +# It is not intended for manual editing. +version = 3 + +[[package]] +name = "adler" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f26201604c87b1e01bd3d98f8d5d9a8fcbb815e8cedb41ffccbeb4bf593a35fe" + +[[package]] +name = "aho-corasick" +version = "0.7.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cc936419f96fa211c1b9166887b38e5e40b19958e5b895be7c1f93adec7071ac" +dependencies = [ + "memchr", +] + +[[package]] +name = "aho-corasick" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "43f6cb1bf222025340178f382c426f13757b2960e89779dfcb319c32542a5a41" +dependencies = [ + "memchr", +] + +[[package]] +name = "alloc-no-stdlib" +version = "2.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cc7bb162ec39d46ab1ca8c77bf72e890535becd1751bb45f64c597edb4c8c6b3" + +[[package]] +name = "alloc-stdlib" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "94fb8275041c72129eb51b7d0322c29b8387a0386127718b096429201a5d6ece" +dependencies = [ + "alloc-no-stdlib", +] + +[[package]] +name = "android-tzdata" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e999941b234f3131b00bc13c22d06e8c5ff726d1b6318ac7eb276997bbb4fef0" + +[[package]] +name = "android_system_properties" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "819e7219dbd41043ac279b19830f2efc897156490d7fd6ea916720117ee66311" +dependencies = [ + "libc", +] + +[[package]] +name = "anyhow" +version = "1.0.71" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9c7d0618f0e0b7e8ff11427422b64564d5fb0be1940354bfe2e0529b18a9d9b8" + +[[package]] +name = "atk" +version = "0.15.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2c3d816ce6f0e2909a96830d6911c2aff044370b1ef92d7f267b43bae5addedd" +dependencies = [ + "atk-sys", + "bitflags", + "glib", + "libc", +] + +[[package]] +name = "atk-sys" +version = "0.15.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "58aeb089fb698e06db8089971c7ee317ab9644bade33383f63631437b03aafb6" +dependencies = [ + "glib-sys", + "gobject-sys", + "libc", + "system-deps 6.1.1", +] + +[[package]] +name = "autocfg" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d468802bab17cbc0cc575e9b053f41e72aa36bfa6b7f55e3529ffa43161b97fa" + +[[package]] +name = "base64" +version = "0.13.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9e1b586273c5702936fe7b7d6896644d8be71e6314cfe09d3167c95f712589e8" + +[[package]] +name = "base64" +version = "0.21.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "604178f6c5c21f02dc555784810edfb88d34ac2c73b2eae109655649ee73ce3d" + +[[package]] +name = "bitflags" +version = "1.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" + +[[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 = "brotli" +version = "3.3.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a1a0b1dbcc8ae29329621f8d4f0d835787c1c38bb1401979b49d13b0b305ff68" +dependencies = [ + "alloc-no-stdlib", + "alloc-stdlib", + "brotli-decompressor", +] + +[[package]] +name = "brotli-decompressor" +version = "2.3.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4b6561fd3f895a11e8f72af2cb7d22e08366bebc2b6b57f7744c4bda27034744" +dependencies = [ + "alloc-no-stdlib", + "alloc-stdlib", +] + +[[package]] +name = "bstr" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a246e68bb43f6cd9db24bea052a53e40405417c5fb372e3d1a8a7f770a564ef5" +dependencies = [ + "memchr", + "serde", +] + +[[package]] +name = "bumpalo" +version = "3.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a3e2c3daef883ecc1b5d58c15adae93470a91d425f3532ba1695849656af3fc1" + +[[package]] +name = "bytemuck" +version = "1.13.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "17febce684fd15d89027105661fec94afb475cb995fbc59d2865198446ba2eea" + +[[package]] +name = "byteorder" +version = "1.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "14c189c53d098945499cdfa7ecc63567cf3886b3332b312a5b4585d8d3a6a610" + +[[package]] +name = "bytes" +version = "1.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "89b2fd2a0dcf38d7971e2194b6b6eebab45ae01067456a7fd93d5547a61b70be" + +[[package]] +name = "cairo-rs" +version = "0.15.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c76ee391b03d35510d9fa917357c7f1855bd9a6659c95a1b392e33f49b3369bc" +dependencies = [ + "bitflags", + "cairo-sys-rs", + "glib", + "libc", + "thiserror", +] + +[[package]] +name = "cairo-sys-rs" +version = "0.15.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3c55d429bef56ac9172d25fecb85dc8068307d17acd74b377866b7a1ef25d3c8" +dependencies = [ + "glib-sys", + "libc", + "system-deps 6.1.1", +] + +[[package]] +name = "cc" +version = "1.0.79" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "50d30906286121d95be3d479533b458f87493b30a4b5f79a607db8f5d11aa91f" + +[[package]] +name = "cesu8" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6d43a04d8753f35258c91f8ec639f792891f748a1edbd759cf1dcea3382ad83c" + +[[package]] +name = "cfb" +version = "0.7.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d38f2da7a0a2c4ccf0065be06397cc26a81f4e528be095826eee9d4adbb8c60f" +dependencies = [ + "byteorder", + "fnv", + "uuid", +] + +[[package]] +name = "cfg-expr" +version = "0.9.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3431df59f28accaf4cb4eed4a9acc66bea3f3c3753aa6cdc2f024174ef232af7" +dependencies = [ + "smallvec", +] + +[[package]] +name = "cfg-expr" +version = "0.15.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "215c0072ecc28f92eeb0eea38ba63ddfcb65c2828c46311d646f1a3ff5f9841c" +dependencies = [ + "smallvec", + "target-lexicon", +] + +[[package]] +name = "cfg-if" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" + +[[package]] +name = "chrono" +version = "0.4.26" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ec837a71355b28f6556dbd569b37b3f363091c0bd4b2e735674521b4c5fd9bc5" +dependencies = [ + "android-tzdata", + "iana-time-zone", + "num-traits", + "serde", + "winapi", +] + +[[package]] +name = "cmake" +version = "0.1.50" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a31c789563b815f77f4250caee12365734369f942439b7defd71e18a48197130" +dependencies = [ + "cc", +] + +[[package]] +name = "cocoa" +version = "0.24.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f425db7937052c684daec3bd6375c8abe2d146dca4b8b143d6db777c39138f3a" +dependencies = [ + "bitflags", + "block", + "cocoa-foundation", + "core-foundation", + "core-graphics", + "foreign-types", + "libc", + "objc", +] + +[[package]] +name = "cocoa-foundation" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "931d3837c286f56e3c58423ce4eba12d08db2374461a785c86f672b08b5650d6" +dependencies = [ + "bitflags", + "block", + "core-foundation", + "core-graphics-types", + "foreign-types", + "libc", + "objc", +] + +[[package]] +name = "color_quant" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3d7b894f5411737b7867f4827955924d7c254fc9f4d91a6aad6b097804b1018b" + +[[package]] +name = "combine" +version = "4.6.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "35ed6e9d84f0b51a7f52daf1c7d71dd136fd7a3f41a8462b8cdb8c78d920fad4" +dependencies = [ + "bytes", + "memchr", +] + +[[package]] +name = "const-cstr" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ed3d0b5ff30645a68f35ece8cea4556ca14ef8a1651455f789a099a0513532a6" + +[[package]] +name = "convert_case" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6245d59a3e82a7fc217c5828a6692dbc6dfb63a0c8c90495621f7b9d79704a0e" + +[[package]] +name = "core-foundation" +version = "0.9.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "194a7a9e6de53fa55116934067c844d9d749312f75c6f6d0980e8c252f8c2146" +dependencies = [ + "core-foundation-sys", + "libc", +] + +[[package]] +name = "core-foundation-sys" +version = "0.8.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e496a50fda8aacccc86d7529e2c1e0892dbd0f898a6b5645b5561b89c3210efa" + +[[package]] +name = "core-graphics" +version = "0.22.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2581bbab3b8ffc6fcbd550bf46c355135d16e9ff2a6ea032ad6b9bf1d7efe4fb" +dependencies = [ + "bitflags", + "core-foundation", + "core-graphics-types", + "foreign-types", + "libc", +] + +[[package]] +name = "core-graphics-types" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2bb142d41022986c1d8ff29103a1411c8a3dfad3552f87a4f8dc50d61d4f4e33" +dependencies = [ + "bitflags", + "core-foundation", + "libc", +] + +[[package]] +name = "core-text" +version = "19.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "99d74ada66e07c1cefa18f8abfba765b486f250de2e4a999e5727fc0dd4b4a25" +dependencies = [ + "core-foundation", + "core-graphics", + "foreign-types", + "libc", +] + +[[package]] +name = "cpufeatures" +version = "0.2.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "03e69e28e9f7f77debdedbaafa2866e1de9ba56df55a8bd7cfc724c25a09987c" +dependencies = [ + "libc", +] + +[[package]] +name = "crc32fast" +version = "1.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b540bd8bc810d3885c6ea91e2018302f68baba2129ab3e88f32389ee9370880d" +dependencies = [ + "cfg-if", +] + +[[package]] +name = "creator_rs" +version = "0.1.0" +dependencies = [ + "font-kit", + "rayon", + "serde", + "serde_json", + "simple-easing", + "tauri", + "uuid", + "wasm-bindgen", +] + +[[package]] +name = "crossbeam-channel" +version = "0.5.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a33c2bf77f2df06183c3aa30d1e96c0695a313d4f9c453cc3762a6db39f99200" +dependencies = [ + "cfg-if", + "crossbeam-utils", +] + +[[package]] +name = "crossbeam-deque" +version = "0.8.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ce6fd6f855243022dcecf8702fef0c297d4338e226845fe067f6341ad9fa0cef" +dependencies = [ + "cfg-if", + "crossbeam-epoch", + "crossbeam-utils", +] + +[[package]] +name = "crossbeam-epoch" +version = "0.9.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ae211234986c545741a7dc064309f67ee1e5ad243d0e48335adc0484d960bcc7" +dependencies = [ + "autocfg", + "cfg-if", + "crossbeam-utils", + "memoffset", + "scopeguard", +] + +[[package]] +name = "crossbeam-utils" +version = "0.8.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5a22b2d63d4d1dc0b7f1b6b2747dd0088008a9be28b6ddf0b1e7d335e3037294" +dependencies = [ + "cfg-if", +] + +[[package]] +name = "crypto-common" +version = "0.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1bfb12502f3fc46cca1bb51ac28df9d618d813cdc3d2f25b9fe775a34af26bb3" +dependencies = [ + "generic-array", + "typenum", +] + +[[package]] +name = "cssparser" +version = "0.27.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "754b69d351cdc2d8ee09ae203db831e005560fc6030da058f86ad60c92a9cb0a" +dependencies = [ + "cssparser-macros", + "dtoa-short", + "itoa 0.4.8", + "matches", + "phf 0.8.0", + "proc-macro2", + "quote", + "smallvec", + "syn 1.0.109", +] + +[[package]] +name = "cssparser-macros" +version = "0.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "13b588ba4ac1a99f7f2964d24b3d896ddc6bf847ee3855dbd4366f058cfcd331" +dependencies = [ + "quote", + "syn 2.0.22", +] + +[[package]] +name = "ctor" +version = "0.1.26" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6d2301688392eb071b0bf1a37be05c469d3cc4dbbd95df672fe28ab021e6a096" +dependencies = [ + "quote", + "syn 1.0.109", +] + +[[package]] +name = "darling" +version = "0.20.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0558d22a7b463ed0241e993f76f09f30b126687447751a8638587b864e4b3944" +dependencies = [ + "darling_core", + "darling_macro", +] + +[[package]] +name = "darling_core" +version = "0.20.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ab8bfa2e259f8ee1ce5e97824a3c55ec4404a0d772ca7fa96bf19f0752a046eb" +dependencies = [ + "fnv", + "ident_case", + "proc-macro2", + "quote", + "strsim", + "syn 2.0.22", +] + +[[package]] +name = "darling_macro" +version = "0.20.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "29a358ff9f12ec09c3e61fef9b5a9902623a695a46a917b07f269bff1445611a" +dependencies = [ + "darling_core", + "quote", + "syn 2.0.22", +] + +[[package]] +name = "derive_more" +version = "0.99.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4fb810d30a7c1953f91334de7244731fc3f3c10d7fe163338a35b9f640960321" +dependencies = [ + "convert_case", + "proc-macro2", + "quote", + "rustc_version 0.4.0", + "syn 1.0.109", +] + +[[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-next" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b98cf8ebf19c3d1b223e151f99a4f9f0690dca41414773390fc824184ac833e1" +dependencies = [ + "cfg-if", + "dirs-sys-next", +] + +[[package]] +name = "dirs-sys-next" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4ebda144c4fe02d1f7ea1a7d9641b6fc6b580adcfa024ae48797ecdeb6825b4d" +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 = "dlib" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "330c60081dcc4c72131f8eb70510f1ac07223e5d4163db481a04a0befcffa412" +dependencies = [ + "libloading", +] + +[[package]] +name = "dtoa" +version = "1.0.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "65d09067bfacaa79114679b279d7f5885b53295b1e2cfb4e79c8e4bd3d633169" + +[[package]] +name = "dtoa-short" +version = "0.3.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dbaceec3c6e4211c79e7b1800fb9680527106beb2f9c51904a3210c03a448c74" +dependencies = [ + "dtoa", +] + +[[package]] +name = "dunce" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "56ce8c6da7551ec6c462cbaf3bfbc75131ebbfa1c944aeaa9dab51ca1c5f0c3b" + +[[package]] +name = "dwrote" +version = "0.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "439a1c2ba5611ad3ed731280541d36d2e9c4ac5e7fb818a27b604bdc5a6aa65b" +dependencies = [ + "lazy_static", + "libc", + "winapi", + "wio", +] + +[[package]] +name = "either" +version = "1.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7fcaabb2fef8c910e7f4c7ce9f67a1283a1715879a7c230ca9d6d1ae31f16d91" + +[[package]] +name = "embed_plist" +version = "1.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4ef6b89e5b37196644d8796de5268852ff179b44e96276cf4290264843743bb7" + +[[package]] +name = "encoding_rs" +version = "0.8.32" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "071a31f4ee85403370b58aca746f01041ede6f0da2730960ad001edc2b71b394" +dependencies = [ + "cfg-if", +] + +[[package]] +name = "equivalent" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "88bffebc5d80432c9b140ee17875ff173a8ab62faad5b257da912bd2f6c1c0a1" + +[[package]] +name = "errno" +version = "0.3.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", +] + +[[package]] +name = "fastrand" +version = "1.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e51093e27b0797c359783294ca4f0a911c270184cb10f85783b118614a1501be" +dependencies = [ + "instant", +] + +[[package]] +name = "fdeflate" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d329bdeac514ee06249dabc27877490f17f5d371ec693360768b838e19f3ae10" +dependencies = [ + "simd-adler32", +] + +[[package]] +name = "field-offset" +version = "0.3.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "38e2275cc4e4fc009b0669731a1e5ab7ebf11f469eaede2bab9309a5b4d6057f" +dependencies = [ + "memoffset", + "rustc_version 0.4.0", +] + +[[package]] +name = "filetime" +version = "0.2.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5cbc844cecaee9d4443931972e1289c8ff485cb4cc2767cb03ca139ed6885153" +dependencies = [ + "cfg-if", + "libc", + "redox_syscall 0.2.16", + "windows-sys 0.48.0", +] + +[[package]] +name = "flate2" +version = "1.0.26" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3b9429470923de8e8cbd4d2dc513535400b4b3fef0319fb5c4e1f520a7bef743" +dependencies = [ + "crc32fast", + "miniz_oxide", +] + +[[package]] +name = "float-ord" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7bad48618fdb549078c333a7a8528acb57af271d0433bdecd523eb620628364e" + +[[package]] +name = "fnv" +version = "1.0.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" + +[[package]] +name = "font-kit" +version = "0.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "21fe28504d371085fae9ac7a3450f0b289ab71e07c8e57baa3fb68b9e57d6ce5" +dependencies = [ + "bitflags", + "byteorder", + "core-foundation", + "core-graphics", + "core-text", + "dirs-next", + "dwrote", + "float-ord", + "freetype", + "lazy_static", + "libc", + "log", + "pathfinder_geometry", + "pathfinder_simd", + "walkdir", + "winapi", + "yeslogic-fontconfig-sys", +] + +[[package]] +name = "foreign-types" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f6f339eb8adc052cd2ca78910fda869aefa38d22d5cb648e6485e4d3fc06f3b1" +dependencies = [ + "foreign-types-shared", +] + +[[package]] +name = "foreign-types-shared" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "00b0228411908ca8685dba7fc2cdd70ec9990a6e753e89b6ac91a84c40fbaf4b" + +[[package]] +name = "form_urlencoded" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a62bc1cf6f830c2ec14a513a9fb124d0a213a629668a4186f329db21fe045652" +dependencies = [ + "percent-encoding", +] + +[[package]] +name = "freetype" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bee38378a9e3db1cc693b4f88d166ae375338a0ff75cb8263e1c601d51f35dc6" +dependencies = [ + "freetype-sys", + "libc", +] + +[[package]] +name = "freetype-sys" +version = "0.13.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a37d4011c0cc628dfa766fcc195454f4b068d7afdc2adfd28861191d866e731a" +dependencies = [ + "cmake", + "libc", + "pkg-config", +] + +[[package]] +name = "futf" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "df420e2e84819663797d1ec6544b13c5be84629e7bb00dc960d6917db2987843" +dependencies = [ + "mac", + "new_debug_unreachable", +] + +[[package]] +name = "futures-channel" +version = "0.3.28" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "955518d47e09b25bbebc7a18df10b81f0c766eaf4c4f1cccef2fca5f2a4fb5f2" +dependencies = [ + "futures-core", +] + +[[package]] +name = "futures-core" +version = "0.3.28" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4bca583b7e26f571124fe5b7561d49cb2868d79116cfa0eefce955557c6fee8c" + +[[package]] +name = "futures-executor" +version = "0.3.28" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ccecee823288125bd88b4d7f565c9e58e41858e47ab72e8ea2d64e93624386e0" +dependencies = [ + "futures-core", + "futures-task", + "futures-util", +] + +[[package]] +name = "futures-io" +version = "0.3.28" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4fff74096e71ed47f8e023204cfd0aa1289cd54ae5430a9523be060cdb849964" + +[[package]] +name = "futures-macro" +version = "0.3.28" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "89ca545a94061b6365f2c7355b4b32bd20df3ff95f02da9329b34ccc3bd6ee72" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.22", +] + +[[package]] +name = "futures-task" +version = "0.3.28" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "76d3d132be6c0e6aa1534069c705a74a5997a356c0dc2f86a47765e5617c5b65" + +[[package]] +name = "futures-util" +version = "0.3.28" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "26b01e40b772d54cf6c6d721c1d1abd0647a0106a12ecaa1c186273392a69533" +dependencies = [ + "futures-core", + "futures-macro", + "futures-task", + "pin-project-lite", + "pin-utils", + "slab", +] + +[[package]] +name = "fxhash" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c31b6d751ae2c7f11320402d34e41349dd1016f8d5d45e48c4312bc8625af50c" +dependencies = [ + "byteorder", +] + +[[package]] +name = "gdk" +version = "0.15.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a6e05c1f572ab0e1f15be94217f0dc29088c248b14f792a5ff0af0d84bcda9e8" +dependencies = [ + "bitflags", + "cairo-rs", + "gdk-pixbuf", + "gdk-sys", + "gio", + "glib", + "libc", + "pango", +] + +[[package]] +name = "gdk-pixbuf" +version = "0.15.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ad38dd9cc8b099cceecdf41375bb6d481b1b5a7cd5cd603e10a69a9383f8619a" +dependencies = [ + "bitflags", + "gdk-pixbuf-sys", + "gio", + "glib", + "libc", +] + +[[package]] +name = "gdk-pixbuf-sys" +version = "0.15.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "140b2f5378256527150350a8346dbdb08fadc13453a7a2d73aecd5fab3c402a7" +dependencies = [ + "gio-sys", + "glib-sys", + "gobject-sys", + "libc", + "system-deps 6.1.1", +] + +[[package]] +name = "gdk-sys" +version = "0.15.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "32e7a08c1e8f06f4177fb7e51a777b8c1689f743a7bc11ea91d44d2226073a88" +dependencies = [ + "cairo-sys-rs", + "gdk-pixbuf-sys", + "gio-sys", + "glib-sys", + "gobject-sys", + "libc", + "pango-sys", + "pkg-config", + "system-deps 6.1.1", +] + +[[package]] +name = "gdkwayland-sys" +version = "0.15.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cca49a59ad8cfdf36ef7330fe7bdfbe1d34323220cc16a0de2679ee773aee2c2" +dependencies = [ + "gdk-sys", + "glib-sys", + "gobject-sys", + "libc", + "pkg-config", + "system-deps 6.1.1", +] + +[[package]] +name = "gdkx11-sys" +version = "0.15.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b4b7f8c7a84b407aa9b143877e267e848ff34106578b64d1e0a24bf550716178" +dependencies = [ + "gdk-sys", + "glib-sys", + "libc", + "system-deps 6.1.1", + "x11", +] + +[[package]] +name = "generator" +version = "0.7.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5cc16584ff22b460a382b7feec54b23d2908d858152e5739a120b949293bd74e" +dependencies = [ + "cc", + "libc", + "log", + "rustversion", + "windows 0.48.0", +] + +[[package]] +name = "generic-array" +version = "0.14.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "85649ca51fd72272d7821adaf274ad91c288277713d9c18820d8499a7ff69e9a" +dependencies = [ + "typenum", + "version_check", +] + +[[package]] +name = "getrandom" +version = "0.1.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8fc3cb4d91f53b50155bdcfd23f6a4c39ae1969c2ae85982b135750cccaf5fce" +dependencies = [ + "cfg-if", + "libc", + "wasi 0.9.0+wasi-snapshot-preview1", +] + +[[package]] +name = "getrandom" +version = "0.2.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "be4136b2a15dd319360be1c07d9933517ccf0be8f16bf62a3bee4f0d618df427" +dependencies = [ + "cfg-if", + "js-sys", + "libc", + "wasi 0.11.0+wasi-snapshot-preview1", + "wasm-bindgen", +] + +[[package]] +name = "gio" +version = "0.15.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "68fdbc90312d462781a395f7a16d96a2b379bb6ef8cd6310a2df272771c4283b" +dependencies = [ + "bitflags", + "futures-channel", + "futures-core", + "futures-io", + "gio-sys", + "glib", + "libc", + "once_cell", + "thiserror", +] + +[[package]] +name = "gio-sys" +version = "0.15.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "32157a475271e2c4a023382e9cab31c4584ee30a97da41d3c4e9fdd605abcf8d" +dependencies = [ + "glib-sys", + "gobject-sys", + "libc", + "system-deps 6.1.1", + "winapi", +] + +[[package]] +name = "glib" +version = "0.15.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "edb0306fbad0ab5428b0ca674a23893db909a98582969c9b537be4ced78c505d" +dependencies = [ + "bitflags", + "futures-channel", + "futures-core", + "futures-executor", + "futures-task", + "glib-macros", + "glib-sys", + "gobject-sys", + "libc", + "once_cell", + "smallvec", + "thiserror", +] + +[[package]] +name = "glib-macros" +version = "0.15.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "10c6ae9f6fa26f4fb2ac16b528d138d971ead56141de489f8111e259b9df3c4a" +dependencies = [ + "anyhow", + "heck 0.4.1", + "proc-macro-crate", + "proc-macro-error", + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "glib-sys" +version = "0.15.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ef4b192f8e65e9cf76cbf4ea71fa8e3be4a0e18ffe3d68b8da6836974cc5bad4" +dependencies = [ + "libc", + "system-deps 6.1.1", +] + +[[package]] +name = "glob" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d2fabcfbdc87f4758337ca535fb41a6d701b65693ce38287d856d1674551ec9b" + +[[package]] +name = "globset" +version = "0.4.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "029d74589adefde59de1a0c4f4732695c32805624aec7b68d91503d4dba79afc" +dependencies = [ + "aho-corasick 0.7.20", + "bstr", + "fnv", + "log", + "regex", +] + +[[package]] +name = "gobject-sys" +version = "0.15.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0d57ce44246becd17153bd035ab4d32cfee096a657fc01f2231c9278378d1e0a" +dependencies = [ + "glib-sys", + "libc", + "system-deps 6.1.1", +] + +[[package]] +name = "gtk" +version = "0.15.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "92e3004a2d5d6d8b5057d2b57b3712c9529b62e82c77f25c1fecde1fd5c23bd0" +dependencies = [ + "atk", + "bitflags", + "cairo-rs", + "field-offset", + "futures-channel", + "gdk", + "gdk-pixbuf", + "gio", + "glib", + "gtk-sys", + "gtk3-macros", + "libc", + "once_cell", + "pango", + "pkg-config", +] + +[[package]] +name = "gtk-sys" +version = "0.15.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d5bc2f0587cba247f60246a0ca11fe25fb733eabc3de12d1965fc07efab87c84" +dependencies = [ + "atk-sys", + "cairo-sys-rs", + "gdk-pixbuf-sys", + "gdk-sys", + "gio-sys", + "glib-sys", + "gobject-sys", + "libc", + "pango-sys", + "system-deps 6.1.1", +] + +[[package]] +name = "gtk3-macros" +version = "0.15.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "684c0456c086e8e7e9af73ec5b84e35938df394712054550e81558d21c44ab0d" +dependencies = [ + "anyhow", + "proc-macro-crate", + "proc-macro-error", + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "hashbrown" +version = "0.12.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8a9ee70c43aaf417c914396645a0fa852624801b24ebb7ae78fe8272889ac888" + +[[package]] +name = "hashbrown" +version = "0.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2c6201b9ff9fd90a5a3bac2e56a830d0caa509576f0e503818ee82c181b3437a" + +[[package]] +name = "heck" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6d621efb26863f0e9924c6ac577e8275e5e6b77455db64ffa6c65c904e9e132c" +dependencies = [ + "unicode-segmentation", +] + +[[package]] +name = "heck" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "95505c38b4572b2d910cecb0281560f54b440a19336cbbcb27bf6ce6adc6f5a8" + +[[package]] +name = "hermit-abi" +version = "0.2.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ee512640fe35acbfb4bb779db6f0d80704c2cacfa2e39b601ef3e3f47d1ae4c7" +dependencies = [ + "libc", +] + +[[package]] +name = "hermit-abi" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fed44880c466736ef9a5c5b5facefb5ed0785676d0c02d612db14e54f0d84286" + +[[package]] +name = "hex" +version = "0.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7f24254aa9a54b5c858eaee2f5bccdb46aaf0e486a595ed5fd8f86ba55232a70" + +[[package]] +name = "html5ever" +version = "0.25.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e5c13fb08e5d4dfc151ee5e88bae63f7773d61852f3bdc73c9f4b9e1bde03148" +dependencies = [ + "log", + "mac", + "markup5ever", + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "http" +version = "0.2.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bd6effc99afb63425aff9b05836f029929e345a6148a14b7ecd5ab67af944482" +dependencies = [ + "bytes", + "fnv", + "itoa 1.0.6", +] + +[[package]] +name = "http-range" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "21dec9db110f5f872ed9699c3ecf50cf16f423502706ba5c72462e28d3157573" + +[[package]] +name = "iana-time-zone" +version = "0.1.57" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2fad5b825842d2b38bd206f3e81d6957625fd7f0a361e345c30e01a0ae2dd613" +dependencies = [ + "android_system_properties", + "core-foundation-sys", + "iana-time-zone-haiku", + "js-sys", + "wasm-bindgen", + "windows 0.48.0", +] + +[[package]] +name = "iana-time-zone-haiku" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f31827a206f56af32e590ba56d5d2d085f558508192593743f16b2306495269f" +dependencies = [ + "cc", +] + +[[package]] +name = "ico" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e3804960be0bb5e4edb1e1ad67afd321a9ecfd875c3e65c099468fd2717d7cae" +dependencies = [ + "byteorder", + "png", +] + +[[package]] +name = "ident_case" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b9e0384b61958566e926dc50660321d12159025e767c18e043daf26b70104c39" + +[[package]] +name = "idna" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7d20d6b07bfbc108882d88ed8e37d39636dcc260e15e30c45e6ba089610b917c" +dependencies = [ + "unicode-bidi", + "unicode-normalization", +] + +[[package]] +name = "ignore" +version = "0.4.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dbe7873dab538a9a44ad79ede1faf5f30d49f9a5c883ddbab48bce81b64b7492" +dependencies = [ + "globset", + "lazy_static", + "log", + "memchr", + "regex", + "same-file", + "thread_local", + "walkdir", + "winapi-util", +] + +[[package]] +name = "image" +version = "0.24.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "527909aa81e20ac3a44803521443a765550f09b5130c2c2fa1ea59c2f8f50a3a" +dependencies = [ + "bytemuck", + "byteorder", + "color_quant", + "num-rational", + "num-traits", +] + +[[package]] +name = "indexmap" +version = "1.9.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bd070e393353796e801d209ad339e89596eb4c8d430d18ede6a1cced8fafbd99" +dependencies = [ + "autocfg", + "hashbrown 0.12.3", + "serde", +] + +[[package]] +name = "indexmap" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d5477fe2230a79769d8dc68e0eabf5437907c0457a5614a9e8dddb67f65eb65d" +dependencies = [ + "equivalent", + "hashbrown 0.14.0", +] + +[[package]] +name = "infer" +version = "0.12.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a898e4b7951673fce96614ce5751d13c40fc5674bc2d759288e46c3ab62598b3" +dependencies = [ + "cfb", +] + +[[package]] +name = "instant" +version = "0.1.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7a5bbe824c507c5da5956355e86a746d82e0e1464f65d862cc5e71da70e94b2c" +dependencies = [ + "cfg-if", +] + +[[package]] +name = "io-lifetimes" +version = "1.0.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eae7b9aee968036d54dce06cebaefd919e4472e753296daccd6d344e3e2df0c2" +dependencies = [ + "hermit-abi 0.3.1", + "libc", + "windows-sys 0.48.0", +] + +[[package]] +name = "itoa" +version = "0.4.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b71991ff56294aa922b450139ee08b3bfc70982c6b2c7562771375cf73542dd4" + +[[package]] +name = "itoa" +version = "1.0.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "453ad9f582a441959e5f0d088b02ce04cfe8d51a8eaf077f12ac6d3e94164ca6" + +[[package]] +name = "javascriptcore-rs" +version = "0.16.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bf053e7843f2812ff03ef5afe34bb9c06ffee120385caad4f6b9967fcd37d41c" +dependencies = [ + "bitflags", + "glib", + "javascriptcore-rs-sys", +] + +[[package]] +name = "javascriptcore-rs-sys" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "905fbb87419c5cde6e3269537e4ea7d46431f3008c5d057e915ef3f115e7793c" +dependencies = [ + "glib-sys", + "gobject-sys", + "libc", + "system-deps 5.0.0", +] + +[[package]] +name = "jni" +version = "0.20.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "039022cdf4d7b1cf548d31f60ae783138e5fd42013f6271049d7df7afadef96c" +dependencies = [ + "cesu8", + "combine", + "jni-sys", + "log", + "thiserror", + "walkdir", +] + +[[package]] +name = "jni-sys" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8eaf4bc02d17cbdd7ff4c7438cafcdf7fb9a4613313ad11b4f8fefe7d3fa0130" + +[[package]] +name = "js-sys" +version = "0.3.64" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c5f195fe497f702db0f318b07fdd68edb16955aed830df8363d837542f8f935a" +dependencies = [ + "wasm-bindgen", +] + +[[package]] +name = "json-patch" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1f54898088ccb91df1b492cc80029a6fdf1c48ca0db7c6822a8babad69c94658" +dependencies = [ + "serde", + "serde_json", + "thiserror", + "treediff", +] + +[[package]] +name = "kuchiki" +version = "0.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1ea8e9c6e031377cff82ee3001dc8026cdf431ed4e2e6b51f98ab8c73484a358" +dependencies = [ + "cssparser", + "html5ever", + "matches", + "selectors", +] + +[[package]] +name = "lazy_static" +version = "1.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646" + +[[package]] +name = "libc" +version = "0.2.147" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b4668fb0ea861c1df094127ac5f1da3409a82116a4ba74fca2e58ef927159bb3" + +[[package]] +name = "libloading" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d580318f95776505201b28cf98eb1fa5e4be3b689633ba6a3e6cd880ff22d8cb" +dependencies = [ + "cfg-if", + "windows-sys 0.48.0", +] + +[[package]] +name = "line-wrap" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f30344350a2a51da54c1d53be93fade8a237e545dbcc4bdbe635413f2117cab9" +dependencies = [ + "safemem", +] + +[[package]] +name = "linux-raw-sys" +version = "0.3.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ef53942eb7bf7ff43a617b3e2c1c4a5ecf5944a7c1bc12d7ee39bbb15e5c1519" + +[[package]] +name = "lock_api" +version = "0.4.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c1cc9717a20b1bb222f333e6a92fd32f7d8a18ddc5a3191a11af45dcbf4dcd16" +dependencies = [ + "autocfg", + "scopeguard", +] + +[[package]] +name = "log" +version = "0.4.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b06a4cde4c0f271a446782e3eff8de789548ce57dbc8eca9292c27f4a42004b4" + +[[package]] +name = "loom" +version = "0.5.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ff50ecb28bb86013e935fb6683ab1f6d3a20016f123c76fd4c27470076ac30f5" +dependencies = [ + "cfg-if", + "generator", + "scoped-tls", + "serde", + "serde_json", + "tracing", + "tracing-subscriber", +] + +[[package]] +name = "mac" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c41e0c4fef86961ac6d6f8a82609f55f31b05e4fce149ac5710e439df7619ba4" + +[[package]] +name = "malloc_buf" +version = "0.0.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "62bb907fe88d54d8d9ce32a3cceab4218ed2f6b7d35617cafe9adf84e43919cb" +dependencies = [ + "libc", +] + +[[package]] +name = "markup5ever" +version = "0.10.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a24f40fb03852d1cdd84330cddcaf98e9ec08a7b7768e952fad3b4cf048ec8fd" +dependencies = [ + "log", + "phf 0.8.0", + "phf_codegen", + "string_cache", + "string_cache_codegen", + "tendril", +] + +[[package]] +name = "matchers" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8263075bb86c5a1b1427b5ae862e8889656f126e9f77c484496e8b47cf5c5558" +dependencies = [ + "regex-automata", +] + +[[package]] +name = "matches" +version = "0.1.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2532096657941c2fea9c289d370a250971c689d4f143798ff67113ec042024a5" + +[[package]] +name = "memchr" +version = "2.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2dffe52ecf27772e601905b7522cb4ef790d2cc203488bbd0e2fe85fcb74566d" + +[[package]] +name = "memoffset" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5a634b1c61a95585bd15607c6ab0c4e5b226e695ff2800ba0cdccddf208c406c" +dependencies = [ + "autocfg", +] + +[[package]] +name = "miniz_oxide" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e7810e0be55b428ada41041c41f32c9f1a42817901b4ccf45fa3d4b6561e74c7" +dependencies = [ + "adler", + "simd-adler32", +] + +[[package]] +name = "ndk" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2032c77e030ddee34a6787a64166008da93f6a352b629261d0fee232b8742dd4" +dependencies = [ + "bitflags", + "jni-sys", + "ndk-sys", + "num_enum", + "thiserror", +] + +[[package]] +name = "ndk-context" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "27b02d87554356db9e9a873add8782d4ea6e3e58ea071a9adb9a2e8ddb884a8b" + +[[package]] +name = "ndk-sys" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6e5a6ae77c8ee183dcbbba6150e2e6b9f3f4196a7666c02a715a95692ec1fa97" +dependencies = [ + "jni-sys", +] + +[[package]] +name = "new_debug_unreachable" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e4a24736216ec316047a1fc4252e27dabb04218aa4a3f37c6e7ddbf1f9782b54" + +[[package]] +name = "nodrop" +version = "0.1.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "72ef4a56884ca558e5ddb05a1d1e7e1bfd9a68d9ed024c21704cc98872dae1bb" + +[[package]] +name = "nu-ansi-term" +version = "0.46.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "77a8165726e8236064dbb45459242600304b42a5ea24ee2948e18e023bf7ba84" +dependencies = [ + "overload", + "winapi", +] + +[[package]] +name = "num-integer" +version = "0.1.45" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "225d3389fb3509a24c93f5c29eb6bde2586b98d9f016636dff58d7c6f7569cd9" +dependencies = [ + "autocfg", + "num-traits", +] + +[[package]] +name = "num-rational" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0638a1c9d0a3c0914158145bc76cff373a75a627e6ecbfb71cbe6f453a5a19b0" +dependencies = [ + "autocfg", + "num-integer", + "num-traits", +] + +[[package]] +name = "num-traits" +version = "0.2.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "578ede34cf02f8924ab9447f50c28075b4d3e5b269972345e7e0372b38c6cdcd" +dependencies = [ + "autocfg", +] + +[[package]] +name = "num_cpus" +version = "1.15.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0fac9e2da13b5eb447a6ce3d392f23a29d8694bff781bf03a16cd9ac8697593b" +dependencies = [ + "hermit-abi 0.2.6", + "libc", +] + +[[package]] +name = "num_enum" +version = "0.5.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1f646caf906c20226733ed5b1374287eb97e3c2a5c227ce668c1f2ce20ae57c9" +dependencies = [ + "num_enum_derive", +] + +[[package]] +name = "num_enum_derive" +version = "0.5.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dcbff9bc912032c62bf65ef1d5aea88983b420f4f839db1e9b0c281a25c9c799" +dependencies = [ + "proc-macro-crate", + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "objc" +version = "0.2.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "915b1b472bc21c53464d6c8461c9d3af805ba1ef837e1cac254428f4a77177b1" +dependencies = [ + "malloc_buf", + "objc_exception", +] + +[[package]] +name = "objc-foundation" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1add1b659e36c9607c7aab864a76c7a4c2760cd0cd2e120f3fb8b952c7e22bf9" +dependencies = [ + "block", + "objc", + "objc_id", +] + +[[package]] +name = "objc_exception" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ad970fb455818ad6cba4c122ad012fae53ae8b4795f86378bce65e4f6bab2ca4" +dependencies = [ + "cc", +] + +[[package]] +name = "objc_id" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c92d4ddb4bd7b50d730c215ff871754d0da6b2178849f8a2a2ab69712d0c073b" +dependencies = [ + "objc", +] + +[[package]] +name = "once_cell" +version = "1.18.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dd8b5dd2ae5ed71462c540258bedcb51965123ad7e7ccf4b9a8cafaa4a63576d" + +[[package]] +name = "open" +version = "3.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2078c0039e6a54a0c42c28faa984e115fb4c2d5bf2208f77d1961002df8576f8" +dependencies = [ + "pathdiff", + "windows-sys 0.42.0", +] + +[[package]] +name = "overload" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b15813163c1d831bf4a13c3610c05c0d03b39feb07f7e09fa234dac9b15aaf39" + +[[package]] +name = "pango" +version = "0.15.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "22e4045548659aee5313bde6c582b0d83a627b7904dd20dc2d9ef0895d414e4f" +dependencies = [ + "bitflags", + "glib", + "libc", + "once_cell", + "pango-sys", +] + +[[package]] +name = "pango-sys" +version = "0.15.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d2a00081cde4661982ed91d80ef437c20eacaf6aa1a5962c0279ae194662c3aa" +dependencies = [ + "glib-sys", + "gobject-sys", + "libc", + "system-deps 6.1.1", +] + +[[package]] +name = "parking_lot" +version = "0.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3742b2c103b9f06bc9fff0a37ff4912935851bee6d36f3c02bcc755bcfec228f" +dependencies = [ + "lock_api", + "parking_lot_core", +] + +[[package]] +name = "parking_lot_core" +version = "0.9.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "93f00c865fe7cabf650081affecd3871070f26767e7b2070a3ffae14c654b447" +dependencies = [ + "cfg-if", + "libc", + "redox_syscall 0.3.5", + "smallvec", + "windows-targets", +] + +[[package]] +name = "pathdiff" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8835116a5c179084a830efb3adc117ab007512b535bc1a21c991d3b32a6b44dd" + +[[package]] +name = "pathfinder_geometry" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0b7b7e7b4ea703700ce73ebf128e1450eb69c3a8329199ffbfb9b2a0418e5ad3" +dependencies = [ + "log", + "pathfinder_simd", +] + +[[package]] +name = "pathfinder_simd" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "39fe46acc5503595e5949c17b818714d26fdf9b4920eacf3b2947f0199f4a6ff" +dependencies = [ + "rustc_version 0.3.3", +] + +[[package]] +name = "percent-encoding" +version = "2.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9b2a4787296e9989611394c33f193f676704af1686e70b8f8033ab5ba9a35a94" + +[[package]] +name = "pest" +version = "2.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f73935e4d55e2abf7f130186537b19e7a4abc886a0252380b59248af473a3fc9" +dependencies = [ + "thiserror", + "ucd-trie", +] + +[[package]] +name = "phf" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3dfb61232e34fcb633f43d12c58f83c1df82962dcdfa565a4e866ffc17dafe12" +dependencies = [ + "phf_macros 0.8.0", + "phf_shared 0.8.0", + "proc-macro-hack", +] + +[[package]] +name = "phf" +version = "0.10.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fabbf1ead8a5bcbc20f5f8b939ee3f5b0f6f281b6ad3468b84656b658b455259" +dependencies = [ + "phf_macros 0.10.0", + "phf_shared 0.10.0", + "proc-macro-hack", +] + +[[package]] +name = "phf_codegen" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cbffee61585b0411840d3ece935cce9cb6321f01c45477d30066498cd5e1a815" +dependencies = [ + "phf_generator 0.8.0", + "phf_shared 0.8.0", +] + +[[package]] +name = "phf_generator" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "17367f0cc86f2d25802b2c26ee58a7b23faeccf78a396094c13dced0d0182526" +dependencies = [ + "phf_shared 0.8.0", + "rand 0.7.3", +] + +[[package]] +name = "phf_generator" +version = "0.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5d5285893bb5eb82e6aaf5d59ee909a06a16737a8970984dd7746ba9283498d6" +dependencies = [ + "phf_shared 0.10.0", + "rand 0.8.5", +] + +[[package]] +name = "phf_macros" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7f6fde18ff429ffc8fe78e2bf7f8b7a5a5a6e2a8b58bc5a9ac69198bbda9189c" +dependencies = [ + "phf_generator 0.8.0", + "phf_shared 0.8.0", + "proc-macro-hack", + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "phf_macros" +version = "0.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "58fdf3184dd560f160dd73922bea2d5cd6e8f064bf4b13110abd81b03697b4e0" +dependencies = [ + "phf_generator 0.10.0", + "phf_shared 0.10.0", + "proc-macro-hack", + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "phf_shared" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c00cf8b9eafe68dde5e9eaa2cef8ee84a9336a47d566ec55ca16589633b65af7" +dependencies = [ + "siphasher", +] + +[[package]] +name = "phf_shared" +version = "0.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6796ad771acdc0123d2a88dc428b5e38ef24456743ddb1744ed628f9815c096" +dependencies = [ + "siphasher", +] + +[[package]] +name = "pin-project-lite" +version = "0.2.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e0a7ae3ac2f1173085d398531c705756c94a4c56843785df85a60c1a0afac116" + +[[package]] +name = "pin-utils" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184" + +[[package]] +name = "pkg-config" +version = "0.3.27" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "26072860ba924cbfa98ea39c8c19b4dd6a4a25423dbdf219c1eca91aa0cf6964" + +[[package]] +name = "plist" +version = "1.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9bd9647b268a3d3e14ff09c23201133a62589c658db02bb7388c7246aafe0590" +dependencies = [ + "base64 0.21.2", + "indexmap 1.9.3", + "line-wrap", + "quick-xml", + "serde", + "time", +] + +[[package]] +name = "png" +version = "0.17.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "59871cc5b6cce7eaccca5a802b4173377a1c2ba90654246789a8fa2334426d11" +dependencies = [ + "bitflags", + "crc32fast", + "fdeflate", + "flate2", + "miniz_oxide", +] + +[[package]] +name = "ppv-lite86" +version = "0.2.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5b40af805b3121feab8a3c29f04d8ad262fa8e0561883e7653e024ae4479e6de" + +[[package]] +name = "precomputed-hash" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "925383efa346730478fb4838dbe9137d2a47675ad789c546d150a6e1dd4ab31c" + +[[package]] +name = "proc-macro-crate" +version = "1.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7f4c021e1093a56626774e81216a4ce732a735e5bad4868a03f3ed65ca0c3919" +dependencies = [ + "once_cell", + "toml_edit", +] + +[[package]] +name = "proc-macro-error" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "da25490ff9892aab3fcf7c36f08cfb902dd3e71ca0f9f9517bea02a73a5ce38c" +dependencies = [ + "proc-macro-error-attr", + "proc-macro2", + "quote", + "syn 1.0.109", + "version_check", +] + +[[package]] +name = "proc-macro-error-attr" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a1be40180e52ecc98ad80b184934baf3d0d29f979574e439af5a55274b35f869" +dependencies = [ + "proc-macro2", + "quote", + "version_check", +] + +[[package]] +name = "proc-macro-hack" +version = "0.5.20+deprecated" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dc375e1527247fe1a97d8b7156678dfe7c1af2fc075c9a4db3690ecd2a148068" + +[[package]] +name = "proc-macro2" +version = "1.0.63" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7b368fba921b0dce7e60f5e04ec15e565b3303972b42bcfde1d0713b881959eb" +dependencies = [ + "unicode-ident", +] + +[[package]] +name = "quick-xml" +version = "0.28.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0ce5e73202a820a31f8a0ee32ada5e21029c81fd9e3ebf668a40832e4219d9d1" +dependencies = [ + "memchr", +] + +[[package]] +name = "quote" +version = "1.0.28" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1b9ab9c7eadfd8df19006f1cf1a4aed13540ed5cbc047010ece5826e10825488" +dependencies = [ + "proc-macro2", +] + +[[package]] +name = "rand" +version = "0.7.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6a6b1679d49b24bbfe0c803429aa1874472f50d9b363131f0e89fc356b544d03" +dependencies = [ + "getrandom 0.1.16", + "libc", + "rand_chacha 0.2.2", + "rand_core 0.5.1", + "rand_hc", + "rand_pcg", +] + +[[package]] +name = "rand" +version = "0.8.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "34af8d1a0e25924bc5b7c43c079c942339d8f0a8b57c39049bef581b46327404" +dependencies = [ + "libc", + "rand_chacha 0.3.1", + "rand_core 0.6.4", +] + +[[package]] +name = "rand_chacha" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f4c8ed856279c9737206bf725bf36935d8666ead7aa69b52be55af369d193402" +dependencies = [ + "ppv-lite86", + "rand_core 0.5.1", +] + +[[package]] +name = "rand_chacha" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e6c10a63a0fa32252be49d21e7709d4d4baf8d231c2dbce1eaa8141b9b127d88" +dependencies = [ + "ppv-lite86", + "rand_core 0.6.4", +] + +[[package]] +name = "rand_core" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "90bde5296fc891b0cef12a6d03ddccc162ce7b2aff54160af9338f8d40df6d19" +dependencies = [ + "getrandom 0.1.16", +] + +[[package]] +name = "rand_core" +version = "0.6.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c" +dependencies = [ + "getrandom 0.2.10", +] + +[[package]] +name = "rand_hc" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ca3129af7b92a17112d59ad498c6f81eaf463253766b90396d39ea7a39d6613c" +dependencies = [ + "rand_core 0.5.1", +] + +[[package]] +name = "rand_pcg" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "16abd0c1b639e9eb4d7c50c0b8100b0d0f849be2349829c740fe8e6eb4816429" +dependencies = [ + "rand_core 0.5.1", +] + +[[package]] +name = "raw-window-handle" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f2ff9a1f06a88b01621b7ae906ef0211290d1c8a168a15542486a8f61c0833b9" + +[[package]] +name = "rayon" +version = "1.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1d2df5196e37bcc87abebc0053e20787d73847bb33134a69841207dd0a47f03b" +dependencies = [ + "either", + "rayon-core", +] + +[[package]] +name = "rayon-core" +version = "1.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4b8f95bd6966f5c87776639160a66bd8ab9895d9d4ab01ddba9fc60661aebe8d" +dependencies = [ + "crossbeam-channel", + "crossbeam-deque", + "crossbeam-utils", + "num_cpus", +] + +[[package]] +name = "redox_syscall" +version = "0.2.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fb5a58c1855b4b6819d59012155603f0b22ad30cad752600aadfcb695265519a" +dependencies = [ + "bitflags", +] + +[[package]] +name = "redox_syscall" +version = "0.3.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "567664f262709473930a4bf9e51bf2ebf3348f2e748ccc50dea20646858f8f29" +dependencies = [ + "bitflags", +] + +[[package]] +name = "redox_users" +version = "0.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b033d837a7cf162d7993aded9304e30a83213c648b6e389db233191f891e5c2b" +dependencies = [ + "getrandom 0.2.10", + "redox_syscall 0.2.16", + "thiserror", +] + +[[package]] +name = "regex" +version = "1.8.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d0ab3ca65655bb1e41f2a8c8cd662eb4fb035e67c3f78da1d61dffe89d07300f" +dependencies = [ + "aho-corasick 1.0.2", + "memchr", + "regex-syntax 0.7.2", +] + +[[package]] +name = "regex-automata" +version = "0.1.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6c230d73fb8d8c1b9c0b3135c5142a8acee3a0558fb8db5cf1cb65f8d7862132" +dependencies = [ + "regex-syntax 0.6.29", +] + +[[package]] +name = "regex-syntax" +version = "0.6.29" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f162c6dd7b008981e4d40210aca20b4bd0f9b60ca9271061b07f78537722f2e1" + +[[package]] +name = "regex-syntax" +version = "0.7.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "436b050e76ed2903236f032a59761c1eb99e1b0aead2c257922771dab1fc8c78" + +[[package]] +name = "rfd" +version = "0.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0149778bd99b6959285b0933288206090c50e2327f47a9c463bfdbf45c8823ea" +dependencies = [ + "block", + "dispatch", + "glib-sys", + "gobject-sys", + "gtk-sys", + "js-sys", + "lazy_static", + "log", + "objc", + "objc-foundation", + "objc_id", + "raw-window-handle", + "wasm-bindgen", + "wasm-bindgen-futures", + "web-sys", + "windows 0.37.0", +] + +[[package]] +name = "rustc_version" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f0dfe2087c51c460008730de8b57e6a320782fbfb312e1f4d520e6c6fae155ee" +dependencies = [ + "semver 0.11.0", +] + +[[package]] +name = "rustc_version" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bfa0f585226d2e68097d4f95d113b15b83a82e819ab25717ec0590d9584ef366" +dependencies = [ + "semver 1.0.17", +] + +[[package]] +name = "rustix" +version = "0.37.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b96e891d04aa506a6d1f318d2771bcb1c7dfda84e126660ace067c9b474bb2c0" +dependencies = [ + "bitflags", + "errno", + "io-lifetimes", + "libc", + "linux-raw-sys", + "windows-sys 0.48.0", +] + +[[package]] +name = "rustversion" +version = "1.0.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4f3208ce4d8448b3f3e7d168a73f5e0c43a61e32930de3bceeccedb388b6bf06" + +[[package]] +name = "ryu" +version = "1.0.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f91339c0467de62360649f8d3e185ca8de4224ff281f66000de5eb2a77a79041" + +[[package]] +name = "safemem" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ef703b7cb59335eae2eb93ceb664c0eb7ea6bf567079d843e09420219668e072" + +[[package]] +name = "same-file" +version = "1.0.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "93fc1dc3aaa9bfed95e02e6eadabb4baf7e3078b0bd1b4d7b6b0b68378900502" +dependencies = [ + "winapi-util", +] + +[[package]] +name = "scoped-tls" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e1cf6437eb19a8f4a6cc0f7dca544973b0b78843adbfeb3683d1a94a0024a294" + +[[package]] +name = "scopeguard" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d29ab0c6d3fc0ee92fe66e2d99f700eab17a8d57d1c1d3b748380fb20baa78cd" + +[[package]] +name = "selectors" +version = "0.22.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "df320f1889ac4ba6bc0cdc9c9af7af4bd64bb927bccdf32d81140dc1f9be12fe" +dependencies = [ + "bitflags", + "cssparser", + "derive_more", + "fxhash", + "log", + "matches", + "phf 0.8.0", + "phf_codegen", + "precomputed-hash", + "servo_arc", + "smallvec", + "thin-slice", +] + +[[package]] +name = "semver" +version = "0.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f301af10236f6df4160f7c3f04eec6dbc70ace82d23326abad5edee88801c6b6" +dependencies = [ + "semver-parser", +] + +[[package]] +name = "semver" +version = "1.0.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bebd363326d05ec3e2f532ab7660680f3b02130d780c299bca73469d521bc0ed" +dependencies = [ + "serde", +] + +[[package]] +name = "semver-parser" +version = "0.10.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "00b0bef5b7f9e0df16536d3961cfb6e84331c065b4066afb39768d0e319411f7" +dependencies = [ + "pest", +] + +[[package]] +name = "serde" +version = "1.0.164" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9e8c8cf938e98f769bc164923b06dce91cea1751522f46f8466461af04c9027d" +dependencies = [ + "serde_derive", +] + +[[package]] +name = "serde_derive" +version = "1.0.164" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d9735b638ccc51c28bf6914d90a2e9725b377144fc612c49a611fddd1b631d68" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.22", +] + +[[package]] +name = "serde_json" +version = "1.0.99" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "46266871c240a00b8f503b877622fe33430b3c7d963bdc0f2adc511e54a1eae3" +dependencies = [ + "itoa 1.0.6", + "ryu", + "serde", +] + +[[package]] +name = "serde_repr" +version = "0.1.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bcec881020c684085e55a25f7fd888954d56609ef363479dc5a1305eb0d40cab" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.22", +] + +[[package]] +name = "serde_spanned" +version = "0.6.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "96426c9936fd7a0124915f9185ea1d20aa9445cc9821142f0a73bc9207a2e186" +dependencies = [ + "serde", +] + +[[package]] +name = "serde_with" +version = "3.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9f02d8aa6e3c385bf084924f660ce2a3a6bd333ba55b35e8590b321f35d88513" +dependencies = [ + "base64 0.21.2", + "chrono", + "hex", + "indexmap 1.9.3", + "serde", + "serde_json", + "serde_with_macros", + "time", +] + +[[package]] +name = "serde_with_macros" +version = "3.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "edc7d5d3932fb12ce722ee5e64dd38c504efba37567f0c402f6ca728c3b8b070" +dependencies = [ + "darling", + "proc-macro2", + "quote", + "syn 2.0.22", +] + +[[package]] +name = "serialize-to-javascript" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c9823f2d3b6a81d98228151fdeaf848206a7855a7a042bbf9bf870449a66cafb" +dependencies = [ + "serde", + "serde_json", + "serialize-to-javascript-impl", +] + +[[package]] +name = "serialize-to-javascript-impl" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "74064874e9f6a15f04c1f3cb627902d0e6b410abbf36668afa873c61889f1763" +dependencies = [ + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "servo_arc" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d98238b800e0d1576d8b6e3de32827c2d74bee68bb97748dcf5071fb53965432" +dependencies = [ + "nodrop", + "stable_deref_trait", +] + +[[package]] +name = "sha2" +version = "0.10.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "479fb9d862239e610720565ca91403019f2f00410f1864c5aa7479b950a76ed8" +dependencies = [ + "cfg-if", + "cpufeatures", + "digest", +] + +[[package]] +name = "sharded-slab" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "900fba806f70c630b0a382d0d825e17a0f19fcd059a2ade1ff237bcddf446b31" +dependencies = [ + "lazy_static", +] + +[[package]] +name = "simd-adler32" +version = "0.3.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "238abfbb77c1915110ad968465608b68e869e0772622c9656714e73e5a1a522f" + +[[package]] +name = "simple-easing" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "832ddd7df0d98d6fd93b973c330b7c8e0742d5cb8f1afc7dea89dba4d2531aa1" + +[[package]] +name = "siphasher" +version = "0.3.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7bd3e3206899af3f8b12af284fafc038cc1dc2b41d1b89dd17297221c5d225de" + +[[package]] +name = "slab" +version = "0.4.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6528351c9bc8ab22353f9d776db39a20288e8d6c37ef8cfe3317cf875eecfc2d" +dependencies = [ + "autocfg", +] + +[[package]] +name = "smallvec" +version = "1.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a507befe795404456341dfab10cef66ead4c041f62b8b11bbb92bffe5d0953e0" + +[[package]] +name = "soup2" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b2b4d76501d8ba387cf0fefbe055c3e0a59891d09f0f995ae4e4b16f6b60f3c0" +dependencies = [ + "bitflags", + "gio", + "glib", + "libc", + "once_cell", + "soup2-sys", +] + +[[package]] +name = "soup2-sys" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "009ef427103fcb17f802871647a7fa6c60cbb654b4c4e4c0ac60a31c5f6dc9cf" +dependencies = [ + "bitflags", + "gio-sys", + "glib-sys", + "gobject-sys", + "libc", + "system-deps 5.0.0", +] + +[[package]] +name = "stable_deref_trait" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a8f112729512f8e442d81f95a8a7ddf2b7c6b8a1a6f509a95864142b30cab2d3" + +[[package]] +name = "state" +version = "0.5.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dbe866e1e51e8260c9eed836a042a5e7f6726bb2b411dffeaa712e19c388f23b" +dependencies = [ + "loom", +] + +[[package]] +name = "string_cache" +version = "0.8.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f91138e76242f575eb1d3b38b4f1362f10d3a43f47d182a5b359af488a02293b" +dependencies = [ + "new_debug_unreachable", + "once_cell", + "parking_lot", + "phf_shared 0.10.0", + "precomputed-hash", + "serde", +] + +[[package]] +name = "string_cache_codegen" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6bb30289b722be4ff74a408c3cc27edeaad656e06cb1fe8fa9231fa59c728988" +dependencies = [ + "phf_generator 0.10.0", + "phf_shared 0.10.0", + "proc-macro2", + "quote", +] + +[[package]] +name = "strsim" +version = "0.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "73473c0e59e6d5812c5dfe2a064a6444949f089e20eec9a2e5506596494e4623" + +[[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.22" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2efbeae7acf4eabd6bcdcbd11c92f45231ddda7539edc7806bd1a04a03b24616" +dependencies = [ + "proc-macro2", + "quote", + "unicode-ident", +] + +[[package]] +name = "system-deps" +version = "5.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "18db855554db7bd0e73e06cf7ba3df39f97812cb11d3f75e71c39bf45171797e" +dependencies = [ + "cfg-expr 0.9.1", + "heck 0.3.3", + "pkg-config", + "toml 0.5.11", + "version-compare 0.0.11", +] + +[[package]] +name = "system-deps" +version = "6.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "30c2de8a4d8f4b823d634affc9cd2a74ec98c53a756f317e529a48046cbf71f3" +dependencies = [ + "cfg-expr 0.15.3", + "heck 0.4.1", + "pkg-config", + "toml 0.7.5", + "version-compare 0.1.1", +] + +[[package]] +name = "tao" +version = "0.16.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6a6d198e01085564cea63e976ad1566c1ba2c2e4cc79578e35d9f05521505e31" +dependencies = [ + "bitflags", + "cairo-rs", + "cc", + "cocoa", + "core-foundation", + "core-graphics", + "crossbeam-channel", + "dispatch", + "gdk", + "gdk-pixbuf", + "gdk-sys", + "gdkwayland-sys", + "gdkx11-sys", + "gio", + "glib", + "glib-sys", + "gtk", + "image", + "instant", + "jni", + "lazy_static", + "libc", + "log", + "ndk", + "ndk-context", + "ndk-sys", + "objc", + "once_cell", + "parking_lot", + "png", + "raw-window-handle", + "scopeguard", + "serde", + "tao-macros", + "unicode-segmentation", + "uuid", + "windows 0.39.0", + "windows-implement", + "x11-dl", +] + +[[package]] +name = "tao-macros" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3b27a4bcc5eb524658234589bdffc7e7bfb996dbae6ce9393bfd39cb4159b445" +dependencies = [ + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "tar" +version = "0.4.38" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4b55807c0344e1e6c04d7c965f5289c39a8d94ae23ed5c0b57aabac549f871c6" +dependencies = [ + "filetime", + "libc", + "xattr", +] + +[[package]] +name = "target-lexicon" +version = "0.12.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1b1c7f239eb94671427157bd93b3694320f3668d4e1eff08c7285366fd777fac" + +[[package]] +name = "tauri" +version = "1.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7fbe522898e35407a8e60dc3870f7579fea2fc262a6a6072eccdd37ae1e1d91e" +dependencies = [ + "anyhow", + "cocoa", + "dirs-next", + "embed_plist", + "encoding_rs", + "flate2", + "futures-util", + "glib", + "glob", + "gtk", + "heck 0.4.1", + "http", + "ignore", + "objc", + "once_cell", + "open", + "percent-encoding", + "rand 0.8.5", + "raw-window-handle", + "regex", + "rfd", + "semver 1.0.17", + "serde", + "serde_json", + "serde_repr", + "serialize-to-javascript", + "state", + "tar", + "tauri-macros", + "tauri-runtime", + "tauri-runtime-wry", + "tauri-utils", + "tempfile", + "thiserror", + "tokio", + "url", + "uuid", + "webkit2gtk", + "webview2-com", + "windows 0.39.0", +] + +[[package]] +name = "tauri-codegen" +version = "1.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "54ad2d49fdeab4a08717f5b49a163bdc72efc3b1950b6758245fcde79b645e1a" +dependencies = [ + "base64 0.21.2", + "brotli", + "ico", + "json-patch", + "plist", + "png", + "proc-macro2", + "quote", + "regex", + "semver 1.0.17", + "serde", + "serde_json", + "sha2", + "tauri-utils", + "thiserror", + "time", + "uuid", + "walkdir", +] + +[[package]] +name = "tauri-macros" +version = "1.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8eb12a2454e747896929338d93b0642144bb51e0dddbb36e579035731f0d76b7" +dependencies = [ + "heck 0.4.1", + "proc-macro2", + "quote", + "syn 1.0.109", + "tauri-codegen", + "tauri-utils", +] + +[[package]] +name = "tauri-runtime" +version = "0.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "108683199cb18f96d2d4134187bb789964143c845d2d154848dda209191fd769" +dependencies = [ + "gtk", + "http", + "http-range", + "rand 0.8.5", + "raw-window-handle", + "serde", + "serde_json", + "tauri-utils", + "thiserror", + "url", + "uuid", + "webview2-com", + "windows 0.39.0", +] + +[[package]] +name = "tauri-runtime-wry" +version = "0.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0b7aa256a1407a3a091b5d843eccc1a5042289baf0a43d1179d9f0fcfea37c1b" +dependencies = [ + "cocoa", + "gtk", + "percent-encoding", + "rand 0.8.5", + "raw-window-handle", + "tauri-runtime", + "tauri-utils", + "uuid", + "webkit2gtk", + "webview2-com", + "windows 0.39.0", + "wry", +] + +[[package]] +name = "tauri-utils" +version = "1.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "03fc02bb6072bb397e1d473c6f76c953cda48b4a2d0cce605df284aa74a12e84" +dependencies = [ + "brotli", + "ctor", + "dunce", + "glob", + "heck 0.4.1", + "html5ever", + "infer", + "json-patch", + "kuchiki", + "memchr", + "phf 0.10.1", + "proc-macro2", + "quote", + "semver 1.0.17", + "serde", + "serde_json", + "serde_with", + "thiserror", + "url", + "walkdir", + "windows 0.39.0", +] + +[[package]] +name = "tempfile" +version = "3.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "31c0432476357e58790aaa47a8efb0c5138f137343f3b5f23bd36a27e3b0a6d6" +dependencies = [ + "autocfg", + "cfg-if", + "fastrand", + "redox_syscall 0.3.5", + "rustix", + "windows-sys 0.48.0", +] + +[[package]] +name = "tendril" +version = "0.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d24a120c5fc464a3458240ee02c299ebcb9d67b5249c8848b09d639dca8d7bb0" +dependencies = [ + "futf", + "mac", + "utf-8", +] + +[[package]] +name = "thin-slice" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8eaa81235c7058867fa8c0e7314f33dcce9c215f535d1913822a2b3f5e289f3c" + +[[package]] +name = "thiserror" +version = "1.0.40" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "978c9a314bd8dc99be594bc3c175faaa9794be04a5a5e153caba6915336cebac" +dependencies = [ + "thiserror-impl", +] + +[[package]] +name = "thiserror-impl" +version = "1.0.40" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f9456a42c5b0d803c8cd86e73dd7cc9edd429499f37a3550d286d5e86720569f" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.22", +] + +[[package]] +name = "thread_local" +version = "1.1.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3fdd6f064ccff2d6567adcb3873ca630700f00b5ad3f060c25b5dcfd9a4ce152" +dependencies = [ + "cfg-if", + "once_cell", +] + +[[package]] +name = "time" +version = "0.3.22" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ea9e1b3cf1243ae005d9e74085d4d542f3125458f3a81af210d901dcd7411efd" +dependencies = [ + "itoa 1.0.6", + "serde", + "time-core", + "time-macros", +] + +[[package]] +name = "time-core" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7300fbefb4dadc1af235a9cef3737cea692a9d97e1b9cbcd4ebdae6f8868e6fb" + +[[package]] +name = "time-macros" +version = "0.2.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "372950940a5f07bf38dbe211d7283c9e6d7327df53794992d293e534c733d09b" +dependencies = [ + "time-core", +] + +[[package]] +name = "tinyvec" +version = "1.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "87cc5ceb3875bb20c2890005a4e226a4651264a5c75edb2421b52861a0a0cb50" +dependencies = [ + "tinyvec_macros", +] + +[[package]] +name = "tinyvec_macros" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" + +[[package]] +name = "tokio" +version = "1.28.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "94d7b1cfd2aa4011f2de74c2c4c63665e27a71006b0a192dcd2710272e73dfa2" +dependencies = [ + "autocfg", + "bytes", + "num_cpus", + "pin-project-lite", + "windows-sys 0.48.0", +] + +[[package]] +name = "toml" +version = "0.5.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f4f7f0dd8d50a853a531c426359045b1998f04219d88799810762cd4ad314234" +dependencies = [ + "serde", +] + +[[package]] +name = "toml" +version = "0.7.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1ebafdf5ad1220cb59e7d17cf4d2c72015297b75b19a10472f99b89225089240" +dependencies = [ + "serde", + "serde_spanned", + "toml_datetime", + "toml_edit", +] + +[[package]] +name = "toml_datetime" +version = "0.6.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7cda73e2f1397b1262d6dfdcef8aafae14d1de7748d66822d3bfeeb6d03e5e4b" +dependencies = [ + "serde", +] + +[[package]] +name = "toml_edit" +version = "0.19.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "266f016b7f039eec8a1a80dfe6156b633d208b9fccca5e4db1d6775b0c4e34a7" +dependencies = [ + "indexmap 2.0.0", + "serde", + "serde_spanned", + "toml_datetime", + "winnow", +] + +[[package]] +name = "tracing" +version = "0.1.37" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8ce8c33a8d48bd45d624a6e523445fd21ec13d3653cd51f681abf67418f54eb8" +dependencies = [ + "cfg-if", + "pin-project-lite", + "tracing-attributes", + "tracing-core", +] + +[[package]] +name = "tracing-attributes" +version = "0.1.26" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5f4f31f56159e98206da9efd823404b79b6ef3143b4a7ab76e67b1751b25a4ab" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.22", +] + +[[package]] +name = "tracing-core" +version = "0.1.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0955b8137a1df6f1a2e9a37d8a6656291ff0297c1a97c24e0d8425fe2312f79a" +dependencies = [ + "once_cell", + "valuable", +] + +[[package]] +name = "tracing-log" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "78ddad33d2d10b1ed7eb9d1f518a5674713876e97e5bb9b7345a7984fbb4f922" +dependencies = [ + "lazy_static", + "log", + "tracing-core", +] + +[[package]] +name = "tracing-subscriber" +version = "0.3.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "30a651bc37f915e81f087d86e62a18eec5f79550c7faff886f7090b4ea757c77" +dependencies = [ + "matchers", + "nu-ansi-term", + "once_cell", + "regex", + "sharded-slab", + "smallvec", + "thread_local", + "tracing", + "tracing-core", + "tracing-log", +] + +[[package]] +name = "treediff" +version = "4.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "52984d277bdf2a751072b5df30ec0377febdb02f7696d64c2d7d54630bac4303" +dependencies = [ + "serde_json", +] + +[[package]] +name = "typenum" +version = "1.16.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "497961ef93d974e23eb6f433eb5fe1b7930b659f06d12dec6fc44a8f554c0bba" + +[[package]] +name = "ucd-trie" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9e79c4d996edb816c91e4308506774452e55e95c3c9de07b6729e17e15a5ef81" + +[[package]] +name = "unicode-bidi" +version = "0.3.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "92888ba5573ff080736b3648696b70cafad7d250551175acbaa4e0385b3e1460" + +[[package]] +name = "unicode-ident" +version = "1.0.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b15811caf2415fb889178633e7724bad2509101cde276048e013b9def5e51fa0" + +[[package]] +name = "unicode-normalization" +version = "0.1.22" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5c5713f0fc4b5db668a2ac63cdb7bb4469d8c9fed047b1d0292cc7b0ce2ba921" +dependencies = [ + "tinyvec", +] + +[[package]] +name = "unicode-segmentation" +version = "1.10.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1dd624098567895118886609431a7c3b8f516e41d30e0643f03d94592a147e36" + +[[package]] +name = "url" +version = "2.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "50bff7831e19200a85b17131d085c25d7811bc4e186efdaf54bbd132994a88cb" +dependencies = [ + "form_urlencoded", + "idna", + "percent-encoding", + "serde", +] + +[[package]] +name = "utf-8" +version = "0.7.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "09cc8ee72d2a9becf2f2febe0205bbed8fc6615b7cb429ad062dc7b7ddd036a9" + +[[package]] +name = "uuid" +version = "1.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d023da39d1fde5a8a3fe1f3e01ca9632ada0a63e9797de55a879d6e2236277be" +dependencies = [ + "getrandom 0.2.10", + "uuid-macro-internal", + "wasm-bindgen", +] + +[[package]] +name = "uuid-macro-internal" +version = "1.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8614dda80b9075fbca36bc31b58d1447715b1236af98dee21db521c47a0cc2c0" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.22", +] + +[[package]] +name = "valuable" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "830b7e5d4d90034032940e4ace0d9a9a057e7a45cd94e6c007832e39edb82f6d" + +[[package]] +name = "version-compare" +version = "0.0.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1c18c859eead79d8b95d09e4678566e8d70105c4e7b251f707a03df32442661b" + +[[package]] +name = "version-compare" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "579a42fc0b8e0c63b76519a339be31bed574929511fa53c1a3acae26eb258f29" + +[[package]] +name = "version_check" +version = "0.9.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "49874b5167b65d7193b8aba1567f5c7d93d001cafc34600cee003eda787e483f" + +[[package]] +name = "walkdir" +version = "2.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "36df944cda56c7d8d8b7496af378e6b16de9284591917d307c9b4d313c44e698" +dependencies = [ + "same-file", + "winapi-util", +] + +[[package]] +name = "wasi" +version = "0.9.0+wasi-snapshot-preview1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cccddf32554fecc6acb585f82a32a72e28b48f8c4c1883ddfeeeaa96f7d8e519" + +[[package]] +name = "wasi" +version = "0.11.0+wasi-snapshot-preview1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" + +[[package]] +name = "wasm-bindgen" +version = "0.2.87" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7706a72ab36d8cb1f80ffbf0e071533974a60d0a308d01a5d0375bf60499a342" +dependencies = [ + "cfg-if", + "wasm-bindgen-macro", +] + +[[package]] +name = "wasm-bindgen-backend" +version = "0.2.87" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5ef2b6d3c510e9625e5fe6f509ab07d66a760f0885d858736483c32ed7809abd" +dependencies = [ + "bumpalo", + "log", + "once_cell", + "proc-macro2", + "quote", + "syn 2.0.22", + "wasm-bindgen-shared", +] + +[[package]] +name = "wasm-bindgen-futures" +version = "0.4.37" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c02dbc21516f9f1f04f187958890d7e6026df8d16540b7ad9492bc34a67cea03" +dependencies = [ + "cfg-if", + "js-sys", + "wasm-bindgen", + "web-sys", +] + +[[package]] +name = "wasm-bindgen-macro" +version = "0.2.87" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dee495e55982a3bd48105a7b947fd2a9b4a8ae3010041b9e0faab3f9cd028f1d" +dependencies = [ + "quote", + "wasm-bindgen-macro-support", +] + +[[package]] +name = "wasm-bindgen-macro-support" +version = "0.2.87" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "54681b18a46765f095758388f2d0cf16eb8d4169b639ab575a8f5693af210c7b" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.22", + "wasm-bindgen-backend", + "wasm-bindgen-shared", +] + +[[package]] +name = "wasm-bindgen-shared" +version = "0.2.87" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ca6ad05a4870b2bf5fe995117d3728437bd27d7cd5f06f13c17443ef369775a1" + +[[package]] +name = "web-sys" +version = "0.3.64" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9b85cbef8c220a6abc02aefd892dfc0fc23afb1c6a426316ec33253a3877249b" +dependencies = [ + "js-sys", + "wasm-bindgen", +] + +[[package]] +name = "webkit2gtk" +version = "0.18.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b8f859735e4a452aeb28c6c56a852967a8a76c8eb1cc32dbf931ad28a13d6370" +dependencies = [ + "bitflags", + "cairo-rs", + "gdk", + "gdk-sys", + "gio", + "gio-sys", + "glib", + "glib-sys", + "gobject-sys", + "gtk", + "gtk-sys", + "javascriptcore-rs", + "libc", + "once_cell", + "soup2", + "webkit2gtk-sys", +] + +[[package]] +name = "webkit2gtk-sys" +version = "0.18.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4d76ca6ecc47aeba01ec61e480139dda143796abcae6f83bcddf50d6b5b1dcf3" +dependencies = [ + "atk-sys", + "bitflags", + "cairo-sys-rs", + "gdk-pixbuf-sys", + "gdk-sys", + "gio-sys", + "glib-sys", + "gobject-sys", + "gtk-sys", + "javascriptcore-rs-sys", + "libc", + "pango-sys", + "pkg-config", + "soup2-sys", + "system-deps 6.1.1", +] + +[[package]] +name = "webview2-com" +version = "0.19.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b4a769c9f1a64a8734bde70caafac2b96cada12cd4aefa49196b3a386b8b4178" +dependencies = [ + "webview2-com-macros", + "webview2-com-sys", + "windows 0.39.0", + "windows-implement", +] + +[[package]] +name = "webview2-com-macros" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eaebe196c01691db62e9e4ca52c5ef1e4fd837dcae27dae3ada599b5a8fd05ac" +dependencies = [ + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "webview2-com-sys" +version = "0.19.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "aac48ef20ddf657755fdcda8dfed2a7b4fc7e4581acce6fe9b88c3d64f29dee7" +dependencies = [ + "regex", + "serde", + "serde_json", + "thiserror", + "windows 0.39.0", + "windows-bindgen", + "windows-metadata", +] + +[[package]] +name = "winapi" +version = "0.3.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5c839a674fcd7a98952e593242ea400abe93992746761e38641405d28b00f419" +dependencies = [ + "winapi-i686-pc-windows-gnu", + "winapi-x86_64-pc-windows-gnu", +] + +[[package]] +name = "winapi-i686-pc-windows-gnu" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6" + +[[package]] +name = "winapi-util" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "70ec6ce85bb158151cae5e5c87f95a8e97d2c0c4b001223f33a334e3ce5de178" +dependencies = [ + "winapi", +] + +[[package]] +name = "winapi-x86_64-pc-windows-gnu" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" + +[[package]] +name = "windows" +version = "0.37.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "57b543186b344cc61c85b5aab0d2e3adf4e0f99bc076eff9aa5927bcc0b8a647" +dependencies = [ + "windows_aarch64_msvc 0.37.0", + "windows_i686_gnu 0.37.0", + "windows_i686_msvc 0.37.0", + "windows_x86_64_gnu 0.37.0", + "windows_x86_64_msvc 0.37.0", +] + +[[package]] +name = "windows" +version = "0.39.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f1c4bd0a50ac6020f65184721f758dba47bb9fbc2133df715ec74a237b26794a" +dependencies = [ + "windows-implement", + "windows_aarch64_msvc 0.39.0", + "windows_i686_gnu 0.39.0", + "windows_i686_msvc 0.39.0", + "windows_x86_64_gnu 0.39.0", + "windows_x86_64_msvc 0.39.0", +] + +[[package]] +name = "windows" +version = "0.48.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e686886bc078bc1b0b600cac0147aadb815089b6e4da64016cbd754b6342700f" +dependencies = [ + "windows-targets", +] + +[[package]] +name = "windows-bindgen" +version = "0.39.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "68003dbd0e38abc0fb85b939240f4bce37c43a5981d3df37ccbaaa981b47cb41" +dependencies = [ + "windows-metadata", + "windows-tokens", +] + +[[package]] +name = "windows-implement" +version = "0.39.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ba01f98f509cb5dc05f4e5fc95e535f78260f15fea8fe1a8abdd08f774f1cee7" +dependencies = [ + "syn 1.0.109", + "windows-tokens", +] + +[[package]] +name = "windows-metadata" +version = "0.39.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9ee5e275231f07c6e240d14f34e1b635bf1faa1c76c57cfd59a5cdb9848e4278" + +[[package]] +name = "windows-sys" +version = "0.42.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5a3e1820f08b8513f676f7ab6c1f99ff312fb97b553d30ff4dd86f9f15728aa7" +dependencies = [ + "windows_aarch64_gnullvm 0.42.2", + "windows_aarch64_msvc 0.42.2", + "windows_i686_gnu 0.42.2", + "windows_i686_msvc 0.42.2", + "windows_x86_64_gnu 0.42.2", + "windows_x86_64_gnullvm 0.42.2", + "windows_x86_64_msvc 0.42.2", +] + +[[package]] +name = "windows-sys" +version = "0.48.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "677d2418bec65e3338edb076e806bc1ec15693c5d0104683f2efe857f61056a9" +dependencies = [ + "windows-targets", +] + +[[package]] +name = "windows-targets" +version = "0.48.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7b1eb6f0cd7c80c79759c929114ef071b87354ce476d9d94271031c0497adfd5" +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", +] + +[[package]] +name = "windows-tokens" +version = "0.39.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f838de2fe15fe6bac988e74b798f26499a8b21a9d97edec321e79b28d1d7f597" + +[[package]] +name = "windows_aarch64_gnullvm" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "597a5118570b68bc08d8d59125332c54f1ba9d9adeedeef5b99b02ba2b0698f8" + +[[package]] +name = "windows_aarch64_gnullvm" +version = "0.48.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "91ae572e1b79dba883e0d315474df7305d12f569b400fcf90581b06062f7e1bc" + +[[package]] +name = "windows_aarch64_msvc" +version = "0.37.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2623277cb2d1c216ba3b578c0f3cf9cdebeddb6e66b1b218bb33596ea7769c3a" + +[[package]] +name = "windows_aarch64_msvc" +version = "0.39.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ec7711666096bd4096ffa835238905bb33fb87267910e154b18b44eaabb340f2" + +[[package]] +name = "windows_aarch64_msvc" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e08e8864a60f06ef0d0ff4ba04124db8b0fb3be5776a5cd47641e942e58c4d43" + +[[package]] +name = "windows_aarch64_msvc" +version = "0.48.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b2ef27e0d7bdfcfc7b868b317c1d32c641a6fe4629c171b8928c7b08d98d7cf3" + +[[package]] +name = "windows_i686_gnu" +version = "0.37.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d3925fd0b0b804730d44d4b6278c50f9699703ec49bcd628020f46f4ba07d9e1" + +[[package]] +name = "windows_i686_gnu" +version = "0.39.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "763fc57100a5f7042e3057e7e8d9bdd7860d330070251a73d003563a3bb49e1b" + +[[package]] +name = "windows_i686_gnu" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c61d927d8da41da96a81f029489353e68739737d3beca43145c8afec9a31a84f" + +[[package]] +name = "windows_i686_gnu" +version = "0.48.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "622a1962a7db830d6fd0a69683c80a18fda201879f0f447f065a3b7467daa241" + +[[package]] +name = "windows_i686_msvc" +version = "0.37.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ce907ac74fe331b524c1298683efbf598bb031bc84d5e274db2083696d07c57c" + +[[package]] +name = "windows_i686_msvc" +version = "0.39.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7bc7cbfe58828921e10a9f446fcaaf649204dcfe6c1ddd712c5eebae6bda1106" + +[[package]] +name = "windows_i686_msvc" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "44d840b6ec649f480a41c8d80f9c65108b92d89345dd94027bfe06ac444d1060" + +[[package]] +name = "windows_i686_msvc" +version = "0.48.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4542c6e364ce21bf45d69fdd2a8e455fa38d316158cfd43b3ac1c5b1b19f8e00" + +[[package]] +name = "windows_x86_64_gnu" +version = "0.37.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2babfba0828f2e6b32457d5341427dcbb577ceef556273229959ac23a10af33d" + +[[package]] +name = "windows_x86_64_gnu" +version = "0.39.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6868c165637d653ae1e8dc4d82c25d4f97dd6605eaa8d784b5c6e0ab2a252b65" + +[[package]] +name = "windows_x86_64_gnu" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8de912b8b8feb55c064867cf047dda097f92d51efad5b491dfb98f6bbb70cb36" + +[[package]] +name = "windows_x86_64_gnu" +version = "0.48.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ca2b8a661f7628cbd23440e50b05d705db3686f894fc9580820623656af974b1" + +[[package]] +name = "windows_x86_64_gnullvm" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "26d41b46a36d453748aedef1486d5c7a85db22e56aff34643984ea85514e94a3" + +[[package]] +name = "windows_x86_64_gnullvm" +version = "0.48.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7896dbc1f41e08872e9d5e8f8baa8fdd2677f29468c4e156210174edc7f7b953" + +[[package]] +name = "windows_x86_64_msvc" +version = "0.37.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f4dd6dc7df2d84cf7b33822ed5b86318fb1781948e9663bacd047fc9dd52259d" + +[[package]] +name = "windows_x86_64_msvc" +version = "0.39.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5e4d40883ae9cae962787ca76ba76390ffa29214667a111db9e0a1ad8377e809" + +[[package]] +name = "windows_x86_64_msvc" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9aec5da331524158c6d1a4ac0ab1541149c0b9505fde06423b02f5ef0106b9f0" + +[[package]] +name = "windows_x86_64_msvc" +version = "0.48.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1a515f5799fe4961cb532f983ce2b23082366b898e52ffbce459c86f67c8378a" + +[[package]] +name = "winnow" +version = "0.4.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ca0ace3845f0d96209f0375e6d367e3eb87eb65d27d445bdc9f1843a26f39448" +dependencies = [ + "memchr", +] + +[[package]] +name = "wio" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5d129932f4644ac2396cb456385cbf9e63b5b30c6e8dc4820bdca4eb082037a5" +dependencies = [ + "winapi", +] + +[[package]] +name = "wry" +version = "0.24.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "33748f35413c8a98d45f7a08832d848c0c5915501803d1faade5a4ebcd258cea" +dependencies = [ + "base64 0.13.1", + "block", + "cocoa", + "core-graphics", + "crossbeam-channel", + "dunce", + "gdk", + "gio", + "glib", + "gtk", + "html5ever", + "http", + "kuchiki", + "libc", + "log", + "objc", + "objc_id", + "once_cell", + "serde", + "serde_json", + "sha2", + "soup2", + "tao", + "thiserror", + "url", + "webkit2gtk", + "webkit2gtk-sys", + "webview2-com", + "windows 0.39.0", + "windows-implement", +] + +[[package]] +name = "x11" +version = "2.21.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "502da5464ccd04011667b11c435cb992822c2c0dbde1770c988480d312a0db2e" +dependencies = [ + "libc", + "pkg-config", +] + +[[package]] +name = "x11-dl" +version = "2.21.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "38735924fedd5314a6e548792904ed8c6de6636285cb9fec04d5b1db85c1516f" +dependencies = [ + "libc", + "once_cell", + "pkg-config", +] + +[[package]] +name = "xattr" +version = "0.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6d1526bbe5aaeb5eb06885f4d987bcdfa5e23187055de9b83fe00156a821fabc" +dependencies = [ + "libc", +] + +[[package]] +name = "yeslogic-fontconfig-sys" +version = "3.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f2bbd69036d397ebbff671b1b8e4d918610c181c5a16073b96f984a38d08c386" +dependencies = [ + "const-cstr", + "dlib", + "once_cell", + "pkg-config", +] diff --git a/lib/creator_rs/Cargo.toml b/lib/creator_rs/Cargo.toml new file mode 100644 index 0000000..ea8207b --- /dev/null +++ b/lib/creator_rs/Cargo.toml @@ -0,0 +1,31 @@ +[package] +name = "creator_rs" +version = "0.1.0" +edition = "2021" +authors = ["Enrico Bühler "] +description = "Motion Design toolkit with spring, eased and linear based value interpolation, timeline functionality and more" +license = "MIT" +repository = "https://github.com/tempblade/creator" + +[lib] +crate-type = ["cdylib"] + +[dependencies] +rayon = { version = "1.7", optional = true } +font-kit = { version = "0.11", optional = true } +serde = { version = "1.0", features = ["derive", "rc"] } +serde_json = "1.0" +simple-easing = "1.0" +tauri = { version = "1.4", optional = true, features = [ + "dialog-open", + "dialog-save", + "shell-open", +] } +uuid = { version = "1.3", features = ["v4", "macro-diagnostics", "js"] } +wasm-bindgen = "0.2" + + +[features] +tauri = ["dep:tauri"] +parallelization = ["dep:rayon"] +fonts = ["dep:font-kit"] diff --git a/lib/creator_rs/src/animation/mod.rs b/lib/creator_rs/src/animation/mod.rs new file mode 100644 index 0000000..818b3eb --- /dev/null +++ b/lib/creator_rs/src/animation/mod.rs @@ -0,0 +1,2 @@ +pub mod primitives; +pub mod timeline; diff --git a/lib/creator_rs/src/animation/primitives/circular_text.rs b/lib/creator_rs/src/animation/primitives/circular_text.rs new file mode 100644 index 0000000..17081ee --- /dev/null +++ b/lib/creator_rs/src/animation/primitives/circular_text.rs @@ -0,0 +1,36 @@ +impl Animateable for AnimatedCircularText<'_> { + fn draw(&mut self, mut canvas: &mut Canvas, timeline: &Timeline<'_>) { + self.prepare(&mut canvas, &self.animation_data); + + self.sort_keyframes(); + + self.paint.set_anti_alias(true); + + let default_text_typeface = &Typeface::default(); + + let default_text_font = &Font::from_typeface(default_text_typeface, 190.0); + + let text_font: &Font = match self.font { + Some(font) => font, + None => default_text_font, + }; + + let radius: f32 = 0.35 * timeline.size.0.min(timeline.size.1) as f32; + + let mut path = Path::new(); + + path.add_circle( + (timeline.size.0 / 2, timeline.size.1 / 2), + radius, + PathDirection::CW, + ); + + let text_width = text_font.measure_str(self.text, Some(&self.paint)); + + canvas.draw + } + + fn sort_keyframes(&mut self) { + self.origin.sort_keyframes(); + } +} diff --git a/lib/creator_rs/src/animation/primitives/entities/common.rs b/lib/creator_rs/src/animation/primitives/entities/common.rs new file mode 100644 index 0000000..4dadd90 --- /dev/null +++ b/lib/creator_rs/src/animation/primitives/entities/common.rs @@ -0,0 +1,78 @@ +use serde::{Deserialize, Serialize}; + +use crate::animation::{primitives::utils::timestamp_to_frame, timeline::Timeline}; + +use super::{ + ellipse::{AnimatedEllipseEntity, EllipseEntity}, + rect::{AnimatedRectEntity, RectEntity}, + staggered_text::{AnimatedStaggeredTextEntity, StaggeredTextEntity}, + text::{AnimatedTextEntity, TextEntity}, +}; + +pub trait Drawable { + fn should_draw(&self, animation_data: &AnimationData, timeline: &Timeline) -> bool { + let start_frame = timestamp_to_frame(animation_data.offset, timeline.fps); + let end_frame = timestamp_to_frame( + animation_data.offset + animation_data.duration, + timeline.fps, + ); + + // println!("start {0} end {1}", start_frame, end_frame); + + let is_before = timeline.render_state.curr_frame < start_frame; + let is_after = timeline.render_state.curr_frame > end_frame; + let is_between = !is_after && !is_before; + + if is_between { + return true; + } else { + return false; + } + } +} + +pub trait Animateable { + fn sort_keyframes(&mut self); + + fn calculate(&mut self, timeline: &Timeline) -> Option; +} + +#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)] +pub struct Cache { + pub valid: bool, +} + +#[derive(Debug, Clone, Serialize, Deserialize)] +#[serde(tag = "type")] +pub enum AnimatedEntity { + Text(AnimatedTextEntity), + StaggeredText(AnimatedStaggeredTextEntity), + Ellipse(AnimatedEllipseEntity), + Rect(AnimatedRectEntity), +} +#[derive(Debug, Clone, Serialize, Deserialize)] +#[serde(tag = "type")] +pub enum Entity { + Text(TextEntity), + StaggeredText(StaggeredTextEntity), + Ellipse(EllipseEntity), + Rect(RectEntity), +} + +impl AnimatedEntity { + pub fn calculate(&mut self, timeline: &Timeline) -> Option { + match self { + Self::Text(text_entity) => text_entity.calculate(timeline), + Self::Rect(box_entity) => box_entity.calculate(timeline), + Self::StaggeredText(staggered_text_entity) => staggered_text_entity.calculate(timeline), + Self::Ellipse(ellipse_entity) => ellipse_entity.calculate(timeline), + } + } +} + +#[derive(Debug, Clone, Serialize, Deserialize)] +pub struct AnimationData { + pub offset: f32, + pub duration: f32, + pub visible: bool, +} diff --git a/lib/creator_rs/src/animation/primitives/entities/ellipse.rs b/lib/creator_rs/src/animation/primitives/entities/ellipse.rs new file mode 100644 index 0000000..c89d49a --- /dev/null +++ b/lib/creator_rs/src/animation/primitives/entities/ellipse.rs @@ -0,0 +1,92 @@ +use serde::{Deserialize, Serialize}; + +use crate::animation::{ + primitives::{ + paint::Paint, + transform::{AnimatedTransform, Transform}, + values::animated_values::{AnimatedFloatVec2, AnimatedValue}, + }, + timeline::Timeline, +}; + +use super::common::{Animateable, AnimationData, Cache, Drawable, Entity}; + +#[derive(Debug, Clone, Serialize, Deserialize)] +pub struct AnimatedEllipseEntity { + pub paint: Paint, + pub id: String, + pub cache: Cache, + pub radius: AnimatedFloatVec2, + pub origin: AnimatedFloatVec2, + pub position: AnimatedFloatVec2, + pub animation_data: AnimationData, + pub transform: Option, +} + +#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)] +pub struct EllipseEntity { + pub radius: (f32, f32), + pub cache: Cache, + pub id: String, + pub position: (f32, f32), + pub origin: (f32, f32), + pub paint: Paint, + pub transform: Option, +} + +impl Drawable for AnimatedEllipseEntity {} +impl Animateable for AnimatedEllipseEntity { + fn calculate(&mut self, timeline: &Timeline) -> Option { + let should_draw = self.should_draw(&self.animation_data, timeline); + + if should_draw { + self.sort_keyframes(); + + let radius = self.radius.get_value_at_frame( + timeline.render_state.curr_frame, + &self.animation_data, + timeline.fps, + ); + + let position = self.position.get_value_at_frame( + timeline.render_state.curr_frame, + &self.animation_data, + timeline.fps, + ); + + let origin = self.origin.get_value_at_frame( + timeline.render_state.curr_frame, + &self.animation_data, + timeline.fps, + ); + + let transform: Option = match self.transform.clone() { + Some(mut val) => Some(val.calculate(timeline, &self.animation_data)), + None => None, + }; + + Some(Entity::Ellipse(EllipseEntity { + id: self.id.clone(), + radius, + position, + origin, + cache: self.cache.clone(), + paint: self.paint.clone(), + transform, + })) + } else { + None + } + } + + fn sort_keyframes(&mut self) { + let transform = self.transform.clone(); + + if let Some(mut transform) = transform { + transform.sort_keyframes(); + } + + self.position.sort_keyframes(); + self.radius.sort_keyframes(); + } +} diff --git a/lib/creator_rs/src/animation/primitives/entities/mod.rs b/lib/creator_rs/src/animation/primitives/entities/mod.rs new file mode 100644 index 0000000..d5ca160 --- /dev/null +++ b/lib/creator_rs/src/animation/primitives/entities/mod.rs @@ -0,0 +1,5 @@ +pub mod common; +pub mod ellipse; +pub mod rect; +pub mod staggered_text; +pub mod text; diff --git a/lib/creator_rs/src/animation/primitives/entities/rect.rs b/lib/creator_rs/src/animation/primitives/entities/rect.rs new file mode 100644 index 0000000..e7ec536 --- /dev/null +++ b/lib/creator_rs/src/animation/primitives/entities/rect.rs @@ -0,0 +1,90 @@ +use serde::{Deserialize, Serialize}; + +use crate::animation::{ + primitives::{ + paint::Paint, + transform::{AnimatedTransform, Transform}, + values::animated_values::{AnimatedFloatVec2, AnimatedValue}, + }, + timeline::Timeline, +}; + +use super::common::{Animateable, AnimationData, Cache, Drawable, Entity}; + +#[derive(Debug, Clone, Serialize, Deserialize)] +pub struct AnimatedRectEntity { + pub id: String, + pub cache: Cache, + pub position: AnimatedFloatVec2, + pub size: AnimatedFloatVec2, + pub origin: AnimatedFloatVec2, + pub paint: Paint, + pub animation_data: AnimationData, + pub transform: Option, +} + +#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)] +pub struct RectEntity { + pub id: String, + pub cache: Cache, + pub position: (f32, f32), + pub size: (f32, f32), + pub origin: (f32, f32), + pub paint: Paint, + pub transform: Option, +} + +impl Drawable for AnimatedRectEntity {} +impl Animateable for AnimatedRectEntity { + fn sort_keyframes(&mut self) { + if let Some(x) = &mut self.transform { + x.sort_keyframes(); + } + + self.position.sort_keyframes(); + self.size.sort_keyframes(); + } + + fn calculate(&mut self, timeline: &Timeline) -> Option { + let should_draw = self.should_draw(&self.animation_data, timeline); + + if should_draw { + self.sort_keyframes(); + + let position = self.position.get_value_at_frame( + timeline.render_state.curr_frame, + &self.animation_data, + timeline.fps, + ); + + let size = self.size.get_value_at_frame( + timeline.render_state.curr_frame, + &self.animation_data, + timeline.fps, + ); + + let origin = self.origin.get_value_at_frame( + timeline.render_state.curr_frame, + &self.animation_data, + timeline.fps, + ); + + let transform: Option = match self.transform.clone() { + Some(mut val) => Some(val.calculate(timeline, &self.animation_data)), + None => None, + }; + + Some(Entity::Rect(RectEntity { + id: self.id.clone(), + cache: self.cache.clone(), + position, + size, + origin, + paint: self.paint.clone(), + transform, + })) + } else { + None + } + } +} diff --git a/lib/creator_rs/src/animation/primitives/entities/staggered_text.rs b/lib/creator_rs/src/animation/primitives/entities/staggered_text.rs new file mode 100644 index 0000000..62a2cb2 --- /dev/null +++ b/lib/creator_rs/src/animation/primitives/entities/staggered_text.rs @@ -0,0 +1,112 @@ +use super::common::{Animateable, AnimationData, Cache, Drawable, Entity}; +use crate::animation::{ + primitives::{ + paint::TextPaint, + transform::{AnimatedTransform, Transform}, + values::animated_values::{AnimatedFloatVec2, AnimatedValue}, + }, + timeline::Timeline, +}; +use serde::{Deserialize, Serialize}; + +#[derive(Debug, Clone, Serialize, Deserialize)] +pub struct AnimatedStaggeredTextLetter { + pub transform: Option, + pub paint: TextPaint, +} + +#[derive(Debug, Clone, Serialize, Deserialize)] +pub struct StaggeredTextLetter { + pub transform: Option>, + pub paint: TextPaint, +} + +#[derive(Debug, Clone, Serialize, Deserialize)] +pub struct AnimatedStaggeredTextEntity { + pub id: String, + pub cache: Cache, + pub text: String, + pub stagger: f32, + pub origin: AnimatedFloatVec2, + pub animation_data: AnimationData, + pub transform: Option, + pub letter: AnimatedStaggeredTextLetter, +} + +#[derive(Debug, Clone, Serialize, Deserialize)] +pub struct StaggeredTextEntity { + pub id: String, + pub cache: Cache, + pub text: String, + pub stagger: f32, + pub origin: (f32, f32), + pub transform: Option, + pub animation_data: AnimationData, + pub letter: StaggeredTextLetter, +} + +impl Drawable for AnimatedStaggeredTextEntity {} +impl Animateable for AnimatedStaggeredTextEntity { + fn calculate(&mut self, timeline: &Timeline) -> Option { + let should_draw: bool = self.should_draw(&self.animation_data, timeline); + + if should_draw { + self.sort_keyframes(); + + let transform: Option = match self.transform.clone() { + Some(mut val) => Some(val.calculate(timeline, &self.animation_data)), + None => None, + }; + + // Iterate over the chars of the string and calculate the animation with the staggered offset + let letter_transform: Option> = match self.letter.transform.clone() { + Some(mut val) => { + let mut transforms: Vec = Vec::new(); + + for c in self.text.chars().enumerate() { + let mut animation_data = self.animation_data.clone(); + animation_data.offset += self.stagger * c.0 as f32; + + let transform = val.calculate(timeline, &animation_data); + transforms.push(transform); + } + + Some(transforms) + } + None => None, + }; + + let origin = self.origin.get_value_at_frame( + timeline.render_state.curr_frame, + &self.animation_data, + timeline.fps, + ); + + Some(Entity::StaggeredText(StaggeredTextEntity { + id: self.id.clone(), + transform, + cache: self.cache.clone(), + stagger: self.stagger, + origin, + text: self.text.clone(), + animation_data: self.animation_data.clone(), + letter: StaggeredTextLetter { + transform: letter_transform, + paint: self.letter.paint.clone(), + }, + })) + } else { + None + } + } + + fn sort_keyframes(&mut self) { + if let Some(x) = &mut self.transform { + x.sort_keyframes(); + } + + if let Some(x) = &mut self.letter.transform { + x.sort_keyframes(); + } + } +} diff --git a/lib/creator_rs/src/animation/primitives/entities/text.rs b/lib/creator_rs/src/animation/primitives/entities/text.rs new file mode 100644 index 0000000..cf8dfcc --- /dev/null +++ b/lib/creator_rs/src/animation/primitives/entities/text.rs @@ -0,0 +1,82 @@ +use crate::animation::{ + primitives::{ + paint::TextPaint, + transform::{AnimatedTransform, Transform}, + values::animated_values::{AnimatedFloatVec2, AnimatedValue}, + }, + timeline::Timeline, +}; +use serde::{Deserialize, Serialize}; + +use super::common::{Animateable, AnimationData, Cache, Drawable, Entity}; + +#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)] +pub struct TextEntity { + pub id: String, + pub cache: Cache, + pub text: String, + pub origin: (f32, f32), + pub paint: TextPaint, + pub transform: Option, +} + +#[derive(Debug, Clone, Serialize, Deserialize)] +pub struct AnimatedTextEntity { + pub id: String, + pub cache: Cache, + pub text: String, + pub origin: AnimatedFloatVec2, + pub paint: TextPaint, + pub animation_data: AnimationData, + pub transform: Option, +} + +impl Drawable for AnimatedTextEntity {} + +impl AnimatedTextEntity { + fn into_static(&mut self, timeline: &Timeline) -> TextEntity { + self.sort_keyframes(); + + let origin = self.origin.get_value_at_frame( + timeline.render_state.curr_frame, + &self.animation_data, + timeline.fps, + ); + + let transform: Option = match self.transform.clone() { + Some(mut val) => Some(val.calculate(timeline, &self.animation_data)), + None => None, + }; + + TextEntity { + id: self.id.clone(), + cache: self.cache.clone(), + transform, + text: self.text.clone(), + origin, + paint: self.paint.clone(), + } + } +} + +impl Animateable for AnimatedTextEntity { + fn calculate(&mut self, timeline: &Timeline) -> Option { + let should_draw = self.should_draw(&self.animation_data, timeline); + + if should_draw { + self.sort_keyframes(); + + Some(Entity::Text(self.into_static(timeline))) + } else { + None + } + } + + fn sort_keyframes(&mut self) { + if let Some(x) = &mut self.transform { + x.sort_keyframes(); + } + + self.origin.sort_keyframes(); + } +} diff --git a/lib/creator_rs/src/animation/primitives/interpolations.rs b/lib/creator_rs/src/animation/primitives/interpolations.rs new file mode 100644 index 0000000..6055b14 --- /dev/null +++ b/lib/creator_rs/src/animation/primitives/interpolations.rs @@ -0,0 +1,170 @@ +use std::cmp::Ordering; + +use super::keyframe::RenderedKeyframe; +use serde::{Deserialize, Serialize}; +use simple_easing::{ + circ_in, circ_in_out, circ_out, cubic_in, cubic_in_out, cubic_out, expo_in, expo_in_out, + expo_out, quad_in, quad_in_out, quad_out, quart_in, quart_in_out, quart_out, quint_in, + quint_in_out, quint_out, +}; + +#[derive(Debug, Clone, Copy, Serialize, Deserialize, PartialEq)] +pub struct SpringProperties { + pub mass: f32, + pub damping: f32, + pub stiffness: f32, +} + +#[derive(Debug, Clone, Copy, Serialize, Deserialize, PartialEq)] +pub struct SpringState { + pub velocity: f32, + pub last_val: f32, +} + +#[derive(Debug, Clone, Copy, Serialize, Deserialize, PartialEq)] +#[serde(tag = "easing_function")] +pub enum EasingFunction { + QuintOut, + QuintIn, + QuintInOut, + CircOut, + CircIn, + CircInOut, + CubicOut, + CubicIn, + CubicInOut, + ExpoOut, + ExpoIn, + ExpoInOut, + QuadOut, + QuadIn, + QuadInOut, + QuartOut, + QuartIn, + QuartInOut, +} + +impl EasingFunction { + fn ease(self: &Self, t: f32) -> f32 { + match self { + EasingFunction::QuintOut => quint_out(t), + EasingFunction::QuintIn => quint_in(t), + EasingFunction::QuintInOut => quint_in_out(t), + EasingFunction::CircOut => circ_out(t), + EasingFunction::CircIn => circ_in(t), + EasingFunction::CircInOut => circ_in_out(t), + EasingFunction::CubicOut => cubic_out(t), + EasingFunction::CubicIn => cubic_in(t), + EasingFunction::CubicInOut => cubic_in_out(t), + EasingFunction::ExpoOut => expo_out(t), + EasingFunction::ExpoIn => expo_in(t), + EasingFunction::ExpoInOut => expo_in_out(t), + EasingFunction::QuadOut => quad_out(t), + EasingFunction::QuadIn => quad_in(t), + EasingFunction::QuadInOut => quad_in_out(t), + EasingFunction::QuartOut => quart_out(t), + EasingFunction::QuartIn => quart_in(t), + EasingFunction::QuartInOut => quart_in_out(t), + } + } +} + +#[derive(Debug, Clone, Copy, Serialize, Deserialize, PartialEq)] +#[serde(tag = "type")] +pub enum InterpolationType { + Linear, + Spring(SpringProperties), + EasingFunction(EasingFunction), +} + +pub fn calculate_spring_value( + curr_frame: i32, + start_value: f32, + target_value: f32, + start_frame: i32, + _end_frame: i32, + spring_props: &SpringProperties, +) -> f32 { + const PRECISION: f32 = 0.01; + const STEP: f32 = 10.0; + const REST_VELOCITY: f32 = PRECISION / 10.0; + + let _is_growing = match start_value.total_cmp(&target_value) { + Ordering::Equal => false, + Ordering::Less => false, + Ordering::Greater => true, + }; + + let mut _is_moving = false; + let mut spring_state = SpringState { + last_val: start_value, + velocity: 0.0, + }; + + let mut position = start_value; + let relative_curr_frame = curr_frame - start_frame; + + // println!("target_value {target_value} start_value {start_value}"); + // println!("start_frame {start_frame} end_frame {end_frame}"); + + for _ in 0..relative_curr_frame { + let _is_moving = spring_state.velocity.abs() > REST_VELOCITY; + + let spring_force = -spring_props.stiffness * 0.000001 * (position - target_value); + let damping_force = -spring_props.damping * 0.001 * spring_state.velocity; + let acceleration = (spring_force + damping_force) / spring_props.mass; // pt/ms^2 + + spring_state.velocity = spring_state.velocity + acceleration * STEP; // pt/ms + position = position + spring_state.velocity * STEP; + // println!("{position}") + } + + position +} + +pub fn interpolate_rendered_keyframes( + first_ren_keyframe: &RenderedKeyframe, + second_ren_keyframe: &RenderedKeyframe, + curr_frame: i32, + interpolation_type: InterpolationType, + _fps: i16, +) -> f32 { + let frame_range = second_ren_keyframe.absolute_frame - first_ren_keyframe.absolute_frame; + let position_in_range = curr_frame - first_ren_keyframe.absolute_frame; + let progress: f32 = (1.0 / frame_range as f32) * position_in_range as f32; + + /* println!( + "Progress:{0} Frame_Range: {1} Position_In_Range: {2}", + progress, frame_range, position_in_range + ); */ + + let value_diff = second_ren_keyframe.keyframe.value - first_ren_keyframe.keyframe.value; + + match interpolation_type { + InterpolationType::Linear => { + let interpolated_val = + first_ren_keyframe.keyframe.value + (value_diff * progress as f32); + + return interpolated_val; + } + InterpolationType::EasingFunction(easing_function) => { + let eased_progress = easing_function.ease(progress); + + let interpolated_val = + first_ren_keyframe.keyframe.value + (value_diff * eased_progress as f32); + + return interpolated_val; + } + InterpolationType::Spring(spring_properties) => { + let interpolated_value = calculate_spring_value( + curr_frame, + first_ren_keyframe.keyframe.value, + second_ren_keyframe.keyframe.value, + first_ren_keyframe.absolute_frame, + second_ren_keyframe.absolute_frame, + &spring_properties, + ); + return interpolated_value; + } + }; +} diff --git a/lib/creator_rs/src/animation/primitives/keyframe.rs b/lib/creator_rs/src/animation/primitives/keyframe.rs new file mode 100644 index 0000000..68c104f --- /dev/null +++ b/lib/creator_rs/src/animation/primitives/keyframe.rs @@ -0,0 +1,158 @@ +use std::{cmp::Ordering, sync::Arc}; + +use serde::{Deserialize, Serialize}; + +use super::{ + entities::common::AnimationData, + interpolations::{interpolate_rendered_keyframes, InterpolationType}, + utils::render_keyframe, + values::values::Float, +}; + +#[derive(Clone, Debug, Serialize, Deserialize, PartialEq)] +pub struct Keyframe { + pub value: Float, + pub offset: f32, + pub id: Arc, + pub interpolation: Option, +} + +impl Keyframe { + pub fn new( + value: f32, + offset: f32, + id: Arc, + interpolation: Option, + ) -> Self { + Keyframe { + value, + offset, + id, + interpolation, + } + } +} + +#[derive(Debug, Clone)] +pub struct RenderedKeyframe { + pub absolute_frame: i32, + pub keyframe: Keyframe, + pub index: usize, + pub distance_from_curr: i32, + pub abs_distance_from_curr: i32, +} + +#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)] +pub struct Keyframes { + pub values: Vec, +} + +impl Keyframes { + pub fn get_value_at_frame( + &self, + curr_frame: i32, + animation_data: &AnimationData, + fps: i16, + ) -> f32 { + let keyframe_count = self.values.len(); + + if keyframe_count > 0 { + let mut rendered_keyframes: Vec = self + .values + .to_vec() + .into_iter() + .enumerate() + .map(|(index, keyframe)| { + render_keyframe(keyframe, animation_data, index, curr_frame, fps) + }) + .collect(); + + rendered_keyframes + .sort_by(|a, b| a.abs_distance_from_curr.cmp(&b.abs_distance_from_curr)); + + let closest_keyframe = rendered_keyframes.get(0).unwrap(); + + let result = match (closest_keyframe.distance_from_curr).cmp(&0) { + Ordering::Equal => closest_keyframe.keyframe.value, + Ordering::Greater => { + if closest_keyframe.absolute_frame == curr_frame { + return closest_keyframe.keyframe.value; + } else { + let previous_keyframe = + rendered_keyframes.to_vec().into_iter().find(|keyframe| { + if closest_keyframe.index > 0 { + keyframe.index == closest_keyframe.index - 1 + } else { + false + } + }); + + if let Some(previous_keyframe) = previous_keyframe { + let interpolation = match previous_keyframe.keyframe.interpolation { + Some(val) => val, + None => InterpolationType::Linear, + }; + + let interpolated_value = interpolate_rendered_keyframes( + &previous_keyframe, + closest_keyframe, + curr_frame, + interpolation, + fps, + ); + + return interpolated_value; + } else { + if closest_keyframe.absolute_frame > curr_frame { + return closest_keyframe.keyframe.value; + } else { + return 0.0; + } + } + } + } + Ordering::Less => { + if closest_keyframe.absolute_frame == curr_frame { + return closest_keyframe.keyframe.value; + } else { + let next_keyframe = rendered_keyframes + .to_vec() + .into_iter() + .find(|keyframe| keyframe.index == closest_keyframe.index + 1); + + if let Some(next_keyframe) = next_keyframe { + let interpolation = match closest_keyframe.keyframe.interpolation { + Some(val) => val, + None => InterpolationType::Linear, + }; + + let interpolated_value = interpolate_rendered_keyframes( + closest_keyframe, + &next_keyframe, + curr_frame, + interpolation, + fps, + ); + + return interpolated_value; + } else { + if closest_keyframe.absolute_frame < curr_frame { + return closest_keyframe.keyframe.value; + } else { + return 0.0; + } + } + } + } + }; + + result + } else { + 0.0 + } + } + + pub fn sort(&mut self) { + self.values.sort_by(|a, b| a.offset.total_cmp(&b.offset)); + } +} diff --git a/lib/creator_rs/src/animation/primitives/mod.rs b/lib/creator_rs/src/animation/primitives/mod.rs new file mode 100644 index 0000000..f047a2f --- /dev/null +++ b/lib/creator_rs/src/animation/primitives/mod.rs @@ -0,0 +1,8 @@ +pub mod entities; +pub mod interpolations; +pub mod keyframe; +pub mod paint; +pub mod tests; +pub mod transform; +pub mod utils; +pub mod values; diff --git a/lib/creator_rs/src/animation/primitives/paint.rs b/lib/creator_rs/src/animation/primitives/paint.rs new file mode 100644 index 0000000..695c5af --- /dev/null +++ b/lib/creator_rs/src/animation/primitives/paint.rs @@ -0,0 +1,70 @@ +use serde::{Deserialize, Serialize}; + +#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)] +pub struct Color { + value: (u8, u8, u8, f32), +} + +impl Color { + pub fn new(red: u8, green: u8, blue: u8, alpha: f32) -> Color { + Color { + value: (red, green, blue, alpha), + } + } +} + +#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)] +#[serde(tag = "type")] +pub enum PaintStyle { + Fill(FillStyle), + Stroke(StrokeStyle), + StrokeAndFill(StrokeAndFillStyle), +} + +#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)] +pub struct Paint { + pub style: PaintStyle, +} + +#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)] +pub struct TextPaint { + pub style: PaintStyle, + pub align: TextAlign, + pub font_name: String, + pub size: f32, +} + +#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)] +pub struct StrokeStyle { + pub color: Color, + pub width: f32, +} + +#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)] +pub struct StrokeAndFillStyle { + pub stroke: StrokeStyle, + pub fill: FillStyle, +} + +#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)] +pub struct FillStyle { + pub color: Color, +} +#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)] +pub enum TextAlign { + Left, + Center, + Right, +} + +#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)] +pub struct FontDefinition { + pub family_name: String, +} + +#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)] +pub struct Font { + pub glyph_count: i32, + pub weight: i32, + pub style: String, +} diff --git a/lib/creator_rs/src/animation/primitives/tests.rs b/lib/creator_rs/src/animation/primitives/tests.rs new file mode 100644 index 0000000..1c2957d --- /dev/null +++ b/lib/creator_rs/src/animation/primitives/tests.rs @@ -0,0 +1,183 @@ +#[cfg(test)] +use crate::animation::primitives::{ + entities::common::AnimationData, + interpolations::{calculate_spring_value, SpringProperties}, + keyframe::{Keyframe, Keyframes}, + utils::timestamp_to_frame, +}; + +#[test] +fn interpolates_the_input() { + use crate::animation::primitives::{ + interpolations::{interpolate_rendered_keyframes, InterpolationType}, + keyframe::{Keyframe, Keyframes, RenderedKeyframe}, + utils::render_keyframe, + }; + + let animation_data = AnimationData { + offset: 0.0, + duration: 3.0, + visible: true, + }; + + let fps = 60; + + let keyframes1 = Keyframes { + values: vec![ + Keyframe { + id: "1".into(), + value: 0.0, + offset: 0.0, + interpolation: None, + }, + Keyframe { + id: "2".into(), + value: 100.0, + offset: 1.0, + interpolation: None, + }, + Keyframe { + id: "3".into(), + value: 300.0, + offset: 3.0, + interpolation: None, + }, + ], + }; + + let keyframes2 = Keyframes { + values: vec![ + Keyframe { + id: "4".into(), + value: -100.0, + offset: 0.0, + interpolation: None, + }, + Keyframe { + id: "5".into(), + value: 0.0, + offset: 1.0, + interpolation: None, + }, + ], + }; + + let rendered_keyframes1: Vec = keyframes1 + .values + .into_iter() + .enumerate() + .map(|(index, keyframe)| { + let rendered_keyframe = render_keyframe(keyframe, &animation_data, index, 120, 60); + rendered_keyframe + }) + .collect(); + + let rendered_keyframes2: Vec = keyframes2 + .values + .into_iter() + .enumerate() + .map(|(index, keyframe)| { + let rendered_keyframe = render_keyframe(keyframe, &animation_data, index, 120, 60); + rendered_keyframe + }) + .collect(); + + let val1 = interpolate_rendered_keyframes( + rendered_keyframes1.get(1).unwrap(), + rendered_keyframes1.get(2).unwrap(), + 120, + InterpolationType::Linear, + fps, + ); + + let _val2 = interpolate_rendered_keyframes( + rendered_keyframes2.get(0).unwrap(), + rendered_keyframes2.get(1).unwrap(), + 30, + InterpolationType::Linear, + fps, + ); + + assert_eq!(val1, 200.0); + //println!("{0}", val2); +} + +#[test] +fn calculates_the_spring_value() { + let _fps = 60; + let previous_value = 0.0; + let next_value = 500.0; + + let mut spring_props = SpringProperties { + mass: 1.0, // Mass of the object attached to the spring + stiffness: 100.0, // Stiffness of the spring + damping: 10.0, // Damping factor of the spring + }; + + let value1 = + calculate_spring_value(100, previous_value, next_value, 100, 300, &mut spring_props); + let value2 = + calculate_spring_value(150, previous_value, next_value, 100, 300, &mut spring_props); + let value3 = + calculate_spring_value(200, previous_value, next_value, 100, 300, &mut spring_props); + + println!("{value1}"); + println!("{value2}"); + println!("{value3}"); +} + +#[test] +fn converts_timestamp_to_frame() { + let frame1 = timestamp_to_frame(0.0, 60); + let frame2 = timestamp_to_frame(1.0, 60); + let frame3 = timestamp_to_frame(1.5, 60); + + assert_eq!(frame1, 0); + assert_eq!(frame2, 60); + assert_eq!(frame3, 90); +} + +#[test] +fn gets_value_at_frame() { + let animation_data = AnimationData { + offset: 0.0, + duration: 5.0, + visible: true, + }; + + let fps = 60; + + let keyframes = Keyframes { + values: vec![ + Keyframe { + id: "1".into(), + value: 0.0, + offset: 0.0, + interpolation: None, + }, + Keyframe { + id: "2".into(), + value: 100.0, + offset: 1.0, + interpolation: None, + }, + Keyframe { + id: "3".into(), + value: 300.0, + offset: 3.0, + interpolation: None, + }, + ], + }; + + let value1 = keyframes.get_value_at_frame(50, &animation_data, fps); + let value2 = keyframes.get_value_at_frame(90, &animation_data, fps); + let value3 = keyframes.get_value_at_frame(120, &animation_data, fps); + let value4 = keyframes.get_value_at_frame(180, &animation_data, fps); + let value5 = keyframes.get_value_at_frame(220, &animation_data, fps); + println!("value1: {0}", value1); + println!("value2: {0}", value2); + println!("value3: {0}", value3); + println!("value4: {0}", value4); + println!("value5: {0}", value5); +} diff --git a/lib/creator_rs/src/animation/primitives/transform.rs b/lib/creator_rs/src/animation/primitives/transform.rs new file mode 100644 index 0000000..6b52b76 --- /dev/null +++ b/lib/creator_rs/src/animation/primitives/transform.rs @@ -0,0 +1,64 @@ +use super::{ + entities::common::AnimationData, + values::animated_values::{AnimatedFloatVec2, AnimatedFloatVec3, AnimatedValue}, +}; +use crate::animation::timeline::Timeline; +use serde::{Deserialize, Serialize}; + +#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)] +pub struct AnimatedTransform { + pub translate: AnimatedFloatVec2, + pub scale: AnimatedFloatVec2, + pub skew: AnimatedFloatVec2, + pub rotate: AnimatedFloatVec3, +} + +#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)] +pub struct Transform { + pub translate: (f32, f32), + pub scale: (f32, f32), + pub skew: (f32, f32), + pub rotate: (f32, f32, f32), +} + +impl AnimatedTransform { + pub fn sort_keyframes(&mut self) { + self.rotate.sort_keyframes(); + self.skew.sort_keyframes(); + self.scale.sort_keyframes(); + self.translate.sort_keyframes(); + } + + pub fn calculate(&mut self, timeline: &Timeline, animation_data: &AnimationData) -> Transform { + let skew = self.skew.get_value_at_frame( + timeline.render_state.curr_frame, + animation_data, + timeline.fps, + ); + + let scale = self.scale.get_value_at_frame( + timeline.render_state.curr_frame, + animation_data, + timeline.fps, + ); + + let translate = self.translate.get_value_at_frame( + timeline.render_state.curr_frame, + animation_data, + timeline.fps, + ); + + let rotate = self.rotate.get_value_at_frame( + timeline.render_state.curr_frame, + animation_data, + timeline.fps, + ); + + Transform { + skew, + scale, + translate, + rotate, + } + } +} diff --git a/lib/creator_rs/src/animation/primitives/utils.rs b/lib/creator_rs/src/animation/primitives/utils.rs new file mode 100644 index 0000000..5cc0afe --- /dev/null +++ b/lib/creator_rs/src/animation/primitives/utils.rs @@ -0,0 +1,29 @@ +use super::{ + entities::common::AnimationData, + keyframe::{Keyframe, RenderedKeyframe}, +}; + +pub fn timestamp_to_frame(timestamp: f32, fps: i16) -> i32 { + return (timestamp * fps as f32).round() as i32; +} + +pub fn render_keyframe( + keyframe: Keyframe, + animation_data: &AnimationData, + index: usize, + curr_frame: i32, + fps: i16, +) -> RenderedKeyframe { + let animation_start_frame = timestamp_to_frame(animation_data.offset, fps); + let frame_offset = timestamp_to_frame(keyframe.offset, fps); + let absolute_frame = animation_start_frame + frame_offset; + let distance_from_curr = absolute_frame - curr_frame; + + RenderedKeyframe { + absolute_frame, + keyframe, + index, + distance_from_curr, + abs_distance_from_curr: distance_from_curr.abs(), + } +} diff --git a/lib/creator_rs/src/animation/primitives/values/animated_values.rs b/lib/creator_rs/src/animation/primitives/values/animated_values.rs new file mode 100644 index 0000000..bf9b3a8 --- /dev/null +++ b/lib/creator_rs/src/animation/primitives/values/animated_values.rs @@ -0,0 +1,268 @@ +use crate::animation::primitives::{ + entities::common::AnimationData, + keyframe::{Keyframe, Keyframes}, +}; +#[cfg(feature = "parallelization")] +use rayon::prelude::{IndexedParallelIterator, IntoParallelIterator, ParallelIterator}; +use serde::{Deserialize, Serialize}; +use uuid::Uuid; + +use super::values::{Float, FloatVec2, FloatVec3}; + +pub trait AnimatedValue { + fn sort_keyframes(&mut self); + fn get_value_at_frame(&self, curr_frame: i32, animation_data: &AnimationData, fps: i16) -> T; + fn get_values_at_frame_range( + &self, + start_frame: i32, + end_frame: i32, + animation_data: &AnimationData, + fps: i16, + ) -> Vec; +} +#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)] +pub struct AnimatedFloat { + pub keyframes: Keyframes, +} + +#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)] +pub struct AnimatedFloatVec2 { + pub keyframes: (AnimatedFloat, AnimatedFloat), +} + +#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)] +pub struct AnimatedFloatVec3 { + pub keyframes: (AnimatedFloat, AnimatedFloat, AnimatedFloat), +} + +#[cfg_attr(feature = "tauri", tauri::command)] +pub fn get_values_at_frame_range_from_animated_float( + animated_value: AnimatedFloat, + start_frame: i32, + end_frame: i32, + animation_data: AnimationData, + fps: i16, +) -> Vec { + animated_value.get_values_at_frame_range(start_frame, end_frame, &animation_data, fps) +} + +#[cfg_attr(feature = "tauri", tauri::command)] +pub fn get_values_at_frame_range_from_animated_float_vec2( + animated_value: AnimatedFloatVec2, + start_frame: i32, + end_frame: i32, + animation_data: AnimationData, + fps: i16, +) -> Vec { + animated_value.get_values_at_frame_range(start_frame, end_frame, &animation_data, fps) +} + +#[cfg_attr(feature = "tauri", tauri::command)] +pub fn get_values_at_frame_range_from_animated_float_vec3( + animated_value: AnimatedFloatVec3, + start_frame: i32, + end_frame: i32, + animation_data: AnimationData, + fps: i16, +) -> Vec { + animated_value.get_values_at_frame_range(start_frame, end_frame, &animation_data, fps) +} + +impl AnimatedFloat { + pub fn new(val: f32) -> AnimatedFloat { + AnimatedFloat { + keyframes: Keyframes { + values: vec![Keyframe { + id: Uuid::new_v4().to_string().into(), + value: val, + offset: 0.0, + interpolation: None, + }], + }, + } + } +} + +impl AnimatedFloatVec2 { + pub fn new(x: f32, y: f32) -> AnimatedFloatVec2 { + AnimatedFloatVec2 { + keyframes: (AnimatedFloat::new(x), AnimatedFloat::new(y)), + } + } +} + +impl AnimatedFloatVec3 { + pub fn new(x: f32, y: f32, z: f32) -> AnimatedFloatVec3 { + AnimatedFloatVec3 { + keyframes: ( + AnimatedFloat::new(x), + AnimatedFloat::new(y), + AnimatedFloat::new(z), + ), + } + } +} + +impl AnimatedValue for AnimatedFloat { + fn sort_keyframes(&mut self) { + self.keyframes.sort(); + } + + fn get_value_at_frame(&self, curr_frame: i32, animation_data: &AnimationData, fps: i16) -> f32 { + self.keyframes + .get_value_at_frame(curr_frame, &animation_data, fps) + } + + #[cfg(feature = "parallelization")] + fn get_values_at_frame_range( + &self, + start_frame: i32, + end_frame: i32, + animation_data: &AnimationData, + fps: i16, + ) -> Vec { + let values = (start_frame..end_frame) + .into_par_iter() + .map(|i| self.get_value_at_frame(i, animation_data, fps)) + .collect(); + + values + } + + #[cfg(not(feature = "parallelization"))] + fn get_values_at_frame_range( + &self, + start_frame: i32, + end_frame: i32, + animation_data: &AnimationData, + fps: i16, + ) -> Vec { + let values = (start_frame..end_frame) + .into_iter() + .map(|i| self.get_value_at_frame(i, animation_data, fps)) + .collect(); + + values + } +} + +impl AnimatedValue<(f32, f32, f32)> for AnimatedFloatVec3 { + fn sort_keyframes(&mut self) { + self.keyframes.0.sort_keyframes(); + self.keyframes.1.sort_keyframes(); + self.keyframes.2.sort_keyframes(); + } + + fn get_value_at_frame( + &self, + curr_frame: i32, + animation_data: &AnimationData, + fps: i16, + ) -> (f32, f32, f32) { + let x = self + .keyframes + .0 + .get_value_at_frame(curr_frame, animation_data, fps); + + let y = self + .keyframes + .1 + .get_value_at_frame(curr_frame, animation_data, fps); + + let z = self + .keyframes + .2 + .get_value_at_frame(curr_frame, animation_data, fps); + + return (x, y, z); + } + + fn get_values_at_frame_range( + &self, + start_frame: i32, + end_frame: i32, + animation_data: &AnimationData, + fps: i16, + ) -> Vec<(f32, f32, f32)> { + let x = + self.keyframes + .0 + .get_values_at_frame_range(start_frame, end_frame, animation_data, fps); + let y = + self.keyframes + .1 + .get_values_at_frame_range(start_frame, end_frame, animation_data, fps); + let z = + self.keyframes + .2 + .get_values_at_frame_range(start_frame, end_frame, animation_data, fps); + + let vectors: Vec<(f32, f32, f32)> = x + .into_iter() + .enumerate() + .map(|(index, val_x)| { + let val_y: f32 = *y.get(index).unwrap(); + let val_z: f32 = *z.get(index).unwrap(); + + (val_x, val_y, val_z) + }) + .collect(); + + vectors + } +} + +impl AnimatedValue<(f32, f32)> for AnimatedFloatVec2 { + fn sort_keyframes(&mut self) { + self.keyframes.0.sort_keyframes(); + self.keyframes.1.sort_keyframes(); + } + + fn get_value_at_frame( + &self, + curr_frame: i32, + animation_data: &AnimationData, + fps: i16, + ) -> (f32, f32) { + let x = self + .keyframes + .0 + .get_value_at_frame(curr_frame, animation_data, fps); + + let y = self + .keyframes + .1 + .get_value_at_frame(curr_frame, animation_data, fps); + + return (x, y); + } + + fn get_values_at_frame_range( + &self, + start_frame: i32, + end_frame: i32, + animation_data: &AnimationData, + fps: i16, + ) -> Vec<(f32, f32)> { + let x = + self.keyframes + .0 + .get_values_at_frame_range(start_frame, end_frame, animation_data, fps); + let y = + self.keyframes + .1 + .get_values_at_frame_range(start_frame, end_frame, animation_data, fps); + + let vectors: Vec<(f32, f32)> = x + .into_iter() + .enumerate() + .map(|(index, val_x)| { + let val_y: f32 = *y.get(index).unwrap(); + + (val_x, val_y) + }) + .collect(); + + vectors + } +} diff --git a/lib/creator_rs/src/animation/primitives/values/mod.rs b/lib/creator_rs/src/animation/primitives/values/mod.rs new file mode 100644 index 0000000..f84a5e0 --- /dev/null +++ b/lib/creator_rs/src/animation/primitives/values/mod.rs @@ -0,0 +1,2 @@ +pub mod animated_values; +pub mod values; diff --git a/lib/creator_rs/src/animation/primitives/values/values.rs b/lib/creator_rs/src/animation/primitives/values/values.rs new file mode 100644 index 0000000..e67c773 --- /dev/null +++ b/lib/creator_rs/src/animation/primitives/values/values.rs @@ -0,0 +1,4 @@ +pub type Float = f32; +pub type FloatVec2 = (f32, f32); +pub type FloatVec3 = (f32, f32, f32); +pub type FloatVec4 = (f32, f32, f32, f32); diff --git a/lib/creator_rs/src/animation/timeline.rs b/lib/creator_rs/src/animation/timeline.rs new file mode 100644 index 0000000..4961de9 --- /dev/null +++ b/lib/creator_rs/src/animation/timeline.rs @@ -0,0 +1,318 @@ +use super::primitives::{ + entities::{ + common::{AnimatedEntity, AnimationData, Cache, Entity}, + rect::AnimatedRectEntity, + text::AnimatedTextEntity, + }, + paint::{Color, FillStyle, Paint, PaintStyle, StrokeStyle, TextAlign, TextPaint}, + values::animated_values::{AnimatedFloat, AnimatedFloatVec2}, +}; +use crate::animation::primitives::{ + interpolations::{EasingFunction, InterpolationType, SpringProperties}, + keyframe::{Keyframe, Keyframes}, +}; +#[cfg(feature = "parallelization")] +use rayon::prelude::*; +use serde::{Deserialize, Serialize}; +use std::str::FromStr; +use wasm_bindgen::prelude::*; + +#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)] +pub struct Input { + pub title: String, + pub sub_title: String, +} + +#[derive(Debug, Clone, Serialize, Deserialize)] +pub struct Timeline { + entities: Vec, + pub render_state: RenderState, + pub duration: f32, + pub fps: i16, + pub size: (i32, i32), +} + +#[derive(Debug, Clone, Serialize, Deserialize)] +pub struct RenderState { + pub curr_frame: i32, +} + +impl Timeline { + #[cfg(feature = "parallelization")] + fn calculate(&self) -> Vec { + let mut entities = self.entities.clone(); + + let entities = entities + .par_iter_mut() + .map(|entity| entity.calculate(self)) + .filter(|entity| entity.is_some()) + .map(|entity| entity.unwrap()) + .collect(); + + return entities; + } + + #[cfg(not(feature = "parallelization"))] + fn calculate(&self) -> Vec { + let mut entities = self.entities.clone(); + + let entities = entities + .iter_mut() + .map(|entity| entity.calculate(self)) + .filter(|entity| entity.is_some()) + .map(|entity| entity.unwrap()) + .collect(); + + return entities; + } +} + +fn build_bg(offset: f32, paint: Paint, size: (i32, i32)) -> AnimatedRectEntity { + let bg_box = AnimatedRectEntity { + id: String::from_str("1").unwrap(), + paint, + animation_data: AnimationData { + offset: 0.0 + offset, + duration: 5.0, + visible: true, + }, + cache: Cache { valid: false }, + transform: None, + origin: AnimatedFloatVec2::new(1280.0 / 2.0, 720.0 / 2.0), + position: AnimatedFloatVec2 { + keyframes: ( + AnimatedFloat { + keyframes: Keyframes { + values: vec![ + Keyframe { + id: "1".into(), + value: (size.0 * -1) as f32, + offset: 0.0, + interpolation: Some(InterpolationType::EasingFunction( + EasingFunction::QuintOut, + )), + }, + Keyframe { + id: "2".into(), + value: 0.0, + offset: 5.0, + interpolation: None, + }, + ], + }, + }, + AnimatedFloat { + keyframes: Keyframes { + values: vec![Keyframe { + id: "3".into(), + value: 0.0, + offset: 0.0, + interpolation: None, + }], + }, + }, + ), + }, + size: AnimatedFloatVec2 { + keyframes: ( + AnimatedFloat { + keyframes: Keyframes { + values: vec![Keyframe { + id: "4".into(), + interpolation: None, + value: size.0 as f32, + offset: 0.0, + }], + }, + }, + AnimatedFloat { + keyframes: Keyframes { + values: vec![Keyframe { + id: "5".into(), + value: size.1 as f32, + offset: 0.0, + interpolation: None, + }], + }, + }, + ), + }, + }; + return bg_box; +} + +#[cfg_attr(feature = "tauri", tauri::command)] +pub fn calculate_timeline_at_curr_frame(timeline: Timeline) -> Vec { + timeline.calculate() +} + +#[wasm_bindgen] +pub fn calculate_timeline_from_json_at_curr_frame(timeline_json: &str) -> String { + // TODO: Handle failure instead of unwrap + let timeline: Timeline = serde_json::from_str(timeline_json).unwrap(); + + let entities = calculate_timeline_at_curr_frame(timeline); + + // TODO: Handle failure instead of unwrap + let entities_json = serde_json::to_string(&entities).unwrap(); + + entities_json +} + +pub fn test_timeline_entities_at_frame( + render_state: RenderState, + size: (i32, i32), + input: Input, +) -> Vec { + let rect1_paint = Paint { + style: PaintStyle::Fill(FillStyle { + color: Color::new(34, 189, 58, 1.0), + }), + }; + + let rect2_paint = Paint { + style: PaintStyle::Fill(FillStyle { + color: Color::new(23, 178, 28, 1.0), + }), + }; + + let rect3_paint = Paint { + style: PaintStyle::Fill(FillStyle { + color: Color::new(43, 128, 98, 1.0), + }), + }; + + let title_paint = TextPaint { + style: PaintStyle::Stroke(StrokeStyle { + color: Color::new(0, 0, 0, 1.0), + width: 10.0, + }), + font_name: "Arial".into(), + align: TextAlign::Center, + size: 20.0, + }; + + let sub_title_paint = TextPaint { + style: PaintStyle::Fill(FillStyle { + color: Color::new(0, 0, 0, 1.0), + }), + font_name: "Arial".into(), + align: TextAlign::Center, + size: 10.0, + }; + + let timeline = Timeline { + fps: 60, + duration: 5.0, + size, + entities: vec![ + AnimatedEntity::Rect(build_bg(0.0, rect1_paint, size)), + AnimatedEntity::Rect(build_bg(0.5, rect2_paint, size)), + AnimatedEntity::Rect(build_bg(1.0, rect3_paint, size)), + AnimatedEntity::Text(AnimatedTextEntity { + id: String::from_str("2").unwrap(), + paint: title_paint, + cache: Cache { valid: false }, + text: input.title, + animation_data: AnimationData { + offset: 0.0, + duration: 6.0, + visible: true, + }, + transform: None, + origin: AnimatedFloatVec2 { + keyframes: ( + AnimatedFloat { + keyframes: Keyframes { + values: vec![ + Keyframe { + id: "1".into(), + value: 0.0, + offset: 0.0, + interpolation: Some(InterpolationType::Spring( + SpringProperties { + mass: 1.0, + damping: 20.0, + stiffness: 200.0, + }, + )), + }, + Keyframe { + id: "2".into(), + value: (size.0 / 2) as f32, + offset: 2.0, + interpolation: None, + }, + ], + }, + }, + AnimatedFloat { + keyframes: Keyframes { + values: vec![Keyframe { + id: "3".into(), + value: (size.1 / 2) as f32, + offset: 0.0, + interpolation: None, + }], + }, + }, + ), + }, + }), + AnimatedEntity::Text(AnimatedTextEntity { + id: String::from_str("3").unwrap(), + paint: sub_title_paint, + text: input.sub_title, + cache: Cache { valid: false }, + animation_data: AnimationData { + offset: 0.5, + duration: 6.0, + visible: true, + }, + transform: None, + origin: AnimatedFloatVec2 { + keyframes: ( + AnimatedFloat { + keyframes: Keyframes { + values: vec![ + Keyframe { + id: "5".into(), + value: 0.0, + offset: 0.0, + interpolation: Some(InterpolationType::Spring( + SpringProperties { + mass: 1.0, + damping: 20.0, + stiffness: 200.0, + }, + )), + }, + Keyframe { + id: "6".into(), + + value: (size.0 / 2) as f32, + offset: 2.0, + interpolation: None, + }, + ], + }, + }, + AnimatedFloat { + keyframes: Keyframes { + values: vec![Keyframe { + id: "7".into(), + value: ((size.1 / 2) as f32) + 80.0, + offset: 0.0, + interpolation: None, + }], + }, + }, + ), + }, + }), + ], + render_state: render_state, + }; + + timeline.calculate() +} diff --git a/lib/creator_rs/src/fonts/fonts.rs b/lib/creator_rs/src/fonts/fonts.rs new file mode 100644 index 0000000..484a762 --- /dev/null +++ b/lib/creator_rs/src/fonts/fonts.rs @@ -0,0 +1,58 @@ +use font_kit::source::SystemSource; + +#[cfg_attr(feature = "tauri", tauri::command)] +pub fn get_system_fonts() -> Option> { + let source = SystemSource::new(); + + let found_fonts = source.all_fonts(); + + match found_fonts { + Ok(found_fonts) => { + let font_names: Vec = found_fonts + .iter() + .map(|f| f.load()) + .filter(|f| f.is_ok()) + .map(|f| f.unwrap()) + .map(|f| f.postscript_name()) + .filter(|f| f.is_some()) + .map(|f| f.unwrap()) + .collect(); + + Some(font_names) + } + Err(_) => None, + } +} + +#[cfg_attr(feature = "tauri", tauri::command)] +pub fn get_system_families() -> Option> { + let source = SystemSource::new(); + + let found_families = source.all_families(); + + found_families.ok() +} + +#[cfg_attr(feature = "tauri", tauri::command)] +pub fn get_system_font(font_name: String) -> Option> { + let source = SystemSource::new(); + + let font = source.select_by_postscript_name(font_name.as_str()); + + match font { + Ok(font) => { + let font = font.load(); + + if let Ok(font) = font { + if let Some(font_data) = font.copy_font_data() { + Some(font_data.as_slice().to_owned()) + } else { + None + } + } else { + None + } + } + Err(_) => panic!("Err"), + } +} diff --git a/lib/creator_rs/src/fonts/mod.rs b/lib/creator_rs/src/fonts/mod.rs new file mode 100644 index 0000000..bfbdc1d --- /dev/null +++ b/lib/creator_rs/src/fonts/mod.rs @@ -0,0 +1 @@ +pub mod fonts; diff --git a/lib/creator_rs/src/lib.rs b/lib/creator_rs/src/lib.rs new file mode 100644 index 0000000..ac15e3c --- /dev/null +++ b/lib/creator_rs/src/lib.rs @@ -0,0 +1,3 @@ +pub mod animation; +#[cfg(feature = "fonts")] +pub mod fonts; diff --git a/lib/something/Cargo.toml b/lib/something/Cargo.toml new file mode 100644 index 0000000..60810b4 --- /dev/null +++ b/lib/something/Cargo.toml @@ -0,0 +1,8 @@ +[package] +name = "something" +version = "0.1.0" +edition = "2021" + +# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html + +[dependencies] diff --git a/lib/something/src/lib.rs b/lib/something/src/lib.rs new file mode 100644 index 0000000..7d12d9a --- /dev/null +++ b/lib/something/src/lib.rs @@ -0,0 +1,14 @@ +pub fn add(left: usize, right: usize) -> usize { + left + right +} + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn it_works() { + let result = add(2, 2); + assert_eq!(result, 4); + } +}