diff --git a/.gitea/workflows/ci.yml b/.gitea/workflows/ci.yml index a1e2e2f..600b408 100644 --- a/.gitea/workflows/ci.yml +++ b/.gitea/workflows/ci.yml @@ -16,6 +16,35 @@ concurrency: cancel-in-progress: true jobs: + rust-skia: + name: rust-skia (Rust only) + runs-on: ubuntu-latest + timeout-minutes: 15 + env: + CARGO_BUILD_JOBS: "1" + CARGO_INCREMENTAL: "0" + CARGO_PROFILE_DEV_DEBUG: "0" + CARGO_PROFILE_TEST_DEBUG: "0" + steps: + - uses: actions/checkout@v4 + + # Deliberately do not install CMake, Clang, pkg-config, Skia, WebP, or + # any other native codec prerequisite in this job. + - name: Install pinned Rust + uses: dtolnay/rust-toolchain@master + with: + toolchain: 1.97.1 + targets: wasm32-unknown-unknown + + - name: Test the pure-Rust Skia-compatible extension + run: cargo test --locked -j 1 -p libremetaverse-imaging-skia --no-default-features --features rust-skia + + - name: Audit the normal and build dependency graph + run: cargo tree --locked -p libremetaverse-imaging-skia --no-default-features --features rust-skia -e normal,build + + - name: Compile the same Rust codec for WASM + run: cargo check --locked -j 1 -p libremetaverse-imaging-skia --no-default-features --features rust-skia --target wasm32-unknown-unknown + required: name: required runs-on: ubuntu-latest diff --git a/Cargo.lock b/Cargo.lock index 633c5e2..7dd372c 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -52,6 +52,12 @@ dependencies = [ "memchr", ] +[[package]] +name = "allocator-api2" +version = "0.2.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "683d7910e743518b0e34f1186f92494becacb047c7b6bf616c96772180fef923" + [[package]] name = "alsa" version = "0.11.0" @@ -59,7 +65,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "812947049edcd670a82cd5c73c3661d2e58468577ba8489de58e1a73c04cbd5d" dependencies = [ "alsa-sys", - "bitflags", + "bitflags 2.13.1", "cfg-if", "libc", ] @@ -143,6 +149,15 @@ dependencies = [ "ogg_next_sys", ] +[[package]] +name = "approx" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cab112f0a86d568ea0e627cc1d6be74a1e9cd55214684db5561995f6dad897c6" +dependencies = [ + "num-traits", +] + [[package]] name = "arrayvec" version = "0.7.8" @@ -254,7 +269,7 @@ version = "0.72.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "993776b509cfb49c750f11b8f07a46fa23e0a1386ffc01fb1e7d343efc387895" dependencies = [ - "bitflags", + "bitflags 2.13.1", "cexpr", "clang-sys", "itertools", @@ -263,11 +278,26 @@ dependencies = [ "proc-macro2", "quote", "regex", - "rustc-hash", + "rustc-hash 2.1.3", "shlex 1.3.0", "syn 2.0.119", ] +[[package]] +name = "bit-set" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "08807e080ed7f9d5433fa9b275196cfc35414f66a0c79d864dc51a0d825231a3" +dependencies = [ + "bit-vec 0.8.0", +] + +[[package]] +name = "bit-vec" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5e764a1d40d510daf35e07be9eb06e75770908c27d411ee6c92109c9840eaaf7" + [[package]] name = "bit-vec" version = "0.9.1" @@ -277,6 +307,12 @@ dependencies = [ "serde", ] +[[package]] +name = "bitflags" +version = "1.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" + [[package]] name = "bitflags" version = "2.13.1" @@ -316,6 +352,38 @@ version = "3.20.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "72f5acc6cb2ba439de613abc23857ec3d78374d8ed5ac84e9d11336e87da8649" +[[package]] +name = "bytemuck" +version = "1.25.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "95832e849adfb21180ccb6826a99da14e5d266ae5c2e668e1602cf234f153797" +dependencies = [ + "bytemuck_derive", +] + +[[package]] +name = "bytemuck_derive" +version = "1.12.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fc0e56a716f1e132ff6bf4bdac1c944a3fcdc1cae65f70a4a2a1ac3b401d2d1f" +dependencies = [ + "proc-macro2", + "quote", + "syn 3.0.3", +] + +[[package]] +name = "byteorder" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b" + +[[package]] +name = "byteorder-lite" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8f1fe948ff07f4bd06c30984e69f5b4899c516a3ef74f34df92a2df2ab535495" + [[package]] name = "bytes" version = "1.12.1" @@ -479,6 +547,22 @@ dependencies = [ "cc", ] +[[package]] +name = "codespan-reporting" +version = "0.11.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3538270d33cc669650c4b093848450d380def10c331d38c768e34cac80576e6e" +dependencies = [ + "termcolor", + "unicode-width", +] + +[[package]] +name = "color_quant" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3d7b894f5411737b7867f4827955924d7c254fc9f4d91a6aad6b097804b1018b" + [[package]] name = "colorchoice" version = "1.0.5" @@ -529,7 +613,7 @@ version = "0.14.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7d5d7dca3ebcf65a035582c9ad4385371a9d9ee6537474d2a278f4e1e475bb58" dependencies = [ - "bitflags", + "bitflags 2.13.1", "libc", "objc2-audio-toolbox", "objc2-core-audio", @@ -823,7 +907,7 @@ version = "0.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1e0e367e4e7da84520dedcac1901e4da967309406d1e51017ae1abfb97adbd38" dependencies = [ - "bitflags", + "bitflags 2.13.1", "objc2", ] @@ -844,6 +928,15 @@ version = "1.0.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "92773504d58c093f6de2459af4af33faa518c13451eb8f2b5698ed3d36e7c813" +[[package]] +name = "earcut" +version = "0.4.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "88459a2a8e3a514b6e6de38cf3aaa9250a894cb098f74a932db77fcc8341b6d0" +dependencies = [ + "num-traits", +] + [[package]] name = "ecdsa" version = "0.16.9" @@ -907,6 +1000,15 @@ version = "2.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "da7c62ceae207dd37ea5b845da6a0696c799f85e97da1ab5b7910be3c1c80223" +[[package]] +name = "fdeflate" +version = "0.3.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e6853b52649d4ac5c0bd02320cddc5ba956bdb407c4b75a2c6b75bf51500f8c" +dependencies = [ + "simd-adler32", +] + [[package]] name = "fearless_simd" version = "0.4.1" @@ -961,6 +1063,18 @@ dependencies = [ "miniz_oxide", ] +[[package]] +name = "float_next_after" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "37007738a80ea34f969af54a3390dd72cacdef654974cfd449c9f6f72dbaac10" + +[[package]] +name = "foldhash" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "77ce24cb58228fbb8aa041425bb1050850ac19177686ea6e0f41a70416f56fdb" + [[package]] name = "form_urlencoded" version = "1.2.2" @@ -1047,6 +1161,51 @@ dependencies = [ "zeroize", ] +[[package]] +name = "geo" +version = "0.33.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "30eb1fdc57c1e5cfd11826fe0caec4b9dc7901f3758263bb506228d88c8d9e9a" +dependencies = [ + "earcut", + "float_next_after", + "geo-types", + "geographiclib-rs", + "i_overlay", + "log", + "num-traits", + "rand 0.10.2", + "rand_pcg", + "robust", + "rstar", + "sif-itree", + "spade", +] + +[[package]] +name = "geo-types" +version = "0.7.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "777d18aa0f12f8b285331cd867133ee14422b3f023f6d388034c47d43e28786a" +dependencies = [ + "approx", + "num-traits", + "rayon", + "rstar", + "serde", + "spade", + "thiserror 2.0.20", +] + +[[package]] +name = "geographiclib-rs" +version = "0.2.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c5a7f08910fd98737a6eda7568e7c5e645093e073328eeef49758cfe8b0489c7" +dependencies = [ + "libm", +] + [[package]] name = "getrandom" version = "0.2.17" @@ -1096,6 +1255,22 @@ dependencies = [ "polyval", ] +[[package]] +name = "gif" +version = "0.13.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4ae047235e33e2829703574b54fdec96bfbad892062d97fed2f76022287de61b" +dependencies = [ + "color_quant", + "weezl", +] + +[[package]] +name = "glam" +version = "0.29.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8babf46d4c1c9d92deac9f7be466f76dfc4482b6452fc5024b5e8daf6ffeb3ee" + [[package]] name = "glob" version = "0.3.4" @@ -1124,18 +1299,54 @@ dependencies = [ "subtle", ] +[[package]] +name = "hash32" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "47d60b12902ba28e2730cd37e95b8c9223af2808df9e902d4df49588d1470606" +dependencies = [ + "byteorder", +] + +[[package]] +name = "hashbrown" +version = "0.16.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "841d1cc9bed7f9236f321df977030373f4a4163ae1a7dbfe1a51a2c1a51d9100" +dependencies = [ + "allocator-api2", + "equivalent", + "foldhash", +] + [[package]] name = "hashbrown" version = "0.17.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ed5909b6e89a2db4456e54cd5f673791d7eca6732202bbf2a9cc504fe2f9b84a" +[[package]] +name = "heapless" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0bfb9eb618601c89945a70e254898da93b13be0388091d42117462b265bb3fad" +dependencies = [ + "hash32", + "stable_deref_trait", +] + [[package]] name = "heck" version = "0.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea" +[[package]] +name = "hexf-parse" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dfa686283ad6dd069f105e5ab091b04c62850d3e4cf5d67debad1933f55023df" + [[package]] name = "hkdf" version = "0.12.4" @@ -1266,6 +1477,52 @@ dependencies = [ "tracing", ] +[[package]] +name = "i_float" +version = "1.16.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "813145bb0ad5b60f55cbbf3c74cdceda1c0a9d253b35c4cc36ae0df7887cb78f" +dependencies = [ + "libm", +] + +[[package]] +name = "i_key_sort" +version = "0.10.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d73d122b937fca067feb0ad74f62388920272b27c356d4df2d0cfdd59e044cf0" +dependencies = [ + "rayon", +] + +[[package]] +name = "i_overlay" +version = "4.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8dd314b4668e2b3a12508f2e125558c82a6c0a8636fa5107a900f79ce414e450" +dependencies = [ + "i_float", + "i_key_sort", + "i_shape", + "i_tree", + "rayon", +] + +[[package]] +name = "i_shape" +version = "1.18.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bfa9eac533d7509a8ab87672b60ac610c17240f9ea4851d26227689fdfe349c8" +dependencies = [ + "i_float", +] + +[[package]] +name = "i_tree" +version = "0.18.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4804bdc1dc124eb7e1aa9e144ecc04096bcf787a10a15fa44af682b51f0f6cce" + [[package]] name = "icu_collections" version = "2.2.0" @@ -1369,6 +1626,16 @@ dependencies = [ "icu_properties", ] +[[package]] +name = "image-webp" +version = "0.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "525e9ff3e1a4be2fbea1fdf0e98686a6d98b4d8f937e1bf7402245af1909e8c3" +dependencies = [ + "byteorder-lite", + "quick-error", +] + [[package]] name = "indexmap" version = "2.14.0" @@ -1376,7 +1643,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d466e9454f08e4a911e14806c24e16fba1b4c121d1ea474396f396069cf949d9" dependencies = [ "equivalent", - "hashbrown", + "hashbrown 0.17.1", ] [[package]] @@ -1551,6 +1818,21 @@ dependencies = [ "libc", ] +[[package]] +name = "jpeg-decoder" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "00810f1d8b74be64b13dbf3db89ac67740615d6c891f0e7b6179326533011a07" +dependencies = [ + "rayon", +] + +[[package]] +name = "jpeg-encoder" +version = "0.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b454d911ac55068f53495488d8ccd0646eaa540c033a28ee15b07838afafb01f" + [[package]] name = "js-sys" version = "0.3.104" @@ -1660,8 +1942,10 @@ dependencies = [ name = "libremetaverse-imaging-skia" version = "0.0.1" dependencies = [ + "image-webp", "libremetaverse-imaging", "libremetaverse-types", + "skia-rs-codec", "skia-safe", ] @@ -1821,6 +2105,15 @@ version = "0.8.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "92daf443525c4cce67b150400bc2316076100ce0b3686209eb8cf3c31612e6f0" +[[package]] +name = "lock_api" +version = "0.4.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "224399e74b87b5f3557511d98dff8b14089b3dadafcab6bb93eab67d3aace965" +dependencies = [ + "scopeguard", +] + [[package]] name = "log" version = "0.4.33" @@ -1954,13 +2247,34 @@ dependencies = [ "pxfm", ] +[[package]] +name = "naga" +version = "23.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "364f94bc34f61332abebe8cad6f6cd82a5b65cff22c828d05d0968911462ca4f" +dependencies = [ + "arrayvec", + "bit-set", + "bitflags 2.13.1", + "cfg_aliases 0.1.1", + "codespan-reporting", + "hexf-parse", + "indexmap", + "log", + "rustc-hash 1.1.0", + "spirv", + "termcolor", + "thiserror 1.0.69", + "unicode-xid", +] + [[package]] name = "ndk" version = "0.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c3f42e7bbe13d351b6bead8286a43aac9534b82bd3cc43e47037f012ebfd62d4" dependencies = [ - "bitflags", + "bitflags 2.13.1", "jni-sys 0.3.1", "log", "ndk-sys", @@ -1989,7 +2303,7 @@ version = "0.28.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ab2156c4fce2f8df6c499cc1c763e4394b7482525bf2a9701c9d79d215f519e4" dependencies = [ - "bitflags", + "bitflags 2.13.1", "cfg-if", "cfg_aliases 0.1.1", "libc", @@ -2002,7 +2316,7 @@ version = "0.31.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "cf20d2fde8ff38632c426f1165ed7436270b44f199fc55284c38276f9db47c3d" dependencies = [ - "bitflags", + "bitflags 2.13.1", "cfg-if", "cfg_aliases 0.2.2", "libc", @@ -2070,6 +2384,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "071dfc062690e90b734c0b2273ce72ad0ffa95f0c74596bc250dcfd960262841" dependencies = [ "autocfg", + "libm", ] [[package]] @@ -2109,7 +2424,7 @@ version = "0.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6948501a91121d6399b79abaa33a8aa4ea7857fe019f341b8c23ad6e81b79b08" dependencies = [ - "bitflags", + "bitflags 2.13.1", "libc", "objc2", "objc2-core-audio", @@ -2124,7 +2439,7 @@ version = "0.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "13a380031deed8e99db00065c45937da434ca987c034e13b87e4441f9e4090be" dependencies = [ - "bitflags", + "bitflags 2.13.1", "objc2", "objc2-foundation", ] @@ -2135,7 +2450,7 @@ version = "0.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "73ad74d880bb43877038da939b7427bba67e9dd42004a18b809ba7d87cee241c" dependencies = [ - "bitflags", + "bitflags 2.13.1", "objc2", "objc2-foundation", ] @@ -2159,7 +2474,7 @@ version = "0.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5a89f2ec274a0cf4a32642b2991e8b351a404d290da87bb6a9a9d8632490bd1c" dependencies = [ - "bitflags", + "bitflags 2.13.1", "objc2", ] @@ -2179,7 +2494,7 @@ version = "0.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2a180dd8642fa45cdb7dd721cd4c11b1cadd4929ce112ebd8b9f5803cc79d536" dependencies = [ - "bitflags", + "bitflags 2.13.1", "block2", "dispatch2", "libc", @@ -2192,7 +2507,7 @@ version = "0.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e022c9d066895efa1345f8e33e584b9f958da2fd4cd116792e15e07e4720a807" dependencies = [ - "bitflags", + "bitflags 2.13.1", "dispatch2", "objc2", "objc2-core-foundation", @@ -2225,7 +2540,7 @@ version = "0.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0cde0dfb48d25d2b4862161a4d5fcc0e3c24367869ad306b0c9ec0073bfed92d" dependencies = [ - "bitflags", + "bitflags 2.13.1", "objc2", "objc2-core-foundation", "objc2-core-graphics", @@ -2243,7 +2558,7 @@ version = "0.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e3e0adef53c21f888deb4fa59fc59f7eb17404926ee8a6f59f5df0fd7f9f3272" dependencies = [ - "bitflags", + "bitflags 2.13.1", "block2", "libc", "objc2", @@ -2256,7 +2571,7 @@ version = "0.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "180788110936d59bab6bd83b6060ffdfffb3b922ba1396b312ae795e1de9d81d" dependencies = [ - "bitflags", + "bitflags 2.13.1", "objc2", "objc2-core-foundation", ] @@ -2267,7 +2582,7 @@ version = "0.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "96c1358452b371bf9f104e21ec536d37a650eb10f7ee379fff67d2e08d537f1f" dependencies = [ - "bitflags", + "bitflags 2.13.1", "objc2", "objc2-core-foundation", "objc2-foundation", @@ -2279,7 +2594,7 @@ version = "0.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d87d638e33c06f577498cbcc50491496a3ed4246998a7fbba7ccb98b1e7eab22" dependencies = [ - "bitflags", + "bitflags 2.13.1", "block2", "objc2", "objc2-cloud-kit", @@ -2385,6 +2700,29 @@ dependencies = [ "sha2 0.10.9", ] +[[package]] +name = "parking_lot" +version = "0.12.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "93857453250e3077bd71ff98b6a65ea6621a19bb0f559a85248955ac12c45a1a" +dependencies = [ + "lock_api", + "parking_lot_core", +] + +[[package]] +name = "parking_lot_core" +version = "0.9.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2621685985a2ebf1c516881c026032ac7deafcda1a2c9b7850dc81e3dfcb64c1" +dependencies = [ + "cfg-if", + "libc", + "redox_syscall", + "smallvec", + "windows-link", +] + [[package]] name = "pem-rfc7468" version = "0.7.0" @@ -2428,6 +2766,19 @@ version = "0.2.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b4596b6d070b27117e987119b4dac604f3c58cfb0b191112e24771b2faeac1a6" +[[package]] +name = "png" +version = "0.17.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "82151a2fc869e011c153adc57cf2789ccb8d9906ce52c0b39a6b5697749d7526" +dependencies = [ + "bitflags 1.3.2", + "crc32fast", + "fdeflate", + "flate2", + "miniz_oxide", +] + [[package]] name = "poly1305" version = "0.8.0" @@ -2518,6 +2869,12 @@ version = "0.1.30" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d55d956fa96f5ec02be2e13af0e20391a5aa83d6a074e3ad368959d0fab299ea" +[[package]] +name = "quick-error" +version = "2.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a993555f31e5a609f617c12db6250dedcac1b0a85076912c436e6fc9b2c8e6a3" + [[package]] name = "quinn" version = "0.11.11" @@ -2529,7 +2886,7 @@ dependencies = [ "pin-project-lite", "quinn-proto", "quinn-udp", - "rustc-hash", + "rustc-hash 2.1.3", "rustls", "socket2", "thiserror 2.0.20", @@ -2551,7 +2908,7 @@ dependencies = [ "rand 0.10.2", "rand_pcg", "ring", - "rustc-hash", + "rustc-hash 2.1.3", "rustls", "rustls-pki-types", "slab", @@ -2693,6 +3050,15 @@ dependencies = [ "yasna", ] +[[package]] +name = "redox_syscall" +version = "0.5.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ed2bf2547551a7053d6fdfafda3f938979645c44812fbfcda098faae3f1a362d" +dependencies = [ + "bitflags 2.13.1", +] + [[package]] name = "regex" version = "1.13.1" @@ -2784,6 +3150,12 @@ dependencies = [ "windows-sys 0.52.0", ] +[[package]] +name = "robust" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4e27ee8bb91ca0adcf0ecb116293afa12d393f9c2b9b9cd54d33e8078fe19839" + [[package]] name = "roxmltree" version = "0.21.1" @@ -2793,6 +3165,23 @@ dependencies = [ "memchr", ] +[[package]] +name = "rstar" +version = "0.12.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "421400d13ccfd26dfa5858199c30a5d76f9c54e0dba7575273025b43c5175dbb" +dependencies = [ + "heapless", + "num-traits", + "smallvec", +] + +[[package]] +name = "rustc-hash" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "08d43f7aa6b08d49f382cde6a7982047c3426db949b1424bc4b7ec9ae12c6ce2" + [[package]] name = "rustc-hash" version = "2.1.3" @@ -2823,7 +3212,7 @@ version = "1.1.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b6fe4565b9518b83ef4f91bb47ce29620ca828bd32cb7e408f0062e9930ba190" dependencies = [ - "bitflags", + "bitflags 2.13.1", "errno", "libc", "linux-raw-sys", @@ -2929,6 +3318,12 @@ dependencies = [ "windows-sys 0.61.2", ] +[[package]] +name = "scopeguard" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49" + [[package]] name = "scroll" version = "0.13.0" @@ -2959,7 +3354,7 @@ dependencies = [ "crc", "log", "rand 0.9.5", - "rustc-hash", + "rustc-hash 2.1.3", "slab", "thiserror 2.0.20", ] @@ -2984,7 +3379,7 @@ version = "3.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b7f4bc775c73d9a02cde8bf7b2ec4c9d12743edf609006c7facc23998404cd1d" dependencies = [ - "bitflags", + "bitflags 2.13.1", "core-foundation", "core-foundation-sys", "libc", @@ -3104,6 +3499,12 @@ version = "2.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f8fadd59c855ef2080decdef8ff161eb6661b86933c9d82e5ba29dc602a55aba" +[[package]] +name = "sif-itree" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d7f45b8998ced5134fb1d75732c77842a3e888f19c1ff98481822e8fbfbf930b" + [[package]] name = "signal-hook-registry" version = "1.4.8" @@ -3163,6 +3564,60 @@ dependencies = [ "toml", ] +[[package]] +name = "skia-rs-codec" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "733be303d09c7e2bd0628dc1e592855d80e79a32c7f020f980ab0abe710d77a6" +dependencies = [ + "gif", + "jpeg-decoder", + "jpeg-encoder", + "parking_lot", + "png", + "skia-rs-core", + "skia-rs-paint", + "thiserror 2.0.20", +] + +[[package]] +name = "skia-rs-core" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "88c10ce81ab452a6fa88e7228a5af713328e698b7100c2d021f58287a5370c49" +dependencies = [ + "bitflags 2.13.1", + "bytemuck", + "getrandom 0.2.17", + "glam", + "smallvec", + "thiserror 2.0.20", +] + +[[package]] +name = "skia-rs-paint" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f4b7ea0fc7fa887d5875e49809eabc3cbd9e6a0247930a9f6456ad4c59cedfb1" +dependencies = [ + "bitflags 2.13.1", + "naga", + "skia-rs-core", + "skia-rs-path", + "thiserror 2.0.20", +] + +[[package]] +name = "skia-rs-path" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1f928ca29bc3e26f46393048186bf64cf7eb7c39cc7176e8285a1828c601d7c0" +dependencies = [ + "geo", + "skia-rs-core", + "smallvec", +] + [[package]] name = "skia-safe" version = "0.99.0" @@ -3170,7 +3625,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9f512ac418a64194842dd05566320805dad1c957c521039db2486fd6368865bc" dependencies = [ "base64", - "bitflags", + "bitflags 2.13.1", "percent-encoding", "skia-bindings", "skia-svg-macros", @@ -3209,6 +3664,27 @@ dependencies = [ "windows-sys 0.61.2", ] +[[package]] +name = "spade" +version = "2.15.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9699399fd9349b00b184f5635b074f9ec93afffef30c853f8c875b32c0f8c7fa" +dependencies = [ + "hashbrown 0.16.1", + "num-traits", + "robust", + "smallvec", +] + +[[package]] +name = "spirv" +version = "0.3.0+sdk-1.3.268.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eda41003dc44290527a59b13432d4a0379379fa074b70174882adfbdfd917844" +dependencies = [ + "bitflags 2.13.1", +] + [[package]] name = "spki" version = "0.7.3" @@ -3349,6 +3825,15 @@ dependencies = [ "xattr", ] +[[package]] +name = "termcolor" +version = "1.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "06794f8f6c5c898b3275aebefa6b8a1cb24cd2c6c79397ab15774837a0bc5755" +dependencies = [ + "winapi-util", +] + [[package]] name = "thiserror" version = "1.0.69" @@ -3566,7 +4051,7 @@ version = "0.6.11" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4cfcf7e2740e6fc6d4d688b4ef00650406bb94adf4731e43c096c3a19fe40840" dependencies = [ - "bitflags", + "bitflags 2.13.1", "bytes", "futures-util", "http", @@ -3645,6 +4130,18 @@ version = "1.0.24" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e6e4313cd5fcd3dad5cafa179702e2b244f760991f45397d14d4ebf38247da75" +[[package]] +name = "unicode-width" +version = "0.1.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7dd6e30e90baa6f72411720665d41d89b9a3d039dc45b8faea1ddd07f617f6af" + +[[package]] +name = "unicode-xid" +version = "0.2.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ebc1c04c71510c7f702b52b7c350734c9ff1295c464a03335b00bb84fc54f853" + [[package]] name = "universal-hash" version = "0.5.1" @@ -3699,9 +4196,19 @@ checksum = "bf3923a6f5c4c6382e0b653c4117f48d631ea17f38ed86e2a828e6f7412f5239" dependencies = [ "getrandom 0.4.3", "js-sys", + "uuid-rng-internal", "wasm-bindgen", ] +[[package]] +name = "uuid-rng-internal" +version = "1.24.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9dff7387287837acf196f2596a6216f94c555d947d5331e1cc48393131020119" +dependencies = [ + "getrandom 0.4.3", +] + [[package]] name = "vcpkg" version = "0.2.15" @@ -3859,6 +4366,12 @@ dependencies = [ "rustls-pki-types", ] +[[package]] +name = "weezl" +version = "0.1.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a28ac98ddc8b9274cb41bb4d9d4d5c425b6020c50c46f25559911905610b4a88" + [[package]] name = "widestring" version = "1.2.1" @@ -4144,7 +4657,7 @@ version = "0.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b5f6765e852b9b4dc8e2a76843e4d64d1cea8e79bcde0b6901aea8e7c7f08282" dependencies = [ - "bit-vec", + "bit-vec 0.9.1", "time", ] diff --git a/README.md b/README.md index 8042640..ad0399d 100644 --- a/README.md +++ b/README.md @@ -62,7 +62,8 @@ The currently available opt-in codec backends are: | --- | --- | --- | --- | | Raw J2K and JP2 decoding/encoding through OpenJPEG | `libremetaverse/jpeg2000` | `cargo build -p libremetaverse --features jpeg2000` | OpenJPEG 2.5.4 or newer | | Raw J2K and JP2 decoding/encoding in pure Rust | `libremetaverse/rust-j2k` | `cargo build -p libremetaverse --no-default-features --features rust-j2k` | none | -| BMP, GIF, ICO, JPEG, PNG, WBMP, and WebP decoding through Skia | `libremetaverse-imaging-skia/skia` | `cargo build -p libremetaverse-imaging-skia --features skia` | A matching rust-skia binary cache, or the documented native source-build tools | +| BMP, GIF, ICO, JPEG, PNG, WBMP, and WebP decoding in pure Rust | `libremetaverse-imaging-skia/rust-skia` | `cargo build -p libremetaverse-imaging-skia --features rust-skia` | None | +| BMP, GIF, ICO, JPEG, PNG, WBMP, and WebP decoding through native Skia | `libremetaverse-imaging-skia/skia` | `cargo build -p libremetaverse-imaging-skia --features skia` | A matching rust-skia binary cache, or the documented native source-build tools | | PCM to Ogg Vorbis encoding | `libremetaverse/vorbis` | `cargo build -p libremetaverse --features vorbis` | `vorbis_rs` 0.5.6 and its native encoder build prerequisites | Run their focused test suites with: @@ -71,6 +72,7 @@ Run their focused test suites with: cargo test -p libremetaverse-imaging --features jpeg2000 cargo test -p libremetaverse-imaging --no-default-features --features rust-j2k cargo test -p libremetaverse-imaging-skia --features skia +cargo test -p libremetaverse-imaging-skia --features rust-skia cargo test -p libremetaverse --no-default-features --features vorbis ``` diff --git a/RUSTREWRITE.md b/RUSTREWRITE.md index 2ab36e8..6b82e68 100644 --- a/RUSTREWRITE.md +++ b/RUSTREWRITE.md @@ -404,7 +404,7 @@ MSRV, features, and licenses at adoption time. | `System.Net.Http` / WinHTTP | [`reqwest` 0.13.4](https://crates.io/crates/reqwest/0.13.4) | MSRV 1.85. Use rustls/default TLS deliberately, connection pooling, streaming bodies, and injected client/timeouts. | | JSON and general data mapping | [`serde` 1.0.229](https://crates.io/crates/serde/1.0.229), [`serde_json` 1.0.151](https://crates.io/crates/serde_json/1.0.151), [`serde_bytes` 0.11.19](https://crates.io/crates/serde_bytes/0.11.19) | Use only where the C# implementation is schema-driven JSON. Hand-write LLSD encodings. | | MessagePack 3.1.8 | [`rmp-serde` 1.3.1](https://crates.io/crates/rmp-serde/1.3.1), [`rmpv` 1.3.1](https://crates.io/crates/rmpv/1.3.1) | Golden byte vectors must prove integer widths, maps, extensions, and field ordering. | -| UUID | [`uuid` 1.24.0](https://crates.io/crates/uuid/1.24.0) | Wrap it; do not expose dependency-specific endian assumptions as protocol behavior. | +| UUID | [`uuid` 1.24.0](https://crates.io/crates/uuid/1.24.0) | Wrap it; do not expose dependency-specific endian assumptions as protocol behavior. WASM selects UUID's `rng-getrandom` adapter and `getrandom`'s Web Crypto-backed `wasm_js` feature while desktop targets retain operating-system entropy. | | byte buffers | [`bytes` 1.12.1](https://crates.io/crates/bytes/1.12.1), [`bytemuck` 1.25.2](https://crates.io/crates/bytemuck/1.25.2) | Prefer explicit endian reads. `bytemuck` is only for proven POD layouts, never untrusted variable packets. | | vector/matrix math | [`glam` 0.33.3](https://crates.io/crates/glam/0.33.3) | Keep compatibility newtypes to control component order, precision, equality, and serialization. | | flags | [`bitflags` 2.13.1](https://crates.io/crates/bitflags/2.13.1) | Retain unknown bits from newer grids. | @@ -417,6 +417,7 @@ MSRV, features, and licenses at adoption time. | CoreJ2K 2.3.3.91 | system [OpenJPEG](https://www.openjpeg.org/) 2.5.4+ through the private `libremetaverse-openjpeg` adapter | Opt-in `jpeg2000` feature; checked-in minimal bindings avoid a libclang build dependency. Bounded memory streams and header validation isolate native code. Golden tests cover channel order, alpha, 16-bit precision, dimensions, discard levels, lossless/lossy modes, and malformed input. | | CoreJ2K pure-Rust extension | [`j2k`](https://crates.io/crates/j2k) 0.8.1 | Independent opt-in `rust-j2k` feature with no native library. The safe adapter provides J2K/JP2 encode/decode, native component preservation, bounded streams and allocations, reduced resolution, progressive quality layers, strict/permissive truncation, and OpenJPEG interoperability. | | SkiaSharp 4.150.1 | [`skia-safe` 0.99.0](https://crates.io/crates/skia-safe/0.99.0) | Adopted behind the opt-in `skia` feature. Target-specific official binary-cache feature sets provide BMP/GIF/ICO/JPEG/PNG/WBMP/WebP decoding on macOS, Linux, and Windows; checked owned buffers keep Skia types out of the core image API. | +| SkiaSharp pure-Rust extension | [`skia-rs-codec` 0.3.0](https://crates.io/crates/skia-rs-codec/0.3.0) and [`image-webp` 0.2.4](https://crates.io/crates/image-webp/0.2.4) | Independent opt-in `rust-skia` feature with no native codec. Default features stay disabled: pure-Rust PNG/JPEG/GIF plus built-in BMP/ICO/WBMP come from `skia-rs-codec`, and pure-Rust WebP comes from `image-webp` instead of the native `libwebp-sys` path. | | Pfim 0.11.4 | [`image` 0.25.10](https://crates.io/crates/image/0.25.10), [`ddsfile` 0.6.0](https://crates.io/crates/ddsfile/0.6.0) | `image` covers TGA and common DDS decoding; `ddsfile` exposes DDS container details. Golden files decide whether both are needed. | | OggVorbisEncoder 1.2.2 | [`vorbis_rs` 0.5.6](https://crates.io/crates/vorbis_rs/0.5.6) | BSD-3-Clause, MSRV 1.82, backed by C libraries. Feature-gate native audio encoding. | | SIPSorcery 8.0.23 | [`str0m` 0.22.0](https://crates.io/crates/str0m/0.22.0), [`cpal` 0.18.1](https://crates.io/crates/cpal/0.18.1), system libopus 1.3+ through `libremetaverse-opus` | The private safe adapter avoids the unmaintained `audiopus_sys` binding. Validate SDP, ICE, data-channel framing, audio formats, device hotplug, and native libopus deployment separately. Do not claim parity from successful compilation. | @@ -444,7 +445,7 @@ The current adopted set is: | Async and HTTP | `tokio`, `futures-channel`, `futures-util`, `reqwest` | | Wire data and parsing | `base64`, `serde`, `serde_json`, `roxmltree`, `regex`, `unicode-general-category` | | Identity, hashing, and platform facts | `uuid`, `getrandom`, `md-5`, `sha1`, `sha2`, `mac_address2`, `os_info` | -| Archives, images, and audio | `flate2`, `tar`, `bcdec_rs`, `skia-safe`, `hound`, `vorbis_rs`, `str0m`, `cpal` | +| Archives, images, and audio | `flate2`, `tar`, `bcdec_rs`, `skia-safe`, `skia-rs-codec`, `image-webp`, `hound`, `vorbis_rs`, `str0m`, `cpal` | | Code generation, program CLI, and artifact inspection | `syn`, `prettyplease`, `clap`, `goblin` | | Build and compatibility-test support | `pkg-config`, `vcpkg`, `stats_alloc` | @@ -518,10 +519,12 @@ and invalid-dimension tests match the original. ### 5.4 `libremetaverse-imaging-skia` -Implement `SkiaTextureCodec` as an optional adapter with `skia-safe`. Convert at -the boundary to/from `ManagedImage`; never expose `skia_safe` types in the core -trait. CI must cover macOS, Linux, and Windows or explicitly document unsupported -targets. Validate native binary provenance and packaging. +Implement `SkiaTextureCodec` as an optional adapter with `skia-safe`, plus an +independently selectable `RustSkiaTextureCodec` using `skia-rs-codec` and +`image-webp`. Convert at the boundary to/from `ManagedImage`; never expose +backend-specific types in the core trait. CI must cover macOS, Linux, Windows, +and the Rust-only WASM compile boundary. Validate native binary provenance and +the locked Rust dependency/license inventory. ### 5.5 `libremetaverse-prim-mesher` diff --git a/api/SEMVER-AUDIT.md b/api/SEMVER-AUDIT.md index 9ff4ccc..ce9db4d 100644 --- a/api/SEMVER-AUDIT.md +++ b/api/SEMVER-AUDIT.md @@ -24,7 +24,7 @@ The compatibility source is pinned at [`2aa70bb68513b39795da5d13c88f31b86e85a3ba | `libremetaverse-types` | 45 | 942 | 887 | none | `532cdfc175a60cb6ab109b2c43cfdda1d89cf0aadffccbcd7c9b18e1a3215bee` | | `libremetaverse-structured-data` | 16 | 295 | 304 | none | `b1c2ca9a683efe92ea22293384189f9e7c9a1926860893ab78c41829e641a8c3` | | `libremetaverse-imaging` | 3 | 20 | 70 | default, jpeg2000, rust-j2k | `19423a5aec60e38d547b809ab947e7aff6366318f97f69cde824f57ae6194c0e` | -| `libremetaverse-imaging-skia` | 1 | 3 | 13 | default, skia | `a6a1445725410a036204496ad4953c84dcfea1e6a00390ce4e10d12d36f2876b` | +| `libremetaverse-imaging-skia` | 1 | 3 | 17 | default, rust-skia, skia | `855a181b77413a1e5f0094b1581971fd5e0a4d93fadb5f83d54f82a7ba8ee71f` | | `libremetaverse-prim-mesher` | 17 | 207 | 117 | none | `dde798e86c485948f1d67e093f8194a76082101416516df3f8dca4de04c2d415` | | `libremetaverse-rendering-simple` | 1 | 6 | 12 | none | `4dc284ea0abb16de63494435758c8b7c5eeb57a80d2e32a141e488e5861f2fad` | | `libremetaverse-rendering-mesh-foundry` | 1 | 14 | 25 | none | `3689f6b454061fdae699d5fb66a11482909fa25bda398e26c38327995a9e2896` | @@ -46,7 +46,7 @@ The exact mapping, exported-marker, feature, and normalized Rust declaration has - .NET events become `subscribe_*` calls returning an owned `Subscription`; callbacks are `Send + Sync` and dispatch outside internal locks. - `IDisposable` becomes explicit idempotent shutdown plus `Drop`; cancellation remains a typed `Error::Cancelled`. - Closed C# enums retain fixed discriminants and are SemVer-breaking to extend; flags retain unknown bits, while public Rust error enums are `non_exhaustive`. -- Optional native backends remain feature-gated (`jpeg2000`, `skia`, `vorbis`, `real-audio`); default and empty-default sets are part of the baseline. +- Optional native and pure-Rust backends remain feature-gated (`jpeg2000`, `rust-j2k`, `skia`, `rust-skia`, `vorbis`, `real-audio`); default and empty-default sets are part of the baseline. - Capability HTTP injection uses project-owned `HttpMessageHandler`, `CapsHttpLimits`, and `with_native_transport`; the internal `reqwest` client is not part of the public surface. - External C# signature types map to core/std, adopted cross-platform crates, or project-owned boundary types; no third-party crate path leaks through mapped signatures or public Rust declarations. diff --git a/api/SEMVER-BASELINE.json b/api/SEMVER-BASELINE.json index 99dfdfd..8993de3 100644 --- a/api/SEMVER-BASELINE.json +++ b/api/SEMVER-BASELINE.json @@ -20,7 +20,7 @@ "type_mapping_sha256": "21025889c62b0f8666a2dda46a03ff4f28931f51156927822a1c04e97b49f221", "member_mapping_sha256": "cd99420643c665ea393dd59418c33fb00f97f7030e71540c00b2b27470abb1d4", "exported_mapping_sha256": "5b8a502ce229d26732744f2b44c029fc4a86b403966dc2f9b4a1c913a7b242b9", - "rust_declaration_sha256": "687d3d29bb0e79651881ffdda962be21df8716a4d96417175611541d0fe27a8e", + "rust_declaration_sha256": "b2ba1ccf9293ac94164e593546891a2a122b1e5997ee4ecc2de86ef5eb0d866e", "crates": [ { "name": "libremetaverse", @@ -87,14 +87,21 @@ "version": "0.0.1", "features": { "default": [], + "rust-skia": [ + "dep:image-webp", + "dep:skia-rs-codec", + "skia-rs-codec/gif", + "skia-rs-codec/jpeg", + "skia-rs-codec/png" + ], "skia": [ "dep:skia-safe" ] }, "mapped_types": 1, "mapped_members": 3, - "public_declarations": 13, - "declaration_sha256": "a6a1445725410a036204496ad4953c84dcfea1e6a00390ce4e10d12d36f2876b" + "public_declarations": 17, + "declaration_sha256": "855a181b77413a1e5f0094b1581971fd5e0a4d93fadb5f83d54f82a7ba8ee71f" }, { "name": "libremetaverse-prim-mesher", diff --git a/ci/ci-coverage.json b/ci/ci-coverage.json index dc06193..67b32f3 100644 --- a/ci/ci-coverage.json +++ b/ci/ci-coverage.json @@ -13,6 +13,7 @@ "minimal-features", "jpeg2000", "rust-j2k", + "rust-skia", "skia-binary", "program-offline-smoke", "clippy", @@ -104,8 +105,8 @@ "workflow": "skia.yml", "responsibility": "Default and Skia feature tests plus package listing", "destination": "required", - "checks": ["skia-binary", "workspace-tests"], - "rationale": "The required gate proves the exact ARM64 GNU archive is installed and forbids source compilation." + "checks": ["rust-skia", "skia-binary", "workspace-tests"], + "rationale": "A dedicated dependency-free job tests the Rust-only codec graph, while the required gate proves the exact ARM64 GNU archive is installed and forbids source compilation." }, { "workflow": "supply-chain.yml", diff --git a/ci/dependency-policy.json b/ci/dependency-policy.json index f859878..4363ba1 100644 --- a/ci/dependency-policy.json +++ b/ci/dependency-policy.json @@ -2,7 +2,7 @@ "schema": 1, "msrv": "1.96.0", "current": "stable", - "reviewed_on": "2026-08-12", + "reviewed_on": "2026-08-13", "review_by": "2026-11-11", "direct": [ { "name": "base64", "versions": ["0.22.1"], "purpose": "LLSD, login, asset, and protocol base64 encoding", "maintenance": "active", "transitive_cost": "low", "native": false, "rewrite_anchor": "`base64`" }, @@ -15,6 +15,7 @@ { "name": "getrandom", "versions": ["0.4.3"], "purpose": "Operating-system entropy for protocol identifiers", "maintenance": "active", "transitive_cost": "low", "native": false, "rewrite_anchor": "`getrandom`" }, { "name": "goblin", "versions": ["0.10.5"], "purpose": "Cross-platform ELF, PE, and Mach-O release artifact inspection", "maintenance": "active", "transitive_cost": "low", "native": false, "rewrite_anchor": "`goblin`" }, { "name": "hound", "versions": ["3.5.1"], "purpose": "Bounded PCM WAV parsing for WebRTC playback", "maintenance": "stable", "transitive_cost": "low", "native": false, "rewrite_anchor": "`hound`" }, + { "name": "image-webp", "versions": ["0.2.4"], "purpose": "Opt-in pure-Rust bounded WebP image decoding", "maintenance": "active", "transitive_cost": "low", "native": false, "rewrite_anchor": "`image-webp`" }, { "name": "j2k", "versions": ["0.8.1"], "purpose": "Opt-in pure-Rust bounded JPEG 2000 and JP2 encoding and decoding", "maintenance": "active", "transitive_cost": "medium", "native": false, "rewrite_anchor": "`j2k`" }, { "name": "mac_address2", "versions": ["2.0.2"], "purpose": "Cross-platform machine identity compatibility input", "maintenance": "active", "transitive_cost": "low", "native": false, "rewrite_anchor": "`mac_address2`" }, { "name": "md-5", "versions": ["0.10.6"], "purpose": "Legacy protocol checksum compatibility", "maintenance": "active", "transitive_cost": "low", "native": false, "rewrite_anchor": "`md-5`" }, @@ -29,6 +30,7 @@ { "name": "sha1", "versions": ["0.10.7"], "purpose": "Legacy protocol hash compatibility", "maintenance": "active", "transitive_cost": "low", "native": false, "rewrite_anchor": "`sha1`" }, { "name": "sha2", "versions": ["0.11.0"], "purpose": "Manifest integrity and protocol hashing", "maintenance": "active", "transitive_cost": "low", "native": false, "rewrite_anchor": "`sha2`" }, { "name": "skia-safe", "versions": ["0.99.0"], "purpose": "Opt-in cross-platform Skia image decoding", "maintenance": "monitored-native", "transitive_cost": "high", "native": true, "rewrite_anchor": "`skia-safe`" }, + { "name": "skia-rs-codec", "versions": ["0.3.0"], "purpose": "Opt-in pure-Rust BMP, GIF, ICO, JPEG, PNG, and WBMP image decoding", "maintenance": "active", "transitive_cost": "high", "native": false, "rewrite_anchor": "`skia-rs-codec`" }, { "name": "stats_alloc", "versions": ["0.1.10"], "purpose": "Allocation-budget compatibility tests, concurrency leak audits, and reproducible performance evidence", "maintenance": "stable", "transitive_cost": "low", "native": false, "rewrite_anchor": "`stats_alloc`" }, { "name": "str0m", "versions": ["0.22.0"], "purpose": "Native Rust ICE, DTLS, SRTP, RTP, and SCTP WebRTC transport", "maintenance": "active", "transitive_cost": "high", "native": false, "rewrite_anchor": "`str0m`" }, { "name": "syn", "versions": ["2.0.119"], "purpose": "Syntax validation for generated Rust sources", "maintenance": "active", "transitive_cost": "medium", "native": false, "rewrite_anchor": "`syn`" }, @@ -40,6 +42,8 @@ { "name": "vorbis_rs", "versions": ["0.5.6"], "purpose": "Opt-in Ogg Vorbis asset encoding", "maintenance": "monitored-native", "transitive_cost": "medium", "native": true, "rewrite_anchor": "`vorbis_rs`" } ], "approved_duplicates": [ + { "name": "bit-vec", "versions": ["0.8.0", "0.9.1"], "reason": "The pinned skia-rs shader parser and current WebRTC certificate stack require adjacent bit-vector API lines." }, + { "name": "bitflags", "versions": ["1.3.2", "2.13.1"], "reason": "The pinned pure-Rust PNG codec remains on bitflags 1 while the rest of the workspace uses bitflags 2." }, { "name": "block-buffer", "versions": ["0.10.4", "0.12.1"], "reason": "RustCrypto digest 0.10 and 0.11 consumers have not unified their block-buffer major version." }, { "name": "cfg_aliases", "versions": ["0.1.1", "0.2.2"], "reason": "The target-specific native stacks use different nix-generation build helpers." }, { "name": "chacha20", "versions": ["0.9.1", "0.10.1"], "reason": "The WebRTC crypto and current random-number stacks require different RustCrypto generations." }, @@ -48,12 +52,14 @@ { "name": "crypto-common", "versions": ["0.1.7", "0.2.2"], "reason": "Legacy protocol hashes and current SHA-2 intentionally span RustCrypto digest generations." }, { "name": "digest", "versions": ["0.10.7", "0.11.3"], "reason": "MD5, SHA-1, and WebRTC use digest 0.10 while manifest SHA-2 uses the audited 0.11 API." }, { "name": "getrandom", "versions": ["0.2.17", "0.3.4", "0.4.3"], "reason": "WebRTC crypto, transitive rand, and direct UUID entropy consumers span three compatible APIs." }, + { "name": "hashbrown", "versions": ["0.16.1", "0.17.1"], "reason": "The pinned skia-rs geometry and shader dependencies have not unified their hash table minor line." }, { "name": "jni-sys", "versions": ["0.3.1", "0.4.1"], "reason": "CPAL Android NDK support and rustls Android certificate verification require different JNI bindings." }, { "name": "nix", "versions": ["0.28.0", "0.31.3"], "reason": "Machine-address and operating-system reporting crates have not unified their Unix API generation." }, { "name": "nom", "versions": ["7.1.3", "8.0.0"], "reason": "Skia bindgen tooling remains on nom 7 while the native WebRTC stack uses nom 8." }, { "name": "r-efi", "versions": ["5.3.0", "6.0.0"], "reason": "The three resolved getrandom generations require two WASI EFI interface generations." }, { "name": "rand", "versions": ["0.9.5", "0.10.2"], "reason": "WebRTC protocol crates use rand 0.9 while target-specific dependencies have adopted rand 0.10." }, { "name": "rand_core", "versions": ["0.6.4", "0.9.5", "0.10.1"], "reason": "DTLS elliptic curves and the two resolved rand generations require distinct rand_core APIs." }, + { "name": "rustc-hash", "versions": ["1.1.0", "2.1.3"], "reason": "The pinned skia-rs shader parser remains on rustc-hash 1 while existing workspace parsers use version 2." }, { "name": "sha2", "versions": ["0.10.9", "0.11.0"], "reason": "WebRTC crypto still requires SHA-2 0.10 while MetaCrate integrity code directly uses 0.11." }, { "name": "shlex", "versions": ["1.3.0", "2.0.1"], "reason": "Skia bindgen and current native C compilation helpers use different shell-token parsers." }, { "name": "syn", "versions": ["2.0.119", "3.0.3"], "reason": "MetaCrate code generation uses syn 2 while current derive macro dependencies use syn 3." }, diff --git a/ci/release-matrix.json b/ci/release-matrix.json index 08a4a67..c7898a1 100644 --- a/ci/release-matrix.json +++ b/ci/release-matrix.json @@ -42,12 +42,12 @@ "execution": "native", "toolchain": "1.96.0", "target": "x86_64-unknown-linux-gnu", - "feature_sets": ["no-default-features", "rust-j2k"], + "feature_sets": ["no-default-features", "rust-j2k", "rust-skia"], "prerequisites": ["libopus-1.3"], "commands": [ { "label": "Compile the portable public crates on the declared MSRV", - "args": ["check", "--locked", "-j", "1", "--all-targets", "--no-default-features", "--features", "libremetaverse-imaging/rust-j2k", "-p", "libremetaverse-types", "-p", "libremetaverse-structured-data", "-p", "libremetaverse-imaging", "-p", "libremetaverse-imaging-skia", "-p", "libremetaverse-prim-mesher", "-p", "libremetaverse-lsl-tools", "-p", "libremetaverse-rlv", "-p", "metacrate-ci-matrix"] + "args": ["check", "--locked", "-j", "1", "--all-targets", "--no-default-features", "--features", "libremetaverse-imaging/rust-j2k,libremetaverse-imaging-skia/rust-skia", "-p", "libremetaverse-types", "-p", "libremetaverse-structured-data", "-p", "libremetaverse-imaging", "-p", "libremetaverse-imaging-skia", "-p", "libremetaverse-prim-mesher", "-p", "libremetaverse-lsl-tools", "-p", "libremetaverse-rlv", "-p", "metacrate-ci-matrix"] }, { "label": "Compile the safe native Opus boundary and WebRTC voice on the declared MSRV", @@ -106,7 +106,7 @@ "execution": "native", "toolchain": "stable", "target": "x86_64-unknown-linux-gnu", - "feature_sets": ["all-features", "dds-bc67", "jpeg2000", "rust-j2k", "skia", "vorbis", "real-audio", "tests"], + "feature_sets": ["all-features", "dds-bc67", "jpeg2000", "rust-j2k", "rust-skia", "skia", "vorbis", "real-audio", "tests"], "prerequisites": ["openjpeg-2.5.4", "skia-safe-0.99.0", "libopus-1.3", "alsa-1.2", "vorbis-rs-0.5.6"], "commands": [ { @@ -125,10 +125,18 @@ "label": "Test OpenJPEG and pure-Rust JPEG 2000 interoperability", "args": ["test", "-p", "libremetaverse-imaging", "--no-default-features", "--features", "jpeg2000,rust-j2k", "--locked", "-j", "1"] }, + { + "label": "Test the pure-Rust Skia-compatible feature independently", + "args": ["test", "-p", "libremetaverse-imaging-skia", "--no-default-features", "--features", "rust-skia", "--locked", "-j", "1"] + }, { "label": "Test the Skia feature independently", "args": ["test", "-p", "libremetaverse-imaging-skia", "--no-default-features", "--features", "skia", "--locked", "-j", "1"] }, + { + "label": "Test native Skia and pure-Rust codec interoperability", + "args": ["test", "-p", "libremetaverse-imaging-skia", "--no-default-features", "--features", "skia,rust-skia", "--locked", "-j", "1"] + }, { "label": "Test the Vorbis feature independently", "args": ["test", "-p", "libremetaverse", "--no-default-features", "--features", "vorbis", "--lib", "--locked", "-j", "1", "--", "asset_pipeline_semantics"] @@ -170,12 +178,12 @@ "execution": "cross", "toolchain": "stable", "target": "x86_64-pc-windows-gnu", - "feature_sets": ["no-default-features", "dds-bc67", "rust-j2k"], + "feature_sets": ["no-default-features", "dds-bc67", "rust-j2k", "rust-skia"], "prerequisites": [], "commands": [ { "label": "Cross-check portable crates for Windows GNU", - "args": ["check", "--locked", "-j", "1", "--target", "x86_64-pc-windows-gnu", "--all-targets", "--no-default-features", "--features", "libremetaverse-imaging/rust-j2k", "-p", "libremetaverse-types", "-p", "libremetaverse-structured-data", "-p", "libremetaverse-imaging", "-p", "libremetaverse-imaging-skia", "-p", "libremetaverse-prim-mesher", "-p", "libremetaverse-lsl-tools", "-p", "libremetaverse-rlv", "-p", "metacrate-ci-matrix"] + "args": ["check", "--locked", "-j", "1", "--target", "x86_64-pc-windows-gnu", "--all-targets", "--no-default-features", "--features", "libremetaverse-imaging/rust-j2k,libremetaverse-imaging-skia/rust-skia", "-p", "libremetaverse-types", "-p", "libremetaverse-structured-data", "-p", "libremetaverse-imaging", "-p", "libremetaverse-imaging-skia", "-p", "libremetaverse-prim-mesher", "-p", "libremetaverse-lsl-tools", "-p", "libremetaverse-rlv", "-p", "metacrate-ci-matrix"] } ] }, @@ -186,12 +194,12 @@ "execution": "cross", "toolchain": "stable", "target": "x86_64-apple-darwin", - "feature_sets": ["no-default-features", "dds-bc67", "rust-j2k"], + "feature_sets": ["no-default-features", "dds-bc67", "rust-j2k", "rust-skia"], "prerequisites": [], "commands": [ { "label": "Cross-check portable crates for macOS", - "args": ["check", "--locked", "-j", "1", "--target", "x86_64-apple-darwin", "--all-targets", "--no-default-features", "--features", "libremetaverse-imaging/rust-j2k", "-p", "libremetaverse-types", "-p", "libremetaverse-structured-data", "-p", "libremetaverse-imaging", "-p", "libremetaverse-imaging-skia", "-p", "libremetaverse-prim-mesher", "-p", "libremetaverse-lsl-tools", "-p", "libremetaverse-rlv", "-p", "metacrate-ci-matrix"] + "args": ["check", "--locked", "-j", "1", "--target", "x86_64-apple-darwin", "--all-targets", "--no-default-features", "--features", "libremetaverse-imaging/rust-j2k,libremetaverse-imaging-skia/rust-skia", "-p", "libremetaverse-types", "-p", "libremetaverse-structured-data", "-p", "libremetaverse-imaging", "-p", "libremetaverse-imaging-skia", "-p", "libremetaverse-prim-mesher", "-p", "libremetaverse-lsl-tools", "-p", "libremetaverse-rlv", "-p", "metacrate-ci-matrix"] } ] } diff --git a/crates/libremetaverse-imaging-skia/Cargo.toml b/crates/libremetaverse-imaging-skia/Cargo.toml index 972c400..524fa98 100644 --- a/crates/libremetaverse-imaging-skia/Cargo.toml +++ b/crates/libremetaverse-imaging-skia/Cargo.toml @@ -10,10 +10,13 @@ description = "Optional Skia image decoder for the MetaCrate LibreMetaverse rewr [features] default = [] skia = ["dep:skia-safe"] +rust-skia = ["dep:image-webp", "dep:skia-rs-codec", "skia-rs-codec/gif", "skia-rs-codec/jpeg", "skia-rs-codec/png"] [dependencies] libremetaverse-imaging = { version = "0.0.1", path = "../libremetaverse-imaging" } libremetaverse-types = { version = "0.0.1", path = "../libremetaverse-types" } +image-webp = { version = "=0.2.4", optional = true } +skia-rs-codec = { version = "=0.3.0", default-features = false, optional = true } # rust-skia publishes WebP-capable binary caches with Vulkan on Linux/Windows # and without Vulkan on macOS. Matching those sets avoids an hours-long Skia diff --git a/crates/libremetaverse-imaging-skia/README.md b/crates/libremetaverse-imaging-skia/README.md index 368d6b9..e478049 100644 --- a/crates/libremetaverse-imaging-skia/README.md +++ b/crates/libremetaverse-imaging-skia/README.md @@ -6,10 +6,43 @@ exposes a `skia-safe` type and never discovers or links Skia. ## Features and formats -The default feature set has no Skia dependency. `SkiaTextureCodec::decode` -returns a typed `InvalidOperation` error in that configuration, while conversion -from the checked project-owned `backend::SKBitmap` remains available for tests -and callers that already own decoded pixels. +The default feature set has no Skia dependency. `SkiaTextureCodec::decode` and +`RustSkiaTextureCodec::decode` return a typed `InvalidOperation` error when +their respective feature is disabled, while conversion from the checked +project-owned `backend::SKBitmap` remains available for tests and callers that +already own decoded pixels. + +For a fully Rust implementation, enable: + +```sh +cargo test -p libremetaverse-imaging-skia --no-default-features --features rust-skia +``` + +`rust-skia` pins [`skia-rs-codec` 0.3.0](https://github.com/rust-skia/skia-rs) +with default features disabled and only +its pure-Rust PNG, JPEG, and GIF codecs selected. Its `webp` feature is +deliberately disabled because that feature selects `libwebp-sys`; WebP is +instead decoded by the separately pinned, safe-Rust +[`image-webp` 0.2.4](https://github.com/image-rs/image-webp) crate. +BMP, ICO, and WBMP are built into `skia-rs-codec`. The resulting normal/build +graph has no codec `-sys` crate, C/C++ compilation, CMake, system-library +lookup, or binary download. + +The locked transitive codec lines are `png` 0.17.16, `jpeg-decoder` 0.3.2, +`jpeg-encoder` 0.6.1 (the upstream JPEG feature couples decode and encode), and +`gif` 0.13.3. `skia-rs-codec` also brings its ordinary Rust core, paint, and +path crates; their build helpers only select Rust cfgs and compile no native +code. A source audit of the locked `skia-rs-*` crates found no unsafe blocks, +and `image-webp` declares `forbid(unsafe_code)`. MetaCrate itself continues to +compile with workspace `unsafe_code = "forbid"`. + +`RustSkiaTextureCodec` implements the same `ITextureCodec` abstraction and +decodes BMP, GIF, ICO, baseline/progressive JPEG, interlaced PNG, WBMP, and +lossless/lossy/animated WebP. GIF and WebP return frame one composited on the +logical canvas; ICO chooses its largest valid entry. Both Skia features may be +enabled together, and each codec remains independently constructible. +The graph builds on the workspace Rust 1.96 MSRV; both selected direct codecs +declare older compatible Rust floors. Enable native decoding with: @@ -17,7 +50,7 @@ Enable native decoding with: cargo test -p libremetaverse-imaging-skia --features skia ``` -The `skia` feature decodes the CPU codec formats supported by the pinned +The native `skia` feature decodes the CPU codec formats supported by the pinned rust-skia release: BMP, GIF, ICO, JPEG, PNG, WBMP, and WebP. Input is buffered to at most 64 MiB. Dimensions are rejected before native pixel allocation when they exceed the core 16,777,216-pixel limit, and decoded storage uses checked @@ -31,6 +64,25 @@ alpha at this boundary. RGB565, BGRA8888, RGBA8888, RGBA/BGRA1010102, Gray8, Alpha8, row padding, and the reference byte-width fallback retain the pinned C# channel and rounding rules. +Both paths accept any `ReadWrite + Send` stream and stop buffering after 64 +MiB plus one sentinel byte. The pure-Rust path probes encoded dimensions before +codec pixel allocation and enforces the shared 16,777,216-pixel ceiling; WebP +also receives an explicit decoder memory limit. Checked dimensions, strides, +buffer sizes, and fallible project-owned allocations turn malformed, +truncated, oversized, and allocation failures into typed errors. Decoded rows +have a top-left origin and premultiplied native samples are normalized to +straight alpha at the shared `ManagedImage` boundary. + +The pure-Rust graph has identical code on Linux, Windows, macOS, and WASM and +does not call platform APIs. Checked static fixtures cover top-down/bottom-up +BMP, palette/offset GIF, largest-entry ICO, baseline/progressive JPEG, +interlaced palette PNG, multibyte WBMP, lossless-alpha/lossy WebP, malformed and +oversized inputs, and concurrent decode/drop. Gitea runs the `rust-skia` suite +in a dedicated `ubuntu-latest` job that installs no native codec prerequisites. +`image-webp` 0.2's animated-canvas blend fast path rounds fully opaque nonzero +samples one low; the bounded adapter corrects that single upstream edge so the +checked first-frame planes remain byte-identical to native Skia. + ## Binary cache and source builds `skia-safe` 0.99.0 downloads an official prebuilt Skia archive when the target @@ -66,3 +118,8 @@ explicitly. is BSD-3-Clause licensed. Official binary-cache archives contain compiled Skia. Products that redistribute the resulting native artifacts must preserve the applicable MIT and BSD notices and audit the exact archive they ship. + +`skia-rs-codec` is MIT OR Apache-2.0 and `image-webp` is MIT OR Apache-2.0. +They are ordinary Rust source dependencies recorded in `Cargo.lock`; generated +dependency notices and the distribution manifest bind their crates.io checksums +and license texts for source and binary redistribution. diff --git a/crates/libremetaverse-imaging-skia/src/lib.rs b/crates/libremetaverse-imaging-skia/src/lib.rs index 901069b..3cff104 100644 --- a/crates/libremetaverse-imaging-skia/src/lib.rs +++ b/crates/libremetaverse-imaging-skia/src/lib.rs @@ -1,7 +1,7 @@ //! Optional Skia imaging adapter corresponding to `LibreMetaverse.Imaging.Skia`. //! -//! Enable `skia` for bounded `BMP`, `GIF`, `ICO`, `JPEG`, `PNG`, `WBMP`, and -//! `WebP` decoding. +//! Enable `skia` or the fully native-Rust `rust-skia` alternative for bounded +//! `BMP`, `GIF`, `ICO`, `JPEG`, `PNG`, `WBMP`, and `WebP` decoding. //! The default build remains inert. See the crate README for native cache, //! source-build, licensing, and cross-platform prerequisite details. @@ -15,6 +15,7 @@ mod skia_codec; pub use generated::*; pub use libremetaverse_imaging as imaging; pub use libremetaverse_types::Error; +pub use skia_codec::RustSkiaTextureCodec; impl libremetaverse_imaging::ITextureCodec for SkiaTextureCodec { fn decode( @@ -24,3 +25,12 @@ impl libremetaverse_imaging::ITextureCodec for SkiaTextureCodec { Self::decode(self, stream) } } + +impl libremetaverse_imaging::ITextureCodec for RustSkiaTextureCodec { + fn decode( + &self, + stream: Box, + ) -> Result { + Self::decode(self, stream) + } +} diff --git a/crates/libremetaverse-imaging-skia/src/skia_codec.rs b/crates/libremetaverse-imaging-skia/src/skia_codec.rs index f7c9d01..7f06aca 100644 --- a/crates/libremetaverse-imaging-skia/src/skia_codec.rs +++ b/crates/libremetaverse-imaging-skia/src/skia_codec.rs @@ -2,17 +2,24 @@ use crate::Error; use crate::backend::{SKAlphaType, SKBitmap, SKColorType}; -#[cfg(feature = "skia")] +#[cfg(any(feature = "rust-skia", feature = "skia"))] use libremetaverse_imaging::{DEFAULT_MAX_ENCODED_BYTES, DEFAULT_MAX_PIXELS}; use libremetaverse_imaging::{ManagedImage, ManagedImageImageChannels}; use libremetaverse_types::compat::ReadWrite; -#[cfg(feature = "skia")] +#[cfg(any(feature = "rust-skia", feature = "skia"))] use std::io::Read; /// Optional Skia-backed decoder and format-neutral bitmap converter. #[derive(Clone, Copy, Debug, Default)] pub struct SkiaTextureCodec; +/// Pure-Rust alternative to [`SkiaTextureCodec`] with the same image boundary. +/// +/// Enable the `rust-skia` feature to decode the common Skia codec formats +/// without a native library, build script, system package lookup, or download. +#[derive(Clone, Copy, Debug, Default)] +pub struct RustSkiaTextureCodec; + impl SkiaTextureCodec { /// Creates the stateless codec adapter. /// @@ -33,17 +40,7 @@ impl SkiaTextureCodec { pub fn decode(&self, mut stream: Box) -> Result { #[cfg(feature = "skia")] { - let mut encoded = Vec::new(); - Read::by_ref(&mut stream) - .take((DEFAULT_MAX_ENCODED_BYTES + 1) as u64) - .read_to_end(&mut encoded) - .map_err(|_| Error::InvalidOperation)?; - if encoded.is_empty() { - return Err(Error::InvalidOperation); - } - if encoded.len() > DEFAULT_MAX_ENCODED_BYTES { - return Err(Error::Argument); - } + let encoded = read_bounded(&mut stream)?; decode_with_skia(&encoded) } #[cfg(not(feature = "skia"))] @@ -65,6 +62,55 @@ impl SkiaTextureCodec { } } +impl RustSkiaTextureCodec { + /// Creates the stateless pure-Rust codec adapter. + /// + /// # Errors + /// + /// This fixed compatibility constructor cannot fail. + pub const fn new() -> Result { + Ok(Self) + } + + /// Decodes a bounded stream with Rust-only BMP, GIF, ICO, JPEG, PNG, + /// WBMP, and WebP codecs. + /// + /// # Errors + /// + /// With `rust-skia`, returns [`Error::Argument`] for an input or decoded + /// canvas above the documented limits and [`Error::InvalidOperation`] for + /// malformed or unsupported images. Without the feature it returns + /// [`Error::InvalidOperation`]. + pub fn decode(&self, mut stream: Box) -> Result { + #[cfg(feature = "rust-skia")] + { + let encoded = read_bounded(&mut stream)?; + decode_with_rust_skia(&encoded) + } + #[cfg(not(feature = "rust-skia"))] + { + let _ = &mut stream; + Err(Error::InvalidOperation) + } + } +} + +#[cfg(any(feature = "rust-skia", feature = "skia"))] +fn read_bounded(stream: &mut (dyn ReadWrite + Send)) -> Result, Error> { + let mut encoded = Vec::new(); + stream + .take((DEFAULT_MAX_ENCODED_BYTES + 1) as u64) + .read_to_end(&mut encoded) + .map_err(|_| Error::InvalidOperation)?; + if encoded.is_empty() { + return Err(Error::InvalidOperation); + } + if encoded.len() > DEFAULT_MAX_ENCODED_BYTES { + return Err(Error::Argument); + } + Ok(encoded) +} + // Keeping the format branches together makes comparison with the pinned C# // color switch auditable and prevents subtly different indexing paths. #[allow(clippy::too_many_lines)] @@ -238,6 +284,404 @@ fn normalize_10bit_alpha( (normalize(red), normalize(green), normalize(blue)) } +#[cfg(feature = "rust-skia")] +fn decode_with_rust_skia(encoded: &[u8]) -> Result { + use skia_rs_codec::{ImageDecoder, ImageFormat}; + + let format = if wbmp_dimensions(encoded).is_ok() { + ImageFormat::Wbmp + } else { + ImageFormat::from_magic(encoded) + }; + if format == ImageFormat::WebP { + return decode_webp_with_rust(encoded); + } + if !matches!( + format, + ImageFormat::Bmp + | ImageFormat::Gif + | ImageFormat::Ico + | ImageFormat::Jpeg + | ImageFormat::Png + | ImageFormat::Wbmp + ) { + return Err(Error::InvalidOperation); + } + + let (width, height) = match format { + ImageFormat::Gif => gif_dimensions(encoded)?, + ImageFormat::Ico => ico_dimensions(encoded)?, + ImageFormat::Wbmp => wbmp_dimensions(encoded)?, + _ => skia_rs_codec::get_image_dimensions(encoded).map_err(|_| Error::InvalidOperation)?, + }; + validate_dimensions(width, height)?; + + let decoded = if format == ImageFormat::Wbmp { + skia_rs_codec::WbmpDecoder::new().decode_bytes(encoded) + } else { + skia_rs_codec::decode_image(encoded) + } + .map_err(|_| Error::InvalidOperation)?; + validate_dimensions(decoded.width(), decoded.height())?; + if decoded.width() != width || decoded.height() != height { + return Err(Error::InvalidOperation); + } + let width_usize = usize::try_from(width).map_err(|_| Error::Argument)?; + if decoded.row_bytes() != width_usize.checked_mul(4).ok_or(Error::Argument)? { + return Err(Error::InvalidOperation); + } + let source_pixels = decoded.peek_pixels().ok_or(Error::InvalidOperation)?; + let grayscale = match format { + ImageFormat::Jpeg => jpeg_is_grayscale(encoded)?, + ImageFormat::Png => encoded.get(25) == Some(&0), + ImageFormat::Wbmp => true, + _ => false, + }; + let (row_bytes, color_type, alpha_type, pixels) = if grayscale { + let pixel_count = width_usize + .checked_mul(usize::try_from(height).map_err(|_| Error::Argument)?) + .ok_or(Error::Argument)?; + let mut gray = Vec::new(); + gray.try_reserve_exact(pixel_count) + .map_err(|_| Error::InvalidOperation)?; + gray.extend(source_pixels.chunks_exact(4).map(|rgba| rgba[0])); + if gray.len() != pixel_count { + return Err(Error::InvalidOperation); + } + (width_usize, SKColorType::Gray8, SKAlphaType::Opaque, gray) + } else { + let mut rgba = Vec::new(); + rgba.try_reserve_exact(source_pixels.len()) + .map_err(|_| Error::InvalidOperation)?; + rgba.extend_from_slice(source_pixels); + ( + decoded.row_bytes(), + SKColorType::Rgba8888, + if decoded.is_opaque() { + SKAlphaType::Opaque + } else { + SKAlphaType::Unpremul + }, + rgba, + ) + }; + let bitmap = SKBitmap::new(width, height, row_bytes, color_type, alpha_type, pixels)?; + bitmap_to_managed(&bitmap) +} + +#[cfg(feature = "rust-skia")] +fn jpeg_is_grayscale(encoded: &[u8]) -> Result { + let mut offset = 2; + while offset + 1 < encoded.len() { + if encoded[offset] != 0xff { + offset += 1; + continue; + } + let mut marker_offset = offset + 1; + while encoded.get(marker_offset) == Some(&0xff) { + marker_offset += 1; + } + let marker = *encoded.get(marker_offset).ok_or(Error::InvalidOperation)?; + if marker == 0 || marker == 1 || (0xd0..=0xd9).contains(&marker) { + offset = marker_offset + 1; + continue; + } + let length_bytes = encoded + .get(marker_offset + 1..marker_offset + 3) + .ok_or(Error::InvalidOperation)?; + let length = usize::from(u16::from_be_bytes( + length_bytes + .try_into() + .map_err(|_| Error::InvalidOperation)?, + )); + if matches!( + marker, + 0xc0..=0xc3 | 0xc5..=0xc7 | 0xc9..=0xcb | 0xcd..=0xcf + ) { + let components = *encoded + .get(marker_offset + 8) + .ok_or(Error::InvalidOperation)?; + return match components { + 1 => Ok(true), + 3 => Ok(false), + _ => Err(Error::InvalidOperation), + }; + } + if length < 2 { + return Err(Error::InvalidOperation); + } + offset = marker_offset + .checked_add(1) + .and_then(|offset| offset.checked_add(length)) + .ok_or(Error::InvalidOperation)?; + } + Err(Error::InvalidOperation) +} + +#[cfg(feature = "rust-skia")] +fn gif_dimensions(encoded: &[u8]) -> Result<(i32, i32), Error> { + if encoded.len() < 13 || !(encoded.starts_with(b"GIF87a") || encoded.starts_with(b"GIF89a")) { + return Err(Error::InvalidOperation); + } + let canvas = ( + i32::from(u16::from_le_bytes([encoded[6], encoded[7]])), + i32::from(u16::from_le_bytes([encoded[8], encoded[9]])), + ); + validate_dimensions(canvas.0, canvas.1)?; + + let global_table_bytes = if encoded[10] & 0x80 == 0 { + 0 + } else { + 3_usize + .checked_mul(1_usize << (usize::from(encoded[10] & 0x07) + 1)) + .ok_or(Error::InvalidOperation)? + }; + let mut offset = 13_usize + .checked_add(global_table_bytes) + .filter(|offset| *offset <= encoded.len()) + .ok_or(Error::InvalidOperation)?; + loop { + let marker = *encoded.get(offset).ok_or(Error::InvalidOperation)?; + offset += 1; + match marker { + 0x2c => { + let end = offset.checked_add(9).ok_or(Error::InvalidOperation)?; + let descriptor = encoded.get(offset..end).ok_or(Error::InvalidOperation)?; + let frame_width = i32::from(u16::from_le_bytes([descriptor[4], descriptor[5]])); + let frame_height = i32::from(u16::from_le_bytes([descriptor[6], descriptor[7]])); + validate_dimensions(frame_width, frame_height)?; + return Ok(canvas); + } + 0x21 => { + offset = offset.checked_add(1).ok_or(Error::InvalidOperation)?; + loop { + let length = *encoded.get(offset).ok_or(Error::InvalidOperation)?; + offset += 1; + if length == 0 { + break; + } + offset = offset + .checked_add(usize::from(length)) + .filter(|offset| *offset <= encoded.len()) + .ok_or(Error::InvalidOperation)?; + } + } + _ => return Err(Error::InvalidOperation), + } + } +} + +#[cfg(feature = "rust-skia")] +fn wbmp_dimensions(encoded: &[u8]) -> Result<(i32, i32), Error> { + if encoded.get(..2) != Some(&[0, 0]) { + return Err(Error::InvalidOperation); + } + let mut offset = 2; + let width = + i32::try_from(read_wbmp_integer(encoded, &mut offset)?).map_err(|_| Error::Argument)?; + let height = + i32::try_from(read_wbmp_integer(encoded, &mut offset)?).map_err(|_| Error::Argument)?; + validate_dimensions(width, height)?; + Ok((width, height)) +} + +#[cfg(feature = "rust-skia")] +fn read_wbmp_integer(encoded: &[u8], offset: &mut usize) -> Result { + let mut value = 0_u32; + for _ in 0..5 { + let byte = *encoded.get(*offset).ok_or(Error::InvalidOperation)?; + *offset += 1; + value = value + .checked_shl(7) + .and_then(|value| value.checked_add(u32::from(byte & 0x7f))) + .ok_or(Error::InvalidOperation)?; + if byte & 0x80 == 0 { + return Ok(value); + } + } + Err(Error::InvalidOperation) +} + +#[cfg(feature = "rust-skia")] +fn ico_dimensions(encoded: &[u8]) -> Result<(i32, i32), Error> { + if encoded.len() < 6 || encoded.get(..4) != Some(&[0, 0, 1, 0]) { + return Err(Error::InvalidOperation); + } + let count = usize::from(u16::from_le_bytes([encoded[4], encoded[5]])); + let mut best: Option<(u32, usize, usize)> = None; + for index in 0..count { + let offset = 6_usize + .checked_add(index.checked_mul(16).ok_or(Error::InvalidOperation)?) + .ok_or(Error::InvalidOperation)?; + let end = offset.checked_add(16).ok_or(Error::InvalidOperation)?; + let entry = encoded.get(offset..end).ok_or(Error::InvalidOperation)?; + let width = if entry[0] == 0 { + 256 + } else { + u32::from(entry[0]) + }; + let height = if entry[1] == 0 { + 256 + } else { + u32::from(entry[1]) + }; + let area = width.checked_mul(height).ok_or(Error::Argument)?; + let length = usize::try_from(u32::from_le_bytes( + entry[8..12] + .try_into() + .map_err(|_| Error::InvalidOperation)?, + )) + .map_err(|_| Error::Argument)?; + let image_offset = usize::try_from(u32::from_le_bytes( + entry[12..16] + .try_into() + .map_err(|_| Error::InvalidOperation)?, + )) + .map_err(|_| Error::Argument)?; + if best.is_none_or(|(best_area, _, _)| area > best_area) { + best = Some((area, image_offset, length)); + } + } + let (_, offset, length) = best.ok_or(Error::InvalidOperation)?; + let end = offset.checked_add(length).ok_or(Error::Argument)?; + let image = encoded + .get(offset..end) + .filter(|image| !image.is_empty()) + .ok_or(Error::InvalidOperation)?; + if image.starts_with(&[0x89, b'P', b'N', b'G']) { + return skia_rs_codec::get_image_dimensions(image).map_err(|_| Error::InvalidOperation); + } + if image.len() < 40 { + return Err(Error::InvalidOperation); + } + let header_size = u32::from_le_bytes( + image[0..4] + .try_into() + .map_err(|_| Error::InvalidOperation)?, + ); + if header_size < 40 { + return Err(Error::InvalidOperation); + } + let width = i32::from_le_bytes( + image[4..8] + .try_into() + .map_err(|_| Error::InvalidOperation)?, + ); + let stored_height = i32::from_le_bytes( + image[8..12] + .try_into() + .map_err(|_| Error::InvalidOperation)?, + ); + if stored_height <= 0 || stored_height % 2 != 0 { + return Err(Error::InvalidOperation); + } + Ok((width, stored_height / 2)) +} + +#[cfg(feature = "rust-skia")] +fn validate_dimensions(width: i32, height: i32) -> Result<(), Error> { + let width = usize::try_from(width).map_err(|_| Error::Argument)?; + let height = usize::try_from(height).map_err(|_| Error::Argument)?; + width + .checked_mul(height) + .filter(|pixels| *pixels > 0 && *pixels <= DEFAULT_MAX_PIXELS) + .map(|_| ()) + .ok_or(Error::Argument) +} + +#[cfg(feature = "rust-skia")] +fn decode_webp_with_rust(encoded: &[u8]) -> Result { + use std::io::{BufReader, Cursor}; + + let reader = BufReader::new(Cursor::new(encoded)); + let mut decoder = image_webp::WebPDecoder::new(reader).map_err(|_| Error::InvalidOperation)?; + let (width, height) = decoder.dimensions(); + let animated = decoder.is_animated(); + let width_i32 = i32::try_from(width).map_err(|_| Error::Argument)?; + let height_i32 = i32::try_from(height).map_err(|_| Error::Argument)?; + validate_dimensions(width_i32, height_i32)?; + decoder.set_memory_limit(DEFAULT_MAX_PIXELS * 16); + + let output_size = decoder.output_buffer_size().ok_or(Error::Argument)?; + if output_size > DEFAULT_MAX_PIXELS * 4 { + return Err(Error::Argument); + } + let mut packed_pixels = Vec::new(); + packed_pixels + .try_reserve_exact(output_size) + .map_err(|_| Error::InvalidOperation)?; + packed_pixels.resize(output_size, 0); + decoder + .read_image(&mut packed_pixels) + .map_err(|_| Error::InvalidOperation)?; + + let has_alpha = decoder.has_alpha(); + // image-webp 0.2 uses a divide-by-256 blend fast path for animated + // canvases. Its fully opaque nonzero samples are consequently one below + // Skia/libwebp's divide-by-255 result. Correct that bounded first-frame + // canvas here; partially transparent samples already use the same rounding + // as the compatibility backend. + if animated { + if has_alpha { + for rgba in packed_pixels.chunks_exact_mut(4) { + if rgba[3] == u8::MAX { + for channel in &mut rgba[..3] { + if *channel != 0 { + *channel = channel.saturating_add(1); + } + } + } + } + } else { + for channel in &mut packed_pixels { + if *channel != 0 { + *channel = channel.saturating_add(1); + } + } + } + } + let pixels = if has_alpha { + packed_pixels + } else { + let pixel_count = usize::try_from(width) + .ok() + .and_then(|width| { + usize::try_from(height) + .ok() + .and_then(|height| width.checked_mul(height)) + }) + .ok_or(Error::Argument)?; + let rgba_size = pixel_count.checked_mul(4).ok_or(Error::Argument)?; + let mut rgba = Vec::new(); + rgba.try_reserve_exact(rgba_size) + .map_err(|_| Error::InvalidOperation)?; + for rgb in packed_pixels.chunks_exact(3) { + rgba.extend_from_slice(&[rgb[0], rgb[1], rgb[2], u8::MAX]); + } + if rgba.len() != rgba_size { + return Err(Error::InvalidOperation); + } + rgba + }; + let row_bytes = usize::try_from(width) + .map_err(|_| Error::Argument)? + .checked_mul(4) + .ok_or(Error::Argument)?; + let bitmap = SKBitmap::new( + width_i32, + height_i32, + row_bytes, + SKColorType::Rgba8888, + if has_alpha { + SKAlphaType::Unpremul + } else { + SKAlphaType::Opaque + }, + pixels, + )?; + bitmap_to_managed(&bitmap) +} + #[cfg(feature = "skia")] fn decode_with_skia(encoded: &[u8]) -> Result { use skia_safe::Data; @@ -528,6 +972,394 @@ mod tests { SkiaTextureCodec.decode(Box::new(std::io::Cursor::new(Vec::new()))), Err(Error::InvalidOperation) ); + #[cfg(not(feature = "rust-skia"))] + assert_eq!( + RustSkiaTextureCodec.decode(Box::new(std::io::Cursor::new(Vec::new()))), + Err(Error::InvalidOperation) + ); + } + + #[cfg(any(feature = "rust-skia", feature = "skia"))] + fn hex_fixture(source: &str) -> Vec { + let digits: Vec<_> = source.bytes().filter(u8::is_ascii_hexdigit).collect(); + assert_eq!(digits.len() % 2, 0, "fixture contains a partial byte"); + digits + .chunks_exact(2) + .map(|pair| { + let high = (pair[0] as char).to_digit(16).expect("hex digit"); + let low = (pair[1] as char).to_digit(16).expect("hex digit"); + u8::try_from(high * 16 + low).expect("hex byte") + }) + .collect() + } + + #[cfg(feature = "rust-skia")] + fn rust_decode(encoded: Vec) -> Result { + RustSkiaTextureCodec.decode(Box::new(std::io::Cursor::new(encoded))) + } + + #[cfg(any(feature = "rust-skia", feature = "skia"))] + fn checked_format_matrix() -> [(&'static str, &'static str, (i32, i32)); 19] { + [ + ( + "BMP 16-bit RGB555", + include_str!("../tests/fixtures/rgb555.bmp.hex"), + (2, 1), + ), + ( + "BMP 24-bit bottom-up", + include_str!("../tests/fixtures/bottom-up.bmp.hex"), + (8, 8), + ), + ( + "BMP 32-bit BGRX", + include_str!("../tests/fixtures/bgrx32.bmp.hex"), + (2, 1), + ), + ( + "GIF palette and frame offset", + include_str!("../tests/fixtures/palette-offset.gif.hex"), + (4, 2), + ), + ( + "ICO largest entry", + include_str!("../tests/fixtures/multi.ico.hex"), + (2, 2), + ), + ( + "JPEG baseline RGB", + include_str!("../tests/fixtures/baseline.jpg.hex"), + (8, 8), + ), + ( + "JPEG progressive grayscale", + include_str!("../tests/fixtures/progressive.jpg.hex"), + (128, 128), + ), + ( + "PNG grayscale", + include_str!("../tests/fixtures/gray.png.hex"), + (32, 32), + ), + ( + "PNG grayscale alpha", + include_str!("../tests/fixtures/gray-alpha.png.hex"), + (32, 32), + ), + ( + "PNG RGB", + include_str!("../tests/fixtures/rgb.png.hex"), + (32, 32), + ), + ( + "PNG RGBA", + include_str!("../tests/fixtures/rgba.png.hex"), + (32, 32), + ), + ( + "PNG straight alpha", + include_str!("../tests/fixtures/straight-alpha.png.hex"), + (1, 1), + ), + ( + "PNG interlaced palette", + include_str!("../tests/fixtures/interlaced-palette.png.hex"), + (32, 32), + ), + ( + "WBMP multibyte width", + include_str!("../tests/fixtures/multibyte.wbmp.hex"), + (130, 1), + ), + ( + "WBMP minimum-length image", + include_str!("../tests/fixtures/small.wbmp.hex"), + (2, 2), + ), + ( + "WebP lossless RGB", + include_str!("../tests/fixtures/rgb-lossless.webp.hex"), + (2, 2), + ), + ( + "WebP lossless alpha", + include_str!("../tests/fixtures/alpha.webp.hex"), + (1, 1), + ), + ( + "WebP lossy", + include_str!("../tests/fixtures/lossy-red.webp.hex"), + (8, 8), + ), + ( + "WebP animated first frame", + include_str!("../tests/fixtures/animated.webp.hex"), + (11, 29), + ), + ] + } + + #[cfg(any(feature = "rust-skia", feature = "skia"))] + fn assert_checked_format_matrix(codec: &dyn libremetaverse_imaging::ITextureCodec) { + for (name, fixture, dimensions) in checked_format_matrix() { + let image = codec + .decode(Box::new(std::io::Cursor::new(hex_fixture(fixture)))) + .unwrap_or_else(|error| panic!("{name} failed to decode: {error:?}")); + assert_eq!((image.width, image.height), dimensions, "{name}"); + assert_eq!( + image.channels, + if matches!( + name, + "JPEG progressive grayscale" + | "PNG grayscale" + | "WBMP multibyte width" + | "WBMP minimum-length image" + ) { + ManagedImageImageChannels::GRAY + } else { + ManagedImageImageChannels::COLOR | ManagedImageImageChannels::ALPHA + }, + "{name}" + ); + } + } + + #[cfg(feature = "rust-skia")] + #[test] + fn rust_feature_decodes_the_checked_format_matrix() { + assert_checked_format_matrix(&RustSkiaTextureCodec); + } + + #[cfg(feature = "skia")] + #[test] + fn native_feature_decodes_the_checked_format_matrix() { + assert_checked_format_matrix(&SkiaTextureCodec); + } + + #[cfg(all(feature = "rust-skia", feature = "skia"))] + #[test] + fn native_and_rust_backends_match_the_shared_contract_matrix() { + fn assert_plane(name: &str, plane: &str, native: &[u8], rust: &[u8], tolerance: u8) { + assert_eq!(native.len(), rust.len(), "{name} {plane} length"); + for (index, (&native, &rust)) in native.iter().zip(rust).enumerate() { + assert!( + native.abs_diff(rust) <= tolerance, + "{name} {plane}[{index}]: native={native}, rust={rust}, tolerance={tolerance}" + ); + } + } + + for (name, fixture, _) in checked_format_matrix() { + let bytes = hex_fixture(fixture); + let native = SkiaTextureCodec + .decode(Box::new(std::io::Cursor::new(bytes.clone()))) + .unwrap_or_else(|error| panic!("native {name}: {error:?}")); + let rust = RustSkiaTextureCodec + .decode(Box::new(std::io::Cursor::new(bytes))) + .unwrap_or_else(|error| panic!("Rust {name}: {error:?}")); + assert_eq!(native.width, rust.width, "{name} width"); + assert_eq!(native.height, rust.height, "{name} height"); + assert_eq!(native.channels, rust.channels, "{name} channels"); + let tolerance = if name.starts_with("JPEG") { + 8 + } else if name == "WebP lossy" { + 10 + } else { + 0 + }; + assert_plane(name, "red", &native.red, &rust.red, tolerance); + assert_plane(name, "green", &native.green, &rust.green, tolerance); + assert_plane(name, "blue", &native.blue, &rust.blue, tolerance); + assert_plane(name, "alpha", &native.alpha, &rust.alpha, tolerance); + } + } + + #[cfg(feature = "rust-skia")] + #[test] + fn rust_feature_preserves_canvas_orientation_selection_and_alpha() { + for fixture in [ + include_str!("../tests/fixtures/two-by-two-bottom-up.bmp.hex"), + include_str!("../tests/fixtures/two-by-two-top-down.bmp.hex"), + ] { + let bitmap = rust_decode(hex_fixture(fixture)).expect("oriented BMP"); + assert_eq!(bitmap.red, [255, 0, 0, 255]); + assert_eq!(bitmap.green, [0, 255, 0, 255]); + assert_eq!(bitmap.blue, [0, 0, 255, 255]); + } + + let gif = rust_decode(hex_fixture(include_str!( + "../tests/fixtures/palette-offset.gif.hex" + ))) + .expect("GIF logical canvas"); + assert_eq!((gif.width, gif.height), (4, 2)); + + let icon = rust_decode(hex_fixture(include_str!("../tests/fixtures/multi.ico.hex"))) + .expect("largest ICO entry"); + assert_eq!(icon.red, [255, 0, 0, 255]); + assert_eq!(icon.green, [0, 255, 0, 255]); + assert_eq!(icon.blue, [0, 0, 255, 255]); + + let alpha = rust_decode(hex_fixture(include_str!( + "../tests/fixtures/alpha.webp.hex" + ))) + .expect("alpha WebP"); + assert_eq!( + (alpha.red[0], alpha.green[0], alpha.blue[0]), + (255, 255, 255) + ); + assert!((127..=128).contains(&alpha.alpha[0])); + + let lossy = rust_decode(hex_fixture(include_str!( + "../tests/fixtures/lossy-red.webp.hex" + ))) + .expect("lossy WebP"); + assert!(lossy.red.iter().all(|red| *red >= 245)); + assert!(lossy.green.iter().all(|green| *green <= 10)); + assert!(lossy.blue.iter().all(|blue| *blue <= 10)); + assert!(lossy.alpha.iter().all(|alpha| *alpha == u8::MAX)); + } + + #[cfg(feature = "rust-skia")] + #[test] + fn rust_feature_rejects_invalid_truncated_and_oversized_input_without_panicking() { + for malformed in [Vec::new(), b"not an image".to_vec(), b"GIF89a".to_vec()] { + let result = + std::panic::catch_unwind(std::panic::AssertUnwindSafe(|| rust_decode(malformed))); + assert!(result.is_ok(), "malformed input panicked"); + assert_eq!(result.expect("checked above"), Err(Error::InvalidOperation)); + } + + let mut pixel_bomb = + hex_fixture(include_str!("../tests/fixtures/interlaced-palette.png.hex")); + pixel_bomb[16..20].copy_from_slice(&4097_u32.to_be_bytes()); + pixel_bomb[20..24].copy_from_slice(&4097_u32.to_be_bytes()); + assert_eq!(rust_decode(pixel_bomb), Err(Error::Argument)); + + let mut gif_frame_bomb = + hex_fixture(include_str!("../tests/fixtures/palette-offset.gif.hex")); + let descriptor = gif_frame_bomb[109..] + .iter() + .position(|byte| *byte == 0x2c) + .map(|offset| offset + 109) + .expect("first GIF image descriptor"); + gif_frame_bomb[descriptor + 5..descriptor + 7].copy_from_slice(&u16::MAX.to_le_bytes()); + gif_frame_bomb[descriptor + 7..descriptor + 9].copy_from_slice(&u16::MAX.to_le_bytes()); + assert_eq!(rust_decode(gif_frame_bomb), Err(Error::Argument)); + + let mut malformed_gif_palette = + hex_fixture(include_str!("../tests/fixtures/palette-offset.gif.hex")); + // Advertise a 256-entry global palette while retaining the fixture's + // much smaller checked table. Preflight must reject the missing table + // before the decoder can allocate or index palette storage. + malformed_gif_palette[10] = (malformed_gif_palette[10] & 0xf8) | 0x07; + assert_eq!( + rust_decode(malformed_gif_palette), + Err(Error::InvalidOperation) + ); + + let mut icon_embedded_bomb = hex_fixture(include_str!("../tests/fixtures/multi.ico.hex")); + icon_embedded_bomb[86..90].copy_from_slice(&4097_i32.to_le_bytes()); + icon_embedded_bomb[90..94].copy_from_slice(&8194_i32.to_le_bytes()); + assert_eq!(rust_decode(icon_embedded_bomb), Err(Error::Argument)); + + let over_limit = vec![0_u8; DEFAULT_MAX_ENCODED_BYTES + 1]; + assert_eq!(rust_decode(over_limit), Err(Error::Argument)); + + for fixture in [ + include_str!("../tests/fixtures/bottom-up.bmp.hex"), + include_str!("../tests/fixtures/palette-offset.gif.hex"), + include_str!("../tests/fixtures/multi.ico.hex"), + include_str!("../tests/fixtures/interlaced-palette.png.hex"), + include_str!("../tests/fixtures/alpha.webp.hex"), + ] { + let mut bytes = hex_fixture(fixture); + bytes.truncate(bytes.len() / 2); + let result = + std::panic::catch_unwind(std::panic::AssertUnwindSafe(|| rust_decode(bytes))); + assert!(result.is_ok(), "truncated input panicked"); + assert!(result.expect("checked above").is_err()); + } + } + + #[cfg(feature = "rust-skia")] + struct DropStream { + cursor: std::io::Cursor>, + drops: std::sync::Arc, + } + + #[cfg(feature = "rust-skia")] + impl std::io::Read for DropStream { + fn read(&mut self, buffer: &mut [u8]) -> std::io::Result { + std::io::Read::read(&mut self.cursor, buffer) + } + } + + #[cfg(feature = "rust-skia")] + impl std::io::Write for DropStream { + fn write(&mut self, buffer: &[u8]) -> std::io::Result { + std::io::Write::write(&mut self.cursor, buffer) + } + + fn flush(&mut self) -> std::io::Result<()> { + Ok(()) + } + } + + #[cfg(feature = "rust-skia")] + impl std::io::Seek for DropStream { + fn seek(&mut self, position: std::io::SeekFrom) -> std::io::Result { + std::io::Seek::seek(&mut self.cursor, position) + } + } + + #[cfg(feature = "rust-skia")] + impl Drop for DropStream { + fn drop(&mut self) { + self.drops.fetch_add(1, std::sync::atomic::Ordering::SeqCst); + } + } + + #[cfg(feature = "rust-skia")] + #[test] + fn rust_feature_is_thread_safe_across_repeated_decode_and_drop() { + use std::sync::Arc; + use std::sync::atomic::{AtomicUsize, Ordering}; + + fn assert_texture_codec() {} + assert_texture_codec::(); + + let codec = Arc::new(RustSkiaTextureCodec); + let png = Arc::new(hex_fixture(include_str!( + "../tests/fixtures/interlaced-palette.png.hex" + ))); + let mut workers = Vec::new(); + for _ in 0..8 { + let codec = Arc::clone(&codec); + let png = Arc::clone(&png); + workers.push(std::thread::spawn(move || { + for _ in 0..16 { + let image = codec + .decode(Box::new(std::io::Cursor::new((*png).clone()))) + .expect("concurrent PNG decode"); + assert_eq!((image.width, image.height), (32, 32)); + let repeated = codec + .decode(Box::new(std::io::Cursor::new((*png).clone()))) + .expect("repeated concurrent PNG decode"); + assert_eq!(image, repeated); + } + })); + } + for worker in workers { + worker.join().expect("decoder worker did not panic"); + } + + let drops = Arc::new(AtomicUsize::new(0)); + let stream = DropStream { + cursor: std::io::Cursor::new((*png).clone()), + drops: Arc::clone(&drops), + }; + codec.decode(Box::new(stream)).expect("drop-probe decode"); + assert_eq!(drops.load(Ordering::SeqCst), 1); } #[cfg(feature = "skia")] diff --git a/crates/libremetaverse-imaging-skia/tests/fixtures/README.md b/crates/libremetaverse-imaging-skia/tests/fixtures/README.md new file mode 100644 index 0000000..4196aed --- /dev/null +++ b/crates/libremetaverse-imaging-skia/tests/fixtures/README.md @@ -0,0 +1,29 @@ +# Rust codec fixtures + +The tests decode these hexadecimal files into their exact checked-in bytes; no +image is generated while tests run. Unless noted below, fixtures come from the +BSD-3-Clause Skia test resources vendored by `skia-bindings 0.99.0`. + +| Fixture | SHA-256 | +| --- | --- | +| `alpha.webp` | `8b09993d8ffc9a9ec4e7f5f26a1c126cf265c37b0d63c0c5be2506e20dbc6fea` | +| `animated.webp` | `292753f066add623af1e30bbeeca58f15b3d6d1052e12b13e30f21f8d3c14505` | +| `baseline.jpg` | `4e45048dbe3078943eb364221a9757df9b9845b80e795ccdc944f1c18b5e221b` | +| `bottom-up.bmp` | `d9cc5fff9e8e351727ad4519236ae46eaf37f8007dad5cdb8619fcd67ec68903` | +| `gray-alpha.png` | `377a67510b4ccc74cdcce14847b02035e75ccab36e9d8e00586c4c24d1ae385a` | +| `gray.png` | `85b19fcda452d6cbf02f570c353cfa9e47c29237f2fc8f0114deb6cd0b23f97a` | +| `interlaced-palette.png` | `6283a61b1f7344c0cfa741076d6aed4a16a6bc5582e81db8dd7374a34230b0df` | +| `palette-offset.gif` | `32d3409a79b75614ef385354d54f148f08856f8e9ce0d55054582ff7f40f4461` | +| `progressive.jpg` | `d07a9815dc792543c16b796ec7729c19d6a29e7d9b4d0bbab50f4ef210be7767` | +| `rgb.png` | `ecea1ef4a001a999ce9b82d18abf47401eb92998708b306b6c9a8ac3a6a9a2c8` | +| `rgba.png` | `756a03364c02e3c9f85d6f4029eb3cef2488c081dc537d46e102bebcb9e02732` | +| `straight-alpha.png` | `5a647404fa5289da777b1bb9e1dcfe20027262f992a214f38efaecc3da0e08a4` | + +`lossy-red.webp` was produced once with FFmpeg 5.1.8/libwebp from a solid +8x8 red source (`-c:v libwebp -lossless 0 -quality 80`) and has SHA-256 +`7e3aaf1a442b6e69f7706ee5afe0aeacb2d096e384dbb63e792421fe2449cfe8`. + +The remaining tiny BMP, ICO, WBMP, and lossless RGB WebP files are original +MetaCrate byte-level fixtures. Their reviewed bytes are intentionally readable +in the `.hex` files and exercise header fields, row layout, masks, multi-byte +integers, and multi-entry selection directly. diff --git a/crates/libremetaverse-imaging-skia/tests/fixtures/alpha.webp.hex b/crates/libremetaverse-imaging-skia/tests/fixtures/alpha.webp.hex new file mode 100644 index 0000000..d1f520f --- /dev/null +++ b/crates/libremetaverse-imaging-skia/tests/fixtures/alpha.webp.hex @@ -0,0 +1,3 @@ +524946461e000000574542505650384c110000002f0000001007d0fffef7 +bf7f8188e87f0000 + diff --git a/crates/libremetaverse-imaging-skia/tests/fixtures/animated.webp.hex b/crates/libremetaverse-imaging-skia/tests/fixtures/animated.webp.hex new file mode 100644 index 0000000..04acfbe --- /dev/null +++ b/crates/libremetaverse-imaging-skia/tests/fixtures/animated.webp.hex @@ -0,0 +1,12 @@ +524946464c01000057454250565038580a000000120000000a00001c0000 +414e494d060000000000ffff0000414e4d465a0000000000000000000a00 +001c0000e80300005650384c420000002f0a0007001720164ce6ff849cc6 +388ee3fc078e0645b1ad54573b50821444f0db8728aec9f9562688e8bf80 +a0c8013bd09c2c5e759505ce8f25232ee33615170c0d414e4d465a000000 +010000050000060000100000f40100005650384c420000002f0600040017 +201048525e647e814092f222330b049298079979fe037f15288a6ca749a3 +de31819aee2fc70c32898988fe4f008092d5d79d5525f8079e709b3b6120 +414e4d465c0000000100000100000600000f0000e80300005650384c4400 +00002f06c0030017201048621e647e814092f222330b049298079979fe03 +7f15286a1bc9b9defe4362d05ce5b7cfd5c23c1411fd4f093a8c46a30e09 +ee4f7ff3c3c3c3cdd303 diff --git a/crates/libremetaverse-imaging-skia/tests/fixtures/baseline.jpg.hex b/crates/libremetaverse-imaging-skia/tests/fixtures/baseline.jpg.hex new file mode 100644 index 0000000..7d02365 --- /dev/null +++ b/crates/libremetaverse-imaging-skia/tests/fixtures/baseline.jpg.hex @@ -0,0 +1,11 @@ +ffd8ffe000104a46494600010101004800480000ffdb004300100b0c0e0c +0a100e0d0e1211101318281a181616183123251d283a333d3c3933383740 +485c4e404457453738506d51575f626768673e4d71797064785c656763ff +db0043011112121815182f1a1a2f63423842636363636363636363636363 +636363636363636363636363636363636363636363636363636363636363 +6363636363636363ffc00011080008000803012200021101031101ffc400 +1500010100000000000000000000000000000003ffc4001e100002010403 +01000000000000000000000102000311213112224171ffc4001501010100 +000000000000000000000000000304ffc4001a1101000203010000000000 +00000000000001000203213141ffda000c03010002110311003f009d4e6a +8c15b354b2d455eda6b922c32367dd7db2222d6c9a2558c7c5393fffd9 diff --git a/crates/libremetaverse-imaging-skia/tests/fixtures/bgrx32.bmp.hex b/crates/libremetaverse-imaging-skia/tests/fixtures/bgrx32.bmp.hex new file mode 100644 index 0000000..282fa11 --- /dev/null +++ b/crates/libremetaverse-imaging-skia/tests/fixtures/bgrx32.bmp.hex @@ -0,0 +1,2 @@ +424d3e000000000000003600000028000000020000000100000001002000000000000800000000000000000000000000000000000000 +0000ff0000ff0000 diff --git a/crates/libremetaverse-imaging-skia/tests/fixtures/bottom-up.bmp.hex b/crates/libremetaverse-imaging-skia/tests/fixtures/bottom-up.bmp.hex new file mode 100644 index 0000000..06a4071 --- /dev/null +++ b/crates/libremetaverse-imaging-skia/tests/fixtures/bottom-up.bmp.hex @@ -0,0 +1,10 @@ +424df6000000000000003600000028000000080000000800000001001800 +00000000c0000000130b0000130b000000000000000000002272b0f8232e +d989f03857b32260a8fe403371fe95df716a63fea76b954ce022bce472b2 +4a9f121345e342373d0a19bd98ac6f271d9411e45f83b2fb996ed8629116 +8c1271b4ca39f93d27831ab4c312f867abcc184203a7b97d481082b44afe +5221c5d6cc78abb4dc7dd209f300ca475d60b26f44466e5742f73ba8028f +df09557e02c78aaa24966c888154628936400ea6bdb61dc088d62bd46293 +b241c6decea5ba6e60f34b8f70a5bb5d5f39395ce266761927ba3cb0fcde +7438c19300fa + diff --git a/crates/libremetaverse-imaging-skia/tests/fixtures/gray-alpha.png.hex b/crates/libremetaverse-imaging-skia/tests/fixtures/gray-alpha.png.hex new file mode 100644 index 0000000..f76e2fe --- /dev/null +++ b/crates/libremetaverse-imaging-skia/tests/fixtures/gray-alpha.png.hex @@ -0,0 +1,5 @@ +89504e470d0a1a0a0000000d4948445200000020000000200804000000d9 +73b27f0000000467414d41000186a031e8965f0000003549444154488963 +fccfc0c001859c683431229c2cdf1928032c3f86be01a361301a06543160 +341047c3802a068c06e2681850c30000df2a207da0bf7158000000004945 +4e44ae426082 diff --git a/crates/libremetaverse-imaging-skia/tests/fixtures/gray.png.hex b/crates/libremetaverse-imaging-skia/tests/fixtures/gray.png.hex new file mode 100644 index 0000000..9a83de3 --- /dev/null +++ b/crates/libremetaverse-imaging-skia/tests/fixtures/gray.png.hex @@ -0,0 +1,5 @@ +89504e470d0a1a0a0000000d494844520000002000000020080000000056 +1125280000000467414d41000186a031e8965f0000004149444154388d63 +646024001408c8b30c05058c0f0829f8f71f3f6079301c1430ca11906764 +a2795c0c06058c8ff0cafeffcff887e67131181430cae0956564040050e5 +fe7171a90b240000000049454e44ae426082 diff --git a/crates/libremetaverse-imaging-skia/tests/fixtures/interlaced-palette.png.hex b/crates/libremetaverse-imaging-skia/tests/fixtures/interlaced-palette.png.hex new file mode 100644 index 0000000..5b15354 --- /dev/null +++ b/crates/libremetaverse-imaging-skia/tests/fixtures/interlaced-palette.png.hex @@ -0,0 +1,5 @@ +89504e470d0a1a0a0000000d49484452000000200000002001030000013e +b3d82100000006504c5445eeff222266ff6c1ad226000000294944415408 +d7636080820f50b80a0a43d1b0b131c39933d849088348363f1040880f40 +00212810030009ba422d1cbe5f9a0000000049454e44ae426082 + diff --git a/crates/libremetaverse-imaging-skia/tests/fixtures/lossy-red.webp.hex b/crates/libremetaverse-imaging-skia/tests/fixtures/lossy-red.webp.hex new file mode 100644 index 0000000..961fff3 --- /dev/null +++ b/crates/libremetaverse-imaging-skia/tests/fixtures/lossy-red.webp.hex @@ -0,0 +1,4 @@ +524946463c000000574542505650382030000000d001009d012a08000800 +01402625a00274ba01f80003b000fef36997fe6c0ae6b9f7fbffe9707e97 +07e9707fe9480000 + diff --git a/crates/libremetaverse-imaging-skia/tests/fixtures/multi.ico.hex b/crates/libremetaverse-imaging-skia/tests/fixtures/multi.ico.hex new file mode 100644 index 0000000..2adb722 --- /dev/null +++ b/crates/libremetaverse-imaging-skia/tests/fixtures/multi.ico.hex @@ -0,0 +1,8 @@ +000001000200 +01010000010020002c00000026000000 +02020000010020003800000052000000 +28000000010000000200000001002000000000000400000000000000000000000000000000000000 +0000ffff +28000000020000000400000001002000000000001000000000000000000000000000000000000000 +ff0000ffffffffff0000ffff00ff00ff + diff --git a/crates/libremetaverse-imaging-skia/tests/fixtures/multibyte.wbmp.hex b/crates/libremetaverse-imaging-skia/tests/fixtures/multibyte.wbmp.hex new file mode 100644 index 0000000..586f376 --- /dev/null +++ b/crates/libremetaverse-imaging-skia/tests/fixtures/multibyte.wbmp.hex @@ -0,0 +1,3 @@ +0000810201 +ffffffffffffffffffffffffffffffff80 + diff --git a/crates/libremetaverse-imaging-skia/tests/fixtures/palette-offset.gif.hex b/crates/libremetaverse-imaging-skia/tests/fixtures/palette-offset.gif.hex new file mode 100644 index 0000000..2c53119 --- /dev/null +++ b/crates/libremetaverse-imaging-skia/tests/fixtures/palette-offset.gif.hex @@ -0,0 +1,7 @@ +474946383961040002008400000000001000002000003000004000005000 +00600000700000800000900000a00000b00000c00000d00000e00000f000 +000000000000110000220000330000440000550000660000770000880000 +990000aa0000bb0000cc0000dd0000ee0000ff21f904000a0000002c0000 +00000400020000070908090a0b0c0d0e0f810021f9040114001a002c0100 +0100030001000007041f1a1581003b + diff --git a/crates/libremetaverse-imaging-skia/tests/fixtures/progressive.jpg.hex b/crates/libremetaverse-imaging-skia/tests/fixtures/progressive.jpg.hex new file mode 100644 index 0000000..73bb2e8 --- /dev/null +++ b/crates/libremetaverse-imaging-skia/tests/fixtures/progressive.jpg.hex @@ -0,0 +1,26 @@ +ffd8ffe000104a46494600010101004800480000ffdb0043000806060706 +05080707070909080a0c140d0c0b0b0c1912130f141d1a1f1e1d1a1c1c20 +242e2720222c231c1c2837292c30313434341f27393d38323c2e333432ff +c2000b080080008001011100ffc400150001010000000000000000000000 +0000000306ffda0008010100000001824444444444444448744444444444 +444487444444444444444874444444444444448744444444444444487444 +444444444444874444444444444448744444444444444487444444444444 +444874444444444444448744444444444444487444444444444444874444 +444444444448744444444444444487444444444444444874444444444444 +44ffc40014100100000000000000000000000000000080ffda0008010100 +010502007fffc40014100100000000000000000000000000000080ffda00 +08010100063f02007fffc400151001010000000000000000000000000000 +0100ffda0008010100013f21082082082082082082082082082082082082 +082082082082082082082082082082082082082082082082082082082082 +082082082082082082082082082082082082082082082082082082082082 +082082082082082082082082082082082082082082082082082082082082 +082082082082082082082082082082082082082082082082082082082082 +082082082082082082082082082082082082082082082082082082082082 +082082082082082082082082082082082082082082082082ffda00080101 +000000100000000000000000000000000000000000000000000000000000 +000000000000ffc40014100100000000000000000000000000000080ffda +0008010100013f10007fff00ff00ff00ff00ff00ff00ff00ff00ff00ff00 +ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00 +ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00 +ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00 +ff00ff00ff00ff00ff00ff00ff00ff00ff00ffd9 diff --git a/crates/libremetaverse-imaging-skia/tests/fixtures/rgb-lossless.webp.hex b/crates/libremetaverse-imaging-skia/tests/fixtures/rgb-lossless.webp.hex new file mode 100644 index 0000000..2858282 --- /dev/null +++ b/crates/libremetaverse-imaging-skia/tests/fixtures/rgb-lossless.webp.hex @@ -0,0 +1,2 @@ +524946461c000000574542505650384c0f0000002f014000000710f58ffe +0722a2ff0100 diff --git a/crates/libremetaverse-imaging-skia/tests/fixtures/rgb.png.hex b/crates/libremetaverse-imaging-skia/tests/fixtures/rgb.png.hex new file mode 100644 index 0000000..f19fe88 --- /dev/null +++ b/crates/libremetaverse-imaging-skia/tests/fixtures/rgb.png.hex @@ -0,0 +1,5 @@ +89504e470d0a1a0a0000000d4948445200000020000000200802000000fc +18eda30000000467414d41000186a031e8965f00000048494441544889ed +d5c10900300c024085ec91fdb772133b442bf4a1f8cee12bb40d043b800a +14f81ca0ede47d4c784081020f4a871fc284071428f0a0743823a94081bb +7077a3c00182b1f95e3ed793980000000049454e44ae426082 diff --git a/crates/libremetaverse-imaging-skia/tests/fixtures/rgb555.bmp.hex b/crates/libremetaverse-imaging-skia/tests/fixtures/rgb555.bmp.hex new file mode 100644 index 0000000..8cb6774 --- /dev/null +++ b/crates/libremetaverse-imaging-skia/tests/fixtures/rgb555.bmp.hex @@ -0,0 +1,2 @@ +424d3a000000000000003600000028000000020000000100000001001000000000000400000000000000000000000000000000000000 +007ce003 diff --git a/crates/libremetaverse-imaging-skia/tests/fixtures/rgba.png.hex b/crates/libremetaverse-imaging-skia/tests/fixtures/rgba.png.hex new file mode 100644 index 0000000..175e410 --- /dev/null +++ b/crates/libremetaverse-imaging-skia/tests/fixtures/rgba.png.hex @@ -0,0 +1,7 @@ +89504e470d0a1a0a0000000d494844520000002000000020080600000073 +7a7af40000000467414d41000186a031e8965f0000006f494441545885ed +d6310a80300c46e12764684fa1f73f55048f21c4ddc545781d52e85028fc +1f4d28d98a01305e7b7e9cffba33831d75054703ca06a8f90d58a0074e35 +1e227d805c8254e31bb0420f5cdc2e0079208892ffe2a00136a07b400794 +3c1004d900195036407f011bf00052201a9cd68fe9670000000049454e44 +ae426082 diff --git a/crates/libremetaverse-imaging-skia/tests/fixtures/small.wbmp.hex b/crates/libremetaverse-imaging-skia/tests/fixtures/small.wbmp.hex new file mode 100644 index 0000000..a4bcd67 --- /dev/null +++ b/crates/libremetaverse-imaging-skia/tests/fixtures/small.wbmp.hex @@ -0,0 +1 @@ +000002028040 diff --git a/crates/libremetaverse-imaging-skia/tests/fixtures/straight-alpha.png.hex b/crates/libremetaverse-imaging-skia/tests/fixtures/straight-alpha.png.hex new file mode 100644 index 0000000..2ef43b4 --- /dev/null +++ b/crates/libremetaverse-imaging-skia/tests/fixtures/straight-alpha.png.hex @@ -0,0 +1,6 @@ +89504e470d0a1a0a0000000d49484452000000010000000108060000001f +15c489000000017352474200aece1ce900000006624b474400ff00ff00ff +a0bda793000000097048597300000b1300000b1301009a9c180000000774 +494d4507de040313163ac721af9d0000001974455874436f6d6d656e7400 +4372656174656420776974682047494d5057810e170000000d4944415408 +d763f8ffff7f3d00097b037d178855c50000000049454e44ae426082 diff --git a/crates/libremetaverse-imaging-skia/tests/fixtures/two-by-two-bottom-up.bmp.hex b/crates/libremetaverse-imaging-skia/tests/fixtures/two-by-two-bottom-up.bmp.hex new file mode 100644 index 0000000..b7938c0 --- /dev/null +++ b/crates/libremetaverse-imaging-skia/tests/fixtures/two-by-two-bottom-up.bmp.hex @@ -0,0 +1,3 @@ +424d46000000000000003600000028000000020000000200000001001800000000001000000000000000000000000000000000000000 +ff0000ffffff00000000ff00ff000000 + diff --git a/crates/libremetaverse-imaging-skia/tests/fixtures/two-by-two-top-down.bmp.hex b/crates/libremetaverse-imaging-skia/tests/fixtures/two-by-two-top-down.bmp.hex new file mode 100644 index 0000000..99b5db0 --- /dev/null +++ b/crates/libremetaverse-imaging-skia/tests/fixtures/two-by-two-top-down.bmp.hex @@ -0,0 +1,3 @@ +424d4600000000000000360000002800000002000000feffffff01001800000000001000000000000000000000000000000000000000 +0000ff00ff000000ff0000ffffff0000 + diff --git a/crates/libremetaverse-types/Cargo.toml b/crates/libremetaverse-types/Cargo.toml index 0d5a319..8901138 100644 --- a/crates/libremetaverse-types/Cargo.toml +++ b/crates/libremetaverse-types/Cargo.toml @@ -18,6 +18,12 @@ sha1 = "0.10" sha2 = "0.11" uuid = { version = "1.18", features = ["v4"] } +# Browser and JavaScript WASM targets have no operating-system entropy syscall. +# Select getrandom's supported Web Crypto adapter only for that target family. +[target.'cfg(target_family = "wasm")'.dependencies] +getrandom = { version = "0.4", features = ["wasm_js"] } +uuid = { version = "1.18", features = ["v4", "rng-getrandom"] } + [dev-dependencies] stats_alloc = "0.1.10" diff --git a/crates/libremetaverse/README.md b/crates/libremetaverse/README.md index 28484d5..d1b51e0 100644 --- a/crates/libremetaverse/README.md +++ b/crates/libremetaverse/README.md @@ -19,7 +19,7 @@ they use those APIs directly. | `libremetaverse-types` | UUIDs, vectors, matrices, colors, cancellation, compatibility collections, and boundary types | Pure Rust | | `libremetaverse-structured-data` | LLSD/OSD XML, JSON, binary, and notation | Pure Rust | | `libremetaverse-imaging` | Managed images, TGA/DDS, codec traits | Optional `jpeg2000` or pure-Rust `rust-j2k` | -| `libremetaverse-imaging-skia` | Common raster formats through Skia | Optional `skia`; native Skia build/cache | +| `libremetaverse-imaging-skia` | Common raster formats through native Skia or pure Rust | Optional `skia` native build/cache; optional `rust-skia` has no native prerequisites | | `libremetaverse-prim-mesher` | Legacy prim and sculpt geometry | Pure Rust | | `libremetaverse-rendering-simple` | Deterministic reference geometry | Pure Rust | | `libremetaverse-rendering-mesh-foundry` | Prim, terrain, sculpt, and mesh-asset rendering | Pure Rust | diff --git a/deny.toml b/deny.toml index 7247156..57e576d 100644 --- a/deny.toml +++ b/deny.toml @@ -39,6 +39,8 @@ allow = [] allow-workspace = true deny = [] skip = [ + { crate = "bit-vec@0.8.0", reason = "Approved pinned skia-rs shader parser compatibility line" }, + { crate = "bitflags@1.3.2", reason = "Approved pinned pure-Rust PNG compatibility line" }, { crate = "block-buffer@0.10.4", reason = "Approved RustCrypto digest 0.10 compatibility line" }, { crate = "cfg_aliases@0.1.1", reason = "Approved older nix build-helper line" }, { crate = "const-oid@0.9.6", reason = "Approved DTLS certificate compatibility line" }, @@ -47,10 +49,12 @@ skip = [ { crate = "digest@0.10.7", reason = "Approved legacy hash and WebRTC compatibility line" }, { crate = "getrandom@0.2.17", reason = "Approved elliptic-curve entropy compatibility line" }, { crate = "getrandom@0.3.4", reason = "Approved rand 0.9 entropy compatibility line" }, + { crate = "hashbrown@0.16.1", reason = "Approved pinned skia-rs geometry compatibility line" }, { crate = "nix@0.28.0", reason = "Approved machine-address Unix compatibility line" }, { crate = "nom@7.1.3", reason = "Approved Skia bindgen parser compatibility line" }, { crate = "rand_core@0.6.4", reason = "Approved elliptic-curve random compatibility line" }, { crate = "rand_core@0.9.5", reason = "Approved rand 0.9 compatibility line" }, + { crate = "rustc-hash@1.1.0", reason = "Approved pinned skia-rs shader parser compatibility line" }, { crate = "sha2@0.10.9", reason = "Approved WebRTC RustCrypto compatibility line" }, { crate = "shlex@1.3.0", reason = "Approved Skia bindgen shell parser compatibility line" }, { crate = "syn@2.0.119", reason = "Approved MetaCrate code generator syntax line" }, diff --git a/docs/imaging-meshing.md b/docs/imaging-meshing.md index ccc8e40..5dc2f07 100644 --- a/docs/imaging-meshing.md +++ b/docs/imaging-meshing.md @@ -18,7 +18,8 @@ and [`MeshFoundry` guide](../crates/libremetaverse-rendering-mesh-foundry/README | Managed images and TGA | enabled | n/a | none | | JPEG 2000 | disabled | `libremetaverse-imaging/jpeg2000` | OpenJPEG 2.5.x | | JPEG 2000 (pure Rust) | disabled | `libremetaverse-imaging/rust-j2k` | none (`j2k` 0.8.1) | -| BMP/GIF/ICO/JPEG/PNG/WBMP/WebP | disabled | `libremetaverse-imaging-skia/skia` | Skia | +| BMP/GIF/ICO/JPEG/PNG/WBMP/WebP (pure Rust) | disabled | `libremetaverse-imaging-skia/rust-skia` | none (`skia-rs-codec` 0.3.0 plus `image-webp` 0.2.4) | +| BMP/GIF/ICO/JPEG/PNG/WBMP/WebP (native) | disabled | `libremetaverse-imaging-skia/skia` | Skia | | Prim and sculpt meshing, OBJ ingestion | enabled | n/a | none | OpenJPEG is a non-default workspace member so release tooling can package the @@ -26,10 +27,11 @@ adapter explicitly, and imaging reaches it only through the optional dependency. The independent `rust-j2k` feature reaches only the audited pure-Rust `j2k` graph; enabling both features keeps both explicit codec types available for interoperability testing. Skia is likewise an optional, -target-specific dependency. The -consolidated required Gitea gate exercises both optional features on -`ubuntu-latest` while its minimal-feature check proves that no native codec is -needed for the owned Rust and translated compatibility tests. +target-specific dependency. The consolidated required Gitea gate exercises the +native feature, while a dedicated `ubuntu-latest` job tests `rust-skia`, audits +its normal/build graph without installing native codec tools, and compiles the +same code for WASM. Minimal-feature checks still prove no codec is needed for +the owned Rust and translated compatibility tests. ## Bounds and rendering contract diff --git a/docs/release-candidate.md b/docs/release-candidate.md index 73c4d8e..c00a9ca 100644 --- a/docs/release-candidate.md +++ b/docs/release-candidate.md @@ -24,6 +24,7 @@ Optional boundaries are explicit: | --- | --- | --- | | `jpeg2000` | J2K/JP2 through the safe OpenJPEG adapter | OpenJPEG 2.5.4 or newer | | `rust-j2k` | J2K/JP2 through `RustJ2kCodec` | none; exact pure-Rust `j2k` 0.8.1 | +| `rust-skia` | BMP/GIF/ICO/JPEG/PNG/WBMP/WebP through `RustSkiaTextureCodec` | none; exact pure-Rust `skia-rs-codec` 0.3.0 and `image-webp` 0.2.4 | | `skia` | PNG/JPEG/WebP and other Skia formats | Skia 0.99 target cache or documented source tools | | `vorbis` | PCM to Ogg Vorbis | the locked `vorbis_rs` native build stack | | default WebRTC | native ICE/DTLS/SRTP/RTP/SCTP and Opus | system libopus 1.3 or newer | diff --git a/docs/rust-api-guide.md b/docs/rust-api-guide.md index b4a8515..85d968e 100644 --- a/docs/rust-api-guide.md +++ b/docs/rust-api-guide.md @@ -19,7 +19,7 @@ they use those APIs directly. | `libremetaverse-types` | UUIDs, vectors, matrices, colors, cancellation, compatibility collections, and boundary types | Pure Rust | | `libremetaverse-structured-data` | LLSD/OSD XML, JSON, binary, and notation | Pure Rust | | `libremetaverse-imaging` | Managed images, TGA/DDS, codec traits | Optional `jpeg2000` or pure-Rust `rust-j2k` | -| `libremetaverse-imaging-skia` | Common raster formats through Skia | Optional `skia`; native Skia build/cache | +| `libremetaverse-imaging-skia` | Common raster formats through native Skia or pure Rust | Optional `skia` native build/cache; optional `rust-skia` has no native prerequisites | | `libremetaverse-prim-mesher` | Legacy prim and sculpt geometry | Pure Rust | | `libremetaverse-rendering-simple` | Deterministic reference geometry | Pure Rust | | `libremetaverse-rendering-mesh-foundry` | Prim, terrain, sculpt, and mesh-asset rendering | Pure Rust | diff --git a/release/DEPENDENCY-LICENSES.json b/release/DEPENDENCY-LICENSES.json index 35148ab..46b2a21 100644 --- a/release/DEPENDENCY-LICENSES.json +++ b/release/DEPENDENCY-LICENSES.json @@ -1,6 +1,6 @@ { "schema": 1, - "cargo_lock_sha256": "68988caa2c014bf2c67563df3dd0a8348d67eeb06559649798463fd8211fc0cb", + "cargo_lock_sha256": "a547e07459a810d61571eca6775cebea871fd2874508a494350918fddccf8d6d", "packages": [ { "name": "adler2", @@ -95,6 +95,23 @@ } ] }, + { + "name": "allocator-api2", + "version": "0.2.21", + "checksum": "683d7910e743518b0e34f1186f92494becacb047c7b6bf616c96772180fef923", + "license": "MIT OR Apache-2.0", + "repository": "https://github.com/zakarumych/allocator-api2", + "notice_files": [ + { + "path": "LICENSE-APACHE", + "sha256": "62c7a1e35f56406896d7aa7ca52d0cc0d272ac022b5d2796e7d6905db8a3636a" + }, + { + "path": "LICENSE-MIT", + "sha256": "23f18e03dc49df91622fe2a76176497404e46ced8a715d9d2b67a7446571cca3" + } + ] + }, { "name": "alsa", "version": "0.11.0", @@ -252,6 +269,19 @@ } ] }, + { + "name": "approx", + "version": "0.5.1", + "checksum": "cab112f0a86d568ea0e627cc1d6be74a1e9cd55214684db5561995f6dad897c6", + "license": "Apache-2.0", + "repository": "https://github.com/brendanzab/approx", + "notice_files": [ + { + "path": "LICENSE", + "sha256": "cfc7749b96f63bd31c3c42b5c471bf756814053e847c10f3eb003417bc523d30" + } + ] + }, { "name": "arrayvec", "version": "0.7.8", @@ -469,6 +499,40 @@ } ] }, + { + "name": "bit-set", + "version": "0.8.0", + "checksum": "08807e080ed7f9d5433fa9b275196cfc35414f66a0c79d864dc51a0d825231a3", + "license": "Apache-2.0 OR MIT", + "repository": "https://github.com/contain-rs/bit-set", + "notice_files": [ + { + "path": "LICENSE-APACHE", + "sha256": "8173d5c29b4f956d532781d2b86e4e30f83e6b7878dce18c919451d6ba707c90" + }, + { + "path": "LICENSE-MIT", + "sha256": "f51ac2c59a222f7476ce507ca879960e2b64ea64bb2786eefdbeb7b0b538d1b7" + } + ] + }, + { + "name": "bit-vec", + "version": "0.8.0", + "checksum": "5e764a1d40d510daf35e07be9eb06e75770908c27d411ee6c92109c9840eaaf7", + "license": "Apache-2.0 OR MIT", + "repository": "https://github.com/contain-rs/bit-vec", + "notice_files": [ + { + "path": "LICENSE-APACHE", + "sha256": "8173d5c29b4f956d532781d2b86e4e30f83e6b7878dce18c919451d6ba707c90" + }, + { + "path": "LICENSE-MIT", + "sha256": "f51ac2c59a222f7476ce507ca879960e2b64ea64bb2786eefdbeb7b0b538d1b7" + } + ] + }, { "name": "bit-vec", "version": "0.9.1", @@ -486,6 +550,23 @@ } ] }, + { + "name": "bitflags", + "version": "1.3.2", + "checksum": "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a", + "license": "MIT/Apache-2.0", + "repository": "https://github.com/bitflags/bitflags", + "notice_files": [ + { + "path": "LICENSE-APACHE", + "sha256": "a60eea817514531668d7e00765731449fe14d059d3249e0bc93b36de45f759f2" + }, + { + "path": "LICENSE-MIT", + "sha256": "6485b8ed310d3f0340bf1ad1f47645069ce4069dcc6bb46c7d5c6faf41de1fdb" + } + ] + }, { "name": "bitflags", "version": "2.13.1", @@ -575,6 +656,86 @@ } ] }, + { + "name": "bytemuck", + "version": "1.25.2", + "checksum": "95832e849adfb21180ccb6826a99da14e5d266ae5c2e668e1602cf234f153797", + "license": "Zlib OR Apache-2.0 OR MIT", + "repository": "https://github.com/Lokathor/bytemuck", + "notice_files": [ + { + "path": "LICENSE-APACHE", + "sha256": "e3ba223bb1423f0aad8c3dfce0fe3148db48926d41e6fbc3afbbf5ff9e1c89cb" + }, + { + "path": "LICENSE-MIT", + "sha256": "9df9ba60a11af705f2e451b53762686e615d86f76b169cf075c3237730dbd7e2" + }, + { + "path": "LICENSE-ZLIB", + "sha256": "84b34dd7608f7fb9b17bd588a6bf392bf7de504e2716f024a77d89f1b145a151" + } + ] + }, + { + "name": "bytemuck_derive", + "version": "1.12.0", + "checksum": "fc0e56a716f1e132ff6bf4bdac1c944a3fcdc1cae65f70a4a2a1ac3b401d2d1f", + "license": "Zlib OR Apache-2.0 OR MIT", + "repository": "https://github.com/Lokathor/bytemuck", + "notice_files": [ + { + "path": "LICENSE-APACHE", + "sha256": "e3ba223bb1423f0aad8c3dfce0fe3148db48926d41e6fbc3afbbf5ff9e1c89cb" + }, + { + "path": "LICENSE-MIT", + "sha256": "9df9ba60a11af705f2e451b53762686e615d86f76b169cf075c3237730dbd7e2" + }, + { + "path": "LICENSE-ZLIB", + "sha256": "84b34dd7608f7fb9b17bd588a6bf392bf7de504e2716f024a77d89f1b145a151" + } + ] + }, + { + "name": "byteorder", + "version": "1.5.0", + "checksum": "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b", + "license": "Unlicense OR MIT", + "repository": "https://github.com/BurntSushi/byteorder", + "notice_files": [ + { + "path": "COPYING", + "sha256": "01c266bced4a434da0051174d6bee16a4c82cf634e2679b6155d40d75012390f" + }, + { + "path": "LICENSE-MIT", + "sha256": "0f96a83840e146e43c0ec96a22ec1f392e0680e6c1226e6f3ba87e0740af850f" + }, + { + "path": "UNLICENSE", + "sha256": "7e12e5df4bae12cb21581ba157ced20e1986a0508dd10d0e8a4ab9a4cf94e85c" + } + ] + }, + { + "name": "byteorder-lite", + "version": "0.1.0", + "checksum": "8f1fe948ff07f4bd06c30984e69f5b4899c516a3ef74f34df92a2df2ab535495", + "license": "Unlicense OR MIT", + "repository": "https://github.com/image-rs/byteorder-lite", + "notice_files": [ + { + "path": "LICENSE-MIT", + "sha256": "0f96a83840e146e43c0ec96a22ec1f392e0680e6c1226e6f3ba87e0740af850f" + }, + { + "path": "UNLICENSE", + "sha256": "7e12e5df4bae12cb21581ba157ced20e1986a0508dd10d0e8a4ab9a4cf94e85c" + } + ] + }, { "name": "bytes", "version": "1.12.1", @@ -856,6 +1017,32 @@ } ] }, + { + "name": "codespan-reporting", + "version": "0.11.1", + "checksum": "3538270d33cc669650c4b093848450d380def10c331d38c768e34cac80576e6e", + "license": "Apache-2.0", + "repository": "https://github.com/brendanzab/codespan", + "notice_files": [ + { + "path": "generated-package-license-notice.txt", + "sha256": "6bd99e2013ab763cfa6e15cc07619a8165efa3eff5419df83459486c3f9b1f01" + } + ] + }, + { + "name": "color_quant", + "version": "1.1.0", + "checksum": "3d7b894f5411737b7867f4827955924d7c254fc9f4d91a6aad6b097804b1018b", + "license": "MIT", + "repository": "https://github.com/image-rs/color_quant.git", + "notice_files": [ + { + "path": "LICENSE", + "sha256": "592dc80f1a865d20d61a2006a2d29ce34a2bc28cd7e868ab300fdeed6da154ca" + } + ] + }, { "name": "colorchoice", "version": "1.0.5", @@ -1402,6 +1589,19 @@ } ] }, + { + "name": "earcut", + "version": "0.4.5", + "checksum": "88459a2a8e3a514b6e6de38cf3aaa9250a894cb098f74a932db77fcc8341b6d0", + "license": "ISC", + "repository": "https://github.com/ciscorn/earcut-rs", + "notice_files": [ + { + "path": "LICENSE.txt", + "sha256": "1b5fd56a3c78a302a4bfe304cfcbce912938361f627c69a321220615c2d6b08d" + } + ] + }, { "name": "ecdsa", "version": "0.16.9", @@ -1504,6 +1704,23 @@ } ] }, + { + "name": "fdeflate", + "version": "0.3.7", + "checksum": "1e6853b52649d4ac5c0bd02320cddc5ba956bdb407c4b75a2c6b75bf51500f8c", + "license": "MIT OR Apache-2.0", + "repository": "https://github.com/image-rs/fdeflate", + "notice_files": [ + { + "path": "LICENSE-APACHE", + "sha256": "0d542e0c8804e39aa7f37eb00da5a762149dc682d7829451287e11b938e94594" + }, + { + "path": "LICENSE-MIT", + "sha256": "c77a4cf9da729987d0fe7ccd811e3bd27393914ddf3d23467c18cc22954513b3" + } + ] + }, { "name": "fearless_simd", "version": "0.4.1", @@ -1627,6 +1844,32 @@ } ] }, + { + "name": "float_next_after", + "version": "2.0.0", + "checksum": "37007738a80ea34f969af54a3390dd72cacdef654974cfd449c9f6f72dbaac10", + "license": "MIT", + "repository": "https://gitlab.com/bronsonbdevost/next_afterf", + "notice_files": [ + { + "path": "LICENSE", + "sha256": "0604d5817110dacc5c7d9b7de6b58b962794603d4823c357157bd5dec4198bc5" + } + ] + }, + { + "name": "foldhash", + "version": "0.2.0", + "checksum": "77ce24cb58228fbb8aa041425bb1050850ac19177686ea6e0f41a70416f56fdb", + "license": "Zlib", + "repository": "https://github.com/orlp/foldhash", + "notice_files": [ + { + "path": "LICENSE", + "sha256": "1d4c38d56650edc2c673cadbec74bec14db1fe8f2f10f4e3477dcbb49563be40" + } + ] + }, { "name": "form_urlencoded", "version": "1.2.2", @@ -1789,6 +2032,57 @@ } ] }, + { + "name": "geo", + "version": "0.33.1", + "checksum": "30eb1fdc57c1e5cfd11826fe0caec4b9dc7901f3758263bb506228d88c8d9e9a", + "license": "MIT OR Apache-2.0", + "repository": "https://github.com/georust/geo", + "notice_files": [ + { + "path": "generated-package-license-notice.txt", + "sha256": "97d6f51e49f6670614703e0c99d7a04e409fc7bab1656a8f1753f8770b456c92" + }, + { + "path": "repository-license/geo-types-0.7.20/LICENSE-APACHE", + "sha256": "a60eea817514531668d7e00765731449fe14d059d3249e0bc93b36de45f759f2" + }, + { + "path": "repository-license/geo-types-0.7.20/LICENSE-MIT", + "sha256": "2f8267b247fd81e9555a2e196e119a5b341bcae21011cd93985c312f1312f727" + } + ] + }, + { + "name": "geo-types", + "version": "0.7.20", + "checksum": "777d18aa0f12f8b285331cd867133ee14422b3f023f6d388034c47d43e28786a", + "license": "MIT OR Apache-2.0", + "repository": "https://github.com/georust/geo", + "notice_files": [ + { + "path": "LICENSE-APACHE", + "sha256": "a60eea817514531668d7e00765731449fe14d059d3249e0bc93b36de45f759f2" + }, + { + "path": "LICENSE-MIT", + "sha256": "2f8267b247fd81e9555a2e196e119a5b341bcae21011cd93985c312f1312f727" + } + ] + }, + { + "name": "geographiclib-rs", + "version": "0.2.7", + "checksum": "c5a7f08910fd98737a6eda7568e7c5e645093e073328eeef49758cfe8b0489c7", + "license": "MIT", + "repository": "https://github.com/georust/geographiclib-rs", + "notice_files": [ + { + "path": "LICENSE", + "sha256": "da3ece2d2daf5c812c8606d2922094f51818258d4ce0e041b4ee8409ba3b381f" + } + ] + }, { "name": "getrandom", "version": "0.2.17", @@ -1857,6 +2151,40 @@ } ] }, + { + "name": "gif", + "version": "0.13.3", + "checksum": "4ae047235e33e2829703574b54fdec96bfbad892062d97fed2f76022287de61b", + "license": "MIT OR Apache-2.0", + "repository": "https://github.com/image-rs/image-gif", + "notice_files": [ + { + "path": "LICENSE-APACHE", + "sha256": "a60eea817514531668d7e00765731449fe14d059d3249e0bc93b36de45f759f2" + }, + { + "path": "LICENSE-MIT", + "sha256": "77257f3d2181236b1aee78920238062ae64efe13c5d858b2db126e79c9e1b14f" + } + ] + }, + { + "name": "glam", + "version": "0.29.3", + "checksum": "8babf46d4c1c9d92deac9f7be466f76dfc4482b6452fc5024b5e8daf6ffeb3ee", + "license": "MIT OR Apache-2.0", + "repository": "https://github.com/bitshifter/glam-rs", + "notice_files": [ + { + "path": "LICENSE-APACHE", + "sha256": "be33ddb87a30fd321ab100e2d922cba512e50ec7a63d8e62e5bfc0798dd4b585" + }, + { + "path": "LICENSE-MIT", + "sha256": "23f18e03dc49df91622fe2a76176497404e46ced8a715d9d2b67a7446571cca3" + } + ] + }, { "name": "glob", "version": "0.3.4", @@ -1908,6 +2236,40 @@ } ] }, + { + "name": "hash32", + "version": "0.3.1", + "checksum": "47d60b12902ba28e2730cd37e95b8c9223af2808df9e902d4df49588d1470606", + "license": "MIT OR Apache-2.0", + "repository": "https://github.com/japaric/hash32", + "notice_files": [ + { + "path": "LICENSE-APACHE", + "sha256": "a60eea817514531668d7e00765731449fe14d059d3249e0bc93b36de45f759f2" + }, + { + "path": "LICENSE-MIT", + "sha256": "c986bcdb83103d4ddf58aeb7b5302359782e54dc4eea14a0cc27c62dcbd50729" + } + ] + }, + { + "name": "hashbrown", + "version": "0.16.1", + "checksum": "841d1cc9bed7f9236f321df977030373f4a4163ae1a7dbfe1a51a2c1a51d9100", + "license": "MIT OR Apache-2.0", + "repository": "https://github.com/rust-lang/hashbrown", + "notice_files": [ + { + "path": "LICENSE-APACHE", + "sha256": "a60eea817514531668d7e00765731449fe14d059d3249e0bc93b36de45f759f2" + }, + { + "path": "LICENSE-MIT", + "sha256": "ff8f68cb076caf8cefe7a6430d4ac086ce6af2ca8ce2c4e5a2004d4552ef52a2" + } + ] + }, { "name": "hashbrown", "version": "0.17.1", @@ -1925,6 +2287,23 @@ } ] }, + { + "name": "heapless", + "version": "0.8.0", + "checksum": "0bfb9eb618601c89945a70e254898da93b13be0388091d42117462b265bb3fad", + "license": "MIT OR Apache-2.0", + "repository": "https://github.com/rust-embedded/heapless", + "notice_files": [ + { + "path": "LICENSE-APACHE", + "sha256": "a60eea817514531668d7e00765731449fe14d059d3249e0bc93b36de45f759f2" + }, + { + "path": "LICENSE-MIT", + "sha256": "035e70219855119df4273b3c5b97543ae82e0dd60c520416e759107c602f651b" + } + ] + }, { "name": "heck", "version": "0.5.0", @@ -1942,6 +2321,19 @@ } ] }, + { + "name": "hexf-parse", + "version": "0.2.1", + "checksum": "dfa686283ad6dd069f105e5ab091b04c62850d3e4cf5d67debad1933f55023df", + "license": "CC0-1.0", + "repository": "https://github.com/lifthrasiir/hexf", + "notice_files": [ + { + "path": "generated-package-license-notice.txt", + "sha256": "0e1a61da1582431a552744e844c6f081c613b202c69badec6362ea0f61039510" + } + ] + }, { "name": "hkdf", "version": "0.12.4", @@ -2113,6 +2505,71 @@ } ] }, + { + "name": "i_float", + "version": "1.16.0", + "checksum": "813145bb0ad5b60f55cbbf3c74cdceda1c0a9d253b35c4cc36ae0df7887cb78f", + "license": "MIT", + "repository": "https://github.com/iShape-Rust/iFloat", + "notice_files": [ + { + "path": "LICENSE", + "sha256": "260cc580f53a756821a0f35475e2cd6da790f8fed0efc058252fe1bed8f2689e" + } + ] + }, + { + "name": "i_key_sort", + "version": "0.10.3", + "checksum": "d73d122b937fca067feb0ad74f62388920272b27c356d4df2d0cfdd59e044cf0", + "license": "MIT", + "repository": "https://github.com/iShape-Rust/iKeySort", + "notice_files": [ + { + "path": "generated-package-license-notice.txt", + "sha256": "abad130a74eb590181d6cae3217337e94716394b1db11b7faa1dcde7a1095777" + } + ] + }, + { + "name": "i_overlay", + "version": "4.5.2", + "checksum": "8dd314b4668e2b3a12508f2e125558c82a6c0a8636fa5107a900f79ce414e450", + "license": "MIT OR Apache-2.0", + "repository": "https://github.com/iShape-Rust/iOverlay", + "notice_files": [ + { + "path": "generated-package-license-notice.txt", + "sha256": "c191998f5f595cf7d49a23cfd29b6d85b220e1d6f854b92f4c0f1ffa79d90a29" + } + ] + }, + { + "name": "i_shape", + "version": "1.18.0", + "checksum": "bfa9eac533d7509a8ab87672b60ac610c17240f9ea4851d26227689fdfe349c8", + "license": "MIT", + "repository": "https://github.com/iShape-Rust/iShape", + "notice_files": [ + { + "path": "LICENSE", + "sha256": "260cc580f53a756821a0f35475e2cd6da790f8fed0efc058252fe1bed8f2689e" + } + ] + }, + { + "name": "i_tree", + "version": "0.18.0", + "checksum": "4804bdc1dc124eb7e1aa9e144ecc04096bcf787a10a15fa44af682b51f0f6cce", + "license": "MIT", + "repository": "https://github.com/iShape-Rust/iTree", + "notice_files": [ + { + "path": "LICENSE", + "sha256": "47e00f18b265d350a2860d3899f17dd1c7689b966545e929df8ffa7033f5acdc" + } + ] + }, { "name": "icu_collections", "version": "2.2.0", @@ -2238,6 +2695,23 @@ } ] }, + { + "name": "image-webp", + "version": "0.2.4", + "checksum": "525e9ff3e1a4be2fbea1fdf0e98686a6d98b4d8f937e1bf7402245af1909e8c3", + "license": "MIT OR Apache-2.0", + "repository": "https://github.com/image-rs/image-webp", + "notice_files": [ + { + "path": "LICENSE-APACHE", + "sha256": "0d542e0c8804e39aa7f37eb00da5a762149dc682d7829451287e11b938e94594" + }, + { + "path": "LICENSE-MIT", + "sha256": "c77a4cf9da729987d0fe7ccd811e3bd27393914ddf3d23467c18cc22954513b3" + } + ] + }, { "name": "indexmap", "version": "2.14.0", @@ -2653,6 +3127,40 @@ } ] }, + { + "name": "jpeg-decoder", + "version": "0.3.2", + "checksum": "00810f1d8b74be64b13dbf3db89ac67740615d6c891f0e7b6179326533011a07", + "license": "MIT OR Apache-2.0", + "repository": "https://github.com/image-rs/jpeg-decoder", + "notice_files": [ + { + "path": "LICENSE-APACHE", + "sha256": "a60eea817514531668d7e00765731449fe14d059d3249e0bc93b36de45f759f2" + }, + { + "path": "LICENSE-MIT", + "sha256": "22b83fb92a50418c7df9564b9c179fa2a0e74f293bc58b72dd7e218fc0902143" + } + ] + }, + { + "name": "jpeg-encoder", + "version": "0.6.1", + "checksum": "b454d911ac55068f53495488d8ccd0646eaa540c033a28ee15b07838afafb01f", + "license": "(MIT OR Apache-2.0) AND IJG", + "repository": "https://github.com/vstroebel/jpeg-encoder", + "notice_files": [ + { + "path": "LICENSE-APACHE", + "sha256": "965a63a81d9a2fbeb5f9096954dabb49690f9dffcdac9825f675b25c807252a2" + }, + { + "path": "LICENSE-MIT", + "sha256": "0ecd43cdff2dc2be0deda2116cc00cd9a960930fa7310d02b6379c6ad2319a48" + } + ] + }, { "name": "js-sys", "version": "0.3.104", @@ -2768,6 +3276,23 @@ } ] }, + { + "name": "lock_api", + "version": "0.4.14", + "checksum": "224399e74b87b5f3557511d98dff8b14089b3dadafcab6bb93eab67d3aace965", + "license": "MIT OR Apache-2.0", + "repository": "https://github.com/Amanieu/parking_lot", + "notice_files": [ + { + "path": "LICENSE-APACHE", + "sha256": "a60eea817514531668d7e00765731449fe14d059d3249e0bc93b36de45f759f2" + }, + { + "path": "LICENSE-MIT", + "sha256": "c9a75f18b9ab2927829a208fc6aa2cf4e63b8420887ba29cdb265d6619ae82d5" + } + ] + }, { "name": "log", "version": "0.4.33", @@ -2971,6 +3496,19 @@ } ] }, + { + "name": "naga", + "version": "23.1.0", + "checksum": "364f94bc34f61332abebe8cad6f6cd82a5b65cff22c828d05d0968911462ca4f", + "license": "MIT OR Apache-2.0", + "repository": "https://github.com/gfx-rs/wgpu/tree/trunk/naga", + "notice_files": [ + { + "path": "generated-package-license-notice.txt", + "sha256": "5f86f67a1adc668035f88a708c7355d28a9998612afa6647e07a1f33075c23eb" + } + ] + }, { "name": "ndk", "version": "0.9.0", @@ -3596,6 +4134,40 @@ } ] }, + { + "name": "parking_lot", + "version": "0.12.5", + "checksum": "93857453250e3077bd71ff98b6a65ea6621a19bb0f559a85248955ac12c45a1a", + "license": "MIT OR Apache-2.0", + "repository": "https://github.com/Amanieu/parking_lot", + "notice_files": [ + { + "path": "LICENSE-APACHE", + "sha256": "a60eea817514531668d7e00765731449fe14d059d3249e0bc93b36de45f759f2" + }, + { + "path": "LICENSE-MIT", + "sha256": "c9a75f18b9ab2927829a208fc6aa2cf4e63b8420887ba29cdb265d6619ae82d5" + } + ] + }, + { + "name": "parking_lot_core", + "version": "0.9.12", + "checksum": "2621685985a2ebf1c516881c026032ac7deafcda1a2c9b7850dc81e3dfcb64c1", + "license": "MIT OR Apache-2.0", + "repository": "https://github.com/Amanieu/parking_lot", + "notice_files": [ + { + "path": "LICENSE-APACHE", + "sha256": "a60eea817514531668d7e00765731449fe14d059d3249e0bc93b36de45f759f2" + }, + { + "path": "LICENSE-MIT", + "sha256": "c9a75f18b9ab2927829a208fc6aa2cf4e63b8420887ba29cdb265d6619ae82d5" + } + ] + }, { "name": "pem-rfc7468", "version": "0.7.0", @@ -3698,6 +4270,23 @@ } ] }, + { + "name": "png", + "version": "0.17.16", + "checksum": "82151a2fc869e011c153adc57cf2789ccb8d9906ce52c0b39a6b5697749d7526", + "license": "MIT OR Apache-2.0", + "repository": "https://github.com/image-rs/image-png", + "notice_files": [ + { + "path": "LICENSE-APACHE", + "sha256": "a60eea817514531668d7e00765731449fe14d059d3249e0bc93b36de45f759f2" + }, + { + "path": "LICENSE-MIT", + "sha256": "eaf40297c75da471f7cda1f3458e8d91b4b2ec866e609527a13acfa93b638652" + } + ] + }, { "name": "poly1305", "version": "0.8.0", @@ -3864,6 +4453,23 @@ } ] }, + { + "name": "quick-error", + "version": "2.0.1", + "checksum": "a993555f31e5a609f617c12db6250dedcac1b0a85076912c436e6fc9b2c8e6a3", + "license": "MIT/Apache-2.0", + "repository": "http://github.com/tailhook/quick-error", + "notice_files": [ + { + "path": "LICENSE-APACHE", + "sha256": "c6596eb7be8581c18be736c846fb9173b69eccf6ef94c5135893ec56bd92ba08" + }, + { + "path": "LICENSE-MIT", + "sha256": "058f01fe181608d027fcde7e528fc03ea3cf90f30903c407644b0a9bbc54f500" + } + ] + }, { "name": "quinn", "version": "0.11.11", @@ -4152,6 +4758,19 @@ } ] }, + { + "name": "redox_syscall", + "version": "0.5.18", + "checksum": "ed2bf2547551a7053d6fdfafda3f938979645c44812fbfcda098faae3f1a362d", + "license": "MIT", + "repository": "https://gitlab.redox-os.org/redox-os/syscall", + "notice_files": [ + { + "path": "LICENSE", + "sha256": "efcfee7981ff72431fffb06925cad00a23dce079ed4354f61030ad5abdb78829" + } + ] + }, { "name": "regex", "version": "1.13.1", @@ -4266,6 +4885,23 @@ } ] }, + { + "name": "robust", + "version": "1.2.0", + "checksum": "4e27ee8bb91ca0adcf0ecb116293afa12d393f9c2b9b9cd54d33e8078fe19839", + "license": "MIT OR Apache-2.0", + "repository": "https://github.com/georust/robust", + "notice_files": [ + { + "path": "LICENSE-APACHE", + "sha256": "a60eea817514531668d7e00765731449fe14d059d3249e0bc93b36de45f759f2" + }, + { + "path": "LICENSE-MIT", + "sha256": "ddb606a4226673241b8dedb155a25b271178d028a2bf74c90ee47fe495f4d9bc" + } + ] + }, { "name": "roxmltree", "version": "0.21.1", @@ -4283,6 +4919,36 @@ } ] }, + { + "name": "rstar", + "version": "0.12.2", + "checksum": "421400d13ccfd26dfa5858199c30a5d76f9c54e0dba7575273025b43c5175dbb", + "license": "MIT OR Apache-2.0", + "repository": "https://github.com/georust/rstar", + "notice_files": [ + { + "path": "generated-package-license-notice.txt", + "sha256": "75f29c8382dc456adb2c72d87ac9b09151ea9bc24d085c8ff9c0c047841b5195" + } + ] + }, + { + "name": "rustc-hash", + "version": "1.1.0", + "checksum": "08d43f7aa6b08d49f382cde6a7982047c3426db949b1424bc4b7ec9ae12c6ce2", + "license": "Apache-2.0/MIT", + "repository": "https://github.com/rust-lang-nursery/rustc-hash", + "notice_files": [ + { + "path": "LICENSE-APACHE", + "sha256": "a60eea817514531668d7e00765731449fe14d059d3249e0bc93b36de45f759f2" + }, + { + "path": "LICENSE-MIT", + "sha256": "23f18e03dc49df91622fe2a76176497404e46ced8a715d9d2b67a7446571cca3" + } + ] + }, { "name": "rustc-hash", "version": "2.1.3", @@ -4524,6 +5190,23 @@ } ] }, + { + "name": "scopeguard", + "version": "1.2.0", + "checksum": "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49", + "license": "MIT OR Apache-2.0", + "repository": "https://github.com/bluss/scopeguard", + "notice_files": [ + { + "path": "LICENSE-APACHE", + "sha256": "a60eea817514531668d7e00765731449fe14d059d3249e0bc93b36de45f759f2" + }, + { + "path": "LICENSE-MIT", + "sha256": "fb77f0a9c53e473abe5103c8632ef9f0f2874d4fb3f17cb2d8c661aab9cee9d7" + } + ] + }, { "name": "scroll", "version": "0.13.0", @@ -4805,6 +5488,23 @@ } ] }, + { + "name": "sif-itree", + "version": "0.4.1", + "checksum": "d7f45b8998ced5134fb1d75732c77842a3e888f19c1ff98481822e8fbfbf930b", + "license": "MIT OR Apache-2.0", + "repository": "https://codeberg.org/adamreichold/sif-itree", + "notice_files": [ + { + "path": "LICENSE-APACHE", + "sha256": "62c7a1e35f56406896d7aa7ca52d0cc0d272ac022b5d2796e7d6905db8a3636a" + }, + { + "path": "LICENSE-MIT", + "sha256": "cf6287cf93399cbc46a241bdbafb2d4b6e42956046a886550883a7056f1914eb" + } + ] + }, { "name": "signal-hook-registry", "version": "1.4.8", @@ -4899,6 +5599,58 @@ } ] }, + { + "name": "skia-rs-codec", + "version": "0.3.0", + "checksum": "733be303d09c7e2bd0628dc1e592855d80e79a32c7f020f980ab0abe710d77a6", + "license": "MIT OR Apache-2.0", + "repository": "https://github.com/pegasusheavy/skia-rs", + "notice_files": [ + { + "path": "generated-package-license-notice.txt", + "sha256": "4f67585c5600082ee2a39f968f39958719c77943053a8bc0255cce1fcf5aaf2b" + } + ] + }, + { + "name": "skia-rs-core", + "version": "0.3.0", + "checksum": "88c10ce81ab452a6fa88e7228a5af713328e698b7100c2d021f58287a5370c49", + "license": "MIT OR Apache-2.0", + "repository": "https://github.com/pegasusheavy/skia-rs", + "notice_files": [ + { + "path": "generated-package-license-notice.txt", + "sha256": "5755400844088f6cb705de6d2662e34a2512f7f20d818b35349f726d726e2df5" + } + ] + }, + { + "name": "skia-rs-paint", + "version": "0.3.0", + "checksum": "f4b7ea0fc7fa887d5875e49809eabc3cbd9e6a0247930a9f6456ad4c59cedfb1", + "license": "MIT OR Apache-2.0", + "repository": "https://github.com/pegasusheavy/skia-rs", + "notice_files": [ + { + "path": "generated-package-license-notice.txt", + "sha256": "e79c6016e646c15c9c20d54f197b4cbd4f49930c7d2e8b5d04fef9859132dfe3" + } + ] + }, + { + "name": "skia-rs-path", + "version": "0.3.0", + "checksum": "1f928ca29bc3e26f46393048186bf64cf7eb7c39cc7176e8285a1828c601d7c0", + "license": "MIT OR Apache-2.0", + "repository": "https://github.com/pegasusheavy/skia-rs", + "notice_files": [ + { + "path": "generated-package-license-notice.txt", + "sha256": "a520921b3010a5df19c97a649f0d26edc2750ee2df3df4b3e7f582a2ae85f19f" + } + ] + }, { "name": "skia-safe", "version": "0.99.0", @@ -4972,6 +5724,36 @@ } ] }, + { + "name": "spade", + "version": "2.15.1", + "checksum": "9699399fd9349b00b184f5635b074f9ec93afffef30c853f8c875b32c0f8c7fa", + "license": "MIT OR Apache-2.0", + "repository": "https://github.com/Stoeoef/spade", + "notice_files": [ + { + "path": "LICENSE-APACHE", + "sha256": "cfc7749b96f63bd31c3c42b5c471bf756814053e847c10f3eb003417bc523d30" + }, + { + "path": "LICENSE-MIT", + "sha256": "fc1a4c9482e823f450af4c85471ca6e58d1fd0b3bd0998be4547b1be4a5bc4af" + } + ] + }, + { + "name": "spirv", + "version": "0.3.0+sdk-1.3.268.0", + "checksum": "eda41003dc44290527a59b13432d4a0379379fa074b70174882adfbdfd917844", + "license": "Apache-2.0", + "repository": "https://github.com/gfx-rs/rspirv", + "notice_files": [ + { + "path": "generated-package-license-notice.txt", + "sha256": "2c33264685afe7db2aac2fd5a9788dadf195b7c33e632d7c108fcb0a672a96c9" + } + ] + }, { "name": "spki", "version": "0.7.3", @@ -5181,6 +5963,27 @@ } ] }, + { + "name": "termcolor", + "version": "1.4.1", + "checksum": "06794f8f6c5c898b3275aebefa6b8a1cb24cd2c6c79397ab15774837a0bc5755", + "license": "Unlicense OR MIT", + "repository": "https://github.com/BurntSushi/termcolor", + "notice_files": [ + { + "path": "COPYING", + "sha256": "01c266bced4a434da0051174d6bee16a4c82cf634e2679b6155d40d75012390f" + }, + { + "path": "LICENSE-MIT", + "sha256": "0f96a83840e146e43c0ec96a22ec1f392e0680e6c1226e6f3ba87e0740af850f" + }, + { + "path": "UNLICENSE", + "sha256": "7e12e5df4bae12cb21581ba157ced20e1986a0508dd10d0e8a4ab9a4cf94e85c" + } + ] + }, { "name": "thiserror", "version": "1.0.69", @@ -5659,6 +6462,48 @@ } ] }, + { + "name": "unicode-width", + "version": "0.1.14", + "checksum": "7dd6e30e90baa6f72411720665d41d89b9a3d039dc45b8faea1ddd07f617f6af", + "license": "MIT OR Apache-2.0", + "repository": "https://github.com/unicode-rs/unicode-width", + "notice_files": [ + { + "path": "COPYRIGHT", + "sha256": "23860c2a7b5d96b21569afedf033469bab9fe14a1b24a35068b8641c578ce24d" + }, + { + "path": "LICENSE-APACHE", + "sha256": "a60eea817514531668d7e00765731449fe14d059d3249e0bc93b36de45f759f2" + }, + { + "path": "LICENSE-MIT", + "sha256": "7b63ecd5f1902af1b63729947373683c32745c16a10e8e6292e2e2dcd7e90ae0" + } + ] + }, + { + "name": "unicode-xid", + "version": "0.2.6", + "checksum": "ebc1c04c71510c7f702b52b7c350734c9ff1295c464a03335b00bb84fc54f853", + "license": "MIT OR Apache-2.0", + "repository": "https://github.com/unicode-rs/unicode-xid", + "notice_files": [ + { + "path": "COPYRIGHT", + "sha256": "23860c2a7b5d96b21569afedf033469bab9fe14a1b24a35068b8641c578ce24d" + }, + { + "path": "LICENSE-APACHE", + "sha256": "a60eea817514531668d7e00765731449fe14d059d3249e0bc93b36de45f759f2" + }, + { + "path": "LICENSE-MIT", + "sha256": "7b63ecd5f1902af1b63729947373683c32745c16a10e8e6292e2e2dcd7e90ae0" + } + ] + }, { "name": "universal-hash", "version": "0.5.1", @@ -5774,6 +6619,27 @@ } ] }, + { + "name": "uuid-rng-internal", + "version": "1.24.0", + "checksum": "9dff7387287837acf196f2596a6216f94c555d947d5331e1cc48393131020119", + "license": "Apache-2.0 OR MIT", + "repository": "https://github.com/uuid-rs/uuid", + "notice_files": [ + { + "path": "generated-package-license-notice.txt", + "sha256": "caa2390e19c40285641bd323cacd489091ab2a3f3508141471cf0eb30d75a9f3" + }, + { + "path": "repository-license/uuid-1.24.0/LICENSE-APACHE", + "sha256": "a60eea817514531668d7e00765731449fe14d059d3249e0bc93b36de45f759f2" + }, + { + "path": "repository-license/uuid-1.24.0/LICENSE-MIT", + "sha256": "436bc5a105d8e57dcd8778730f3754f7bf39c14d2f530e4cde4bd2d17a83ec3d" + } + ] + }, { "name": "vcpkg", "version": "0.2.15", @@ -6058,6 +6924,23 @@ } ] }, + { + "name": "weezl", + "version": "0.1.12", + "checksum": "a28ac98ddc8b9274cb41bb4d9d4d5c425b6020c50c46f25559911905610b4a88", + "license": "MIT OR Apache-2.0", + "repository": "https://github.com/image-rs/weezl", + "notice_files": [ + { + "path": "LICENSE-APACHE", + "sha256": "a60eea817514531668d7e00765731449fe14d059d3249e0bc93b36de45f759f2" + }, + { + "path": "LICENSE-MIT", + "sha256": "573f5227db835cd30bbdd3aed3f82615f80119a4d5c82b4daf642dbfe2b6afde" + } + ] + }, { "name": "widestring", "version": "1.2.1", diff --git a/release/DISTRIBUTION-MANIFEST.json b/release/DISTRIBUTION-MANIFEST.json index 6acb933..4571f8b 100644 --- a/release/DISTRIBUTION-MANIFEST.json +++ b/release/DISTRIBUTION-MANIFEST.json @@ -1,6 +1,6 @@ { "schema": 1, - "cargo_lock_sha256": "68988caa2c014bf2c67563df3dd0a8348d67eeb06559649798463fd8211fc0cb", + "cargo_lock_sha256": "a547e07459a810d61571eca6775cebea871fd2874508a494350918fddccf8d6d", "provenance_policy_sha256": "f95475a2284ab282e9432865d4a7ed103498a56ed5ec2393017bc312c77da890", "upstream_repository": "https://github.com/cinderblocks/libremetaverse", "upstream_commit": "2aa70bb68513b39795da5d13c88f31b86e85a3ba", @@ -17,8 +17,8 @@ }, { "path": ".gitea/workflows/ci.yml", - "bytes": 6440, - "sha256": "6241a445155b0691896af98310b18858e0c38537dca70c80c5c0bd9cf8f1c0ca" + "bytes": 7567, + "sha256": "ae8f50aaf0ab6bd07cfff49d75ba7cd1f051bbd6c7599dc8f1d5f239db5b8561" }, { "path": ".gitea/workflows/release.yml", @@ -42,8 +42,8 @@ }, { "path": "Cargo.lock", - "bytes": 103842, - "sha256": "68988caa2c014bf2c67563df3dd0a8348d67eeb06559649798463fd8211fc0cb" + "bytes": 117042, + "sha256": "a547e07459a810d61571eca6775cebea871fd2874508a494350918fddccf8d6d" }, { "path": "Cargo.toml", @@ -62,13 +62,13 @@ }, { "path": "README.md", - "bytes": 35953, - "sha256": "dea4a52f12e5885e2c53356c56b122c9bbf00382cbff21ff179e05b1d8714f05" + "bytes": 36207, + "sha256": "c3f0ff673ad886783314122cf49162e59ccfa4d82a928023d930d60bf521c6b3" }, { "path": "RUSTREWRITE.md", - "bytes": 54472, - "sha256": "b3bc471cb82e76cca0c3d251090634de3ed29e24ef91b01d3cc89723e31854be" + "bytes": 55217, + "sha256": "487dce943fbe823ab5967bbedff506e1229b70508cb73d33fe6726ee11a2fc68" }, { "path": "api/API-COVERAGE.md", @@ -102,13 +102,13 @@ }, { "path": "api/SEMVER-AUDIT.md", - "bytes": 5558, - "sha256": "3c44b4b0ea579d975492fd5f9395a29fc597e43b126f8cbae4a0c14792232dd0" + "bytes": 5608, + "sha256": "91c8dfc22d6f6d411fddc0c52ea02f43245c303eb0fe6d8bac2d46046d7a4ddd" }, { "path": "api/SEMVER-BASELINE.json", - "bytes": 5901, - "sha256": "cd422369af58c6f60dbdda202ae4bb331f68ca3aacb5171839512100c027432e" + "bytes": 6087, + "sha256": "41d77e564f53f7757c8ce7be56abc310d92edf094a0b9ee516944ad2389c0025" }, { "path": "api/SHIM-COVERAGE.md", @@ -212,8 +212,8 @@ }, { "path": "ci/ci-coverage.json", - "bytes": 5593, - "sha256": "241e7bc687b1c2395885e4cd2a95c446e5d4847e3bf9a34d8cee3d76bcbc2903" + "bytes": 5694, + "sha256": "40eed10def683f978c65deba5d2c09f463330fe1cd6357efafc875d86ed1afa3" }, { "path": "ci/concurrency-thresholds.json", @@ -222,8 +222,8 @@ }, { "path": "ci/dependency-policy.json", - "bytes": 10851, - "sha256": "781d497a7a0ddd53fb9158e74e1c5f967eaf3b97535596b42bf34fa38e59b482" + "bytes": 12019, + "sha256": "5d35e2940c22da4c7a488a4ace7dc55ab7293a8ea713b6d71a62d1d0af2ac9cb" }, { "path": "ci/evidence/api-audit.json", @@ -267,8 +267,8 @@ }, { "path": "ci/release-matrix.json", - "bytes": 8560, - "sha256": "f6a641f66c023cd00d5d8b8692b5d6f4a8273fee8e8b5411cab4481de1b0f602" + "bytes": 9206, + "sha256": "c87d86bd754b0c6d98971e0bae83b89bee33be1068f080b02ce897adbd22414e" }, { "path": "codegen/README.md", @@ -332,13 +332,13 @@ }, { "path": "crates/libremetaverse-imaging-skia/Cargo.toml", - "bytes": 1440, - "sha256": "0fb038f36280490487eb3f9e24176abd0f002504918b7bdac83ca319d92298e2" + "bytes": 1691, + "sha256": "013ba0f82c12f654d3b7d90aea4088eb5af0f888fc810736821b9dc9eef20d44" }, { "path": "crates/libremetaverse-imaging-skia/README.md", - "bytes": 3196, - "sha256": "8e1475598b33502d8b7de9528cf925919232dd57ad5c84cce9a382a9b5a22dc2" + "bytes": 6542, + "sha256": "9812fa5c5221497a9a3200564aa9d29425ec7f79ff0d2e3e86455c04cb1ff460" }, { "path": "crates/libremetaverse-imaging-skia/src/backend.rs", @@ -352,13 +352,123 @@ }, { "path": "crates/libremetaverse-imaging-skia/src/lib.rs", - "bytes": 811, - "sha256": "a180686de4aa47d167e61d1198676dd0fa817490669090b177fc9f662069803d" + "bytes": 1182, + "sha256": "8a8a49b2802b0012e0f4731c9a40bfa3c12784716ed2ddb17dad07ef8cd7a4f3" }, { "path": "crates/libremetaverse-imaging-skia/src/skia_codec.rs", - "bytes": 21674, - "sha256": "59215a746a0842609ba8a4c86dca0c09c38043a0ea832416159a2d555c612827" + "bytes": 52736, + "sha256": "373cb9c033dc1d2ea40cee19fc1212860882ac5f679b1952fd5b2ffd72b46809" + }, + { + "path": "crates/libremetaverse-imaging-skia/tests/fixtures/README.md", + "bytes": 1852, + "sha256": "d84610151dceba3012549a2b001d49cc4679e0160713dbcafc11f748f7b19edb" + }, + { + "path": "crates/libremetaverse-imaging-skia/tests/fixtures/alpha.webp.hex", + "bytes": 79, + "sha256": "f7e268437d69a569a27ee15fb3c1c21785afe27c4ad1f99fe63e362cf85af718" + }, + { + "path": "crates/libremetaverse-imaging-skia/tests/fixtures/animated.webp.hex", + "bytes": 692, + "sha256": "90accfdcb7c2548162d641990f9c7dc5276b81164137467b274b9ab65e12ec5c" + }, + { + "path": "crates/libremetaverse-imaging-skia/tests/fixtures/baseline.jpg.hex", + "bytes": 669, + "sha256": "c614e00c9ab1247ac4957dde699e62a82f61f1ea25bbd02a8f86dac27fc0f2c8" + }, + { + "path": "crates/libremetaverse-imaging-skia/tests/fixtures/bgrx32.bmp.hex", + "bytes": 126, + "sha256": "9cdb2db245a0d4ea5289c36e8ef3c55e8a1d9933b2854760dfc2b3474fbcd299" + }, + { + "path": "crates/libremetaverse-imaging-skia/tests/fixtures/bottom-up.bmp.hex", + "bytes": 502, + "sha256": "dc73f5816020b36c312b48d86afe4fac7bbe250ca4255f7a84b654cb610d7bf6" + }, + { + "path": "crates/libremetaverse-imaging-skia/tests/fixtures/gray-alpha.png.hex", + "bytes": 257, + "sha256": "ba2bd4b3ec1286aecfd33141474a2855d697ee88888881396e517a9fbfc1781e" + }, + { + "path": "crates/libremetaverse-imaging-skia/tests/fixtures/gray.png.hex", + "bytes": 281, + "sha256": "0122a5fb4c9ec3398056b74cf503492df06dea9b174abde61b05853eaf5d781f" + }, + { + "path": "crates/libremetaverse-imaging-skia/tests/fixtures/interlaced-palette.png.hex", + "bytes": 237, + "sha256": "d3e76f043e8da40cce95cfb75ac1d9a34a5dc6633b87258f62c77830c9c3d311" + }, + { + "path": "crates/libremetaverse-imaging-skia/tests/fixtures/lossy-red.webp.hex", + "bytes": 140, + "sha256": "5a31db73c00a7543b1831a8488c8c393c91042c35d10ee874ab2b91060524491" + }, + { + "path": "crates/libremetaverse-imaging-skia/tests/fixtures/multi.ico.hex", + "bytes": 284, + "sha256": "75f085b4a18c72fbf2404bd16c5d3c6ffce16e6e8823c7d5dd12f4aa54e4f179" + }, + { + "path": "crates/libremetaverse-imaging-skia/tests/fixtures/multibyte.wbmp.hex", + "bytes": 47, + "sha256": "fd1e97b193d36d1c4d5650b41081487d4ecacbfe0277d29e61a3c6dc9d9ce5e6" + }, + { + "path": "crates/libremetaverse-imaging-skia/tests/fixtures/palette-offset.gif.hex", + "bytes": 337, + "sha256": "b53f9756afa1a8409ba800fadc51113664210eda9d16afbbf4465a509c230cbd" + }, + { + "path": "crates/libremetaverse-imaging-skia/tests/fixtures/progressive.jpg.hex", + "bytes": 1566, + "sha256": "61244f0a07cdb9bf6908c8ec8f896e0a9a6385f65cffc5fb99407c772e3a4a5a" + }, + { + "path": "crates/libremetaverse-imaging-skia/tests/fixtures/rgb-lossless.webp.hex", + "bytes": 74, + "sha256": "e8ab53c5c310c356bccaf7f2baa40190ff39add1c68307fa816e769cfb044f61" + }, + { + "path": "crates/libremetaverse-imaging-skia/tests/fixtures/rgb.png.hex", + "bytes": 295, + "sha256": "1e5ec2ef16d17aa895651ae49a05e173fb631a8addf2400fa0376788f23e8656" + }, + { + "path": "crates/libremetaverse-imaging-skia/tests/fixtures/rgb555.bmp.hex", + "bytes": 118, + "sha256": "3e3fd2851ae755c990d9a3d0b2b48d47e67e76a812782cc1107feebb9a2bfca5" + }, + { + "path": "crates/libremetaverse-imaging-skia/tests/fixtures/rgba.png.hex", + "bytes": 375, + "sha256": "2f6af08ab8092a3705a7776727b2791be4a041ceacde64651993f4bb7e96eb04" + }, + { + "path": "crates/libremetaverse-imaging-skia/tests/fixtures/small.wbmp.hex", + "bytes": 13, + "sha256": "00625cd5781673ec81928d2c08a73516ba820fb46cfe155779c321335068ecab" + }, + { + "path": "crates/libremetaverse-imaging-skia/tests/fixtures/straight-alpha.png.hex", + "bytes": 362, + "sha256": "123f0a325427e2810c0544d3dc24e5943757a4f86f0e2892f10e7a974cc01156" + }, + { + "path": "crates/libremetaverse-imaging-skia/tests/fixtures/two-by-two-bottom-up.bmp.hex", + "bytes": 143, + "sha256": "be53e0cd06441f5795b11d1b517d1542459952d0aa464ec5c7f9d443a42111df" + }, + { + "path": "crates/libremetaverse-imaging-skia/tests/fixtures/two-by-two-top-down.bmp.hex", + "bytes": 143, + "sha256": "83bbf5c1c66e93c7aa413428d760230bca205eb4a1c4f3fc60f9fc63560c285f" }, { "path": "crates/libremetaverse-imaging/Cargo.toml", @@ -702,8 +812,8 @@ }, { "path": "crates/libremetaverse-types/Cargo.toml", - "bytes": 505, - "sha256": "674f227613ac9776f7ea09fb59a6504850830bd8bfc6e62e96ee691226635ae4" + "bytes": 837, + "sha256": "5751090243c10be962db766afa5bcede1074d6d63d3c715528f922bdc440e3e4" }, { "path": "crates/libremetaverse-types/benches/geometry.rs", @@ -892,8 +1002,8 @@ }, { "path": "crates/libremetaverse/README.md", - "bytes": 13059, - "sha256": "871b0b94073aafa46235bba7d150c13d4c4900da5e4e2d82201604365d2c5c40" + "bytes": 13123, + "sha256": "d0fa677f09dcc7e85f1b63e92cce6316e57103583916e166727d1e999173105a" }, { "path": "crates/libremetaverse/assets/avatar_lad.xml", @@ -1522,8 +1632,8 @@ }, { "path": "deny.toml", - "bytes": 2738, - "sha256": "2186fbadd60f11b672c47a916b89dcfc350c3ed922595d9ecf48346a0767f364" + "bytes": 3140, + "sha256": "aa3d63fd17c6647be6c4b2d6467ca6282de588a8253a9d6a938a432287a8f2eb" }, { "path": "docs/agent-manager.md", @@ -1582,8 +1692,8 @@ }, { "path": "docs/imaging-meshing.md", - "bytes": 3678, - "sha256": "c63e434d5181dc903c83f00c7649ee2040028c6d4bda698f57da8c1c3b1416c6" + "bytes": 3967, + "sha256": "a220d1d907a0359d6a82168dee121721895950bd86d2b0ea25f6e998bf5744f3" }, { "path": "docs/inventory.md", @@ -1612,8 +1722,8 @@ }, { "path": "docs/release-candidate.md", - "bytes": 4327, - "sha256": "20aa8c39de842ca1dee15808c44f1e71ee33441796b17d03feea8e14ef99165f" + "bytes": 4476, + "sha256": "25e5a581235539b9145a9030b9f3af9d78f6a22cfc7587b1090f8c19b8653e26" }, { "path": "docs/release-ci-matrix.md", @@ -1627,8 +1737,8 @@ }, { "path": "docs/rust-api-guide.md", - "bytes": 12058, - "sha256": "db4d0ee7986eebe9434e5c51ca65a31ffc3b32323240d9dc62cbd931b21b21b1" + "bytes": 12122, + "sha256": "25d2b333be7106c68bb9d6e1a8149d8abd333566c6705af7a9fb7e97ac7163e4" }, { "path": "docs/social.md", @@ -2517,8 +2627,8 @@ }, { "path": "tools/ci-matrix/src/api_surface.rs", - "bytes": 48586, - "sha256": "a82ac15da446f2f393ba267f8c7537d43cb4595a6be3e08f27d2f718e2aad4e8" + "bytes": 48993, + "sha256": "2c4248ca2cb16c9ae84e25af823f5a45a3f7840519baa8f08d85c67212df8b4e" }, { "path": "tools/ci-matrix/src/artifact.rs", @@ -2542,8 +2652,8 @@ }, { "path": "tools/ci-matrix/src/lib.rs", - "bytes": 21271, - "sha256": "53f4286d600c78d7a3ea593e7d663854e722787573dc5bbf3e48d41e28ac8267" + "bytes": 21338, + "sha256": "cd2d54c1ee8182843af43c271ff1592040c32de254d91bd146aeb822ae3a9a4e" }, { "path": "tools/ci-matrix/src/main.rs", @@ -2664,13 +2774,13 @@ "generated_release_files": [ { "path": "release/DEPENDENCY-LICENSES.json", - "bytes": 230084, - "sha256": "64ee30790d4b3b643514098184bf15b2e9901fe177333dbd7950b4311a47292e" + "bytes": 259721, + "sha256": "5f80b45ab18a45365673b55b52d68318bc31f602ce2f6559f573027cc446c58e" }, { "path": "release/THIRD-PARTY-NOTICES.md", - "bytes": 897381, - "sha256": "47d10a98d94bfe09124cbbfcf57f91a34231286aaec71a3265372ee9006d3eab" + "bytes": 980767, + "sha256": "c4d381944a9b57277963d2a5ee4e23a9a064c2ba93a676a49e023931b53a71d6" }, { "path": "release/NATIVE-LICENSES.md", diff --git a/release/THIRD-PARTY-NOTICES.md b/release/THIRD-PARTY-NOTICES.md index 7f6eff7..d76b189 100644 --- a/release/THIRD-PARTY-NOTICES.md +++ b/release/THIRD-PARTY-NOTICES.md @@ -13,6 +13,7 @@ This document must accompany source and binary distributions. A package's presen | `aes 0.8.4` | `MIT OR Apache-2.0` | `b169f7a6d4742236a0a00c541b845991d0ac43e546831af1249753ab4c3aa3a0` | `a9040321c3712d8fd0b09cf52b17445de04a23a10165049ae187cd39e5c86be5`
`f7e8ab639afef15573680c97f796166835cbeb3865175882fea41c60d106b733` | | `aes-gcm 0.10.3` | `Apache-2.0 OR MIT` | `831010a0f742e1209b3bcea8fab6a8e149051ba6099432c8cb2cc117dec3ead1` | `a9040321c3712d8fd0b09cf52b17445de04a23a10165049ae187cd39e5c86be5`
`3c0dfa33fd2e6976038555b52095699452653b1fcabe113074f14e0848a6b11e` | | `aho-corasick 1.1.5` | `Unlicense OR MIT` | `c982642fa9e8606056828ee9a8505737230110bb1099153c79efe865c59d12ba` | `01c266bced4a434da0051174d6bee16a4c82cf634e2679b6155d40d75012390f`
`0f96a83840e146e43c0ec96a22ec1f392e0680e6c1226e6f3ba87e0740af850f`
`7e12e5df4bae12cb21581ba157ced20e1986a0508dd10d0e8a4ab9a4cf94e85c` | +| `allocator-api2 0.2.21` | `MIT OR Apache-2.0` | `683d7910e743518b0e34f1186f92494becacb047c7b6bf616c96772180fef923` | `62c7a1e35f56406896d7aa7ca52d0cc0d272ac022b5d2796e7d6905db8a3636a`
`23f18e03dc49df91622fe2a76176497404e46ced8a715d9d2b67a7446571cca3` | | `alsa 0.11.0` | `Apache-2.0/MIT` | `812947049edcd670a82cd5c73c3661d2e58468577ba8489de58e1a73c04cbd5d` | `0d542e0c8804e39aa7f37eb00da5a762149dc682d7829451287e11b938e94594`
`3cc33f8e76680b9cba2e2a5bc94de5a92420045863ab2fadbef290a55b4d8530` | | `alsa-sys 0.4.0` | `MIT` | `ad7569085a265dd3f607ebecce7458eaab2132a84393534c95b18dcbc3f31e04` | `219766b3420f49f6204143c5f3ef750888fb6de29ce5f63e909f146e90b375a2` | | `android_system_properties 0.1.6` | `MIT OR Apache-2.0` | `ae221649c9976a6f6c56ae1facf410f3ddb33cc661c4b7b61020a912d4237fbc` | `216486f29671a4262efe32af6d84a75bef398127f8c5f369b5c8305983887a06`
`80f275e90d799911ed3830a7f242a2ef5a4ade2092fe0aa07bfb2d2cf2f2b95e` | @@ -22,6 +23,7 @@ This document must accompany source and binary distributions. A package's presen | `anstyle-query 1.1.5` | `MIT OR Apache-2.0` | `40c48f72fd53cd289104fc64099abca73db4166ad86ea0b4341abe65af83dadc` | `c6596eb7be8581c18be736c846fb9173b69eccf6ef94c5135893ec56bd92ba08`
`6efb0476a1cc085077ed49357026d8c173bf33017278ef440f222fb9cbcb66e6` | | `anstyle-wincon 3.0.11` | `MIT OR Apache-2.0` | `291e6a250ff86cd4a820112fb8898808a366d8f9f58ce16d1f538353ad55747d` | `c6596eb7be8581c18be736c846fb9173b69eccf6ef94c5135893ec56bd92ba08`
`6efb0476a1cc085077ed49357026d8c173bf33017278ef440f222fb9cbcb66e6` | | `aotuv_lancer_vorbis_sys 0.1.6` | `BSD-3-Clause` | `5bc4fd1a61860d2f1198b60bedd30910eaffa978f1ee6214dfb24ac70d589225` | `db8373b96caffc61198be37c43785776f781715905ae048cf209ad620102e0aa`
`d2ab5758336489da61c12cc5bb757da5339c4ae9001f9bb0562b4370249af814`
`0c72574d90753e1eda1f21a83c1a04990e67b26bb56e01acf3ce241140518156`
`1f6c6b6397d86d20968d7856d6945591b89e4cb64e5fc1ec8b992811f6a65ed8` | +| `approx 0.5.1` | `Apache-2.0` | `cab112f0a86d568ea0e627cc1d6be74a1e9cd55214684db5561995f6dad897c6` | `cfc7749b96f63bd31c3c42b5c471bf756814053e847c10f3eb003417bc523d30` | | `arrayvec 0.7.8` | `MIT OR Apache-2.0` | `d3fb67a6e08acf24fdeccbac2cb6ac4305825bd1f117462e0e6f2f193345ad56` | `a60eea817514531668d7e00765731449fe14d059d3249e0bc93b36de45f759f2`
`4da95ec4ecb65b738d470b7d762894ad9c97da93e6cbfb18b570fc2c96f4b871` | | `asn1-rs 0.7.2` | `MIT OR Apache-2.0` | `b7f43a50ac4fdca5df8e885c21b835997f0a1cdee65494a6847694a98652d9d8` | `a60eea817514531668d7e00765731449fe14d059d3249e0bc93b36de45f759f2`
`a5c61b93b6ee1d104af9920cf020ff3c7efe818e31fe562c72261847a728f513` | | `asn1-rs-derive 0.6.0` | `MIT OR Apache-2.0` | `3109e49b1e4909e9db6515a30c633684d68cdeaa252f215214cb4fa1a5bfee2c` | `a60eea817514531668d7e00765731449fe14d059d3249e0bc93b36de45f759f2`
`a5c61b93b6ee1d104af9920cf020ff3c7efe818e31fe562c72261847a728f513` | @@ -35,12 +37,19 @@ This document must accompany source and binary distributions. A package's presen | `base64ct 1.8.3` | `Apache-2.0 OR MIT` | `2af50177e190e07a26ab74f8b1efbfe2ef87da2116221318cb1c2e82baf7de06` | `a9040321c3712d8fd0b09cf52b17445de04a23a10165049ae187cd39e5c86be5`
`2d1c57bff28344b9e698f51063bc8509799cc4c99a4e0cf2aa3f7e7c3e1f9a9d` | | `bcdec_rs 0.2.0` | `MIT` | `f09c37bc0e9f0924b7dae9988265ef3c76c88538f41a3b06caf4bed07cee5226` | `6f2fe40bcbc6a19a321919911bd300056feb29bb4b0ceab7082b6039be3150ff` | | `bindgen 0.72.1` | `BSD-3-Clause` | `993776b509cfb49c750f11b8f07a46fa23e0a1386ffc01fb1e7d343efc387895` | `c23953d9deb0a3312dbeaf6c128a657f3591acee45067612fa68405eaa4525db` | +| `bit-set 0.8.0` | `Apache-2.0 OR MIT` | `08807e080ed7f9d5433fa9b275196cfc35414f66a0c79d864dc51a0d825231a3` | `8173d5c29b4f956d532781d2b86e4e30f83e6b7878dce18c919451d6ba707c90`
`f51ac2c59a222f7476ce507ca879960e2b64ea64bb2786eefdbeb7b0b538d1b7` | +| `bit-vec 0.8.0` | `Apache-2.0 OR MIT` | `5e764a1d40d510daf35e07be9eb06e75770908c27d411ee6c92109c9840eaaf7` | `8173d5c29b4f956d532781d2b86e4e30f83e6b7878dce18c919451d6ba707c90`
`f51ac2c59a222f7476ce507ca879960e2b64ea64bb2786eefdbeb7b0b538d1b7` | | `bit-vec 0.9.1` | `Apache-2.0 OR MIT` | `b71798fca2c1fe1086445a7258a4bc81e6e49dcd24c8d0dd9a1e57395b603f51` | `8173d5c29b4f956d532781d2b86e4e30f83e6b7878dce18c919451d6ba707c90`
`f51ac2c59a222f7476ce507ca879960e2b64ea64bb2786eefdbeb7b0b538d1b7` | +| `bitflags 1.3.2` | `MIT/Apache-2.0` | `bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a` | `a60eea817514531668d7e00765731449fe14d059d3249e0bc93b36de45f759f2`
`6485b8ed310d3f0340bf1ad1f47645069ce4069dcc6bb46c7d5c6faf41de1fdb` | | `bitflags 2.13.1` | `MIT OR Apache-2.0` | `b588b76d00fde79687d7646a9b5bdf3cc0f655e0bbd080335a95d7e96f3587da` | `a60eea817514531668d7e00765731449fe14d059d3249e0bc93b36de45f759f2`
`6485b8ed310d3f0340bf1ad1f47645069ce4069dcc6bb46c7d5c6faf41de1fdb` | | `block-buffer 0.10.4` | `MIT OR Apache-2.0` | `3078c7629b62d3f0439517fa394996acacc5cbc91c5a20d8c658e77abd503a71` | `a9040321c3712d8fd0b09cf52b17445de04a23a10165049ae187cd39e5c86be5`
`d5c22aa3118d240e877ad41c5d9fa232f9c77d757d4aac0c2f943afc0a95e0ef` | | `block-buffer 0.12.1` | `MIT OR Apache-2.0` | `d2f6c7dbe95a6ed67ad9f18e57daf93a2f034c524b99fd2b76d18fdfeb6660aa` | `a9040321c3712d8fd0b09cf52b17445de04a23a10165049ae187cd39e5c86be5`
`98181e7249d0c01737645ec982499ce99a0f07eb8f7d625b8840d799d10dbc01` | | `block2 0.6.2` | `MIT` | `cdeb9d870516001442e364c5220d3574d2da8dc765554b4a617230d33fa58ef5` | `475831d2d53152709a88c227624ba00e969be34ec17c5126465236de2b9fcad8`
`259b22f571b54fed25f68ec5abd8eda223e7b0547a806f13ba797a0eabecd64f`
`23d608079a47693a26dfc8a5cb01894ad0136a50714d46221d9380aa4a4b4423` | | `bumpalo 3.20.3` | `MIT OR Apache-2.0` | `72f5acc6cb2ba439de613abc23857ec3d78374d8ed5ac84e9d11336e87da8649` | `a60eea817514531668d7e00765731449fe14d059d3249e0bc93b36de45f759f2`
`65f94e99ddaf4f5d1782a6dae23f35d4293a9a01444a13135a6887017d353cee` | +| `bytemuck 1.25.2` | `Zlib OR Apache-2.0 OR MIT` | `95832e849adfb21180ccb6826a99da14e5d266ae5c2e668e1602cf234f153797` | `e3ba223bb1423f0aad8c3dfce0fe3148db48926d41e6fbc3afbbf5ff9e1c89cb`
`9df9ba60a11af705f2e451b53762686e615d86f76b169cf075c3237730dbd7e2`
`84b34dd7608f7fb9b17bd588a6bf392bf7de504e2716f024a77d89f1b145a151` | +| `bytemuck_derive 1.12.0` | `Zlib OR Apache-2.0 OR MIT` | `fc0e56a716f1e132ff6bf4bdac1c944a3fcdc1cae65f70a4a2a1ac3b401d2d1f` | `e3ba223bb1423f0aad8c3dfce0fe3148db48926d41e6fbc3afbbf5ff9e1c89cb`
`9df9ba60a11af705f2e451b53762686e615d86f76b169cf075c3237730dbd7e2`
`84b34dd7608f7fb9b17bd588a6bf392bf7de504e2716f024a77d89f1b145a151` | +| `byteorder 1.5.0` | `Unlicense OR MIT` | `1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b` | `01c266bced4a434da0051174d6bee16a4c82cf634e2679b6155d40d75012390f`
`0f96a83840e146e43c0ec96a22ec1f392e0680e6c1226e6f3ba87e0740af850f`
`7e12e5df4bae12cb21581ba157ced20e1986a0508dd10d0e8a4ab9a4cf94e85c` | +| `byteorder-lite 0.1.0` | `Unlicense OR MIT` | `8f1fe948ff07f4bd06c30984e69f5b4899c516a3ef74f34df92a2df2ab535495` | `0f96a83840e146e43c0ec96a22ec1f392e0680e6c1226e6f3ba87e0740af850f`
`7e12e5df4bae12cb21581ba157ced20e1986a0508dd10d0e8a4ab9a4cf94e85c` | | `bytes 1.12.1` | `MIT` | `fc652a48c352aef3ea3aed32080501cf3ef6ed5da78602a020c991775b0aff04` | `45f522cacecb1023856e46df79ca625dfc550c94910078bd8aec6e02880b3d42` | | `cc 1.4.2` | `MIT OR Apache-2.0` | `5d262e149917187838d5b42777c8253bcb64500067342904e7d429499a6f277e` | `a60eea817514531668d7e00765731449fe14d059d3249e0bc93b36de45f759f2`
`378f5840b258e2779c39418f3f2d7b2ba96f1c7917dd6be0713f88305dbda397` | | `ccm 0.5.0` | `Apache-2.0 OR MIT` | `9ae3c82e4355234767756212c570e29833699ab63e6ffd161887314cc5b43847` | `a9040321c3712d8fd0b09cf52b17445de04a23a10165049ae187cd39e5c86be5`
`904801faf3f1850328af8e1aa1047b9190cc22ed40df5c87f2d93d17f847ef67` | @@ -58,6 +67,8 @@ This document must accompany source and binary distributions. A package's presen | `clap_derive 4.6.4` | `MIT OR Apache-2.0` | `d012d2b9d65aca7f18f4d9878a045bc17899bba951561ba5ec3c2ba1eed9a061` | `c6596eb7be8581c18be736c846fb9173b69eccf6ef94c5135893ec56bd92ba08`
`6efb0476a1cc085077ed49357026d8c173bf33017278ef440f222fb9cbcb66e6` | | `clap_lex 1.1.0` | `MIT OR Apache-2.0` | `c8d4a3bb8b1e0c1050499d1815f5ab16d04f0959b233085fb31653fbfc9d98f9` | `c6596eb7be8581c18be736c846fb9173b69eccf6ef94c5135893ec56bd92ba08`
`6efb0476a1cc085077ed49357026d8c173bf33017278ef440f222fb9cbcb66e6` | | `cmake 0.1.58` | `MIT OR Apache-2.0` | `c0f78a02292a74a88ac736019ab962ece0bc380e3f977bf72e376c5d78ff0678` | `a60eea817514531668d7e00765731449fe14d059d3249e0bc93b36de45f759f2`
`378f5840b258e2779c39418f3f2d7b2ba96f1c7917dd6be0713f88305dbda397` | +| `codespan-reporting 0.11.1` | `Apache-2.0` | `3538270d33cc669650c4b093848450d380def10c331d38c768e34cac80576e6e` | `6bd99e2013ab763cfa6e15cc07619a8165efa3eff5419df83459486c3f9b1f01` | +| `color_quant 1.1.0` | `MIT` | `3d7b894f5411737b7867f4827955924d7c254fc9f4d91a6aad6b097804b1018b` | `592dc80f1a865d20d61a2006a2d29ce34a2bc28cd7e868ab300fdeed6da154ca` | | `colorchoice 1.0.5` | `MIT OR Apache-2.0` | `1d07550c9036bf2ae0c684c4297d503f838287c83c53686d05370d0e139ae570` | `c6596eb7be8581c18be736c846fb9173b69eccf6ef94c5135893ec56bd92ba08`
`6efb0476a1cc085077ed49357026d8c173bf33017278ef440f222fb9cbcb66e6` | | `combine 4.6.7` | `MIT` | `ba5a308b75df32fe02788e748662718f03fde005016435c444eea572398219fd` | `9bbc1b3dc4674a9ebb12c2a62f54fe3c08672539717f8d05828f684b6cc419a3` | | `const-oid 0.10.2` | `Apache-2.0 OR MIT` | `a6ef517f0926dd24a1582492c791b6a4818a4d94e789a334894aa15b0d12f55c` | `a9040321c3712d8fd0b09cf52b17445de04a23a10165049ae187cd39e5c86be5`
`73b9dc2e79c7308998dd30296e073aefaefb944a68fb89aa412c23c0edcabcaa` | @@ -92,12 +103,14 @@ This document must accompany source and binary distributions. A package's presen | `dispatch2 0.3.1` | `Zlib OR Apache-2.0 OR MIT` | `1e0e367e4e7da84520dedcac1901e4da967309406d1e51017ae1abfb97adbd38` | `d0a3dcd27a8687089ba6f0e28a072c1b6100d3e734f5ea057c37dba2e7b463e2` | | `displaydoc 0.2.7` | `MIT OR Apache-2.0` | `c6232dd377dcc64799954cbd3a9bb882e9cdc1308ccd87b1c098f1fb2eaf82a8` | `a60eea817514531668d7e00765731449fe14d059d3249e0bc93b36de45f759f2`
`23f18e03dc49df91622fe2a76176497404e46ced8a715d9d2b67a7446571cca3` | | `dunce 1.0.5` | `CC0-1.0 OR MIT-0 OR Apache-2.0` | `92773504d58c093f6de2459af4af33faa518c13451eb8f2b5698ed3d36e7c813` | `a2010f343487d3f7618affe54f789f5487602331c0a8d03f49e9a7c547cf0499` | +| `earcut 0.4.5` | `ISC` | `88459a2a8e3a514b6e6de38cf3aaa9250a894cb098f74a932db77fcc8341b6d0` | `1b5fd56a3c78a302a4bfe304cfcbce912938361f627c69a321220615c2d6b08d` | | `ecdsa 0.16.9` | `Apache-2.0 OR MIT` | `ee27f32b5c5292967d2d4a9d7f1e0b0aed2c15daded5a60300e4abb9d8020bca` | `78779d420019e6b4630376af8e86b6b335ee8a2f89ede6e0411e0469a326aaa4`
`bdebaf9156a298f8fdab56dd26cb5144673de522d80f4c0d88e0039145f147f9` | | `either 1.17.0` | `MIT OR Apache-2.0` | `9e5e8f6c15a24b9a3ee5efec809ccd006d3b30e8b3bb63c39af737c7f87daa1d` | `a60eea817514531668d7e00765731449fe14d059d3249e0bc93b36de45f759f2`
`7576269ea71f767b99297934c0b2367532690f8c4badc695edf8e04ab6a1e545` | | `elliptic-curve 0.13.8` | `Apache-2.0 OR MIT` | `b5e6043086bf7973472e0c7dff2142ea0b680d30e18d9cc40f267efbf222bd47` | `a9040321c3712d8fd0b09cf52b17445de04a23a10165049ae187cd39e5c86be5`
`d27687b51f2874822c1530976b7e837eac4f308d94bf3dd42047011b7d437b47` | | `equivalent 1.0.2` | `Apache-2.0 OR MIT` | `877a4ace8713b0bcf2a4e7eec82529c029f1d0619886d18145fea96c3ffe5c0f` | `a60eea817514531668d7e00765731449fe14d059d3249e0bc93b36de45f759f2`
`7365cc8878a1d7ce155a58c4ca09c3d7a6be413efa5334a80ea842912b669349` | | `errno 0.3.14` | `MIT OR Apache-2.0` | `39cab71617ae0d63f51a36d69f866391735b51691dbda63cf6f96d042b63efeb` | `a60eea817514531668d7e00765731449fe14d059d3249e0bc93b36de45f759f2`
`8764a597675778ddfd4e25f81b08a05dbcf089ac05662df7613fe67f150e3aa2` | | `fastrand 2.5.0` | `Apache-2.0 OR MIT` | `da7c62ceae207dd37ea5b845da6a0696c799f85e97da1ab5b7910be3c1c80223` | `a60eea817514531668d7e00765731449fe14d059d3249e0bc93b36de45f759f2`
`23f18e03dc49df91622fe2a76176497404e46ced8a715d9d2b67a7446571cca3` | +| `fdeflate 0.3.7` | `MIT OR Apache-2.0` | `1e6853b52649d4ac5c0bd02320cddc5ba956bdb407c4b75a2c6b75bf51500f8c` | `0d542e0c8804e39aa7f37eb00da5a762149dc682d7829451287e11b938e94594`
`c77a4cf9da729987d0fe7ccd811e3bd27393914ddf3d23467c18cc22954513b3` | | `fearless_simd 0.4.1` | `Apache-2.0 OR MIT` | `b97b65636e5b9ef369943878ac74335ba1c55c1cb6adbf1e2c293c624248d693` | `a6cba85bc92e0cff7a450b1d873c0eaa2e9fc96bf472df0247a26bec77bf3ff9`
`23c23145f6eac25c28cdcc03d38506a5712a9a8cffb5bd5301457f6173ea696e` | | `ff 0.13.1` | `MIT/Apache-2.0` | `c0b50bfb653653f9ca9095b427bed08ab8d75a137839d9ad64eb11810d5b6393` | `3708458dee7f359ac6c9c5558023ed481be87e5372c43ebd7f2ca7ad23c12026`
`8d0c1d1d4b2bebf5b9211f0e883d5a482b7808f3ed31320da14ddee95811f4ef` | | `fiat-crypto 0.2.9` | `MIT OR Apache-2.0 OR BSD-1-Clause` | `28dea519a9695b9977216879a3ebfddf92f1c08c05d984f8996aecd6ecdc811d` | `6c935d087a2992d0f092665400a2fa99c98db58d96fbe29368f8f48182bed9aa`
`9eacbcb81be660840c714a560a9d65ba07913db98dd4baf969f78dd499fdd60f`
`0c1240e29b4a2c528bcc3ccc38a98b1dba5e3e6b465da910208935f082e2ced6`
`0034712d5e97a4f5b900a160a5c19d582b740d8e0638b4e44fd07e7b492dcd13` | @@ -105,6 +118,8 @@ This document must accompany source and binary distributions. A package's presen | `find-msvc-tools 0.1.10` | `MIT OR Apache-2.0` | `26b73573e6edcd2af0cdf47bd6cb58f0b3839491263c314eaad1ccf24430e1de` | `a60eea817514531668d7e00765731449fe14d059d3249e0bc93b36de45f759f2`
`378f5840b258e2779c39418f3f2d7b2ba96f1c7917dd6be0713f88305dbda397` | | `flagset 0.4.7` | `Apache-2.0` | `b7ac824320a75a52197e8f2d787f6a38b6718bb6897a35142d749af3c0e8f4fe` | `cfc7749b96f63bd31c3c42b5c471bf756814053e847c10f3eb003417bc523d30` | | `flate2 1.1.9` | `MIT OR Apache-2.0` | `843fba2746e448b37e26a819579957415c8cef339bf08564fe8b7ddbd959573c` | `a60eea817514531668d7e00765731449fe14d059d3249e0bc93b36de45f759f2`
`025436edff4cfcdde17a5811fdea78892d8482efd1abdec5a17872d07a4f2112` | +| `float_next_after 2.0.0` | `MIT` | `37007738a80ea34f969af54a3390dd72cacdef654974cfd449c9f6f72dbaac10` | `0604d5817110dacc5c7d9b7de6b58b962794603d4823c357157bd5dec4198bc5` | +| `foldhash 0.2.0` | `Zlib` | `77ce24cb58228fbb8aa041425bb1050850ac19177686ea6e0f41a70416f56fdb` | `1d4c38d56650edc2c673cadbec74bec14db1fe8f2f10f4e3477dcbb49563be40` | | `form_urlencoded 1.2.2` | `MIT OR Apache-2.0` | `cb4cb245038516f5f85277875cdaa4f7d2c9a0fa0468de06ed190163b1581fcf` | `a60eea817514531668d7e00765731449fe14d059d3249e0bc93b36de45f759f2`
`20c7855c364d57ea4c97889a5e8d98470a9952dade37bd9248b9a54431670e5e` | | `fs_extra 1.3.0` | `MIT` | `42703706b716c37f96a77aea830392ad231f44c9e9a67872fa5548707e11b11c` | `251ea8ccb1205ce5fa847d6e264d6b6753af62de2cecf2fd9abc0eb02c7c83fc` | | `futures-channel 0.3.33` | `MIT OR Apache-2.0` | `262590f4fe6afeb0bc83be1daa64e52657fe185690a958af7f3ad0e92085c5ae` | `275c491d6d1160553c32fd6127061d7f9606c3ea25abfad6ca3f6ed088785427`
`6652c868f35dfe5e8ef636810a4e576b9d663f3a17fb0f5613ad73583e1b88fd` | @@ -115,15 +130,24 @@ This document must accompany source and binary distributions. A package's presen | `futures-task 0.3.33` | `MIT OR Apache-2.0` | `b231ed28831efb4a61a08580c4bc233ec56bc009f4cd8f52da2c3cb97df0c109` | `275c491d6d1160553c32fd6127061d7f9606c3ea25abfad6ca3f6ed088785427`
`6652c868f35dfe5e8ef636810a4e576b9d663f3a17fb0f5613ad73583e1b88fd` | | `futures-util 0.3.33` | `MIT OR Apache-2.0` | `a77a90a256fce34da66415271e30f94ee91c57b04b8a2c042d9cf3220179deaa` | `275c491d6d1160553c32fd6127061d7f9606c3ea25abfad6ca3f6ed088785427`
`6652c868f35dfe5e8ef636810a4e576b9d663f3a17fb0f5613ad73583e1b88fd` | | `generic-array 0.14.7` | `MIT` | `85649ca51fd72272d7821adaf274ad91c288277713d9c18820d8499a7ff69e9a` | `eb69613e00e596e13d2f58e820aee10e9d51754b91d7111bc997f1fc90791f66` | +| `geo 0.33.1` | `MIT OR Apache-2.0` | `30eb1fdc57c1e5cfd11826fe0caec4b9dc7901f3758263bb506228d88c8d9e9a` | `97d6f51e49f6670614703e0c99d7a04e409fc7bab1656a8f1753f8770b456c92`
`a60eea817514531668d7e00765731449fe14d059d3249e0bc93b36de45f759f2`
`2f8267b247fd81e9555a2e196e119a5b341bcae21011cd93985c312f1312f727` | +| `geo-types 0.7.20` | `MIT OR Apache-2.0` | `777d18aa0f12f8b285331cd867133ee14422b3f023f6d388034c47d43e28786a` | `a60eea817514531668d7e00765731449fe14d059d3249e0bc93b36de45f759f2`
`2f8267b247fd81e9555a2e196e119a5b341bcae21011cd93985c312f1312f727` | +| `geographiclib-rs 0.2.7` | `MIT` | `c5a7f08910fd98737a6eda7568e7c5e645093e073328eeef49758cfe8b0489c7` | `da3ece2d2daf5c812c8606d2922094f51818258d4ce0e041b4ee8409ba3b381f` | | `getrandom 0.2.17` | `MIT OR Apache-2.0` | `ff2abc00be7fca6ebc474524697ae276ad847ad0a6b3faa4bcb027e9a4614ad0` | `aaff376532ea30a0cd5330b9502ad4a4c8bf769c539c87ffe78819d188a18ebf`
`42fa16951ce7f24b5a467a40e5b449a1d41e662f97ca779864f053f39e097737` | | `getrandom 0.3.4` | `MIT OR Apache-2.0` | `899def5c37c4fd7b2664648c28120ecec138e4d395b459e5ca34f9cce2dd77fd` | `aaff376532ea30a0cd5330b9502ad4a4c8bf769c539c87ffe78819d188a18ebf`
`29e9fe5074bd27e0e5d5d110394fbbcd841baee2651a3c4b4560a632702cede4` | | `getrandom 0.4.3` | `MIT OR Apache-2.0` | `300e883d756b2e4ec94e02791f39b04b522276138852cfc41d9fb7e904106099` | `aaff376532ea30a0cd5330b9502ad4a4c8bf769c539c87ffe78819d188a18ebf`
`523a42c25d245dde9c015f882cec7f4555aad883382a6cf19b4b7d9b2cd5419b` | | `ghash 0.5.1` | `Apache-2.0 OR MIT` | `f0d8a4362ccb29cb0b265253fb0a2728f592895ee6854fd9bc13f2ffda266ff1` | `a9040321c3712d8fd0b09cf52b17445de04a23a10165049ae187cd39e5c86be5`
`c0fabcc308b450cb6fe62c9f56fae6abbeb9768eb80d992484c857d744846c2e` | +| `gif 0.13.3` | `MIT OR Apache-2.0` | `4ae047235e33e2829703574b54fdec96bfbad892062d97fed2f76022287de61b` | `a60eea817514531668d7e00765731449fe14d059d3249e0bc93b36de45f759f2`
`77257f3d2181236b1aee78920238062ae64efe13c5d858b2db126e79c9e1b14f` | +| `glam 0.29.3` | `MIT OR Apache-2.0` | `8babf46d4c1c9d92deac9f7be466f76dfc4482b6452fc5024b5e8daf6ffeb3ee` | `be33ddb87a30fd321ab100e2d922cba512e50ec7a63d8e62e5bfc0798dd4b585`
`23f18e03dc49df91622fe2a76176497404e46ced8a715d9d2b67a7446571cca3` | | `glob 0.3.4` | `MIT OR Apache-2.0` | `e4eba85ea1d0a966a983acd07deee566e67395d2d96b6fb39e62b5a833f1eb0b` | `a60eea817514531668d7e00765731449fe14d059d3249e0bc93b36de45f759f2`
`6485b8ed310d3f0340bf1ad1f47645069ce4069dcc6bb46c7d5c6faf41de1fdb` | | `goblin 0.10.5` | `MIT` | `983a6aafb3b12d4c41ea78d39e189af4298ce747353945ff5105b54a056e5cd9` | `655e3ee7a4c27430774962e62a6d37d7348e5f2f292010ad674ce1bebefd24bc` | | `group 0.13.0` | `MIT/Apache-2.0` | `f0f9ef7462f7c099f518d754361858f86d8a07af53ba9af0fe635bbccb151a63` | `7429802d3e67e3308471b91fbea341e484c4e0a23d0fb230a8636c38184cec79`
`a60eea817514531668d7e00765731449fe14d059d3249e0bc93b36de45f759f2`
`23f18e03dc49df91622fe2a76176497404e46ced8a715d9d2b67a7446571cca3` | +| `hash32 0.3.1` | `MIT OR Apache-2.0` | `47d60b12902ba28e2730cd37e95b8c9223af2808df9e902d4df49588d1470606` | `a60eea817514531668d7e00765731449fe14d059d3249e0bc93b36de45f759f2`
`c986bcdb83103d4ddf58aeb7b5302359782e54dc4eea14a0cc27c62dcbd50729` | +| `hashbrown 0.16.1` | `MIT OR Apache-2.0` | `841d1cc9bed7f9236f321df977030373f4a4163ae1a7dbfe1a51a2c1a51d9100` | `a60eea817514531668d7e00765731449fe14d059d3249e0bc93b36de45f759f2`
`ff8f68cb076caf8cefe7a6430d4ac086ce6af2ca8ce2c4e5a2004d4552ef52a2` | | `hashbrown 0.17.1` | `MIT OR Apache-2.0` | `ed5909b6e89a2db4456e54cd5f673791d7eca6732202bbf2a9cc504fe2f9b84a` | `a60eea817514531668d7e00765731449fe14d059d3249e0bc93b36de45f759f2`
`ff8f68cb076caf8cefe7a6430d4ac086ce6af2ca8ce2c4e5a2004d4552ef52a2` | +| `heapless 0.8.0` | `MIT OR Apache-2.0` | `0bfb9eb618601c89945a70e254898da93b13be0388091d42117462b265bb3fad` | `a60eea817514531668d7e00765731449fe14d059d3249e0bc93b36de45f759f2`
`035e70219855119df4273b3c5b97543ae82e0dd60c520416e759107c602f651b` | | `heck 0.5.0` | `MIT OR Apache-2.0` | `2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea` | `a60eea817514531668d7e00765731449fe14d059d3249e0bc93b36de45f759f2`
`7b63ecd5f1902af1b63729947373683c32745c16a10e8e6292e2e2dcd7e90ae0` | +| `hexf-parse 0.2.1` | `CC0-1.0` | `dfa686283ad6dd069f105e5ab091b04c62850d3e4cf5d67debad1933f55023df` | `0e1a61da1582431a552744e844c6f081c613b202c69badec6362ea0f61039510` | | `hkdf 0.12.4` | `MIT OR Apache-2.0` | `7b5f8eb2ad728638ea2c7d47a21db23b7b58a72ed6a38256b8a1849f15fbbdf7` | `a9040321c3712d8fd0b09cf52b17445de04a23a10165049ae187cd39e5c86be5`
`d288f9c9b4590446ec18c22ead8f8b5a12a3d4025b68f62dc9015063eb9cca69` | | `hmac 0.12.1` | `MIT OR Apache-2.0` | `6c49c37c09c17a53d937dfbb742eb3a961d65a994e6bcdcf37e7399d0cc8ab5e` | `a9040321c3712d8fd0b09cf52b17445de04a23a10165049ae187cd39e5c86be5`
`9e0dfd2dd4173a530e238cb6adb37aa78c34c6bc7444e0e10c1ab5d8881f63ba` | | `hound 3.5.1` | `Apache-2.0` | `62adaabb884c94955b19907d60019f4e145d091c75345379e70d1ee696f7854f` | `cfc7749b96f63bd31c3c42b5c471bf756814053e847c10f3eb003417bc523d30` | @@ -135,6 +159,11 @@ This document must accompany source and binary distributions. A package's presen | `hyper 1.11.0` | `MIT` | `d22053281f852e11534f5198498373cbb59295120a20771d90f7ed1897490a72` | `2d01890414494742ba4a509fcec8efa40f6d8be22cbd72be7cff08d6fda4ec89` | | `hyper-rustls 0.27.9` | `Apache-2.0 OR ISC OR MIT` | `33ca68d021ef39cf6463ab54c1d0f5daf03377b70561305bb89a8f83aab66e0f` | `a60eea817514531668d7e00765731449fe14d059d3249e0bc93b36de45f759f2`
`7cfafc877eccc46c0e346ccbaa5c51bb6b894d2b818e617d970211e232785ad4`
`709e3175b4212f7b13aa93971c9f62ff8c69ec45ad8c6532a7e0c41d7a7d6f8c` | | `hyper-util 0.1.20` | `MIT` | `96547c2556ec9d12fb1578c4eaf448b04993e7fb79cbaad930a656880a6bdfa0` | `9e0a97848ea543aef745c98e84fde696a9a3e0735538f6daefdd3cb1942effc1` | +| `i_float 1.16.0` | `MIT` | `813145bb0ad5b60f55cbbf3c74cdceda1c0a9d253b35c4cc36ae0df7887cb78f` | `260cc580f53a756821a0f35475e2cd6da790f8fed0efc058252fe1bed8f2689e` | +| `i_key_sort 0.10.3` | `MIT` | `d73d122b937fca067feb0ad74f62388920272b27c356d4df2d0cfdd59e044cf0` | `abad130a74eb590181d6cae3217337e94716394b1db11b7faa1dcde7a1095777` | +| `i_overlay 4.5.2` | `MIT OR Apache-2.0` | `8dd314b4668e2b3a12508f2e125558c82a6c0a8636fa5107a900f79ce414e450` | `c191998f5f595cf7d49a23cfd29b6d85b220e1d6f854b92f4c0f1ffa79d90a29` | +| `i_shape 1.18.0` | `MIT` | `bfa9eac533d7509a8ab87672b60ac610c17240f9ea4851d26227689fdfe349c8` | `260cc580f53a756821a0f35475e2cd6da790f8fed0efc058252fe1bed8f2689e` | +| `i_tree 0.18.0` | `MIT` | `4804bdc1dc124eb7e1aa9e144ecc04096bcf787a10a15fa44af682b51f0f6cce` | `47e00f18b265d350a2860d3899f17dd1c7689b966545e929df8ffa7033f5acdc` | | `icu_collections 2.2.0` | `Unicode-3.0` | `2984d1cd16c883d7935b9e07e44071dca8d917fd52ecc02c04d5fa0b5a3f191c` | `f367c1b8e1aa262435251e442901da4607b4650e0e63a026f5044473ecfb90f2` | | `icu_locale_core 2.2.0` | `Unicode-3.0` | `92219b62b3e2b4d88ac5119f8904c10f8f61bf7e95b640d25ba3075e6cac2c29` | `f367c1b8e1aa262435251e442901da4607b4650e0e63a026f5044473ecfb90f2` | | `icu_normalizer 2.2.0` | `Unicode-3.0` | `c56e5ee99d6e3d33bd91c5d85458b6005a22140021cc324cea84dd0e72cff3b4` | `f367c1b8e1aa262435251e442901da4607b4650e0e63a026f5044473ecfb90f2` | @@ -144,6 +173,7 @@ This document must accompany source and binary distributions. A package's presen | `icu_provider 2.2.0` | `Unicode-3.0` | `139c4cf31c8b5f33d7e199446eff9c1e02decfc2f0eec2c8d71f65befa45b421` | `f367c1b8e1aa262435251e442901da4607b4650e0e63a026f5044473ecfb90f2` | | `idna 1.1.0` | `MIT OR Apache-2.0` | `3b0875f23caa03898994f6ddc501886a45c7d3d62d04d2d90788d47be1b1e4de` | `a60eea817514531668d7e00765731449fe14d059d3249e0bc93b36de45f759f2`
`b38f11f6096706e6de553dabe2a7ed142d59b6fa8c97e290c67496154745cdd5` | | `idna_adapter 1.2.2` | `Apache-2.0 OR MIT` | `cb68373c0d6620ef8105e855e7745e18b0d00d3bdb07fb532e434244cdb9a714` | `a60eea817514531668d7e00765731449fe14d059d3249e0bc93b36de45f759f2`
`8b43ce8accd61e9d370b5ca9e9c4f953279b5c239926c62315b40e24df51b726` | +| `image-webp 0.2.4` | `MIT OR Apache-2.0` | `525e9ff3e1a4be2fbea1fdf0e98686a6d98b4d8f937e1bf7402245af1909e8c3` | `0d542e0c8804e39aa7f37eb00da5a762149dc682d7829451287e11b938e94594`
`c77a4cf9da729987d0fe7ccd811e3bd27393914ddf3d23467c18cc22954513b3` | | `indexmap 2.14.0` | `Apache-2.0 OR MIT` | `d466e9454f08e4a911e14806c24e16fba1b4c121d1ea474396f396069cf949d9` | `a60eea817514531668d7e00765731449fe14d059d3249e0bc93b36de45f759f2`
`ecc269ef87fd38a1d98e30bfac9ba964a9dbd9315c3770fed98d4d7cb5882055` | | `inout 0.1.4` | `MIT OR Apache-2.0` | `879f10e63c20629ecabbb64a8010319738c66a5cd0c29b02d63d272b03751d01` | `a9040321c3712d8fd0b09cf52b17445de04a23a10165049ae187cd39e5c86be5`
`304b898acad7f02e03d6d8832d682a3b43ee729ab5d3a069af5a36979083b6b4` | | `ipnet 2.12.1` | `MIT OR Apache-2.0` | `6a756c3fac73139e83f14c2d742155dd2b78d3ee56597b419a0579b7bdd6dd78` | `87d9feb9238c6bd8e0024fc4733b06cff036f89f36d93b7df1c8a0549bbb7a5b`
`47dc9ff29128ddfb4d6a0435383c9f89120bc374dbcc1dd00b933a0b28aa7865` | @@ -163,6 +193,8 @@ This document must accompany source and binary distributions. A package's presen | `jni-sys 0.4.1` | `MIT OR Apache-2.0` | `c6377a88cb3910bee9b0fa88d4f42e1d2da8e79915598f65fb0c7ee14c878af2` | `c6596eb7be8581c18be736c846fb9173b69eccf6ef94c5135893ec56bd92ba08`
`1d85bd754b04ceec93e98e890edd1fa3c6a22e81bcb32135806beeccefa51cd1` | | `jni-sys-macros 0.4.1` | `MIT OR Apache-2.0` | `38c0b942f458fe50cdac086d2f946512305e5631e720728f2a61aabcd47a6264` | `1bd33be6fcbbcc6d585c6778a41b21ea8ac3da5e441ac1ac72aba11ca77ae9a8`
`c6596eb7be8581c18be736c846fb9173b69eccf6ef94c5135893ec56bd92ba08`
`1d85bd754b04ceec93e98e890edd1fa3c6a22e81bcb32135806beeccefa51cd1` | | `jobserver 0.1.35` | `MIT OR Apache-2.0` | `1c00acbd29eabad4a2392fa0e921c874934dbbf4194312ad20f04a0ed67a3cb3` | `a60eea817514531668d7e00765731449fe14d059d3249e0bc93b36de45f759f2`
`378f5840b258e2779c39418f3f2d7b2ba96f1c7917dd6be0713f88305dbda397` | +| `jpeg-decoder 0.3.2` | `MIT OR Apache-2.0` | `00810f1d8b74be64b13dbf3db89ac67740615d6c891f0e7b6179326533011a07` | `a60eea817514531668d7e00765731449fe14d059d3249e0bc93b36de45f759f2`
`22b83fb92a50418c7df9564b9c179fa2a0e74f293bc58b72dd7e218fc0902143` | +| `jpeg-encoder 0.6.1` | `(MIT OR Apache-2.0) AND IJG` | `b454d911ac55068f53495488d8ccd0646eaa540c033a28ee15b07838afafb01f` | `965a63a81d9a2fbeb5f9096954dabb49690f9dffcdac9825f675b25c807252a2`
`0ecd43cdff2dc2be0deda2116cc00cd9a960930fa7310d02b6379c6ad2319a48` | | `js-sys 0.3.104` | `MIT OR Apache-2.0` | `0e0c1080212aad755ea003d18543e8768dd432c48819efd73a7bf1e39b7a5a3a` | `a60eea817514531668d7e00765731449fe14d059d3249e0bc93b36de45f759f2`
`378f5840b258e2779c39418f3f2d7b2ba96f1c7917dd6be0713f88305dbda397` | | `lazy_static 1.5.0` | `MIT OR Apache-2.0` | `bbd2bcb4c963f2ddae06a2efc7e9f3591312473c50c6685e1f298068316e66fe` | `a60eea817514531668d7e00765731449fe14d059d3249e0bc93b36de45f759f2`
`0621878e61f0d0fda054bcbe02df75192c28bde1ecc8289cbd86aeba2dd72720` | | `libc 0.2.189` | `MIT OR Apache-2.0` | `3eaf3ede3fee6db1a4c2ee091bf8a8b4dccdc6d17f656fb07896ee72867612f2` | `62c7a1e35f56406896d7aa7ca52d0cc0d272ac022b5d2796e7d6905db8a3636a`
`123a331b5dbf04c30097fa43b8f858bc85df671fe776de498d01f3d6b7c1f69e` | @@ -170,6 +202,7 @@ This document must accompany source and binary distributions. A package's presen | `libm 0.2.16` | `MIT` | `b6d2cec3eae94f9f509c767b45932f1ada8350c4bdb85af2fcab4a3c14807981` | `3823dda7cf046602f4b4e77ec8e227863dc4736037cc85bb33d9f19febe16bb7` | | `linux-raw-sys 0.12.1` | `Apache-2.0 WITH LLVM-exception OR Apache-2.0 OR MIT` | `32a66949e030da00e8c7d4434b251670a91556f4144941d37452769c25d58a53` | `3290ae0fbc9ddb77d2239121d710f0bb9d31b3b4744e6d97fe01e652b4c1870b`
`a60eea817514531668d7e00765731449fe14d059d3249e0bc93b36de45f759f2`
`268872b9816f90fd8e85db5a28d33f8150ebb8dd016653fb39ef1f94f2686bc5`
`23f18e03dc49df91622fe2a76176497404e46ced8a715d9d2b67a7446571cca3` | | `litemap 0.8.2` | `Unicode-3.0` | `92daf443525c4cce67b150400bc2316076100ce0b3686209eb8cf3c31612e6f0` | `f367c1b8e1aa262435251e442901da4607b4650e0e63a026f5044473ecfb90f2` | +| `lock_api 0.4.14` | `MIT OR Apache-2.0` | `224399e74b87b5f3557511d98dff8b14089b3dadafcab6bb93eab67d3aace965` | `a60eea817514531668d7e00765731449fe14d059d3249e0bc93b36de45f759f2`
`c9a75f18b9ab2927829a208fc6aa2cf4e63b8420887ba29cdb265d6619ae82d5` | | `log 0.4.33` | `MIT OR Apache-2.0` | `0ceec5bc11778974d1bcb055b18002eba7f4b3518b6a0081b3af5f21666da9ad` | `a60eea817514531668d7e00765731449fe14d059d3249e0bc93b36de45f759f2`
`6485b8ed310d3f0340bf1ad1f47645069ce4069dcc6bb46c7d5c6faf41de1fdb` | | `lru-slab 0.1.2` | `MIT OR Apache-2.0 OR Zlib` | `112b39cec0b298b6c1999fee3e31427f74f676e4cb9879ed1a121b43661a4154` | `cfc7749b96f63bd31c3c42b5c471bf756814053e847c10f3eb003417bc523d30`
`1466d9b4f3a59bb8997fc8d5fa977ce3f6a24bb2358793c09bfdf007039f6486`
`09785877275ffada6c371b652a30e95c26b435126fc0fc62f1bc2d72171f80a4` | | `mac_address2 2.0.2` | `MIT OR Apache-2.0` | `dc5e04aa39a4dc96076bca67bf60b63201ff06f9568e62f7904293d39de8cb0b` | `c93a7014a32c88c71551bd6fb4cae8cc9445c237d7e4a0774d4fc5e06089dbd9`
`5cd10983d9e5cc6772b4440805a8a9283c0df34e41ff3c951c0eaefc76d687cb` | @@ -181,6 +214,7 @@ This document must accompany source and binary distributions. A package's presen | `miniz_oxide 0.8.9` | `MIT OR Zlib OR Apache-2.0` | `1fa76a2c86f704bdb222d66965fb3d63269ce38518b83cb0575fca855ebb6316` | `4108245a1f2df9d4e94df8abed5b4ba0759bb2f9b40a6b939f1be141077ae50b`
`0d542e0c8804e39aa7f37eb00da5a762149dc682d7829451287e11b938e94594`
`799e9ca9d179295ef372f25d3769cdda7d25bb2668add6a6a1e22d1e4c678b8d`
`0a54e647fe54104658b5e563c04c6f9edf251710e47bce692e0bd990a4ddaa39` | | `mio 1.2.2` | `MIT` | `30d65c71f1ce40ab09135ce117d742b9f8a19ff91a41a8b57ed50bc2de59c427` | `07919255c7e04793d8ea760d6c2ce32d19f9ff02bdbdde3ce90b1e1880929a9b` | | `moxcms 0.8.1` | `BSD-3-Clause OR Apache-2.0` | `bb85c154ba489f01b25c0d36ae69a87e4a1c73a72631fc6c0eb6dde34a73e44b` | `90bf2d659c43045111b65c733ab2a6d4cbcb422a098368c8c58a9ba3db4ed0c5`
`4b6c5ac5c550bea22b1d6455684b21d94ca96f3bcbbc2840b793180707ed582a` | +| `naga 23.1.0` | `MIT OR Apache-2.0` | `364f94bc34f61332abebe8cad6f6cd82a5b65cff22c828d05d0968911462ca4f` | `5f86f67a1adc668035f88a708c7355d28a9998612afa6647e07a1f33075c23eb` | | `ndk 0.9.0` | `MIT OR Apache-2.0` | `c3f42e7bbe13d351b6bead8286a43aac9534b82bd3cc43e47037f012ebfd62d4` | `1045ccac6de004bc43d922d1b7d4324f4f90c5ae006af8b318616e347bcd2be0` | | `ndk-context 0.1.1` | `MIT OR Apache-2.0` | `27b02d87554356db9e9a873add8782d4ea6e3e58ea071a9adb9a2e8ddb884a8b` | `0671f66ca6d381f4794b036bdcf52664ff1d34ea8a7a8df620de6028bf5a9eaa` | | `ndk-sys 0.6.0+11769913` | `MIT OR Apache-2.0` | `ee6cda3051665f1fb8d9e08fc35c96d5a244fb1be711a03b71118828afc9a873` | `e793fe782da312560decac8e8d8d98e1a62cf0d2dcdbd4c72ae4e3aba0b0f54e` | @@ -222,12 +256,15 @@ This document must accompany source and binary distributions. A package's presen | `os_info 3.15.0` | `MIT` | `9cf20a545b305cf1da722b236b5155c9bb35f1d5ceb28c048bd96ca842f41b5b` | `44b62aa8f8a212f36d120a4f719438765020731207fd78bf28768032291df836` | | `p256 0.13.2` | `Apache-2.0 OR MIT` | `c9863ad85fa8f4460f9c48cb909d38a0d689dba1f6f6988a5e3e0d31071bcd4b` | `a9040321c3712d8fd0b09cf52b17445de04a23a10165049ae187cd39e5c86be5`
`233b95ccbf90dc67e32f3e8995c489f6312d9191ebd141a931c3b684f1e3be6d` | | `p384 0.13.1` | `Apache-2.0 OR MIT` | `fe42f1670a52a47d448f14b6a5c61dd78fce51856e68edaa38f7ae3a46b8d6b6` | `a9040321c3712d8fd0b09cf52b17445de04a23a10165049ae187cd39e5c86be5`
`02168781a5b59970e3da1784d2eb69f432598a3757f283dbffdafd9d483a9113` | +| `parking_lot 0.12.5` | `MIT OR Apache-2.0` | `93857453250e3077bd71ff98b6a65ea6621a19bb0f559a85248955ac12c45a1a` | `a60eea817514531668d7e00765731449fe14d059d3249e0bc93b36de45f759f2`
`c9a75f18b9ab2927829a208fc6aa2cf4e63b8420887ba29cdb265d6619ae82d5` | +| `parking_lot_core 0.9.12` | `MIT OR Apache-2.0` | `2621685985a2ebf1c516881c026032ac7deafcda1a2c9b7850dc81e3dfcb64c1` | `a60eea817514531668d7e00765731449fe14d059d3249e0bc93b36de45f759f2`
`c9a75f18b9ab2927829a208fc6aa2cf4e63b8420887ba29cdb265d6619ae82d5` | | `pem-rfc7468 0.7.0` | `Apache-2.0 OR MIT` | `88b39c9bfcfc231068454382784bb460aae594343fb030d46e9f50a645418412` | `a9040321c3712d8fd0b09cf52b17445de04a23a10165049ae187cd39e5c86be5`
`90c503b61dee04e1449c323ec34c229dfb68d7adcb96c7e140ee55f70fce2d8e` | | `percent-encoding 2.3.2` | `MIT OR Apache-2.0` | `9b4f627cb1b25917193a259e49bdad08f671f8d9708acfd5fe0a8c1455d87220` | `a60eea817514531668d7e00765731449fe14d059d3249e0bc93b36de45f759f2`
`b38f11f6096706e6de553dabe2a7ed142d59b6fa8c97e290c67496154745cdd5` | | `pin-project-lite 0.2.17` | `Apache-2.0 OR MIT` | `a89322df9ebe1c1578d689c92318e070967d1042b512afbe49518723f4e6d5cd` | `0d542e0c8804e39aa7f37eb00da5a762149dc682d7829451287e11b938e94594`
`23f18e03dc49df91622fe2a76176497404e46ced8a715d9d2b67a7446571cca3` | | `pkcs8 0.10.2` | `Apache-2.0 OR MIT` | `f950b2377845cebe5cf8b5165cb3cc1a5e0fa5cfa3e1f7f55707d8fd82e0a7b7` | `a9040321c3712d8fd0b09cf52b17445de04a23a10165049ae187cd39e5c86be5`
`ad64fcb9589f162720f3cc5010ad76ca6ad3764e11861f9192c489df176bb71d` | | `pkg-config 0.3.33` | `MIT OR Apache-2.0` | `19f132c84eca552bf34cab8ec81f1c1dcc229b811638f9d283dceabe58c5569e` | `a60eea817514531668d7e00765731449fe14d059d3249e0bc93b36de45f759f2`
`378f5840b258e2779c39418f3f2d7b2ba96f1c7917dd6be0713f88305dbda397` | | `plain 0.2.3` | `MIT/Apache-2.0` | `b4596b6d070b27117e987119b4dac604f3c58cfb0b191112e24771b2faeac1a6` | `a60eea817514531668d7e00765731449fe14d059d3249e0bc93b36de45f759f2`
`bc12b75fd81829814d843a03fa52aad0e53355b1f13665e309ff7fa33c66e5b5` | +| `png 0.17.16` | `MIT OR Apache-2.0` | `82151a2fc869e011c153adc57cf2789ccb8d9906ce52c0b39a6b5697749d7526` | `a60eea817514531668d7e00765731449fe14d059d3249e0bc93b36de45f759f2`
`eaf40297c75da471f7cda1f3458e8d91b4b2ec866e609527a13acfa93b638652` | | `poly1305 0.8.0` | `Apache-2.0 OR MIT` | `8159bd90725d2df49889a078b54f4f79e87f1f8a8444194cdca81d38f5393abf` | `a9040321c3712d8fd0b09cf52b17445de04a23a10165049ae187cd39e5c86be5`
`6d99fffea918d1f7dfe567029c7bd21d6fcaf310ad28c44e6511a0e1f68c79ea` | | `polyval 0.6.2` | `Apache-2.0 OR MIT` | `9d1fe60d06143b2430aa532c94cfe9e29783047f06c0d7fd359a9a51b729fa25` | `a9040321c3712d8fd0b09cf52b17445de04a23a10165049ae187cd39e5c86be5`
`a291b6910744d262a9e953c3b5868d74510e20161359f649a11e1791fde84fcd` | | `potential_utf 0.1.5` | `Unicode-3.0` | `0103b1cef7ec0cf76490e969665504990193874ea05c85ff9bab8b911d0a0564` | `f367c1b8e1aa262435251e442901da4607b4650e0e63a026f5044473ecfb90f2` | @@ -238,6 +275,7 @@ This document must accompany source and binary distributions. A package's presen | `proc-macro-crate 3.5.0` | `MIT OR Apache-2.0` | `e67ba7e9b2b56446f1d419b1d807906278ffa1a658a8a5d8a39dcb1f5a78614f` | `8ada45cd9f843acf64e4722ae262c622a2b3b3007c7310ef36ac1061a30f6adb`
`23f18e03dc49df91622fe2a76176497404e46ced8a715d9d2b67a7446571cca3` | | `proc-macro2 1.0.107` | `MIT OR Apache-2.0` | `985e7ec9bb745e6ce6535b544d84d6cd6f7ad8bd711c398938ae983b91a766d9` | `62c7a1e35f56406896d7aa7ca52d0cc0d272ac022b5d2796e7d6905db8a3636a`
`23f18e03dc49df91622fe2a76176497404e46ced8a715d9d2b67a7446571cca3` | | `pxfm 0.1.30` | `BSD-3-Clause OR Apache-2.0` | `d55d956fa96f5ec02be2e13af0e20391a5aa83d6a074e3ad368959d0fab299ea` | `90bf2d659c43045111b65c733ab2a6d4cbcb422a098368c8c58a9ba3db4ed0c5`
`4b6c5ac5c550bea22b1d6455684b21d94ca96f3bcbbc2840b793180707ed582a` | +| `quick-error 2.0.1` | `MIT/Apache-2.0` | `a993555f31e5a609f617c12db6250dedcac1b0a85076912c436e6fc9b2c8e6a3` | `c6596eb7be8581c18be736c846fb9173b69eccf6ef94c5135893ec56bd92ba08`
`058f01fe181608d027fcde7e528fc03ea3cf90f30903c407644b0a9bbc54f500` | | `quinn 0.11.11` | `MIT OR Apache-2.0` | `0c1a41e437b6bbd489372cd4971de128e85c855f56c57f283d20ff016cf7c0a8` | `c71d239df91726fc519c6eb72d318ec65820627232b2f796219e87dcf35d0ab4`
`4b2d0aca6789fa39e03d6738e869ea0988cceba210ca34ebb59c15c463e93a04` | | `quinn-proto 0.11.16` | `MIT OR Apache-2.0` | `2f4bfc015262b9df63c8845072ce59068853ff5872180c2ce2f13038b970e560` | `c71d239df91726fc519c6eb72d318ec65820627232b2f796219e87dcf35d0ab4`
`4b2d0aca6789fa39e03d6738e869ea0988cceba210ca34ebb59c15c463e93a04` | | `quinn-udp 0.5.15` | `MIT OR Apache-2.0` | `35a133f956daabe89a61a685c2649f13d82d5aa4bd5d12d1277e1072a21c0694` | `c71d239df91726fc519c6eb72d318ec65820627232b2f796219e87dcf35d0ab4`
`4b2d0aca6789fa39e03d6738e869ea0988cceba210ca34ebb59c15c463e93a04` | @@ -254,13 +292,17 @@ This document must accompany source and binary distributions. A package's presen | `rayon 1.12.0` | `MIT OR Apache-2.0` | `fb39b166781f92d482534ef4b4b1b2568f42613b53e5b6c160e24cfbfa30926d` | `a60eea817514531668d7e00765731449fe14d059d3249e0bc93b36de45f759f2`
`0621878e61f0d0fda054bcbe02df75192c28bde1ecc8289cbd86aeba2dd72720` | | `rayon-core 1.13.0` | `MIT OR Apache-2.0` | `22e18b0f0062d30d4230b2e85ff77fdfe4326feb054b9783a3460d8435c8ab91` | `a60eea817514531668d7e00765731449fe14d059d3249e0bc93b36de45f759f2`
`0621878e61f0d0fda054bcbe02df75192c28bde1ecc8289cbd86aeba2dd72720` | | `rcgen 0.14.9` | `MIT OR Apache-2.0` | `091e7a8e7d86e6feb87a27ce8e2cba29d49eff9507afeebefab7eeb2ca667fb4` | `debe6fed7ac143217c7f533759c54b14f18cd01d5fe195c51d83c2ae2d136cb4` | +| `redox_syscall 0.5.18` | `MIT` | `ed2bf2547551a7053d6fdfafda3f938979645c44812fbfcda098faae3f1a362d` | `efcfee7981ff72431fffb06925cad00a23dce079ed4354f61030ad5abdb78829` | | `regex 1.13.1` | `MIT OR Apache-2.0` | `f020237b6c8eed93db2e2cb53c00c60a8e1bc73da7d073199a1180401450218d` | `a60eea817514531668d7e00765731449fe14d059d3249e0bc93b36de45f759f2`
`6485b8ed310d3f0340bf1ad1f47645069ce4069dcc6bb46c7d5c6faf41de1fdb` | | `regex-automata 0.4.18` | `MIT OR Apache-2.0` | `ad8553b9b26413251cbf30e620595c7a41b3887f03da04579c0e6b0d6a06b4b2` | `a60eea817514531668d7e00765731449fe14d059d3249e0bc93b36de45f759f2`
`6485b8ed310d3f0340bf1ad1f47645069ce4069dcc6bb46c7d5c6faf41de1fdb` | | `regex-syntax 0.8.11` | `MIT OR Apache-2.0` | `d6f6ff9a378485b298a5286656da665ba74413d36db0979633275d2e708145d4` | `a60eea817514531668d7e00765731449fe14d059d3249e0bc93b36de45f759f2`
`6485b8ed310d3f0340bf1ad1f47645069ce4069dcc6bb46c7d5c6faf41de1fdb`
`74db5baf44a41b1000312c673544b3374e4198af5605c7f9080a402cec42cfa3` | | `reqwest 0.13.4` | `MIT OR Apache-2.0` | `219c5811de6525e5416c7d5d53bb656d3afdbc6c5af816e0802bcfa42dbdc1c3` | `751963a8b88c0e3a9f27e98933079fbcf09b9998b2c13ac49c2e4d58444520d6`
`dd87e27dfbaa888cb77ea34592648a7743636b8dce07e49543bddda0fcfc73bc` | | `rfc6979 0.4.0` | `Apache-2.0 OR MIT` | `f8dd2a808d456c4a54e300a23e9f5a67e122c3024119acbfd73e3bf664491cb2` | `78779d420019e6b4630376af8e86b6b335ee8a2f89ede6e0411e0469a326aaa4`
`bdebaf9156a298f8fdab56dd26cb5144673de522d80f4c0d88e0039145f147f9` | | `ring 0.17.14` | `Apache-2.0 AND ISC` | `a4689e6c2294d81e88dc6261c768b63bc4fcdb852be6d1352498b114f61383b7` | `b3d734001a94efff3579978d953391aa7115f877657d25eb54037a43875d078a`
`005fc765ddc5115da796cca915baa9557abae13ff35e0a47c47affc56f6c414d`
`f025ccfb7dfb6bdfedc75ca0f67acc69e6fb4998143d834f7c2f38a29989680f`
`9eacbcb81be660840c714a560a9d65ba07913db98dd4baf969f78dd499fdd60f` | +| `robust 1.2.0` | `MIT OR Apache-2.0` | `4e27ee8bb91ca0adcf0ecb116293afa12d393f9c2b9b9cd54d33e8078fe19839` | `a60eea817514531668d7e00765731449fe14d059d3249e0bc93b36de45f759f2`
`ddb606a4226673241b8dedb155a25b271178d028a2bf74c90ee47fe495f4d9bc` | | `roxmltree 0.21.1` | `MIT OR Apache-2.0` | `f1964b10c76125c36f8afe190065a4bf9a87bf324842c05701330bba9f1cacbb` | `a60eea817514531668d7e00765731449fe14d059d3249e0bc93b36de45f759f2`
`fffe218c1e349e1d482a05677f2ce850502f88298174d77f6ac7c04821db7899` | +| `rstar 0.12.2` | `MIT OR Apache-2.0` | `421400d13ccfd26dfa5858199c30a5d76f9c54e0dba7575273025b43c5175dbb` | `75f29c8382dc456adb2c72d87ac9b09151ea9bc24d085c8ff9c0c047841b5195` | +| `rustc-hash 1.1.0` | `Apache-2.0/MIT` | `08d43f7aa6b08d49f382cde6a7982047c3426db949b1424bc4b7ec9ae12c6ce2` | `a60eea817514531668d7e00765731449fe14d059d3249e0bc93b36de45f759f2`
`23f18e03dc49df91622fe2a76176497404e46ced8a715d9d2b67a7446571cca3` | | `rustc-hash 2.1.3` | `Apache-2.0 OR MIT` | `6b1e7f9a428571be2dc5bc0505c13fb6bf936822b894ec87abf8a08a4e51742d` | `62c7a1e35f56406896d7aa7ca52d0cc0d272ac022b5d2796e7d6905db8a3636a`
`23f18e03dc49df91622fe2a76176497404e46ced8a715d9d2b67a7446571cca3` | | `rustc_version 0.4.1` | `MIT OR Apache-2.0` | `cfcb3a22ef46e85b45de6ee7e79d063319ebb6594faafcf1c225ea92ab6e9b92` | `a60eea817514531668d7e00765731449fe14d059d3249e0bc93b36de45f759f2`
`c9a75f18b9ab2927829a208fc6aa2cf4e63b8420887ba29cdb265d6619ae82d5` | | `rusticata-macros 4.1.0` | `MIT/Apache-2.0` | `faf0c4a6ece9950b9abdb62b1cfcf2a68b3b67a10ba445b3bb85be2a293d0632` | `a60eea817514531668d7e00765731449fe14d059d3249e0bc93b36de45f759f2`
`a5c61b93b6ee1d104af9920cf020ff3c7efe818e31fe562c72261847a728f513` | @@ -274,6 +316,7 @@ This document must accompany source and binary distributions. A package's presen | `rustversion 1.0.23` | `MIT OR Apache-2.0` | `cf54715a573b99ac80df0bc206da022bcd442c974952c7b9720069370852e21f` | `62c7a1e35f56406896d7aa7ca52d0cc0d272ac022b5d2796e7d6905db8a3636a`
`23f18e03dc49df91622fe2a76176497404e46ced8a715d9d2b67a7446571cca3` | | `same-file 1.0.6` | `Unlicense/MIT` | `93fc1dc3aaa9bfed95e02e6eadabb4baf7e3078b0bd1b4d7b6b0b68378900502` | `01c266bced4a434da0051174d6bee16a4c82cf634e2679b6155d40d75012390f`
`cb3c929a05e6cbc9de9ab06a4c57eeb60ca8c724bef6c138c87d3a577e27aa14`
`7e12e5df4bae12cb21581ba157ced20e1986a0508dd10d0e8a4ab9a4cf94e85c` | | `schannel 0.1.29` | `MIT` | `91c1b7e4904c873ef0710c1f407dde2e6287de2bebc1bbbf7d430bb7cbffd939` | `aa72991ac35b4de0034da0afe943e62b48c4092fc2ba13ae47806d8e9a4ad551` | +| `scopeguard 1.2.0` | `MIT OR Apache-2.0` | `94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49` | `a60eea817514531668d7e00765731449fe14d059d3249e0bc93b36de45f759f2`
`fb77f0a9c53e473abe5103c8632ef9f0f2874d4fb3f17cb2d8c661aab9cee9d7` | | `scroll 0.13.0` | `MIT` | `c1257cd4248b4132760d6524d6dda4e053bc648c9070b960929bf50cfb1e7add` | `6e24b7455f0b9afefdf4f3efd59a56ce76a3020c2dc4371937e281fc5e587fd7` | | `scroll_derive 0.13.1` | `MIT` | `ed76efe62313ab6610570951494bdaa81568026e0318eaa55f167de70eeea67d` | `b35d026cc7aca9d5859a02eb87ddf7a386a24c986838651bd1f283f94e003327` | | `sctp-proto 0.10.3` | `MIT OR Apache-2.0` | `f895c3c33ae20283f9129bd09db2ca69138798b372ef2b98bd2946d23ea4819b` | `814d11eba59f964bca7e74ef94f0d1eff1d5f322f895fb9b5d7e06f77debf3b2`
`7a6631daa22a9f1772e4a474ede9c3374a6c7a89b61c8b5973f7fd5ccd5cee8c` | @@ -291,17 +334,24 @@ This document must accompany source and binary distributions. A package's presen | `sha2 0.11.0` | `MIT OR Apache-2.0` | `446ba717509524cb3f22f17ecc096f10f4822d76ab5c0b9822c5f9c284e825f4` | `a9040321c3712d8fd0b09cf52b17445de04a23a10165049ae187cd39e5c86be5`
`831e0f43ad0bf014c1c4fec5767aae470434c1d66d6e671be2d823e729063e25` | | `shlex 1.3.0` | `MIT OR Apache-2.0` | `0fda2ff0d084019ba4d7c6f371c95d8fd75ce3524c3cb8fb653a3023f6323e64` | `553fffcd9b1cb158bc3e9edc35da85ca5c3b3d7d2e61c883ebcfa8a65814b583`
`4455bf75a91154108304cb283e0fea9948c14f13e20d60887cf2552449dea3b1` | | `shlex 2.0.1` | `MIT OR Apache-2.0` | `f8fadd59c855ef2080decdef8ff161eb6661b86933c9d82e5ba29dc602a55aba` | `553fffcd9b1cb158bc3e9edc35da85ca5c3b3d7d2e61c883ebcfa8a65814b583`
`4455bf75a91154108304cb283e0fea9948c14f13e20d60887cf2552449dea3b1` | +| `sif-itree 0.4.1` | `MIT OR Apache-2.0` | `d7f45b8998ced5134fb1d75732c77842a3e888f19c1ff98481822e8fbfbf930b` | `62c7a1e35f56406896d7aa7ca52d0cc0d272ac022b5d2796e7d6905db8a3636a`
`cf6287cf93399cbc46a241bdbafb2d4b6e42956046a886550883a7056f1914eb` | | `signal-hook-registry 1.4.8` | `MIT OR Apache-2.0` | `c4db69cba1110affc0e9f7bcd48bbf87b3f4fc7c61fc9155afd4c469eb3d6c1b` | `a60eea817514531668d7e00765731449fe14d059d3249e0bc93b36de45f759f2`
`503558bfefe66ca15e4e3f7955b3cb0ec87fd52f29bf24b336af7bd00e946d5c` | | `signature 2.2.0` | `Apache-2.0 OR MIT` | `77549399552de45a898a580c1b41d445bf730df867cc44e6c0233bbc4b8329de` | `a9040321c3712d8fd0b09cf52b17445de04a23a10165049ae187cd39e5c86be5`
`b3470648aff02beb36d7a53240fc9260ed80ed93bd43bace6b67d7ef7336ee33` | | `simd-adler32 0.3.10` | `MIT` | `3a219298ac11a56ea9a6d2120044824d6f01aeb034955e7af7bc16858527deea` | `42a35170233e83e18856792e748de4c1ce4a63b2afce9a370c89ef3fe23f9f2d` | | `simd_cesu8 1.2.0` | `Apache-2.0 OR MIT` | `11031e251abf8611c80f460e19dbdeb54a66db918e49c65a7065b46ac7aec520` | `a60eea817514531668d7e00765731449fe14d059d3249e0bc93b36de45f759f2`
`23f18e03dc49df91622fe2a76176497404e46ced8a715d9d2b67a7446571cca3` | | `simdutf8 0.1.5` | `MIT OR Apache-2.0` | `e3a9fe34e3e7a50316060351f37187a3f546bce95496156754b601a5fa71b76e` | `0d542e0c8804e39aa7f37eb00da5a762149dc682d7829451287e11b938e94594`
`508a77d2e7b51d98adeed32648ad124b7b30241a8e70b2e72c99f92d8e5874d1` | | `skia-bindings 0.99.0` | `MIT` | `3e2d1c3ebd697c0cbded0145e9204a38fa6b268446051b7196d0a096414ea7f3` | `e6d6e0146d16ea19abea522d8ed77aadcdc4f90718a11d4d2cfb55c199ec8b4f` | +| `skia-rs-codec 0.3.0` | `MIT OR Apache-2.0` | `733be303d09c7e2bd0628dc1e592855d80e79a32c7f020f980ab0abe710d77a6` | `4f67585c5600082ee2a39f968f39958719c77943053a8bc0255cce1fcf5aaf2b` | +| `skia-rs-core 0.3.0` | `MIT OR Apache-2.0` | `88c10ce81ab452a6fa88e7228a5af713328e698b7100c2d021f58287a5370c49` | `5755400844088f6cb705de6d2662e34a2512f7f20d818b35349f726d726e2df5` | +| `skia-rs-paint 0.3.0` | `MIT OR Apache-2.0` | `f4b7ea0fc7fa887d5875e49809eabc3cbd9e6a0247930a9f6456ad4c59cedfb1` | `e79c6016e646c15c9c20d54f197b4cbd4f49930c7d2e8b5d04fef9859132dfe3` | +| `skia-rs-path 0.3.0` | `MIT OR Apache-2.0` | `1f928ca29bc3e26f46393048186bf64cf7eb7c39cc7176e8285a1828c601d7c0` | `a520921b3010a5df19c97a649f0d26edc2750ee2df3df4b3e7f582a2ae85f19f` | | `skia-safe 0.99.0` | `MIT` | `9f512ac418a64194842dd05566320805dad1c957c521039db2486fd6368865bc` | `85160b23bdf006db68c232129bbf4ace9b3eee2fd21ba41025f447c8281c4f9d` | | `skia-svg-macros 0.1.0` | `MIT` | `044dd2233c9717a74f75197f3e7f0a966db2127c0ffb5e05013b480a9b75b2c7` | `3eefd55332613883150398d8fcf426ac1036bbedecdf28c510573a2da294cf16` | | `slab 0.4.12` | `MIT` | `0c790de23124f9ab44544d7ac05d60440adc586479ce501c1d6d7da3cd8c9cf5` | `8ce0830173fdac609dfb4ea603fdc002c2f4af0dc9b1a005653f5da9cf534b18` | | `smallvec 1.15.2` | `MIT OR Apache-2.0` | `8ed6a63f02c8539c91a8685a86f4099661ba3da017932f6ebbea6de3f0fa7c90` | `a60eea817514531668d7e00765731449fe14d059d3249e0bc93b36de45f759f2`
`0b28172679e0009b655da42797c03fd163a3379d5cfa67ba1f1655e974a2a1a9` | | `socket2 0.6.5` | `MIT OR Apache-2.0` | `c3d1e2c7f27f8d4cb10542a02c49005dbd6e93095799d6f3be745fae9f8fedd4` | `a60eea817514531668d7e00765731449fe14d059d3249e0bc93b36de45f759f2`
`378f5840b258e2779c39418f3f2d7b2ba96f1c7917dd6be0713f88305dbda397` | +| `spade 2.15.1` | `MIT OR Apache-2.0` | `9699399fd9349b00b184f5635b074f9ec93afffef30c853f8c875b32c0f8c7fa` | `cfc7749b96f63bd31c3c42b5c471bf756814053e847c10f3eb003417bc523d30`
`fc1a4c9482e823f450af4c85471ca6e58d1fd0b3bd0998be4547b1be4a5bc4af` | +| `spirv 0.3.0+sdk-1.3.268.0` | `Apache-2.0` | `eda41003dc44290527a59b13432d4a0379379fa074b70174882adfbdfd917844` | `2c33264685afe7db2aac2fd5a9788dadf195b7c33e632d7c108fcb0a672a96c9` | | `spki 0.7.3` | `Apache-2.0 OR MIT` | `d91ed6c858b01f942cd56b37a94b3e0a1798290327d1236e4d9cf4eaca44d29d` | `a9040321c3712d8fd0b09cf52b17445de04a23a10165049ae187cd39e5c86be5`
`c995204cc6bad2ed67dd41f7d89bb9f1a9d48e0edd745732b30640d7912089a4` | | `stable_deref_trait 1.2.1` | `MIT OR Apache-2.0` | `6ce2be8dc25455e1f91df71bfa12ad37d7af1092ae736f3a6cd0e37bc7810596` | `a60eea817514531668d7e00765731449fe14d059d3249e0bc93b36de45f759f2`
`3c125f249fc6fb19f2415d027a0d9a170860583960ea53d08ea1d2b3f269d153` | | `stats_alloc 0.1.10` | `MIT` | `5c0e04424e733e69714ca1bbb9204c1a57f09f5493439520f9f68c132ad25eec` | `620434146064377fc36b3100c47ac0740352c50e7d1c9a2c0b1f1a9cd599f607` | @@ -315,6 +365,7 @@ This document must accompany source and binary distributions. A package's presen | `sync_wrapper 1.0.2` | `Apache-2.0` | `0bf256ce5efdfa370213c1dabab5935a12e49f2c58d15e9eac2870d3b4f27263` | `0d542e0c8804e39aa7f37eb00da5a762149dc682d7829451287e11b938e94594` | | `synstructure 0.13.2` | `MIT` | `728a70f3dbaf5bab7f0c4b1ac8d7ae5ea60a4b5549c8a5914361c99147a709d2` | `219920e865eee70b7dcfc948a86b099e7f4fe2de01bcca2ca9a20c0a033f2b59` | | `tar 0.4.46` | `MIT OR Apache-2.0` | `3f6221d9a6003c78398e3b239969f352578258df48c8eb051caadae0015bc840` | `a60eea817514531668d7e00765731449fe14d059d3249e0bc93b36de45f759f2`
`8ca6b96cea9e67c6c5c63f452c31bd396db8bd2406231fdea5d48ef462b48077` | +| `termcolor 1.4.1` | `Unlicense OR MIT` | `06794f8f6c5c898b3275aebefa6b8a1cb24cd2c6c79397ab15774837a0bc5755` | `01c266bced4a434da0051174d6bee16a4c82cf634e2679b6155d40d75012390f`
`0f96a83840e146e43c0ec96a22ec1f392e0680e6c1226e6f3ba87e0740af850f`
`7e12e5df4bae12cb21581ba157ced20e1986a0508dd10d0e8a4ab9a4cf94e85c` | | `thiserror 1.0.69` | `MIT OR Apache-2.0` | `b6aaf5339b578ea85b50e080feb250a3e8ae8cfcdff9a461c9ec2904bc923f52` | `62c7a1e35f56406896d7aa7ca52d0cc0d272ac022b5d2796e7d6905db8a3636a`
`23f18e03dc49df91622fe2a76176497404e46ced8a715d9d2b67a7446571cca3` | | `thiserror 2.0.20` | `MIT OR Apache-2.0` | `ec86235f5fcc2a73650310756d2ac5b138a5780bbbdfae3eeccec992c435ba4f` | `62c7a1e35f56406896d7aa7ca52d0cc0d272ac022b5d2796e7d6905db8a3636a`
`23f18e03dc49df91622fe2a76176497404e46ced8a715d9d2b67a7446571cca3` | | `thiserror-impl 1.0.69` | `MIT OR Apache-2.0` | `4fee6c4efc90059e10f81e6d42c60a18f76588c3d74cb83a0b242a2b6c7504c1` | `62c7a1e35f56406896d7aa7ca52d0cc0d272ac022b5d2796e7d6905db8a3636a`
`23f18e03dc49df91622fe2a76176497404e46ced8a715d9d2b67a7446571cca3` | @@ -345,6 +396,8 @@ This document must accompany source and binary distributions. A package's presen | `typenum 1.20.1` | `MIT OR Apache-2.0` | `b6f5e870be6c3b371b77fe0ee0bafb859fa4964b4404c27de1d380043c4dda20` | `36bb253818ac13761081556ff5c457d626da9df1eb4f56194d9ad3926c418a68`
`3c97f5b6ad4e73ad22dc0d1e0c7120579a350df57095120017ddfe5a8669604e`
`a825bd853ab71619a4923d7b4311221427848070ff44d990da39b0b274c1683f` | | `unicode-general-category 1.1.0` | `Apache-2.0` | `0b993bddc193ae5bd0d623b49ec06ac3e9312875fdae725a975c51db1cc1677f` | `b40930bbcf80744c86c46a12bc9da056641d722716c378f5659b9e555ef833e1` | | `unicode-ident 1.0.24` | `(MIT OR Apache-2.0) AND Unicode-3.0` | `e6e4313cd5fcd3dad5cafa179702e2b244f760991f45397d14d4ebf38247da75` | `62c7a1e35f56406896d7aa7ca52d0cc0d272ac022b5d2796e7d6905db8a3636a`
`23f18e03dc49df91622fe2a76176497404e46ced8a715d9d2b67a7446571cca3`
`f7db81051789b729fea528a63ec4c938fdcb93d9d61d97dc8cc2e9df6d47f2a1` | +| `unicode-width 0.1.14` | `MIT OR Apache-2.0` | `7dd6e30e90baa6f72411720665d41d89b9a3d039dc45b8faea1ddd07f617f6af` | `23860c2a7b5d96b21569afedf033469bab9fe14a1b24a35068b8641c578ce24d`
`a60eea817514531668d7e00765731449fe14d059d3249e0bc93b36de45f759f2`
`7b63ecd5f1902af1b63729947373683c32745c16a10e8e6292e2e2dcd7e90ae0` | +| `unicode-xid 0.2.6` | `MIT OR Apache-2.0` | `ebc1c04c71510c7f702b52b7c350734c9ff1295c464a03335b00bb84fc54f853` | `23860c2a7b5d96b21569afedf033469bab9fe14a1b24a35068b8641c578ce24d`
`a60eea817514531668d7e00765731449fe14d059d3249e0bc93b36de45f759f2`
`7b63ecd5f1902af1b63729947373683c32745c16a10e8e6292e2e2dcd7e90ae0` | | `universal-hash 0.5.1` | `MIT OR Apache-2.0` | `fc1de2c688dc15305988b563c3854064043356019f97a4b46276fe734c4f07ea` | `a9040321c3712d8fd0b09cf52b17445de04a23a10165049ae187cd39e5c86be5`
`6b50510a0400c72172355cc5d2ba0f2c5c2eb33149b8f96539dc345fdc484920` | | `untrusted 0.7.1` | `ISC` | `a156c684c91ea7d62626509bce3cb4e1d9ed5c4d978f7b4352658f96a4c26b4a` | `7abd9b6960dcf7d4d0a48606a5b71bfe37d472db68d70637f3a58a56785f1621` | | `untrusted 0.9.0` | `ISC` | `8ecb6da28b8a351d773b68d5825ac39017e680750f980f3a1a85cd8dd28a47c1` | `7abd9b6960dcf7d4d0a48606a5b71bfe37d472db68d70637f3a58a56785f1621` | @@ -352,6 +405,7 @@ This document must accompany source and binary distributions. A package's presen | `utf8_iter 1.0.4` | `Apache-2.0 OR MIT` | `b6c140620e7ffbb22c2dee59cafe6084a59b5ffc27a8859a5f0d494b5d52b6be` | `c30152c94a6d75e021adbc52b3a52470366a46edb917e17deae3259251af244c`
`cfc7749b96f63bd31c3c42b5c471bf756814053e847c10f3eb003417bc523d30`
`3fa4ca83dcc9237839b1bdeb2e6d16bdfb5ec0c5ce42b24694d8bbf0dcbef72c` | | `utf8parse 0.2.2` | `Apache-2.0 OR MIT` | `06abde3611657adf66d383f00b093d7faecc7fa57071cce2578660c9f1010821` | `62c7a1e35f56406896d7aa7ca52d0cc0d272ac022b5d2796e7d6905db8a3636a`
`e4c9b06fa850cb9b540a5e400e9f6394cf15efcf4098144de477d1d3dae10150` | | `uuid 1.24.0` | `Apache-2.0 OR MIT` | `bf3923a6f5c4c6382e0b653c4117f48d631ea17f38ed86e2a828e6f7412f5239` | `a60eea817514531668d7e00765731449fe14d059d3249e0bc93b36de45f759f2`
`436bc5a105d8e57dcd8778730f3754f7bf39c14d2f530e4cde4bd2d17a83ec3d` | +| `uuid-rng-internal 1.24.0` | `Apache-2.0 OR MIT` | `9dff7387287837acf196f2596a6216f94c555d947d5331e1cc48393131020119` | `caa2390e19c40285641bd323cacd489091ab2a3f3508141471cf0eb30d75a9f3`
`a60eea817514531668d7e00765731449fe14d059d3249e0bc93b36de45f759f2`
`436bc5a105d8e57dcd8778730f3754f7bf39c14d2f530e4cde4bd2d17a83ec3d` | | `vcpkg 0.2.15` | `MIT/Apache-2.0` | `accd4ea62f7bb7a82fe23066fb0957d48ef677f6eeb8215f372f52e48bb32426` | `3708458dee7f359ac6c9c5558023ed481be87e5372c43ebd7f2ca7ad23c12026`
`ff7d99434986ba68f6575d689fd9cc11d93a486876b19004e1bacc0f6ca554d4` | | `version_check 0.9.5` | `MIT/Apache-2.0` | `0b928f33d975fc6ad9f86c8f283853ad26bdd5b10b7f1542aa2fa15e2289105a` | `a60eea817514531668d7e00765731449fe14d059d3249e0bc93b36de45f759f2`
`b7e650f3fce5c53249d1cdc608b54df156a97edd636cf9d23498d0cfe7aec63e` | | `vorbis_rs 0.5.6` | `BSD-3-Clause` | `49c5da94d280f7a27e8c937e9b73df2da3e23a2583f48471fd8fb4c72f9c1933` | `6b304bd3ec8aa970304048a405fe12c5f48cc2aa3736712f7fe1acddceae0359`
`d2ab5758336489da61c12cc5bb757da5339c4ae9001f9bb0562b4370249af814`
`0c72574d90753e1eda1f21a83c1a04990e67b26bb56e01acf3ce241140518156`
`1f6c6b6397d86d20968d7856d6945591b89e4cb64e5fc1ec8b992811f6a65ed8` | @@ -368,6 +422,7 @@ This document must accompany source and binary distributions. A package's presen | `web-sys 0.3.104` | `MIT OR Apache-2.0` | `c435338968042f4f59a557f690a253676d47ce13ceb55d70100e7facf6620a30` | `a60eea817514531668d7e00765731449fe14d059d3249e0bc93b36de45f759f2`
`378f5840b258e2779c39418f3f2d7b2ba96f1c7917dd6be0713f88305dbda397` | | `web-time 1.1.0` | `MIT OR Apache-2.0` | `5a6580f308b1fad9207618087a65c04e7a10bc77e02c8e84e9b00dd4b12fa0bb` | `54a744942eb3fa63a74d8d359989ed6962c04f3f10ff20cfa08ff8aa7efbe4e6`
`f428305bbf2e70fbd807af0f3c7ac1b7acfb95311640f451e9d2e48db6d7e96b` | | `webpki-root-certs 1.0.9` | `CDLA-Permissive-2.0` | `b96554aa2acc8ccdb7e1c9a58a7a68dd5d13bccc69cd124cb09406db612a1c9b` | `e271993808fec50ab29350b39539cdec611a9103f827e0aa26d61da70e2d33f8` | +| `weezl 0.1.12` | `MIT OR Apache-2.0` | `a28ac98ddc8b9274cb41bb4d9d4d5c425b6020c50c46f25559911905610b4a88` | `a60eea817514531668d7e00765731449fe14d059d3249e0bc93b36de45f759f2`
`573f5227db835cd30bbdd3aed3f82615f80119a4d5c82b4daf642dbfe2b6afde` | | `widestring 1.2.1` | `MIT OR Apache-2.0` | `72069c3113ab32ab29e5584db3c6ec55d416895e60715417b5b883a357c3e471` | `a6cba85bc92e0cff7a450b1d873c0eaa2e9fc96bf472df0247a26bec77bf3ff9`
`508a77d2e7b51d98adeed32648ad124b7b30241a8e70b2e72c99f92d8e5874d1` | | `winapi-util 0.1.11` | `Unlicense OR MIT` | `c2a7b1c03c876122aa43f3020e6c3c3ee5c05081c9a00739faf7503aeba10d22` | `01c266bced4a434da0051174d6bee16a4c82cf634e2679b6155d40d75012390f`
`cb3c929a05e6cbc9de9ab06a4c57eeb60ca8c724bef6c138c87d3a577e27aa14`
`7e12e5df4bae12cb21581ba157ced20e1986a0508dd10d0e8a4ab9a4cf94e85c` | | `windows 0.62.2` | `MIT OR Apache-2.0` | `527fadee13e0c05939a6a05d5bd6eec6cd2e3dbd648b9f8e447c6518133d8580` | `c16f8dcf1a368b83be78d826ea23de4079fe1b4469a0ab9ee20563f37ff3d44b`
`c2cfccb812fe482101a8f04597dfc5a9991a6b2748266c47ac91b6a5aae15383` | @@ -728,7 +783,7 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ### `01c266bced4a434da0051174d6bee16a4c82cf634e2679b6155d40d75012390f` -Packages: aho-corasick 1.1.5, memchr 2.8.3, same-file 1.0.6, walkdir 2.5.0, winapi-util 0.1.11
+Packages: aho-corasick 1.1.5, byteorder 1.5.0, memchr 2.8.3, same-file 1.0.6, termcolor 1.4.1, walkdir 2.5.0, winapi-util 0.1.11
Source filenames: COPYING
@@ -1034,6 +1089,40 @@ DEALINGS IN THE SOFTWARE.
 
 
+### `035e70219855119df4273b3c5b97543ae82e0dd60c520416e759107c602f651b` + +Packages: heapless 0.8.0
+Source filenames: LICENSE-MIT + +
+Copyright (c) 2017 Jorge Aparicio
+
+Permission is hereby granted, free of charge, to any
+person obtaining a copy of this software and associated
+documentation files (the "Software"), to deal in the
+Software without restriction, including without
+limitation the rights to use, copy, modify, merge,
+publish, distribute, sublicense, and/or sell copies of
+the Software, and to permit persons to whom the Software
+is furnished to do so, subject to the following
+conditions:
+
+The above copyright notice and this permission notice
+shall be included in all copies or substantial portions
+of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF
+ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED
+TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A
+PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT
+SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
+CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR
+IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+DEALINGS IN THE SOFTWARE.
+
+
+ ### `044983df14c97f2f9570766aaf977b3cdfc4a06cf1f36b776331c5ff89b4fb89` Packages: mach2 0.6.0
@@ -1066,6 +1155,66 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +### `058f01fe181608d027fcde7e528fc03ea3cf90f30903c407644b0a9bbc54f500` + +Packages: quick-error 2.0.1
+Source filenames: LICENSE-MIT + +
+Copyright (c) 2015 The quick-error Developers
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
+
+
+ +### `0604d5817110dacc5c7d9b7de6b58b962794603d4823c357157bd5dec4198bc5` + +Packages: float_next_after 2.0.0
+Source filenames: LICENSE + +
+MIT License
+
+Copyright (c) 2020 Scripta Qumranica Electronica
+
+Created by Bronson Brown-deVost
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
+
+
+ ### `0621878e61f0d0fda054bcbe02df75192c28bde1ecc8289cbd86aeba2dd72720` Packages: lazy_static 1.5.0, rayon 1.12.0, rayon-core 1.13.0
@@ -1433,7 +1582,7 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ### `0d542e0c8804e39aa7f37eb00da5a762149dc682d7829451287e11b938e94594` -Packages: alsa 0.11.0, j2k 0.8.1, j2k-codec-math 0.8.1, j2k-core 0.8.1, j2k-native 0.8.1, j2k-profile 0.8.1, j2k-types 0.8.1, miniz_oxide 0.8.9, num-conv 0.2.2, pin-project-lite 0.2.17, simdutf8 0.1.5, sync_wrapper 1.0.2, time 0.3.55, time-core 0.1.9, time-macros 0.2.32
+Packages: alsa 0.11.0, fdeflate 0.3.7, image-webp 0.2.4, j2k 0.8.1, j2k-codec-math 0.8.1, j2k-core 0.8.1, j2k-native 0.8.1, j2k-profile 0.8.1, j2k-types 0.8.1, miniz_oxide 0.8.9, num-conv 0.2.2, pin-project-lite 0.2.17, simdutf8 0.1.5, sync_wrapper 1.0.2, time 0.3.55, time-core 0.1.9, time-macros 0.2.32
Source filenames: LICENSE, LICENSE-APACHE, LICENSE-APACHE.md, LICENSE-Apache, repository-license/j2k-native-0.8.1/LICENSE-APACHE
@@ -1647,9 +1796,60 @@ THE SOFTWARE.
 
 
+### `0e1a61da1582431a552744e844c6f081c613b202c69badec6362ea0f61039510` + +Packages: hexf-parse 0.2.1
+Source filenames: generated-package-license-notice.txt + +
+Package: hexf-parse 0.2.1
+Declared license: CC0-1.0
+Authors/copyright attribution from package metadata: Kang Seonghoon <public+rust@mearie.org>
+Source: https://github.com/lifthrasiir/hexf
+SPDX license texts:
+https://spdx.org/licenses/CC0-1.0.html
+
+The published crate archive contains no discoverable top-level license/notice file. This generated notice preserves all attribution and license metadata supplied by that archive instead of silently omitting the package.
+
+
+ +### `0ecd43cdff2dc2be0deda2116cc00cd9a960930fa7310d02b6379c6ad2319a48` + +Packages: jpeg-encoder 0.6.1
+Source filenames: LICENSE-MIT + +
+Copyright (c) 2021 Volker Ströbel <volkerstroebel@mysurdity.de>
+
+Permission is hereby granted, free of charge, to any
+person obtaining a copy of this software and associated
+documentation files (the "Software"), to deal in the
+Software without restriction, including without
+limitation the rights to use, copy, modify, merge,
+publish, distribute, sublicense, and/or sell copies of
+the Software, and to permit persons to whom the Software
+is furnished to do so, subject to the following
+conditions:
+
+The above copyright notice and this permission notice
+shall be included in all copies or substantial portions
+of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF
+ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED
+TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A
+PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT
+SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
+CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR
+IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+DEALINGS IN THE SOFTWARE.
+
+
+ ### `0f96a83840e146e43c0ec96a22ec1f392e0680e6c1226e6f3ba87e0740af850f` -Packages: aho-corasick 1.1.5, memchr 2.8.3, walkdir 2.5.0
+Packages: aho-corasick 1.1.5, byteorder 1.5.0, byteorder-lite 0.1.0, memchr 2.8.3, termcolor 1.4.1, walkdir 2.5.0
Source filenames: LICENSE-MIT
@@ -2044,6 +2244,31 @@ IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
 DEALINGS IN THE SOFTWARE.
 
 
+
+ +### `1b5fd56a3c78a302a4bfe304cfcbce912938361f627c69a321220615c2d6b08d` + +Packages: earcut 0.4.5
+Source filenames: LICENSE.txt + +
+ISC License
+
+Copyright (c) 2016, Mapbox
+Copyright (c) 2023, Taku Fukada
+
+Permission to use, copy, modify, and/or distribute this software for any purpose
+with or without fee is hereby granted, provided that the above copyright notice
+and this permission notice appear in all copies.
+
+THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH
+REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND
+FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,
+INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS
+OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
+TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF
+THIS SOFTWARE.
+
 
### `1bd33be6fcbbcc6d585c6778a41b21ea8ac3da5e441ac1ac72aba11ca77ae9a8` @@ -2094,6 +2319,34 @@ SOFTWARE. +### `1d4c38d56650edc2c673cadbec74bec14db1fe8f2f10f4e3477dcbb49563be40` + +Packages: foldhash 0.2.0
+Source filenames: LICENSE + +
+Copyright (c) 2024 Orson Peters
+
+This software is provided 'as-is', without any express or implied warranty. In
+no event will the authors be held liable for any damages arising from the use of
+this software.
+
+Permission is granted to anyone to use this software for any purpose, including
+commercial applications, and to alter it and redistribute it freely, subject to
+the following restrictions:
+
+1. The origin of this software must not be misrepresented; you must not claim
+    that you wrote the original software. If you use this software in a product,
+    an acknowledgment in the product documentation would be appreciated but is
+    not required.
+
+2. Altered source versions must be plainly marked as such, and must not be
+    misrepresented as being the original software.
+
+3. This notice may not be removed or altered from any source distribution.
+
+
+ ### `1d85bd754b04ceec93e98e890edd1fa3c6a22e81bcb32135806beeccefa51cd1` Packages: jni-sys 0.3.1, jni-sys 0.4.1, jni-sys-macros 0.4.1
@@ -2474,6 +2727,36 @@ DEALINGS IN THE SOFTWARE. +### `22b83fb92a50418c7df9564b9c179fa2a0e74f293bc58b72dd7e218fc0902143` + +Packages: jpeg-decoder 0.3.2
+Source filenames: LICENSE-MIT + +
+MIT License
+
+Copyright (c) 2016 The jpeg-decoder Developers
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
+
+
+ ### `231c837c45eb53f108fb48929e488965bc4fcc14e9ea21d35f50e6b99d98685b` Packages: deranged 0.5.8
@@ -2536,6 +2819,22 @@ DEALINGS IN THE SOFTWARE. +### `23860c2a7b5d96b21569afedf033469bab9fe14a1b24a35068b8641c578ce24d` + +Packages: unicode-width 0.1.14, unicode-xid 0.2.6
+Source filenames: COPYRIGHT + +
+Licensed under the Apache License, Version 2.0
+<LICENSE-APACHE or
+http://www.apache.org/licenses/LICENSE-2.0> or the MIT
+license <LICENSE-MIT or http://opensource.org/licenses/MIT>,
+at your option. All files in the project carrying such
+notice may not be copied, modified, or distributed except
+according to those terms.
+
+
+ ### `23c23145f6eac25c28cdcc03d38506a5712a9a8cffb5bd5301457f6173ea696e` Packages: fearless_simd 0.4.1
@@ -2598,7 +2897,7 @@ fn copy_mutable() { ### `23f18e03dc49df91622fe2a76176497404e46ced8a715d9d2b67a7446571cca3` -Packages: adler2 2.0.1, atomic-waker 1.1.2, curve25519-dalek-derive 0.1.1, displaydoc 0.2.7, fastrand 2.5.0, group 0.13.0, itoa 1.0.18, linux-raw-sys 0.12.1, minimal-lexical 0.2.1, num_enum 0.7.6, num_enum_derive 0.7.6, once_cell 1.21.4, pin-project-lite 0.2.17, prettyplease 0.2.37, proc-macro-crate 3.5.0, proc-macro2 1.0.107, quote 1.0.47, rustc-hash 2.1.3, rustix 1.1.4, rustversion 1.0.23, semver 1.0.28, serde 1.0.229, serde_core 1.0.229, serde_derive 1.0.229, serde_json 1.0.151, simd_cesu8 1.2.0, syn 2.0.119, syn 3.0.3, thiserror 1.0.69, thiserror 2.0.20, thiserror-impl 1.0.69, thiserror-impl 2.0.20, unicode-ident 1.0.24, wasi 0.11.1+wasi-snapshot-preview1, wasip2 1.0.4+wasi-0.2.12, wasm-streams 0.5.0, wit-bindgen 0.57.1, zmij 1.0.23
+Packages: adler2 2.0.1, allocator-api2 0.2.21, atomic-waker 1.1.2, curve25519-dalek-derive 0.1.1, displaydoc 0.2.7, fastrand 2.5.0, glam 0.29.3, group 0.13.0, itoa 1.0.18, linux-raw-sys 0.12.1, minimal-lexical 0.2.1, num_enum 0.7.6, num_enum_derive 0.7.6, once_cell 1.21.4, pin-project-lite 0.2.17, prettyplease 0.2.37, proc-macro-crate 3.5.0, proc-macro2 1.0.107, quote 1.0.47, rustc-hash 1.1.0, rustc-hash 2.1.3, rustix 1.1.4, rustversion 1.0.23, semver 1.0.28, serde 1.0.229, serde_core 1.0.229, serde_derive 1.0.229, serde_json 1.0.151, simd_cesu8 1.2.0, syn 2.0.119, syn 3.0.3, thiserror 1.0.69, thiserror 2.0.20, thiserror-impl 1.0.69, thiserror-impl 2.0.20, unicode-ident 1.0.24, wasi 0.11.1+wasi-snapshot-preview1, wasip2 1.0.4+wasi-0.2.12, wasm-streams 0.5.0, wit-bindgen 0.57.1, zmij 1.0.23
Source filenames: LICENSE-MIT
@@ -3000,6 +3299,36 @@ extern_protocol!(
 
 
+### `260cc580f53a756821a0f35475e2cd6da790f8fed0efc058252fe1bed8f2689e` + +Packages: i_float 1.16.0, i_shape 1.18.0
+Source filenames: LICENSE + +
+MIT License
+
+Copyright (c) 2023 iShape-Rust
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
+
+
+ ### `268872b9816f90fd8e85db5a28d33f8150ebb8dd016653fb39ef1f94f2686bc5` Packages: linux-raw-sys 0.12.1, rustix 1.1.4, wasi 0.11.1+wasi-snapshot-preview1, wasip2 1.0.4+wasi-0.2.12, wit-bindgen 0.57.1
@@ -3650,6 +3979,23 @@ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLI +### `2c33264685afe7db2aac2fd5a9788dadf195b7c33e632d7c108fcb0a672a96c9` + +Packages: spirv 0.3.0+sdk-1.3.268.0
+Source filenames: generated-package-license-notice.txt + +
+Package: spirv 0.3.0+sdk-1.3.268.0
+Declared license: Apache-2.0
+Authors/copyright attribution from package metadata: Lei Zhang <antiagainst@gmail.com>
+Source: https://github.com/gfx-rs/rspirv
+SPDX license texts:
+https://spdx.org/licenses/Apache-2.0.html
+
+The published crate archive contains no discoverable top-level license/notice file. This generated notice preserves all attribution and license metadata supplied by that archive instead of silently omitting the package.
+
+
+ ### `2d01890414494742ba4a509fcec8efa40f6d8be22cbd72be7cff08d6fda4ec89` Packages: hyper 1.11.0
@@ -3713,6 +4059,40 @@ DEALINGS IN THE SOFTWARE. +### `2f8267b247fd81e9555a2e196e119a5b341bcae21011cd93985c312f1312f727` + +Packages: geo 0.33.1, geo-types 0.7.20
+Source filenames: LICENSE-MIT, repository-license/geo-types-0.7.20/LICENSE-MIT + +
+Copyright (c) 2017 The GeoRust Project Developers
+
+Permission is hereby granted, free of charge, to any
+person obtaining a copy of this software and associated
+documentation files (the "Software"), to deal in the
+Software without restriction, including without
+limitation the rights to use, copy, modify, merge,
+publish, distribute, sublicense, and/or sell copies of
+the Software, and to permit persons to whom the Software
+is furnished to do so, subject to the following
+conditions:
+
+The above copyright notice and this permission notice
+shall be included in all copies or substantial portions
+of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF
+ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED
+TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A
+PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT
+SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
+CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR
+IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+DEALINGS IN THE SOFTWARE.
+
+
+ ### `304b898acad7f02e03d6d8832d682a3b43ee729ab5d3a069af5a36979083b6b4` Packages: inout 0.1.4
@@ -5255,8 +5635,8 @@ DEALINGS IN THE SOFTWARE. ### `436bc5a105d8e57dcd8778730f3754f7bf39c14d2f530e4cde4bd2d17a83ec3d` -Packages: uuid 1.24.0
-Source filenames: LICENSE-MIT +Packages: uuid 1.24.0, uuid-rng-internal 1.24.0
+Source filenames: LICENSE-MIT, repository-license/uuid-1.24.0/LICENSE-MIT
 Copyright (c) 2014 The Rust Project Developers
@@ -5854,6 +6234,36 @@ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLI
 
 
+### `47e00f18b265d350a2860d3899f17dd1c7689b966545e929df8ffa7033f5acdc` + +Packages: i_tree 0.18.0
+Source filenames: LICENSE + +
+MIT License
+
+Copyright (c) 2024 iShape-Rust
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
+
+
+ ### `4a883ecc3bb1010faed542bf63d53e530fea5e5e12cf676aed588784298ba929` Packages: sec1 0.7.3
@@ -6264,6 +6674,24 @@ Source filenames: LICENSE-APACHE.md limitations under the License. + + +### `4f67585c5600082ee2a39f968f39958719c77943053a8bc0255cce1fcf5aaf2b` + +Packages: skia-rs-codec 0.3.0
+Source filenames: generated-package-license-notice.txt + +
+Package: skia-rs-codec 0.3.0
+Declared license: MIT OR Apache-2.0
+Authors/copyright attribution from package metadata: Pegasus Heavy Industries
+Source: https://github.com/pegasusheavy/skia-rs
+SPDX license texts:
+https://spdx.org/licenses/Apache-2.0.html
+https://spdx.org/licenses/MIT.html
+
+The published crate archive contains no discoverable top-level license/notice file. This generated notice preserves all attribution and license metadata supplied by that archive instead of silently omitting the package.
+
 
### `503558bfefe66ca15e4e3f7955b3cb0ec87fd52f29bf24b336af7bd00e946d5c` @@ -6722,6 +7150,55 @@ DEALINGS IN THE SOFTWARE. +### `573f5227db835cd30bbdd3aed3f82615f80119a4d5c82b4daf642dbfe2b6afde` + +Packages: weezl 0.1.12
+Source filenames: LICENSE-MIT + +
+The MIT License (MIT)
+
+Copyright (c) HeroicKatora 2020
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
+
+
+
+ +### `5755400844088f6cb705de6d2662e34a2512f7f20d818b35349f726d726e2df5` + +Packages: skia-rs-core 0.3.0
+Source filenames: generated-package-license-notice.txt + +
+Package: skia-rs-core 0.3.0
+Declared license: MIT OR Apache-2.0
+Authors/copyright attribution from package metadata: Pegasus Heavy Industries
+Source: https://github.com/pegasusheavy/skia-rs
+SPDX license texts:
+https://spdx.org/licenses/Apache-2.0.html
+https://spdx.org/licenses/MIT.html
+
+The published crate archive contains no discoverable top-level license/notice file. This generated notice preserves all attribution and license metadata supplied by that archive instead of silently omitting the package.
+
+
+ ### `58545fed1565e42d687aecec6897d35c6d37ccb71479a137c0deb2203e125c79` Packages: tracing-core 0.1.36
@@ -6752,6 +7229,36 @@ SOFTWARE. +### `592dc80f1a865d20d61a2006a2d29ce34a2bc28cd7e868ab300fdeed6da154ca` + +Packages: color_quant 1.1.0
+Source filenames: LICENSE + +
+The MIT License (MIT)
+
+Copyright (c) 2016 PistonDevelopers
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
+
+
+ ### `5b460f37be48ac4cf2181596181cc6cae432fc2caae05944873f380730829a4b` Packages: dimpl 0.7.2, is 0.11.0, str0m 0.22.0, str0m-proto 0.7.0, str0m-rust-crypto 0.6.0
@@ -6917,6 +7424,24 @@ The published crate archive contains no discoverable top-level license/notice fi +### `5f86f67a1adc668035f88a708c7355d28a9998612afa6647e07a1f33075c23eb` + +Packages: naga 23.1.0
+Source filenames: generated-package-license-notice.txt + +
+Package: naga 23.1.0
+Declared license: MIT OR Apache-2.0
+Authors/copyright attribution from package metadata: gfx-rs developers
+Source: https://github.com/gfx-rs/wgpu/tree/trunk/naga
+SPDX license texts:
+https://spdx.org/licenses/Apache-2.0.html
+https://spdx.org/licenses/MIT.html
+
+The published crate archive contains no discoverable top-level license/notice file. This generated notice preserves all attribution and license metadata supplied by that archive instead of silently omitting the package.
+
+
+ ### `615f39d3be6ff90d956c6b490b1f967a8995e88c109384895740748cb197fd87` Packages: objc2-core-graphics 0.3.2
@@ -7073,7 +7598,7 @@ DEALINGS IN THE SOFTWARE. ### `62c7a1e35f56406896d7aa7ca52d0cc0d272ac022b5d2796e7d6905db8a3636a` -Packages: itoa 1.0.18, libc 0.2.189, mach2 0.6.0, num_enum 0.7.6, num_enum_derive 0.7.6, prettyplease 0.2.37, proc-macro2 1.0.107, quote 1.0.47, rustc-hash 2.1.3, rustversion 1.0.23, semver 1.0.28, serde 1.0.229, serde_core 1.0.229, serde_derive 1.0.229, serde_json 1.0.151, syn 2.0.119, syn 3.0.3, thiserror 1.0.69, thiserror 2.0.20, thiserror-impl 1.0.69, thiserror-impl 2.0.20, unicode-ident 1.0.24, utf8parse 0.2.2, wasm-streams 0.5.0
+Packages: allocator-api2 0.2.21, itoa 1.0.18, libc 0.2.189, mach2 0.6.0, num_enum 0.7.6, num_enum_derive 0.7.6, prettyplease 0.2.37, proc-macro2 1.0.107, quote 1.0.47, rustc-hash 2.1.3, rustversion 1.0.23, semver 1.0.28, serde 1.0.229, serde_core 1.0.229, serde_derive 1.0.229, serde_json 1.0.151, sif-itree 0.4.1, syn 2.0.119, syn 3.0.3, thiserror 1.0.69, thiserror 2.0.20, thiserror-impl 1.0.69, thiserror-impl 2.0.20, unicode-ident 1.0.24, utf8parse 0.2.2, wasm-streams 0.5.0
Source filenames: LICENSE-APACHE
@@ -7311,7 +7836,7 @@ DEALINGS IN THE SOFTWARE.
 
 ### `6485b8ed310d3f0340bf1ad1f47645069ce4069dcc6bb46c7d5c6faf41de1fdb`
 
-Packages: bitflags 2.13.1, glob 0.3.4, log 0.4.33, num-bigint 0.4.8, num-derive 0.4.2, num-integer 0.1.46, num-traits 0.2.19, regex 1.13.1, regex-automata 0.4.18, regex-syntax 0.8.11
+Packages: bitflags 1.3.2, bitflags 2.13.1, glob 0.3.4, log 0.4.33, num-bigint 0.4.8, num-derive 0.4.2, num-integer 0.1.46, num-traits 0.2.19, regex 1.13.1, regex-automata 0.4.18, regex-syntax 0.8.11
Source filenames: LICENSE-MIT
@@ -7616,6 +8141,23 @@ The published crate archive contains no discoverable top-level license/notice fi
 
 
+### `6bd99e2013ab763cfa6e15cc07619a8165efa3eff5419df83459486c3f9b1f01` + +Packages: codespan-reporting 0.11.1
+Source filenames: generated-package-license-notice.txt + +
+Package: codespan-reporting 0.11.1
+Declared license: Apache-2.0
+Authors/copyright attribution from package metadata: Brendan Zabarauskas <bjzaba@yahoo.com.au>
+Source: https://github.com/brendanzab/codespan
+SPDX license texts:
+https://spdx.org/licenses/Apache-2.0.html
+
+The published crate archive contains no discoverable top-level license/notice file. This generated notice preserves all attribution and license metadata supplied by that archive instead of silently omitting the package.
+
+
+ ### `6c935d087a2992d0f092665400a2fa99c98db58d96fbe29368f8f48182bed9aa` Packages: fiat-crypto 0.2.9
@@ -8822,6 +9364,54 @@ DEALINGS IN THE SOFTWARE.
+### `75f29c8382dc456adb2c72d87ac9b09151ea9bc24d085c8ff9c0c047841b5195` + +Packages: rstar 0.12.2
+Source filenames: generated-package-license-notice.txt + +
+Package: rstar 0.12.2
+Declared license: MIT OR Apache-2.0
+Authors/copyright attribution from package metadata: Stefan Altmayer <stoeoef@gmail.com>, The Georust Developers <mods@georust.org>
+Source: https://github.com/georust/rstar
+SPDX license texts:
+https://spdx.org/licenses/Apache-2.0.html
+https://spdx.org/licenses/MIT.html
+
+The published crate archive contains no discoverable top-level license/notice file. This generated notice preserves all attribution and license metadata supplied by that archive instead of silently omitting the package.
+
+
+ +### `77257f3d2181236b1aee78920238062ae64efe13c5d858b2db126e79c9e1b14f` + +Packages: gif 0.13.3
+Source filenames: LICENSE-MIT + +
+The MIT License (MIT)
+
+Copyright (c) 2015 nwin
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
+
+
+ ### `7785efa9fca585958a2ddb080c8bc89763abb52d8b6d5850edd09b6cce7b020f` Packages: objc2-cloud-kit 0.3.2
@@ -9139,7 +9729,7 @@ Source filenames: LICENSE.txt ### `7b63ecd5f1902af1b63729947373683c32745c16a10e8e6292e2e2dcd7e90ae0` -Packages: heck 0.5.0
+Packages: heck 0.5.0, unicode-width 0.1.14, unicode-xid 0.2.6
Source filenames: LICENSE-MIT
@@ -9197,7 +9787,7 @@ THIS SOFTWARE.
 
 ### `7e12e5df4bae12cb21581ba157ced20e1986a0508dd10d0e8a4ab9a4cf94e85c`
 
-Packages: aho-corasick 1.1.5, memchr 2.8.3, same-file 1.0.6, walkdir 2.5.0, winapi-util 0.1.11
+Packages: aho-corasick 1.1.5, byteorder 1.5.0, byteorder-lite 0.1.0, memchr 2.8.3, same-file 1.0.6, termcolor 1.4.1, walkdir 2.5.0, winapi-util 0.1.11
Source filenames: UNLICENSE
@@ -9489,7 +10079,7 @@ limitations under the License.
 
 ### `8173d5c29b4f956d532781d2b86e4e30f83e6b7878dce18c919451d6ba707c90`
 
-Packages: bit-vec 0.9.1, minimal-lexical 0.2.1
+Packages: bit-set 0.8.0, bit-vec 0.8.0, bit-vec 0.9.1, minimal-lexical 0.2.1
Source filenames: LICENSE-APACHE
@@ -9769,8 +10359,8 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 
 ### `84b34dd7608f7fb9b17bd588a6bf392bf7de504e2716f024a77d89f1b145a151`
 
-Packages: tinyvec 1.12.0
-Source filenames: LICENSE-ZLIB.md +Packages: bytemuck 1.25.2, bytemuck_derive 1.12.0, tinyvec 1.12.0
+Source filenames: LICENSE-ZLIB, LICENSE-ZLIB.md
 Copyright (c) 2019 Daniel "Lokathor" Gee.
@@ -11210,6 +11800,234 @@ The published crate archive contains no discoverable top-level license/notice fi
 
 
+### `965a63a81d9a2fbeb5f9096954dabb49690f9dffcdac9825f675b25c807252a2` + +Packages: jpeg-encoder 0.6.1
+Source filenames: LICENSE-APACHE + +
+                             Apache License
+                       Version 2.0, January 2004
+                    http://www.apache.org/licenses/
+
+TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
+
+1. Definitions.
+
+  "License" shall mean the terms and conditions for use, reproduction,
+  and distribution as defined by Sections 1 through 9 of this document.
+
+  "Licensor" shall mean the copyright owner or entity authorized by
+  the copyright owner that is granting the License.
+
+  "Legal Entity" shall mean the union of the acting entity and all
+  other entities that control, are controlled by, or are under common
+  control with that entity. For the purposes of this definition,
+  "control" means (i) the power, direct or indirect, to cause the
+  direction or management of such entity, whether by contract or
+  otherwise, or (ii) ownership of fifty percent (50%) or more of the
+  outstanding shares, or (iii) beneficial ownership of such entity.
+
+  "You" (or "Your") shall mean an individual or Legal Entity
+  exercising permissions granted by this License.
+
+  "Source" form shall mean the preferred form for making modifications,
+  including but not limited to software source code, documentation
+  source, and configuration files.
+
+  "Object" form shall mean any form resulting from mechanical
+  transformation or translation of a Source form, including but
+  not limited to compiled object code, generated documentation,
+  and conversions to other media types.
+
+  "Work" shall mean the work of authorship, whether in Source or
+  Object form, made available under the License, as indicated by a
+  copyright notice that is included in or attached to the work
+  (an example is provided in the Appendix below).
+
+  "Derivative Works" shall mean any work, whether in Source or Object
+  form, that is based on (or derived from) the Work and for which the
+  editorial revisions, annotations, elaborations, or other modifications
+  represent, as a whole, an original work of authorship. For the purposes
+  of this License, Derivative Works shall not include works that remain
+  separable from, or merely link (or bind by name) to the interfaces of,
+  the Work and Derivative Works thereof.
+
+  "Contribution" shall mean any work of authorship, including
+  the original version of the Work and any modifications or additions
+  to that Work or Derivative Works thereof, that is intentionally
+  submitted to Licensor for inclusion in the Work by the copyright owner
+  or by an individual or Legal Entity authorized to submit on behalf of
+  the copyright owner. For the purposes of this definition, "submitted"
+  means any form of electronic, verbal, or written communication sent
+  to the Licensor or its representatives, including but not limited to
+  communication on electronic mailing lists, source code control systems,
+  and issue tracking systems that are managed by, or on behalf of, the
+  Licensor for the purpose of discussing and improving the Work, but
+  excluding communication that is conspicuously marked or otherwise
+  designated in writing by the copyright owner as "Not a Contribution."
+
+  "Contributor" shall mean Licensor and any individual or Legal Entity
+  on behalf of whom a Contribution has been received by Licensor and
+  subsequently incorporated within the Work.
+
+2. Grant of Copyright License. Subject to the terms and conditions of
+  this License, each Contributor hereby grants to You a perpetual,
+  worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+  copyright license to reproduce, prepare Derivative Works of,
+  publicly display, publicly perform, sublicense, and distribute the
+  Work and such Derivative Works in Source or Object form.
+
+3. Grant of Patent License. Subject to the terms and conditions of
+  this License, each Contributor hereby grants to You a perpetual,
+  worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+  (except as stated in this section) patent license to make, have made,
+  use, offer to sell, sell, import, and otherwise transfer the Work,
+  where such license applies only to those patent claims licensable
+  by such Contributor that are necessarily infringed by their
+  Contribution(s) alone or by combination of their Contribution(s)
+  with the Work to which such Contribution(s) was submitted. If You
+  institute patent litigation against any entity (including a
+  cross-claim or counterclaim in a lawsuit) alleging that the Work
+  or a Contribution incorporated within the Work constitutes direct
+  or contributory patent infringement, then any patent licenses
+  granted to You under this License for that Work shall terminate
+  as of the date such litigation is filed.
+
+4. Redistribution. You may reproduce and distribute copies of the
+  Work or Derivative Works thereof in any medium, with or without
+  modifications, and in Source or Object form, provided that You
+  meet the following conditions:
+
+  (a) You must give any other recipients of the Work or
+      Derivative Works a copy of this License; and
+
+  (b) You must cause any modified files to carry prominent notices
+      stating that You changed the files; and
+
+  (c) You must retain, in the Source form of any Derivative Works
+      that You distribute, all copyright, patent, trademark, and
+      attribution notices from the Source form of the Work,
+      excluding those notices that do not pertain to any part of
+      the Derivative Works; and
+
+  (d) If the Work includes a "NOTICE" text file as part of its
+      distribution, then any Derivative Works that You distribute must
+      include a readable copy of the attribution notices contained
+      within such NOTICE file, excluding those notices that do not
+      pertain to any part of the Derivative Works, in at least one
+      of the following places: within a NOTICE text file distributed
+      as part of the Derivative Works; within the Source form or
+      documentation, if provided along with the Derivative Works; or,
+      within a display generated by the Derivative Works, if and
+      wherever such third-party notices normally appear. The contents
+      of the NOTICE file are for informational purposes only and
+      do not modify the License. You may add Your own attribution
+      notices within Derivative Works that You distribute, alongside
+      or as an addendum to the NOTICE text from the Work, provided
+      that such additional attribution notices cannot be construed
+      as modifying the License.
+
+  You may add Your own copyright statement to Your modifications and
+  may provide additional or different license terms and conditions
+  for use, reproduction, or distribution of Your modifications, or
+  for any such Derivative Works as a whole, provided Your use,
+  reproduction, and distribution of the Work otherwise complies with
+  the conditions stated in this License.
+
+5. Submission of Contributions. Unless You explicitly state otherwise,
+  any Contribution intentionally submitted for inclusion in the Work
+  by You to the Licensor shall be under the terms and conditions of
+  this License, without any additional terms or conditions.
+  Notwithstanding the above, nothing herein shall supersede or modify
+  the terms of any separate license agreement you may have executed
+  with Licensor regarding such Contributions.
+
+6. Trademarks. This License does not grant permission to use the trade
+  names, trademarks, service marks, or product names of the Licensor,
+  except as required for reasonable and customary use in describing the
+  origin of the Work and reproducing the content of the NOTICE file.
+
+7. Disclaimer of Warranty. Unless required by applicable law or
+  agreed to in writing, Licensor provides the Work (and each
+  Contributor provides its Contributions) on an "AS IS" BASIS,
+  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+  implied, including, without limitation, any warranties or conditions
+  of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
+  PARTICULAR PURPOSE. You are solely responsible for determining the
+  appropriateness of using or redistributing the Work and assume any
+  risks associated with Your exercise of permissions under this License.
+
+8. Limitation of Liability. In no event and under no legal theory,
+  whether in tort (including negligence), contract, or otherwise,
+  unless required by applicable law (such as deliberate and grossly
+  negligent acts) or agreed to in writing, shall any Contributor be
+  liable to You for damages, including any direct, indirect, special,
+  incidental, or consequential damages of any character arising as a
+  result of this License or out of the use or inability to use the
+  Work (including but not limited to damages for loss of goodwill,
+  work stoppage, computer failure or malfunction, or any and all
+  other commercial damages or losses), even if such Contributor
+  has been advised of the possibility of such damages.
+
+9. Accepting Warranty or Additional Liability. While redistributing
+  the Work or Derivative Works thereof, You may choose to offer,
+  and charge a fee for, acceptance of support, warranty, indemnity,
+  or other liability obligations and/or rights consistent with this
+  License. However, in accepting such obligations, You may act only
+  on Your own behalf and on Your sole responsibility, not on behalf
+  of any other Contributor, and only if You agree to indemnify,
+  defend, and hold each Contributor harmless for any liability
+  incurred by, or claims asserted against, such Contributor by reason
+  of your accepting any such warranty or additional liability.
+
+END OF TERMS AND CONDITIONS
+
+APPENDIX: How to apply the Apache License to your work.
+
+  To apply the Apache License to your work, attach the following
+  boilerplate notice, with the fields enclosed by brackets "[]"
+  replaced with your own identifying information. (Don't include
+  the brackets!)  The text should be enclosed in the appropriate
+  comment syntax for the file format. We also recommend that a
+  file or class name and description of purpose be included on the
+  same "printed page" as the copyright notice for easier
+  identification within third-party archives.
+
+Copyright [yyyy] [name of copyright owner]
+
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+   http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+
+
+ +### `97d6f51e49f6670614703e0c99d7a04e409fc7bab1656a8f1753f8770b456c92` + +Packages: geo 0.33.1
+Source filenames: generated-package-license-notice.txt + +
+Package: geo 0.33.1
+Declared license: MIT OR Apache-2.0
+Authors/copyright attribution from package metadata: not supplied in Cargo package metadata
+Source: https://github.com/georust/geo
+SPDX license texts:
+https://spdx.org/licenses/Apache-2.0.html
+https://spdx.org/licenses/MIT.html
+
+The published crate archive contains no discoverable top-level license/notice file. This generated notice preserves all attribution and license metadata supplied by that archive instead of silently omitting the package.
+
+
+ ### `98181e7249d0c01737645ec982499ce99a0f07eb8f7d625b8840d799d10dbc01` Packages: block-buffer 0.12.1
@@ -11520,6 +12338,24 @@ Source filenames: LICENSE-APACHE limitations under the License. +
+ +### `9df9ba60a11af705f2e451b53762686e615d86f76b169cf075c3237730dbd7e2` + +Packages: bytemuck 1.25.2, bytemuck_derive 1.12.0
+Source filenames: LICENSE-MIT + +
+MIT License
+
+Copyright (c) 2019 Daniel "Lokathor" Gee.
+
+Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice (including the next paragraph) shall be included in all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+
 
### `9e0a97848ea543aef745c98e84fde696a9a3e0735538f6daefdd3cb1942effc1` @@ -11772,6 +12608,24 @@ DEALINGS IN THE SOFTWARE.
+### `a520921b3010a5df19c97a649f0d26edc2750ee2df3df4b3e7f582a2ae85f19f` + +Packages: skia-rs-path 0.3.0
+Source filenames: generated-package-license-notice.txt + +
+Package: skia-rs-path 0.3.0
+Declared license: MIT OR Apache-2.0
+Authors/copyright attribution from package metadata: Pegasus Heavy Industries
+Source: https://github.com/pegasusheavy/skia-rs
+SPDX license texts:
+https://spdx.org/licenses/Apache-2.0.html
+https://spdx.org/licenses/MIT.html
+
+The published crate archive contains no discoverable top-level license/notice file. This generated notice preserves all attribution and license metadata supplied by that archive instead of silently omitting the package.
+
+
+ ### `a5c61b93b6ee1d104af9920cf020ff3c7efe818e31fe562c72261847a728f513` Packages: asn1-rs 0.7.2, asn1-rs-derive 0.6.0, asn1-rs-impl 0.2.0, der-parser 10.0.0, oid-registry 0.8.1, rusticata-macros 4.1.0, x509-parser 0.18.1
@@ -11808,8 +12662,8 @@ DEALINGS IN THE SOFTWARE. ### `a60eea817514531668d7e00765731449fe14d059d3249e0bc93b36de45f759f2` -Packages: arrayvec 0.7.8, asn1-rs 0.7.2, asn1-rs-derive 0.6.0, asn1-rs-impl 0.2.0, atomic-waker 1.1.2, autocfg 1.5.1, base64 0.22.1, bitflags 2.13.1, bumpalo 3.20.3, cc 1.4.2, cexpr 0.6.0, cfg-if 1.0.4, cmake 0.1.58, core-foundation 0.10.1, core-foundation-sys 0.8.7, coreaudio-rs 0.14.2, crossbeam-deque 0.8.7, crossbeam-epoch 0.9.20, crossbeam-utils 0.8.22, curve25519-dalek-derive 0.1.1, der-parser 10.0.0, displaydoc 0.2.7, either 1.17.0, equivalent 1.0.2, errno 0.3.14, fastrand 2.5.0, filetime 0.2.29, find-msvc-tools 0.1.10, flate2 1.1.9, form_urlencoded 1.2.2, glob 0.3.4, group 0.13.0, hashbrown 0.17.1, heck 0.5.0, httparse 1.10.1, hyper-rustls 0.27.9, idna 1.1.0, idna_adapter 1.2.2, indexmap 2.14.0, is 0.11.0, itertools 0.13.0, jobserver 0.1.35, js-sys 0.3.104, lazy_static 1.5.0, linux-raw-sys 0.12.1, log 0.4.33, num-bigint 0.4.8, num-derive 0.4.2, num-integer 0.1.46, num-traits 0.2.19, oid-registry 0.8.1, once_cell 1.21.4, openssl-probe 0.2.1, percent-encoding 2.3.2, pkg-config 0.3.33, plain 0.2.3, rayon 1.12.0, rayon-core 1.13.0, regex 1.13.1, regex-automata 0.4.18, regex-syntax 0.8.11, roxmltree 0.21.1, rustc_version 0.4.1, rusticata-macros 4.1.0, rustix 1.1.4, rustls 0.23.43, rustls-native-certs 0.8.4, security-framework 3.7.0, security-framework-sys 2.17.0, signal-hook-registry 1.4.8, simd_cesu8 1.2.0, smallvec 1.15.2, socket2 0.6.5, stable_deref_trait 1.2.1, str0m 0.22.0, str0m-proto 0.7.0, str0m-rust-crypto 0.6.0, tar 0.4.46, url 2.5.8, uuid 1.24.0, version_check 0.9.5, wasi 0.11.1+wasi-snapshot-preview1, wasip2 1.0.4+wasi-0.2.12, wasm-bindgen 0.2.127, wasm-bindgen-futures 0.4.77, wasm-bindgen-macro 0.2.127, wasm-bindgen-macro-support 0.2.127, wasm-bindgen-shared 0.2.127, web-sys 0.3.104, wit-bindgen 0.57.1, x509-parser 0.18.1, xattr 1.6.1, yasna 0.6.0
-Source filenames: LICENSE-APACHE, repository-license/asn1-rs-0.7.2/LICENSE-APACHE, repository-license/str0m-0.22.0/src/packet/LICENSE-APACHE.txt, src/packet/LICENSE-APACHE.txt +Packages: arrayvec 0.7.8, asn1-rs 0.7.2, asn1-rs-derive 0.6.0, asn1-rs-impl 0.2.0, atomic-waker 1.1.2, autocfg 1.5.1, base64 0.22.1, bitflags 1.3.2, bitflags 2.13.1, bumpalo 3.20.3, cc 1.4.2, cexpr 0.6.0, cfg-if 1.0.4, cmake 0.1.58, core-foundation 0.10.1, core-foundation-sys 0.8.7, coreaudio-rs 0.14.2, crossbeam-deque 0.8.7, crossbeam-epoch 0.9.20, crossbeam-utils 0.8.22, curve25519-dalek-derive 0.1.1, der-parser 10.0.0, displaydoc 0.2.7, either 1.17.0, equivalent 1.0.2, errno 0.3.14, fastrand 2.5.0, filetime 0.2.29, find-msvc-tools 0.1.10, flate2 1.1.9, form_urlencoded 1.2.2, geo 0.33.1, geo-types 0.7.20, gif 0.13.3, glob 0.3.4, group 0.13.0, hash32 0.3.1, hashbrown 0.16.1, hashbrown 0.17.1, heapless 0.8.0, heck 0.5.0, httparse 1.10.1, hyper-rustls 0.27.9, idna 1.1.0, idna_adapter 1.2.2, indexmap 2.14.0, is 0.11.0, itertools 0.13.0, jobserver 0.1.35, jpeg-decoder 0.3.2, js-sys 0.3.104, lazy_static 1.5.0, linux-raw-sys 0.12.1, lock_api 0.4.14, log 0.4.33, num-bigint 0.4.8, num-derive 0.4.2, num-integer 0.1.46, num-traits 0.2.19, oid-registry 0.8.1, once_cell 1.21.4, openssl-probe 0.2.1, parking_lot 0.12.5, parking_lot_core 0.9.12, percent-encoding 2.3.2, pkg-config 0.3.33, plain 0.2.3, png 0.17.16, rayon 1.12.0, rayon-core 1.13.0, regex 1.13.1, regex-automata 0.4.18, regex-syntax 0.8.11, robust 1.2.0, roxmltree 0.21.1, rustc-hash 1.1.0, rustc_version 0.4.1, rusticata-macros 4.1.0, rustix 1.1.4, rustls 0.23.43, rustls-native-certs 0.8.4, scopeguard 1.2.0, security-framework 3.7.0, security-framework-sys 2.17.0, signal-hook-registry 1.4.8, simd_cesu8 1.2.0, smallvec 1.15.2, socket2 0.6.5, stable_deref_trait 1.2.1, str0m 0.22.0, str0m-proto 0.7.0, str0m-rust-crypto 0.6.0, tar 0.4.46, unicode-width 0.1.14, unicode-xid 0.2.6, url 2.5.8, uuid 1.24.0, uuid-rng-internal 1.24.0, version_check 0.9.5, wasi 0.11.1+wasi-snapshot-preview1, wasip2 1.0.4+wasi-0.2.12, wasm-bindgen 0.2.127, wasm-bindgen-futures 0.4.77, wasm-bindgen-macro 0.2.127, wasm-bindgen-macro-support 0.2.127, wasm-bindgen-shared 0.2.127, web-sys 0.3.104, weezl 0.1.12, wit-bindgen 0.57.1, x509-parser 0.18.1, xattr 1.6.1, yasna 0.6.0
+Source filenames: LICENSE-APACHE, repository-license/asn1-rs-0.7.2/LICENSE-APACHE, repository-license/geo-types-0.7.20/LICENSE-APACHE, repository-license/str0m-0.22.0/src/packet/LICENSE-APACHE.txt, repository-license/uuid-1.24.0/LICENSE-APACHE, src/packet/LICENSE-APACHE.txt
                               Apache License
@@ -12714,6 +13568,23 @@ limitations under the License.
 
 
+### `abad130a74eb590181d6cae3217337e94716394b1db11b7faa1dcde7a1095777` + +Packages: i_key_sort 0.10.3
+Source filenames: generated-package-license-notice.txt + +
+Package: i_key_sort 0.10.3
+Declared license: MIT
+Authors/copyright attribution from package metadata: Nail Sharipov <nailxsharipov@gmail.com>
+Source: https://github.com/iShape-Rust/iKeySort
+SPDX license texts:
+https://spdx.org/licenses/MIT.html
+
+The published crate archive contains no discoverable top-level license/notice file. This generated notice preserves all attribution and license metadata supplied by that archive instead of silently omitting the package.
+
+
+ ### `ad64fcb9589f162720f3cc5010ad76ca6ad3764e11861f9192c489df176bb71d` Packages: der 0.7.10, pkcs8 0.10.2
@@ -13870,6 +14741,216 @@ DEALINGS IN THE SOFTWARE.
+### `be33ddb87a30fd321ab100e2d922cba512e50ec7a63d8e62e5bfc0798dd4b585` + +Packages: glam 0.29.3
+Source filenames: LICENSE-APACHE + +
+                              Apache License
+                        Version 2.0, January 2004
+                     http://www.apache.org/licenses/
+
+TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
+
+1. Definitions.
+
+   "License" shall mean the terms and conditions for use, reproduction,
+   and distribution as defined by Sections 1 through 9 of this document.
+
+   "Licensor" shall mean the copyright owner or entity authorized by
+   the copyright owner that is granting the License.
+
+   "Legal Entity" shall mean the union of the acting entity and all
+   other entities that control, are controlled by, or are under common
+   control with that entity. For the purposes of this definition,
+   "control" means (i) the power, direct or indirect, to cause the
+   direction or management of such entity, whether by contract or
+   otherwise, or (ii) ownership of fifty percent (50%) or more of the
+   outstanding shares, or (iii) beneficial ownership of such entity.
+
+   "You" (or "Your") shall mean an individual or Legal Entity
+   exercising permissions granted by this License.
+
+   "Source" form shall mean the preferred form for making modifications,
+   including but not limited to software source code, documentation
+   source, and configuration files.
+
+   "Object" form shall mean any form resulting from mechanical
+   transformation or translation of a Source form, including but
+   not limited to compiled object code, generated documentation,
+   and conversions to other media types.
+
+   "Work" shall mean the work of authorship, whether in Source or
+   Object form, made available under the License, as indicated by a
+   copyright notice that is included in or attached to the work
+   (an example is provided in the Appendix below).
+
+   "Derivative Works" shall mean any work, whether in Source or Object
+   form, that is based on (or derived from) the Work and for which the
+   editorial revisions, annotations, elaborations, or other modifications
+   represent, as a whole, an original work of authorship. For the purposes
+   of this License, Derivative Works shall not include works that remain
+   separable from, or merely link (or bind by name) to the interfaces of,
+   the Work and Derivative Works thereof.
+
+   "Contribution" shall mean any work of authorship, including
+   the original version of the Work and any modifications or additions
+   to that Work or Derivative Works thereof, that is intentionally
+   submitted to Licensor for inclusion in the Work by the copyright owner
+   or by an individual or Legal Entity authorized to submit on behalf of
+   the copyright owner. For the purposes of this definition, "submitted"
+   means any form of electronic, verbal, or written communication sent
+   to the Licensor or its representatives, including but not limited to
+   communication on electronic mailing lists, source code control systems,
+   and issue tracking systems that are managed by, or on behalf of, the
+   Licensor for the purpose of discussing and improving the Work, but
+   excluding communication that is conspicuously marked or otherwise
+   designated in writing by the copyright owner as "Not a Contribution."
+
+   "Contributor" shall mean Licensor and any individual or Legal Entity
+   on behalf of whom a Contribution has been received by Licensor and
+   subsequently incorporated within the Work.
+
+2. Grant of Copyright License. Subject to the terms and conditions of
+   this License, each Contributor hereby grants to You a perpetual,
+   worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+   copyright license to reproduce, prepare Derivative Works of,
+   publicly display, publicly perform, sublicense, and distribute the
+   Work and such Derivative Works in Source or Object form.
+
+3. Grant of Patent License. Subject to the terms and conditions of
+   this License, each Contributor hereby grants to You a perpetual,
+   worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+   (except as stated in this section) patent license to make, have made,
+   use, offer to sell, sell, import, and otherwise transfer the Work,
+   where such license applies only to those patent claims licensable
+   by such Contributor that are necessarily infringed by their
+   Contribution(s) alone or by combination of their Contribution(s)
+   with the Work to which such Contribution(s) was submitted. If You
+   institute patent litigation against any entity (including a
+   cross-claim or counterclaim in a lawsuit) alleging that the Work
+   or a Contribution incorporated within the Work constitutes direct
+   or contributory patent infringement, then any patent licenses
+   granted to You under this License for that Work shall terminate
+   as of the date such litigation is filed.
+
+4. Redistribution. You may reproduce and distribute copies of the
+   Work or Derivative Works thereof in any medium, with or without
+   modifications, and in Source or Object form, provided that You
+   meet the following conditions:
+
+   (a) You must give any other recipients of the Work or
+       Derivative Works a copy of this License; and
+
+   (b) You must cause any modified files to carry prominent notices
+       stating that You changed the files; and
+
+   (c) You must retain, in the Source form of any Derivative Works
+       that You distribute, all copyright, patent, trademark, and
+       attribution notices from the Source form of the Work,
+       excluding those notices that do not pertain to any part of
+       the Derivative Works; and
+
+   (d) If the Work includes a "NOTICE" text file as part of its
+       distribution, then any Derivative Works that You distribute must
+       include a readable copy of the attribution notices contained
+       within such NOTICE file, excluding those notices that do not
+       pertain to any part of the Derivative Works, in at least one
+       of the following places: within a NOTICE text file distributed
+       as part of the Derivative Works; within the Source form or
+       documentation, if provided along with the Derivative Works; or,
+       within a display generated by the Derivative Works, if and
+       wherever such third-party notices normally appear. The contents
+       of the NOTICE file are for informational purposes only and
+       do not modify the License. You may add Your own attribution
+       notices within Derivative Works that You distribute, alongside
+       or as an addendum to the NOTICE text from the Work, provided
+       that such additional attribution notices cannot be construed
+       as modifying the License.
+
+   You may add Your own copyright statement to Your modifications and
+   may provide additional or different license terms and conditions
+   for use, reproduction, or distribution of Your modifications, or
+   for any such Derivative Works as a whole, provided Your use,
+   reproduction, and distribution of the Work otherwise complies with
+   the conditions stated in this License.
+
+5. Submission of Contributions. Unless You explicitly state otherwise,
+   any Contribution intentionally submitted for inclusion in the Work
+   by You to the Licensor shall be under the terms and conditions of
+   this License, without any additional terms or conditions.
+   Notwithstanding the above, nothing herein shall supersede or modify
+   the terms of any separate license agreement you may have executed
+   with Licensor regarding such Contributions.
+
+6. Trademarks. This License does not grant permission to use the trade
+   names, trademarks, service marks, or product names of the Licensor,
+   except as required for reasonable and customary use in describing the
+   origin of the Work and reproducing the content of the NOTICE file.
+
+7. Disclaimer of Warranty. Unless required by applicable law or
+   agreed to in writing, Licensor provides the Work (and each
+   Contributor provides its Contributions) on an "AS IS" BASIS,
+   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+   implied, including, without limitation, any warranties or conditions
+   of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
+   PARTICULAR PURPOSE. You are solely responsible for determining the
+   appropriateness of using or redistributing the Work and assume any
+   risks associated with Your exercise of permissions under this License.
+
+8. Limitation of Liability. In no event and under no legal theory,
+   whether in tort (including negligence), contract, or otherwise,
+   unless required by applicable law (such as deliberate and grossly
+   negligent acts) or agreed to in writing, shall any Contributor be
+   liable to You for damages, including any direct, indirect, special,
+   incidental, or consequential damages of any character arising as a
+   result of this License or out of the use or inability to use the
+   Work (including but not limited to damages for loss of goodwill,
+   work stoppage, computer failure or malfunction, or any and all
+   other commercial damages or losses), even if such Contributor
+   has been advised of the possibility of such damages.
+
+9. Accepting Warranty or Additional Liability. While redistributing
+   the Work or Derivative Works thereof, You may choose to offer,
+   and charge a fee for, acceptance of support, warranty, indemnity,
+   or other liability obligations and/or rights consistent with this
+   License. However, in accepting such obligations, You may act only
+   on Your own behalf and on Your sole responsibility, not on behalf
+   of any other Contributor, and only if You agree to indemnify,
+   defend, and hold each Contributor harmless for any liability
+   incurred by, or claims asserted against, such Contributor by reason
+   of your accepting any such warranty or additional liability.
+
+END OF TERMS AND CONDITIONS
+
+APPENDIX: How to apply the Apache License to your work.
+
+   To apply the Apache License to your work, attach the following
+   boilerplate notice, with the fields enclosed by brackets "[]"
+   replaced with your own identifying information. (Don't include
+   the brackets!)  The text should be enclosed in the appropriate
+   comment syntax for the file format. We also recommend that a
+   file or class name and description of purpose be included on the
+   same "printed page" as the copyright notice for easier
+   identification within third-party archives.
+
+Copyright 2020 Cameron Hart
+
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+   http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+
+
+ ### `c0fabcc308b450cb6fe62c9f56fae6abbeb9768eb80d992484c857d744846c2e` Packages: ghash 0.5.1
@@ -14114,6 +15195,24 @@ Source filenames: license-apache-2.0 +### `c191998f5f595cf7d49a23cfd29b6d85b220e1d6f854b92f4c0f1ffa79d90a29` + +Packages: i_overlay 4.5.2
+Source filenames: generated-package-license-notice.txt + +
+Package: i_overlay 4.5.2
+Declared license: MIT OR Apache-2.0
+Authors/copyright attribution from package metadata: Nail Sharipov <nailxsharipov@gmail.com>
+Source: https://github.com/iShape-Rust/iOverlay
+SPDX license texts:
+https://spdx.org/licenses/Apache-2.0.html
+https://spdx.org/licenses/MIT.html
+
+The published crate archive contains no discoverable top-level license/notice file. This generated notice preserves all attribution and license metadata supplied by that archive instead of silently omitting the package.
+
+
+ ### `c23953d9deb0a3312dbeaf6c128a657f3591acee45067612fa68405eaa4525db` Packages: bindgen 0.72.1
@@ -14235,7 +15334,7 @@ licensed under the Apache License, Version 2.0 <LICENSE-APACHE> or ### `c6596eb7be8581c18be736c846fb9173b69eccf6ef94c5135893ec56bd92ba08` -Packages: anstream 1.0.0, anstyle 1.0.14, anstyle-parse 1.0.0, anstyle-query 1.1.5, anstyle-wincon 3.0.11, clap 4.6.6, clap_builder 4.6.6, clap_derive 4.6.4, clap_lex 1.1.0, colorchoice 1.0.5, crc32fast 1.5.0, is_terminal_polyfill 1.70.2, jni-sys 0.3.1, jni-sys 0.4.1, jni-sys-macros 0.4.1, once_cell_polyfill 1.70.2, serde_spanned 1.1.1, toml 1.1.4+spec-1.1.0, toml_datetime 1.1.1+spec-1.1.0, toml_edit 0.25.13+spec-1.1.0, toml_parser 1.1.3+spec-1.1.0, toml_writer 1.1.2+spec-1.1.0
+Packages: anstream 1.0.0, anstyle 1.0.14, anstyle-parse 1.0.0, anstyle-query 1.1.5, anstyle-wincon 3.0.11, clap 4.6.6, clap_builder 4.6.6, clap_derive 4.6.4, clap_lex 1.1.0, colorchoice 1.0.5, crc32fast 1.5.0, is_terminal_polyfill 1.70.2, jni-sys 0.3.1, jni-sys 0.4.1, jni-sys-macros 0.4.1, once_cell_polyfill 1.70.2, quick-error 2.0.1, serde_spanned 1.1.1, toml 1.1.4+spec-1.1.0, toml_datetime 1.1.1+spec-1.1.0, toml_edit 0.25.13+spec-1.1.0, toml_parser 1.1.3+spec-1.1.0, toml_writer 1.1.2+spec-1.1.0
Source filenames: LICENSE-APACHE, repository-license/jni-sys-0.3.1/LICENSE-APACHE
@@ -14654,6 +15753,40 @@ Source filenames: LICENSE, LICENSE-APACHE, LICENSE-APACHE.txt, repository-licens
 
 
+### `c77a4cf9da729987d0fe7ccd811e3bd27393914ddf3d23467c18cc22954513b3` + +Packages: fdeflate 0.3.7, image-webp 0.2.4
+Source filenames: LICENSE-MIT + +
+MIT License
+
+Permission is hereby granted, free of charge, to any
+person obtaining a copy of this software and associated
+documentation files (the "Software"), to deal in the
+Software without restriction, including without
+limitation the rights to use, copy, modify, merge,
+publish, distribute, sublicense, and/or sell copies of
+the Software, and to permit persons to whom the Software
+is furnished to do so, subject to the following
+conditions:
+
+The above copyright notice and this permission notice
+shall be included in all copies or substantial portions
+of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF
+ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED
+TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A
+PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT
+SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
+CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR
+IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+DEALINGS IN THE SOFTWARE.
+
+
+ ### `c816a0749cdc6bf062a5111c159723de51b2bfac66a1dac2655abd9e6b1583eb` Packages: try-lock 0.2.5
@@ -14911,6 +16044,40 @@ THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR I +### `c986bcdb83103d4ddf58aeb7b5302359782e54dc4eea14a0cc27c62dcbd50729` + +Packages: hash32 0.3.1
+Source filenames: LICENSE-MIT + +
+Copyright (c) 2018 Jorge Aparicio
+
+Permission is hereby granted, free of charge, to any
+person obtaining a copy of this software and associated
+documentation files (the "Software"), to deal in the
+Software without restriction, including without
+limitation the rights to use, copy, modify, merge,
+publish, distribute, sublicense, and/or sell copies of
+the Software, and to permit persons to whom the Software
+is furnished to do so, subject to the following
+conditions:
+
+The above copyright notice and this permission notice
+shall be included in all copies or substantial portions
+of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF
+ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED
+TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A
+PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT
+SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
+CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR
+IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+DEALINGS IN THE SOFTWARE.
+
+
+ ### `c995204cc6bad2ed67dd41f7d89bb9f1a9d48e0edd745732b30640d7912089a4` Packages: spki 0.7.3
@@ -14947,7 +16114,7 @@ DEALINGS IN THE SOFTWARE. ### `c9a75f18b9ab2927829a208fc6aa2cf4e63b8420887ba29cdb265d6619ae82d5` -Packages: rustc_version 0.4.1
+Packages: lock_api 0.4.14, parking_lot 0.12.5, parking_lot_core 0.9.12, rustc_version 0.4.1
Source filenames: LICENSE-MIT
@@ -14979,6 +16146,24 @@ DEALINGS IN THE SOFTWARE.
 
 
+### `caa2390e19c40285641bd323cacd489091ab2a3f3508141471cf0eb30d75a9f3` + +Packages: uuid-rng-internal 1.24.0
+Source filenames: generated-package-license-notice.txt + +
+Package: uuid-rng-internal 1.24.0
+Declared license: Apache-2.0 OR MIT
+Authors/copyright attribution from package metadata: uuid-rs contributors
+Source: https://github.com/uuid-rs/uuid
+SPDX license texts:
+https://spdx.org/licenses/Apache-2.0.html
+https://spdx.org/licenses/MIT.html
+
+The published crate archive contains no discoverable top-level license/notice file. This generated notice preserves all attribution and license metadata supplied by that archive instead of silently omitting the package.
+
+
+ ### `cb3c929a05e6cbc9de9ab06a4c57eeb60ca8c724bef6c138c87d3a577e27aa14` Packages: same-file 1.0.6, winapi-util 0.1.11
@@ -15322,9 +16507,43 @@ The published crate archive contains no discoverable top-level license/notice fi +### `cf6287cf93399cbc46a241bdbafb2d4b6e42956046a886550883a7056f1914eb` + +Packages: sif-itree 0.4.1
+Source filenames: LICENSE-MIT + +
+Copyright (c) 2020 Adam Reichold
+
+Permission is hereby granted, free of charge, to any
+person obtaining a copy of this software and associated
+documentation files (the "Software"), to deal in the
+Software without restriction, including without
+limitation the rights to use, copy, modify, merge,
+publish, distribute, sublicense, and/or sell copies of
+the Software, and to permit persons to whom the Software
+is furnished to do so, subject to the following
+conditions:
+
+The above copyright notice and this permission notice
+shall be included in all copies or substantial portions
+of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF
+ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED
+TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A
+PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT
+SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
+CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR
+IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+DEALINGS IN THE SOFTWARE.
+
+
+ ### `cfc7749b96f63bd31c3c42b5c471bf756814053e847c10f3eb003417bc523d30` -Packages: clang-sys 1.9.1, flagset 0.4.7, hound 3.5.1, lru-slab 0.1.2, tinyvec 1.12.0, utf8_iter 1.0.4, zeroize 1.9.0, zeroize_derive 1.5.0
+Packages: approx 0.5.1, clang-sys 1.9.1, flagset 0.4.7, hound 3.5.1, lru-slab 0.1.2, spade 2.15.1, tinyvec 1.12.0, utf8_iter 1.0.4, zeroize 1.9.0, zeroize_derive 1.5.0
Source filenames: LICENSE, LICENSE-APACHE, LICENSE-APACHE.md, LICENSE.txt, license
@@ -15815,6 +17034,36 @@ DEALINGS IN THE SOFTWARE.
 
 
+### `da3ece2d2daf5c812c8606d2922094f51818258d4ce0e041b4ee8409ba3b381f` + +Packages: geographiclib-rs 0.2.7
+Source filenames: LICENSE + +
+MIT License
+
+Copyright (c) 2019
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
+
+
+ ### `db8373b96caffc61198be37c43785776f781715905ae048cf209ad620102e0aa` Packages: aotuv_lancer_vorbis_sys 0.1.6
@@ -15958,6 +17207,41 @@ The published crate archive contains no discoverable top-level license/notice fi +### `ddb606a4226673241b8dedb155a25b271178d028a2bf74c90ee47fe495f4d9bc` + +Packages: robust 1.2.0
+Source filenames: LICENSE-MIT + +
+Copyright (c) 2017 The Spade Developers
+Copyright (c) 2020 The GeoRust Project Developers
+
+Permission is hereby granted, free of charge, to any
+person obtaining a copy of this software and associated
+documentation files (the "Software"), to deal in the
+Software without restriction, including without
+limitation the rights to use, copy, modify, merge,
+publish, distribute, sublicense, and/or sell copies of
+the Software, and to permit persons to whom the Software
+is furnished to do so, subject to the following
+conditions:
+
+The above copyright notice and this permission notice
+shall be included in all copies or substantial portions
+of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF
+ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED
+TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A
+PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT
+SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
+CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR
+IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+DEALINGS IN THE SOFTWARE.
+
+
+ ### `debe6fed7ac143217c7f533759c54b14f18cd01d5fe195c51d83c2ae2d136cb4` Packages: rcgen 0.14.9
@@ -16332,6 +17616,76 @@ SOFTWARE. +### `e3ba223bb1423f0aad8c3dfce0fe3148db48926d41e6fbc3afbbf5ff9e1c89cb` + +Packages: bytemuck 1.25.2, bytemuck_derive 1.12.0
+Source filenames: LICENSE-APACHE + +
+Apache License
+Version 2.0, January 2004
+http://www.apache.org/licenses/
+
+TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
+
+    1. Definitions.
+
+        "License" shall mean the terms and conditions for use, reproduction, and distribution as defined by Sections 1 through 9 of this document.
+
+        "Licensor" shall mean the copyright owner or entity authorized by the copyright owner that is granting the License.
+
+        "Legal Entity" shall mean the union of the acting entity and all other entities that control, are controlled by, or are under common control with that entity. For the purposes of this definition, "control" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity.
+
+        "You" (or "Your") shall mean an individual or Legal Entity exercising permissions granted by this License.
+
+        "Source" form shall mean the preferred form for making modifications, including but not limited to software source code, documentation source, and configuration files.
+
+        "Object" form shall mean any form resulting from mechanical transformation or translation of a Source form, including but not limited to compiled object code, generated documentation, and conversions to other media types.
+
+        "Work" shall mean the work of authorship, whether in Source or Object form, made available under the License, as indicated by a copyright notice that is included in or attached to the work (an example is provided in the Appendix below).
+
+        "Derivative Works" shall mean any work, whether in Source or Object form, that is based on (or derived from) the Work and for which the editorial revisions, annotations, elaborations, or other modifications represent, as a whole, an original work of authorship. For the purposes of this License, Derivative Works shall not include works that remain separable from, or merely link (or bind by name) to the interfaces of, the Work and Derivative Works thereof.
+
+        "Contribution" shall mean any work of authorship, including the original version of the Work and any modifications or additions to that Work or Derivative Works thereof, that is intentionally submitted to Licensor for inclusion in the Work by the copyright owner or by an individual or Legal Entity authorized to submit on behalf of the copyright owner. For the purposes of this definition, "submitted" means any form of electronic, verbal, or written communication sent to the Licensor or its representatives, including but not limited to communication on electronic mailing lists, source code control systems, and issue tracking systems that are managed by, or on behalf of, the Licensor for the purpose of discussing and improving the Work, but excluding communication that is conspicuously marked or otherwise designated in writing by the copyright owner as "Not a Contribution."
+
+        "Contributor" shall mean Licensor and any individual or Legal Entity on behalf of whom a Contribution has been received by Licensor and subsequently incorporated within the Work.
+    2. Grant of Copyright License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable copyright license to reproduce, prepare Derivative Works of, publicly display, publicly perform, sublicense, and distribute the Work and such Derivative Works in Source or Object form.
+    3. Grant of Patent License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable (except as stated in this section) patent license to make, have made, use, offer to sell, sell, import, and otherwise transfer the Work, where such license applies only to those patent claims licensable by such Contributor that are necessarily infringed by their Contribution(s) alone or by combination of their Contribution(s) with the Work to which such Contribution(s) was submitted. If You institute patent litigation against any entity (including a cross-claim or counterclaim in a lawsuit) alleging that the Work or a Contribution incorporated within the Work constitutes direct or contributory patent infringement, then any patent licenses granted to You under this License for that Work shall terminate as of the date such litigation is filed.
+    4. Redistribution. You may reproduce and distribute copies of the Work or Derivative Works thereof in any medium, with or without modifications, and in Source or Object form, provided that You meet the following conditions:
+        (a) You must give any other recipients of the Work or Derivative Works a copy of this License; and
+        (b) You must cause any modified files to carry prominent notices stating that You changed the files; and
+        (c) You must retain, in the Source form of any Derivative Works that You distribute, all copyright, patent, trademark, and attribution notices from the Source form of the Work, excluding those notices that do not pertain to any part of the Derivative Works; and
+        (d) If the Work includes a "NOTICE" text file as part of its distribution, then any Derivative Works that You distribute must include a readable copy of the attribution notices contained within such NOTICE file, excluding those notices that do not pertain to any part of the Derivative Works, in at least one of the following places: within a NOTICE text file distributed as part of the Derivative Works; within the Source form or documentation, if provided along with the Derivative Works; or, within a display generated by the Derivative Works, if and wherever such third-party notices normally appear. The contents of the NOTICE file are for informational purposes only and do not modify the License. You may add Your own attribution notices within Derivative Works that You distribute, alongside or as an addendum to the NOTICE text from the Work, provided that such additional attribution notices cannot be construed as modifying the License.
+
+        You may add Your own copyright statement to Your modifications and may provide additional or different license terms and conditions for use, reproduction, or distribution of Your modifications, or for any such Derivative Works as a whole, provided Your use, reproduction, and distribution of the Work otherwise complies with the conditions stated in this License.
+    5. Submission of Contributions. Unless You explicitly state otherwise, any Contribution intentionally submitted for inclusion in the Work by You to the Licensor shall be under the terms and conditions of this License, without any additional terms or conditions. Notwithstanding the above, nothing herein shall supersede or modify the terms of any separate license agreement you may have executed with Licensor regarding such Contributions.
+    6. Trademarks. This License does not grant permission to use the trade names, trademarks, service marks, or product names of the Licensor, except as required for reasonable and customary use in describing the origin of the Work and reproducing the content of the NOTICE file.
+    7. Disclaimer of Warranty. Unless required by applicable law or agreed to in writing, Licensor provides the Work (and each Contributor provides its Contributions) on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied, including, without limitation, any warranties or conditions of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. You are solely responsible for determining the appropriateness of using or redistributing the Work and assume any risks associated with Your exercise of permissions under this License.
+    8. Limitation of Liability. In no event and under no legal theory, whether in tort (including negligence), contract, or otherwise, unless required by applicable law (such as deliberate and grossly negligent acts) or agreed to in writing, shall any Contributor be liable to You for damages, including any direct, indirect, special, incidental, or consequential damages of any character arising as a result of this License or out of the use or inability to use the Work (including but not limited to damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses), even if such Contributor has been advised of the possibility of such damages.
+    9. Accepting Warranty or Additional Liability. While redistributing the Work or Derivative Works thereof, You may choose to offer, and charge a fee for, acceptance of support, warranty, indemnity, or other liability obligations and/or rights consistent with this License. However, in accepting such obligations, You may act only on Your own behalf and on Your sole responsibility, not on behalf of any other Contributor, and only if You agree to indemnify, defend, and hold each Contributor harmless for any liability incurred by, or claims asserted against, such Contributor by reason of your accepting any such warranty or additional liability.
+
+END OF TERMS AND CONDITIONS
+
+APPENDIX: How to apply the Apache License to your work.
+
+To apply the Apache License to your work, attach the following boilerplate notice, with the fields enclosed by brackets "[]" replaced with your own identifying information. (Don't include the brackets!) The text should be enclosed in the appropriate comment syntax for the file format. We also recommend that a file or class name and description of purpose be included on the same "printed page" as the copyright notice for easier identification within third-party archives.
+
+Copyright [yyyy] [name of copyright owner]
+
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+
+
+ ### `e4c9b06fa850cb9b540a5e400e9f6394cf15efcf4098144de477d1d3dae10150` Packages: utf8parse 0.2.2
@@ -16401,6 +17755,58 @@ The published crate archive contains no discoverable top-level license/notice fi +### `e79c6016e646c15c9c20d54f197b4cbd4f49930c7d2e8b5d04fef9859132dfe3` + +Packages: skia-rs-paint 0.3.0
+Source filenames: generated-package-license-notice.txt + +
+Package: skia-rs-paint 0.3.0
+Declared license: MIT OR Apache-2.0
+Authors/copyright attribution from package metadata: Pegasus Heavy Industries
+Source: https://github.com/pegasusheavy/skia-rs
+SPDX license texts:
+https://spdx.org/licenses/Apache-2.0.html
+https://spdx.org/licenses/MIT.html
+
+The published crate archive contains no discoverable top-level license/notice file. This generated notice preserves all attribution and license metadata supplied by that archive instead of silently omitting the package.
+
+
+ +### `eaf40297c75da471f7cda1f3458e8d91b4b2ec866e609527a13acfa93b638652` + +Packages: png 0.17.16
+Source filenames: LICENSE-MIT + +
+Copyright (c) 2015 nwin
+
+Permission is hereby granted, free of charge, to any
+person obtaining a copy of this software and associated
+documentation files (the "Software"), to deal in the
+Software without restriction, including without
+limitation the rights to use, copy, modify, merge,
+publish, distribute, sublicense, and/or sell copies of
+the Software, and to permit persons to whom the Software
+is furnished to do so, subject to the following
+conditions:
+
+The above copyright notice and this permission notice
+shall be included in all copies or substantial portions
+of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF
+ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED
+TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A
+PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT
+SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
+CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR
+IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+DEALINGS IN THE SOFTWARE.
+
+
+ ### `eb69613e00e596e13d2f58e820aee10e9d51754b91d7111bc997f1fc90791f66` Packages: generic-array 0.14.7
@@ -16704,6 +18110,37 @@ Source filenames: LICENSE-Apache +### `efcfee7981ff72431fffb06925cad00a23dce079ed4354f61030ad5abdb78829` + +Packages: redox_syscall 0.5.18
+Source filenames: LICENSE + +
+Copyright (c) 2017 Redox OS Developers
+
+MIT License
+
+Permission is hereby granted, free of charge, to any person obtaining
+a copy of this software and associated documentation files (the
+"Software"), to deal in the Software without restriction, including
+without limitation the rights to use, copy, modify, merge, publish,
+distribute, sublicense, and/or sell copies of the Software, and to
+permit persons to whom the Software is furnished to do so, subject to
+the following conditions:
+
+The above copyright notice and this permission notice shall be
+included in all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+
+ ### `f025ccfb7dfb6bdfedc75ca0f67acc69e6fb4998143d834f7c2f38a29989680f` Packages: ring 0.17.14
@@ -16813,7 +18250,7 @@ SOFTWARE. ### `f51ac2c59a222f7476ce507ca879960e2b64ea64bb2786eefdbeb7b0b538d1b7` -Packages: bit-vec 0.9.1
+Packages: bit-set 0.8.0, bit-vec 0.8.0, bit-vec 0.9.1
Source filenames: LICENSE-MIT
@@ -16979,6 +18416,74 @@ DEALINGS IN THE SOFTWARE.
 
 
+### `fb77f0a9c53e473abe5103c8632ef9f0f2874d4fb3f17cb2d8c661aab9cee9d7` + +Packages: scopeguard 1.2.0
+Source filenames: LICENSE-MIT + +
+Copyright (c) 2016-2019 Ulrik Sverdrup "bluss" and scopeguard developers
+
+Permission is hereby granted, free of charge, to any
+person obtaining a copy of this software and associated
+documentation files (the "Software"), to deal in the
+Software without restriction, including without
+limitation the rights to use, copy, modify, merge,
+publish, distribute, sublicense, and/or sell copies of
+the Software, and to permit persons to whom the Software
+is furnished to do so, subject to the following
+conditions:
+
+The above copyright notice and this permission notice
+shall be included in all copies or substantial portions
+of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF
+ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED
+TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A
+PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT
+SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
+CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR
+IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+DEALINGS IN THE SOFTWARE.
+
+
+ +### `fc1a4c9482e823f450af4c85471ca6e58d1fd0b3bd0998be4547b1be4a5bc4af` + +Packages: spade 2.15.1
+Source filenames: LICENSE-MIT + +
+Copyright (c) 2017 The Spade Developers
+
+Permission is hereby granted, free of charge, to any
+person obtaining a copy of this software and associated
+documentation files (the "Software"), to deal in the
+Software without restriction, including without
+limitation the rights to use, copy, modify, merge,
+publish, distribute, sublicense, and/or sell copies of
+the Software, and to permit persons to whom the Software
+is furnished to do so, subject to the following
+conditions:
+
+The above copyright notice and this permission notice
+shall be included in all copies or substantial portions
+of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF
+ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED
+TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A
+PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT
+SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
+CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR
+IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+DEALINGS IN THE SOFTWARE.
+
+
+ ### `fd80a26fbb3f644af1fa994134446702932968519797227e07a1368dea80f0bc` Packages: tinyvec 1.12.0
@@ -17030,7 +18535,7 @@ DEALINGS IN THE SOFTWARE. ### `ff8f68cb076caf8cefe7a6430d4ac086ce6af2ca8ce2c4e5a2004d4552ef52a2` -Packages: hashbrown 0.17.1
+Packages: hashbrown 0.16.1, hashbrown 0.17.1
Source filenames: LICENSE-MIT
diff --git a/tools/ci-matrix/src/api_surface.rs b/tools/ci-matrix/src/api_surface.rs
index c333b63..0491c07 100644
--- a/tools/ci-matrix/src/api_surface.rs
+++ b/tools/ci-matrix/src/api_surface.rs
@@ -932,6 +932,16 @@ fn validate_features(name: &str, actual: &BTreeMap>) -> Resu
         ]),
         "libremetaverse-imaging-skia" => BTreeMap::from([
             ("default".to_owned(), Vec::new()),
+            (
+                "rust-skia".to_owned(),
+                vec![
+                    "dep:image-webp".to_owned(),
+                    "dep:skia-rs-codec".to_owned(),
+                    "skia-rs-codec/gif".to_owned(),
+                    "skia-rs-codec/jpeg".to_owned(),
+                    "skia-rs-codec/png".to_owned(),
+                ],
+            ),
             ("skia".to_owned(), vec!["dep:skia-safe".to_owned()]),
         ]),
         "libremetaverse-voice-webrtc" => BTreeMap::from([
@@ -1232,7 +1242,7 @@ The exact mapping, exported-marker, feature, and normalized Rust declaration has
 - .NET events become `subscribe_*` calls returning an owned `Subscription`; callbacks are `Send + Sync` and dispatch outside internal locks.\n\
 - `IDisposable` becomes explicit idempotent shutdown plus `Drop`; cancellation remains a typed `Error::Cancelled`.\n\
 - Closed C# enums retain fixed discriminants and are SemVer-breaking to extend; flags retain unknown bits, while public Rust error enums are `non_exhaustive`.\n\
-- Optional native backends remain feature-gated (`jpeg2000`, `skia`, `vorbis`, `real-audio`); default and empty-default sets are part of the baseline.\n\
+- Optional native and pure-Rust backends remain feature-gated (`jpeg2000`, `rust-j2k`, `skia`, `rust-skia`, `vorbis`, `real-audio`); default and empty-default sets are part of the baseline.\n\
 - Capability HTTP injection uses project-owned `HttpMessageHandler`, `CapsHttpLimits`, and `with_native_transport`; the internal `reqwest` client is not part of the public surface.\n\
 - External C# signature types map to core/std, adopted cross-platform crates, or project-owned boundary types; no third-party crate path leaks through mapped signatures or public Rust declarations.\n\n\
 ## Compile consumers\n\n\
diff --git a/tools/ci-matrix/src/lib.rs b/tools/ci-matrix/src/lib.rs
index 4fc8427..846cf1a 100644
--- a/tools/ci-matrix/src/lib.rs
+++ b/tools/ci-matrix/src/lib.rs
@@ -38,7 +38,7 @@ const REQUIRED_PROFILES: [&str; 7] = [
     "windows-stable-portable",
     "macos-stable-portable",
 ];
-const REQUIRED_FEATURE_SETS: [&str; 12] = [
+const REQUIRED_FEATURE_SETS: [&str; 13] = [
     "all-features",
     "dds-bc67",
     "default",
@@ -48,11 +48,12 @@ const REQUIRED_FEATURE_SETS: [&str; 12] = [
     "no-default-features",
     "real-audio",
     "rust-j2k",
+    "rust-skia",
     "skia",
     "tests",
     "vorbis",
 ];
-const REQUIRED_FEATURES: [(&str, &str); 8] = [
+const REQUIRED_FEATURES: [(&str, &str); 9] = [
     ("libremetaverse", "dds-bc67"),
     ("libremetaverse", "jpeg2000"),
     ("libremetaverse", "rust-j2k"),
@@ -60,6 +61,7 @@ const REQUIRED_FEATURES: [(&str, &str); 8] = [
     ("libremetaverse-imaging", "jpeg2000"),
     ("libremetaverse-imaging", "rust-j2k"),
     ("libremetaverse-imaging-skia", "skia"),
+    ("libremetaverse-imaging-skia", "rust-skia"),
     ("libremetaverse-voice-webrtc", "real-audio"),
 ];