From 05edeb14186271df69502afa0b47f2953343acf0 Mon Sep 17 00:00:00 2001 From: Sophie Herold Date: Thu, 25 Jun 2026 16:52:58 +0200 Subject: [PATCH] cargo: Update to glycin 4.0.0-alpha --- Cargo.lock | 586 +++++++++++++++++++++++----- Cargo.toml | 10 +- src/decoder.rs | 23 +- src/decoder/formats/glycin_proxy.rs | 6 +- src/decoder/formats/svg.rs | 8 +- src/metadata.rs | 22 +- src/widgets/edit_window.rs | 59 ++- 7 files changed, 540 insertions(+), 174 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 89751c2..e6a5343 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -17,6 +17,12 @@ dependencies = [ "memchr", ] +[[package]] +name = "aliasable" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "250f629c0161ad8107cf89319e990051fae62832fd343083bea452d93e2205fd" + [[package]] name = "anyhow" version = "1.0.102" @@ -218,6 +224,12 @@ version = "1.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c08606f8c3cbf4ce6ec8e28fb0014a2c086708fe954eaa885384a6165172e7e8" +[[package]] +name = "bit_field" +version = "0.10.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e4b40c7323adcfc0a41c4b88143ed58346ff65a288fc144329c5c45e05d70c6" + [[package]] name = "bitflags" version = "2.11.0" @@ -255,6 +267,12 @@ version = "1.25.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c8efb64bd706a16a1bdde310ae86b351e4d21550d98d056f22f8a7f7a2183fec" +[[package]] +name = "byteorder-lite" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8f1fe948ff07f4bd06c30984e69f5b4899c516a3ef74f34df92a2df2ab535495" + [[package]] name = "cairo-rs" version = "0.22.0" @@ -321,6 +339,12 @@ dependencies = [ "num-traits", ] +[[package]] +name = "color_quant" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3d7b894f5411737b7867f4827955924d7c254fc9f4d91a6aad6b097804b1018b" + [[package]] name = "concurrent-queue" version = "2.5.0" @@ -484,12 +508,47 @@ dependencies = [ "pin-project-lite", ] +[[package]] +name = "exr" +version = "1.74.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4300e043a56aa2cb633c01af81ca8f699a321879a7854d3896a0ba89056363be" +dependencies = [ + "bit_field", + "half", + "lebe", + "miniz_oxide 0.8.9", + "smallvec", + "zune-inflate", +] + [[package]] name = "fastrand" version = "2.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "37909eebbb50d72f9059c3b6d82c0463f2ff062c9e95845c43a6c9c0355411be" +[[package]] +name = "fax" +version = "0.2.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "caf1079563223d5d59d83c85886a56e586cfd5c1a26292e971a0fa266531ac5a" + +[[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" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b97b65636e5b9ef369943878ac74335ba1c55c1cb6adbf1e2c293c624248d693" + [[package]] name = "field-offset" version = "0.3.6" @@ -556,6 +615,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "07bbe89c50d7a535e539b8c17bc0b49bdb77747034daa8087407d655f3f7cc1d" dependencies = [ "futures-core", + "futures-sink", ] [[package]] @@ -605,6 +665,12 @@ dependencies = [ "syn", ] +[[package]] +name = "futures-sink" +version = "0.3.32" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c39754e157331b013978ec91992bde1ac089843443c49cbc7f46150b0fad0893" + [[package]] name = "futures-task" version = "0.3.32" @@ -626,6 +692,7 @@ dependencies = [ "futures-core", "futures-io", "futures-macro", + "futures-sink", "futures-task", "memchr", "pin-project-lite", @@ -784,6 +851,16 @@ dependencies = [ "temp-dir", ] +[[package]] +name = "gif" +version = "0.14.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ee8cfcc411d9adbbaba82fb72661cc1bcca13e8bba98b364e62b2dba8f960159" +dependencies = [ + "color_quant", + "weezl", +] + [[package]] name = "gio" version = "0.22.2" @@ -814,6 +891,31 @@ dependencies = [ "windows-sys", ] +[[package]] +name = "gio-unix" +version = "0.22.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f9241b3df1288f8b59027e9499a999c54ec6993111e21644e72d4527fdafdb7c" +dependencies = [ + "gio", + "gio-unix-sys", + "glib", + "libc", +] + +[[package]] +name = "gio-unix-sys" +version = "0.22.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "44bab97ce39112040216e268f074645f50b31caeb53af708ab5d7e4e67f0dbfd" +dependencies = [ + "gio-sys", + "glib-sys", + "gobject-sys", + "libc", + "system-deps", +] + [[package]] name = "glib" version = "0.22.0" @@ -841,7 +943,7 @@ version = "0.22.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8b48a968528354e04603ae96205f00cf7e77347ffde0fc943a2159948d7d6d80" dependencies = [ - "heck", + "heck 0.5.0", "proc-macro2", "quote", "syn", @@ -859,46 +961,28 @@ dependencies = [ [[package]] name = "glycin" -version = "3.1.0" +version = "4.0.0-alpha" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "923674c1f2b1a28f69ebdc0f572672e63874e17ce0e60c96b8bfaff47a8ef4e9" +checksum = "ab0d95230ccbc60d168eca33984e3ee2c75d75bb844eb11eb97907eaffc92886" dependencies = [ - "async-fs", - "async-global-executor", - "async-io", - "async-lock", - "async-task", - "blocking", - "futures-channel", - "futures-lite", - "futures-timer", - "futures-util", - "gdk4", - "gio", - "glib", - "glycin-common", - "glycin-utils", - "gufo-common", - "gufo-exif", - "lcms2", - "lcms2-sys", - "libc", - "libseccomp", - "memfd", - "memmap2", - "nix", - "static_assertions", - "thiserror", - "tracing", - "yeslogic-fontconfig-sys", - "zbus", + "glycin-builtin", + "glycin-external", +] + +[[package]] +name = "glycin-builtin" +version = "4.0.0-alpha" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5c5a3cd8219bdee0cd16a26c3728c075604a2a293b211c4e95d0eb2eb55fbe7e" +dependencies = [ + "glycin-core", ] [[package]] name = "glycin-common" -version = "1.0.4" +version = "2.0.0-alpha" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "db28cec888051ccbf68f9f352d57ba2a292179863524a0769e54dbb72d152a03" +checksum = "daf97898ba7a2356b941983ab1ef5634f2e1567eb290fe801bde60da185e2085" dependencies = [ "bitflags", "gufo-common", @@ -914,19 +998,88 @@ dependencies = [ ] [[package]] -name = "glycin-utils" -version = "4.1.0" +name = "glycin-core" +version = "4.0.0-alpha" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b49cd2451bced7416341a5e89d74f547e92b85b67e8f66c8723a7505930a50ab" +checksum = "c624b4182686e793e8dd897108b972d66814d925e66a5acefde25d8faaab1b77" +dependencies = [ + "async-fs", + "async-global-executor", + "async-io", + "async-lock", + "async-task", + "blocking", + "futures-channel", + "futures-lite", + "futures-timer", + "futures-util", + "gdk4", + "gio", + "gio-unix", + "glib", + "glycin-common", + "glycin-image-rs", + "glycin-utils", + "gufo-common", + "gufo-exif", + "lcms2", + "lcms2-sys", + "libc", + "libseccomp", + "nix", + "static_assertions", + "thiserror", + "tracing", + "yeslogic-fontconfig-sys", + "zbus", +] + +[[package]] +name = "glycin-external" +version = "4.0.0-alpha" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "60368043c6a9d7ffc234d93a410ffc8af46b5e8bf1c3a0fffeb62d9440b2e587" +dependencies = [ + "glycin-core", +] + +[[package]] +name = "glycin-image-rs" +version = "2.2.0-alpha" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c9ea3f09d2ae3a76aa548982abfbef05156007d822a3020ae9d9172b5ccc1793" +dependencies = [ + "glycin-utils", + "gufo", + "gufo-common", + "gufo-exif", + "gufo-jpeg", + "hayro-jpeg2000", + "image", + "image-extras", + "jpeg-encoder", + "log", + "zune-jpeg", +] + +[[package]] +name = "glycin-utils" +version = "5.0.0-alpha" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8c0c35adeb97c0e2324cc6c1a65b65bf8abf3ecea5bfc238d476bdee67a7ea4d" dependencies = [ "async-lock", "bitflags", "blocking", "env_logger", + "futures-lite", + "futures-timer", "futures-util", + "glib", "glycin-common", "gufo-common", "half", + "image", "libc", "libseccomp", "log", @@ -1060,15 +1213,16 @@ dependencies = [ [[package]] name = "gufo" -version = "0.4.0" +version = "0.5.0-alpha" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "79cc07454317e1e3baa8c731397f404b183850457a2006fbc9d076a5bb994df7" +checksum = "d97d857a79df06e10cd669541ed0a42d471a45a5201ce99535baf99b18c4129a" dependencies = [ "chrono", "gufo-common", "gufo-exif", "gufo-jpeg", "gufo-png", + "gufo-svg", "gufo-tiff", "gufo-webp", "gufo-xmp", @@ -1078,9 +1232,9 @@ dependencies = [ [[package]] name = "gufo-common" -version = "1.1.0" +version = "2.0.0-alpha" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9f23bc0d0e791259ce4fe703c4d988c64317e33477bc4d1d7526ab8eb9fcaab6" +checksum = "970e26402b2750cf3fbbf49116dca9fc010c939013125623c94da632f1ba76e8" dependencies = [ "chrono", "paste", @@ -1091,47 +1245,63 @@ dependencies = [ [[package]] name = "gufo-exif" -version = "0.4.0" +version = "0.5.0-alpha" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ad61fccc591119491879e7bee63ebbfbd27811b35367b4728a857119fde78843" +checksum = "e6a31aca18913da24cf6aaf0d3ffd905608463ffb75d0af42c2f0bf3afc7b987" dependencies = [ "chrono", "gufo-common", + "indexmap", + "ouroboros", "thiserror", "tracing", + "zerocopy", ] [[package]] name = "gufo-jpeg" -version = "0.4.0" +version = "0.5.0-alpha" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5606b919ea2538d6e761781be87eaf5186427c3d64849c1013359aa3681e68d2" +checksum = "004fec8f321842386ba7decc6ee03dde7ed35f29c3586861a5c708cca1e4259b" dependencies = [ "gufo-common", "indexmap", + "jpeg-encoder", "thiserror", "tracing", ] [[package]] name = "gufo-png" -version = "0.4.0" +version = "0.5.0-alpha" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "48293353510101aa3791932172f864c9acdf2125d730f50910cac965ea2e66d5" +checksum = "810e7750b869abb84c6162ad01a240f388a924d2d469ae30a0c2c11a28e81813" dependencies = [ "crc32fast", "encoding_rs", "gufo-common", "hex", - "miniz_oxide 0.9.0", + "miniz_oxide 0.9.1", "thiserror", ] [[package]] -name = "gufo-tiff" -version = "0.4.0" +name = "gufo-svg" +version = "0.5.0-alpha" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "51743619d12e8ead9fdd3cdd2ad3d0ed994a538542857f5115d74d6547a0083b" +checksum = "c4d74e7f2578608f76c0eff9c517dabf6a7fa8769b1af36ad994d70ec01d5deb" +dependencies = [ + "gufo-common", + "memchr", + "thiserror", + "xml", +] + +[[package]] +name = "gufo-tiff" +version = "0.5.0-alpha" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0a937aa0a245c9602aa9ed4857b6fc8f184cc43cf91e18d982c74c698e20afd5" dependencies = [ "gufo-common", "thiserror", @@ -1139,9 +1309,9 @@ dependencies = [ [[package]] name = "gufo-webp" -version = "0.4.0" +version = "0.5.0-alpha" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "218ea90042f1766b38b487dfbb261b6f21636e5cfd570e1ac6709119dae92fe2" +checksum = "662c18ba5eef44d65c1694ebede033783ab5b48eb81366c1625deaaf75c47a18" dependencies = [ "gufo-common", "thiserror", @@ -1149,14 +1319,14 @@ dependencies = [ [[package]] name = "gufo-xmp" -version = "0.4.0" +version = "0.5.0-alpha" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "020d604dbaf16f257f9d8bf7c1109551089be459ad8dc54c4205d28fe1688399" +checksum = "ea3cc4abbf29cddc6ffc1a4473eec79f11cf742bc113f9bd319ca1d7fcedfc39" dependencies = [ "chrono", "gufo-common", "thiserror", - "xml-rs", + "xml", ] [[package]] @@ -1225,6 +1395,23 @@ version = "0.16.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "841d1cc9bed7f9236f321df977030373f4a4163ae1a7dbfe1a51a2c1a51d9100" +[[package]] +name = "hayro-jpeg2000" +version = "0.3.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c75ab947623ef4ccaa7acf0579edf7cbb5a73838e3839a7be73335e522f433a1" +dependencies = [ + "fearless_simd", + "image", + "moxcms", +] + +[[package]] +name = "heck" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "95505c38b4572b2d910cecb0281560f54b440a19336cbbcb27bf6ce6adc6f5a8" + [[package]] name = "heck" version = "0.5.0" @@ -1249,6 +1436,46 @@ version = "2.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3d3067d79b975e8844ca9eb072e16b31c3c1c36928edf9c6789548c524d0d954" +[[package]] +name = "image" +version = "0.25.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "85ab80394333c02fe689eaf900ab500fbd0c2213da414687ebf995a65d5a6104" +dependencies = [ + "bytemuck", + "byteorder-lite", + "color_quant", + "exr", + "gif", + "image-webp", + "moxcms", + "num-traits", + "png", + "qoi", + "tiff", + "zune-core", + "zune-jpeg", +] + +[[package]] +name = "image-extras" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "60d02eb2c9ccbbab470538fce34c7bc3be7b4e59268e65a3171367b296cdb842" +dependencies = [ + "image", +] + +[[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.13.0" @@ -1301,6 +1528,12 @@ dependencies = [ "libc", ] +[[package]] +name = "jpeg-encoder" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0b0b36cbb4e6704f12f5b5d7b01dac593982c6550859ebd5a66fb15c9ea27fd5" + [[package]] name = "js-sys" version = "0.3.90" @@ -1346,6 +1579,12 @@ version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "09edd9e8b54e49e587e4f6295a7d29c3ea94d469cb40ab8ca70b288248a81db2" +[[package]] +name = "lebe" +version = "0.5.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7a79a3332a6609480d7d0c9eab957bca6b455b91bb84e66d19f5ff66294b85b8" + [[package]] name = "libadwaita" version = "0.9.1" @@ -1379,9 +1618,9 @@ dependencies = [ [[package]] name = "libc" -version = "0.2.183" +version = "0.2.186" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b5b646652bf6661599e1da8901b3b9522896f01e736bad5f723fe7a3a27f899d" +checksum = "68ab91017fe16c622486840e4c83c9a37afeff978bd239b5293d61ece587de66" [[package]] name = "libgweather" @@ -1507,18 +1746,9 @@ dependencies = [ [[package]] name = "memchr" -version = "2.8.0" +version = "2.8.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f8ca58f447f06ed17d5fc4043ce1b10dd205e060fb3ce5b979b8ed8e59ff3f79" - -[[package]] -name = "memfd" -version = "0.6.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ad38eb12aea514a0466ea40a80fd8cc83637065948eb4a426e4aa46261175227" -dependencies = [ - "rustix", -] +checksum = "88904434abc2901f197fe8cc55f0445e7ded921dba5911dad2e2b39b48e663c4" [[package]] name = "memmap2" @@ -1550,18 +1780,28 @@ dependencies = [ [[package]] name = "miniz_oxide" -version = "0.9.0" +version = "0.9.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5faa9f23e86bd5768d76def086192ff5f869fb088da12a976ea21e9796b975f6" +checksum = "b63fbc4a50860e98e7b2aa7804ded1db5cbc3aff9193adaff57a6931bf7c4b4c" dependencies = [ "adler2", ] [[package]] -name = "nix" -version = "0.30.1" +name = "moxcms" +version = "0.8.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "74523f3a35e05aba87a1d978330aef40f67b0304ac79c1c00b294c9830543db6" +checksum = "bb85c154ba489f01b25c0d36ae69a87e4a1c73a72631fc6c0eb6dde34a73e44b" +dependencies = [ + "num-traits", + "pxfm", +] + +[[package]] +name = "nix" +version = "0.31.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cf20d2fde8ff38632c426f1165ed7436270b44f199fc55284c38276f9db47c3d" dependencies = [ "bitflags", "cfg-if", @@ -1632,6 +1872,30 @@ dependencies = [ "pin-project-lite", ] +[[package]] +name = "ouroboros" +version = "0.18.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e0f050db9c44b97a94723127e6be766ac5c340c48f2c4bb3ffa11713744be59" +dependencies = [ + "aliasable", + "ouroboros_macro", + "static_assertions", +] + +[[package]] +name = "ouroboros_macro" +version = "0.18.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3c7028bdd3d43083f6d8d4d5187680d0d3560d54df4cc9d752005268b41e64d0" +dependencies = [ + "heck 0.4.1", + "proc-macro2", + "proc-macro2-diagnostics", + "quote", + "syn", +] + [[package]] name = "pango" version = "0.22.0" @@ -1691,6 +1955,19 @@ version = "0.3.32" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7edddbd0b52d732b21ad9a5fab5c704c14cd949e5e9a1ec5929a24fded1b904c" +[[package]] +name = "png" +version = "0.18.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "60769b8b31b2a9f263dae2776c37b1b28ae246943cf719eb6946a1db05128a61" +dependencies = [ + "bitflags", + "crc32fast", + "fdeflate", + "flate2", + "miniz_oxide 0.8.9", +] + [[package]] name = "polling" version = "3.11.0" @@ -1748,6 +2025,40 @@ dependencies = [ "unicode-ident", ] +[[package]] +name = "proc-macro2-diagnostics" +version = "0.10.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "af066a9c399a26e020ada66a034357a868728e72cd426f3adcd35f80d88d88c8" +dependencies = [ + "proc-macro2", + "quote", + "syn", + "version_check", + "yansi", +] + +[[package]] +name = "pxfm" +version = "0.1.29" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e0c5ccf5294c6ccd63a74f1565028353830a9c2f5eb0c682c355c471726a6e3f" + +[[package]] +name = "qoi" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7f6d64c71eb498fe9eae14ce4ec935c555749aef511cca85b5568910d6e48001" +dependencies = [ + "bytemuck", +] + +[[package]] +name = "quick-error" +version = "2.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a993555f31e5a609f617c12db6250dedcac1b0a85076912c436e6fc9b2c8e6a3" + [[package]] name = "quick-xml" version = "0.38.4" @@ -2011,7 +2322,7 @@ version = "0.28.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ab85eea0270ee17587ed4156089e10b9e6880ee688791d45a905f5b1ca36f664" dependencies = [ - "heck", + "heck 0.5.0", "proc-macro2", "quote", "syn", @@ -2035,7 +2346,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "48c8f33736f986f16d69b6cb8b03f55ddcad5c41acc4ccc39dd88e84aa805e7f" dependencies = [ "cfg-expr", - "heck", + "heck 0.5.0", "pkg-config", "toml", "version-compare", @@ -2095,6 +2406,20 @@ dependencies = [ "cfg-if", ] +[[package]] +name = "tiff" +version = "0.11.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b63feaf3343d35b6ca4d50483f94843803b0f51634937cc2ec519fc32232bc52" +dependencies = [ + "fax", + "flate2", + "half", + "quick-error", + "weezl", + "zune-jpeg", +] + [[package]] name = "toml" version = "0.9.12+spec-1.1.0" @@ -2107,7 +2432,7 @@ dependencies = [ "toml_datetime", "toml_parser", "toml_writer", - "winnow", + "winnow 0.7.14", ] [[package]] @@ -2128,7 +2453,7 @@ dependencies = [ "indexmap", "toml_datetime", "toml_parser", - "winnow", + "winnow 0.7.14", ] [[package]] @@ -2137,7 +2462,7 @@ version = "1.0.9+spec-1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "702d4415e08923e7e1ef96cd5727c0dfed80b4d2fa25db9647fe5eb6f7c5a4c4" dependencies = [ - "winnow", + "winnow 0.7.14", ] [[package]] @@ -2235,6 +2560,12 @@ version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "03c2856837ef78f57382f06b2b8563a2f512f7185d732608fd9176cb3b8edf0e" +[[package]] +name = "version_check" +version = "0.9.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0b928f33d975fc6ad9f86c8f283853ad26bdd5b10b7f1542aa2fa15e2289105a" + [[package]] name = "walkdir" version = "2.5.0" @@ -2342,6 +2673,12 @@ dependencies = [ "semver", ] +[[package]] +name = "weezl" +version = "0.1.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a28ac98ddc8b9274cb41bb4d9d4d5c425b6020c50c46f25559911905610b4a88" + [[package]] name = "winapi" version = "0.3.9" @@ -2397,6 +2734,15 @@ dependencies = [ "memchr", ] +[[package]] +name = "winnow" +version = "1.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0592e1c9d151f854e6fd382574c3a0855250e1d9b2f99d9281c6e6391af352f1" +dependencies = [ + "memchr", +] + [[package]] name = "wit-bindgen" version = "0.51.0" @@ -2413,7 +2759,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ea61de684c3ea68cb082b7a88508a8b27fcc8b797d738bfc99a82facf1d752dc" dependencies = [ "anyhow", - "heck", + "heck 0.5.0", "wit-parser", ] @@ -2424,7 +2770,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b7c566e0f4b284dd6561c786d9cb0142da491f46a9fbed79ea69cdad5db17f21" dependencies = [ "anyhow", - "heck", + "heck 0.5.0", "indexmap", "prettyplease", "syn", @@ -2497,10 +2843,16 @@ dependencies = [ ] [[package]] -name = "xml-rs" -version = "0.8.28" +name = "xml" +version = "1.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3ae8337f8a065cfc972643663ea4279e04e7256de865aa66fe25cec5fb912d3f" +checksum = "636f85e5ca6488e96401b61eb7de54f4e44755c988af0f52cf90230c312a1a89" + +[[package]] +name = "yansi" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cfe53a6657fd280eaa890a3bc59152892ffa3e30101319d168b781ed6529b049" [[package]] name = "yeslogic-fontconfig-sys" @@ -2515,9 +2867,9 @@ dependencies = [ [[package]] name = "zbus" -version = "5.14.0" +version = "5.16.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ca82f95dbd3943a40a53cfded6c2d0a2ca26192011846a1810c4256ef92c60bc" +checksum = "eee682d202a77e4a9f3b2c2bdf48a7b28af5c08c34ddf66f98c93e5e39464285" dependencies = [ "async-broadcast", "async-executor", @@ -2542,7 +2894,7 @@ dependencies = [ "uds_windows", "uuid", "windows-sys", - "winnow", + "winnow 1.0.3", "zbus_macros", "zbus_names", "zvariant", @@ -2550,9 +2902,9 @@ dependencies = [ [[package]] name = "zbus_macros" -version = "5.14.0" +version = "5.16.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "897e79616e84aac4b2c46e9132a4f63b93105d54fe8c0e8f6bffc21fa8d49222" +checksum = "adf1bd45a81a103745b1757754762a26e8cd01e4532e4d6c8ec431624b80d1d6" dependencies = [ "proc-macro-crate", "proc-macro2", @@ -2565,29 +2917,29 @@ dependencies = [ [[package]] name = "zbus_names" -version = "4.3.1" +version = "4.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ffd8af6d5b78619bab301ff3c560a5bd22426150253db278f164d6cf3b72c50f" +checksum = "7074f3e50b894eac91750142016d30d0a89be8e67dbfd9704fb875825760e52d" dependencies = [ "serde", - "winnow", + "winnow 1.0.3", "zvariant", ] [[package]] name = "zerocopy" -version = "0.8.40" +version = "0.8.52" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a789c6e490b576db9f7e6b6d661bcc9799f7c0ac8352f56ea20193b2681532e5" +checksum = "ce1022995ff5ff5d841ad7d994facc23098cd40152f2c1d11cd607c6f530653f" dependencies = [ "zerocopy-derive", ] [[package]] name = "zerocopy-derive" -version = "0.8.40" +version = "0.8.52" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f65c489a7071a749c849713807783f70672b28094011623e200cb86dcb835953" +checksum = "1ae7f38b72ec2a254e2b87ef277cf2cd4fb97cbebf944faa6f33354da0867930" dependencies = [ "proc-macro2", "quote", @@ -2601,24 +2953,48 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b8848ee67ecc8aedbaf3e4122217aff892639231befc6a1b58d29fff4c2cabaa" [[package]] -name = "zvariant" -version = "5.10.0" +name = "zune-core" +version = "0.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5708299b21903bbe348e94729f22c49c55d04720a004aa350f1f9c122fd2540b" +checksum = "cb8a0807f7c01457d0379ba880ba6322660448ddebc890ce29bb64da71fb40f9" + +[[package]] +name = "zune-inflate" +version = "0.2.54" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "73ab332fe2f6680068f3582b16a24f90ad7096d5d39b974d1c0aff0125116f02" +dependencies = [ + "simd-adler32", +] + +[[package]] +name = "zune-jpeg" +version = "0.5.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "27bc9d5b815bc103f142aa054f561d9187d191692ec7c2d1e2b4737f8dbd7296" +dependencies = [ + "zune-core", +] + +[[package]] +name = "zvariant" +version = "5.12.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a192a0bde63360d77a7523c833d4b4ce6070a927e2c53246e4c540b1a3e27be0" dependencies = [ "endi", "enumflags2", "serde", - "winnow", + "winnow 1.0.3", "zvariant_derive", "zvariant_utils", ] [[package]] name = "zvariant_derive" -version = "5.10.0" +version = "5.12.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5b59b012ebe9c46656f9cc08d8da8b4c726510aef12559da3e5f1bf72780752c" +checksum = "90bc6cde9c01c511074be97f7ccb6c19d0da89e3f8662e812e999dcfd4638737" dependencies = [ "proc-macro-crate", "proc-macro2", @@ -2629,13 +3005,13 @@ dependencies = [ [[package]] name = "zvariant_utils" -version = "3.3.0" +version = "3.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f75c23a64ef8f40f13a6989991e643554d9bef1d682a281160cf0c1bc389c5e9" +checksum = "1e8535915cfa75547e559d8c68e8139909a4aeee076831e4ef7fc59d8172c4d6" dependencies = [ "proc-macro2", "quote", "serde", "syn", - "winnow", + "winnow 1.0.3", ] diff --git a/Cargo.toml b/Cargo.toml index 7c2cc69..ee0baef 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -2,7 +2,7 @@ name = "loupe" version = "50.0.0" edition = "2024" -rust-version = "1.92" +rust-version = "1.93" license = "GPL-3.0-or-later" [profile.release] @@ -28,14 +28,14 @@ chrono = { version = "0.4.38", default-features = false, features = ["std"] } gettext-rs = { version = "0.7.0", features = ["gettext-system"] } gettext-sys = { version = "0.26.0", features = ["gettext-system"] } gio = { version = "0.22.0", features = ["v2_74"] } -glycin = { version = "3.1.0", features = ["gdk4", "unstable-config"] } +glycin = { version = "4.0.0-alpha", features = ["gdk4"] } gtk = { package = "gtk4", version = "0.11.0", features = [ "v4_14", "xml_validation", ] } -gufo = { version = "0.4.0", features = ["chrono", "all-image-formats"] } -gufo-exif = "0.4.0" -gufo-common = { version = "1.1.0", features = ["serde"] } +gufo = { version = "0.5.0-alpha", features = ["chrono"] } +gufo-exif = "0.5.0-alpha" +gufo-common = { version = "2.0.0-alpha", features = ["serde"] } gvdb-macros = "0.1.6" indexmap = "2.0.0" libc = "0.2.158" diff --git a/src/decoder.rs b/src/decoder.rs index 105a0ef..057b36a 100644 --- a/src/decoder.rs +++ b/src/decoder.rs @@ -65,15 +65,15 @@ pub enum DecoderUpdate { #[derive(Debug, Clone)] pub enum DecoderError { /// Image format not supported or unknown - UnsupportedFormat(String, glycin::ErrorCtx), + UnsupportedFormat(String, glycin::Error), /// No glycin-loaders installed - NoLoadersConfigured(glycin::ErrorCtx), + NoLoadersConfigured(glycin::Error), /// Memory limit exceeded - OutOfMemory(glycin::ErrorCtx), + OutOfMemory(glycin::Error), /// Failed to load image - ImageSource(glib::Error, glycin::ErrorCtx), + ImageSource(glib::Error, glycin::Error), - Generic(glycin::ErrorCtx), + Generic(glycin::Error), } impl UpdateSender { @@ -90,13 +90,13 @@ impl UpdateSender { /// Send occurring errors to renderer pub fn spawn_error_handled(&self, f: F) -> glib::JoinHandle<()> where - F: std::future::Future> + Send + 'static, + F: std::future::Future> + Send + 'static, { let update_sender = self.clone(); glib::spawn_future(async move { let update_sender = update_sender.clone(); - let result: Result<(), glycin::ErrorCtx> = f.await; + let result: Result<(), glycin::Error> = f.await; if let Err(err) = result { update_sender.send_error(err); @@ -104,7 +104,7 @@ impl UpdateSender { }) } - pub fn send_error(&self, err: glycin::ErrorCtx) { + pub fn send_error(&self, err: glycin::Error) { if let Some(mime_type) = err.unsupported_format() { let mut metadata = Metadata::default(); metadata.set_mime_type(mime_type.clone()); @@ -115,14 +115,13 @@ impl UpdateSender { )))); } else if err.is_out_of_memory() { self.send(DecoderUpdate::Error(Some(DecoderError::OutOfMemory(err)))); - } else if matches!(err.error(), glycin::Error::NoLoadersConfigured(_)) { + } else if err.has_no_processor_configured() { self.send(DecoderUpdate::Error(Some( DecoderError::NoLoadersConfigured(err), ))); - } else if let glycin::Error::ImageSource(glib_err) = err.error() { + } else if let Some(glib_err) = err.failed_image_source() { self.send(DecoderUpdate::Error(Some(DecoderError::ImageSource( - glib_err.clone(), - err, + glib_err, err, )))); } else { self.send(DecoderUpdate::Error(Some(DecoderError::Generic(err)))); diff --git a/src/decoder/formats/glycin_proxy.rs b/src/decoder/formats/glycin_proxy.rs index 5a11283..801ad35 100644 --- a/src/decoder/formats/glycin_proxy.rs +++ b/src/decoder/formats/glycin_proxy.rs @@ -43,7 +43,11 @@ impl Drop for Glycin { } impl Glycin { - pub fn new(image: glycin::Image, updater: UpdateSender, tiles: Arc) -> Self { + pub fn new( + mut image: glycin::Image, + updater: UpdateSender, + tiles: Arc, + ) -> Self { let cancellable = image.cancellable(); let (next_frame_send, next_frame_recv) = async_channel::bounded(2); diff --git a/src/decoder/formats/svg.rs b/src/decoder/formats/svg.rs index da3d204..8ac1fad 100644 --- a/src/decoder/formats/svg.rs +++ b/src/decoder/formats/svg.rs @@ -61,7 +61,11 @@ impl Drop for Svg { } impl Svg { - pub fn new(image: glycin::Image, updater: UpdateSender, tiles: Arc) -> Self { + pub fn new( + mut image: glycin::Image, + updater: UpdateSender, + tiles: Arc, + ) -> Self { let current_request: Arc> = Default::default(); let request_store = current_request.clone(); let cancellable = image.cancellable(); @@ -187,7 +191,7 @@ impl Svg { #[allow(unused_mut)] let loader = glycin::Loader::new(file.clone()); - let image = loader.load().await?; + let mut image = loader.load().await?; let frame_request = glycin::FrameRequest::new().scale(width as u32, height as u32); let frame = image.specific_frame(frame_request).await?; diff --git a/src/metadata.rs b/src/metadata.rs index a5fe164..f680478 100644 --- a/src/metadata.rs +++ b/src/metadata.rs @@ -62,19 +62,11 @@ impl Metadata { } pub fn set_image_info(&mut self, image_info: ImageDetails) { - if let Some(exif_raw) = image_info - .metadata_exif() - .as_ref() - .and_then(|x| x.get_full().ok()) - { - self.set_exif_bytes(exif_raw); + if let Some(exif_raw) = image_info.metadata_exif() { + self.set_exif_bytes(exif_raw.to_owned()); } - if let Some(exif_xmp) = image_info - .metadata_xmp() - .as_ref() - .and_then(|x| x.get_full().ok()) - { - self.set_xmp_bytes(exif_xmp); + if let Some(exif_xmp) = image_info.metadata_xmp() { + self.set_xmp_bytes(exif_xmp.to_owned()); } self.image_info = Some(image_info); } @@ -261,8 +253,8 @@ impl Metadata { } pub fn exposure_time(&self) -> Option { - if let Some((num, denom)) = self.metadata.exposure_time() { - let speed = num as f64 / denom as f64; + if let Some(exposure_time) = self.metadata.exposure_time() { + let speed = exposure_time.as_f64(); if speed <= 0.5 { let exposure = format!("{:.0}", 1. / speed); // Translators: Fractional exposure time (photography) in seconds @@ -288,7 +280,7 @@ impl Metadata { pub fn focal_length(&self) -> Option { self.metadata .focal_length() - .map(|focal_length| gettext_f(r"{}\u{202F}mm", [focal_length.to_string()])) + .map(|focal_length| gettext_f(r"{}\u{202F}mm", [focal_length.as_f32().to_string()])) } /// Combined maker and model info diff --git a/src/widgets/edit_window.rs b/src/widgets/edit_window.rs index d89eb11..02cfee0 100644 --- a/src/widgets/edit_window.rs +++ b/src/widgets/edit_window.rs @@ -364,7 +364,7 @@ mod imp { Err(err) => Err(err), }; match result { - Err(err) if matches!(err.error(), glycin::Error::Canceled(_)) => { + Err(err) if err.is_cancelled() => { tracing::debug!("Computing edited image canceled"); } Err(err) => { @@ -377,41 +377,32 @@ mod imp { } Ok(edit) => { tracing::debug!("Saving edited image to '{}'", new_file.uri()); - match edit.data().get() { - Err(err) => { - obj.window_show_error( - &gettext("Failed to Save Image"), - &format!("Failed to get binary data: {err}"), - ErrorType::General, - ); - } - Ok(data) => { - self.set_saving_status(Some(gettext("Saving Image"))); + self.set_saving_status(Some(gettext("Saving Image"))); - let save_result = gio::CancellableFuture::new( - new_file.replace_contents_future( - data, - None, - true, - gio::FileCreateFlags::NONE, - ), - cancellable, - ) - .await; + // TODO: Clone might be avoidable + let data = edit.data().to_vec(); + let save_result = gio::CancellableFuture::new( + new_file.replace_contents_future( + data, + None, + true, + gio::FileCreateFlags::NONE, + ), + cancellable, + ) + .await; - if save_result.is_err() { - tracing::debug!("Saving image canceled"); - } else if let Ok(Err(err)) = save_result { - obj.window_show_error( - &gettext("Failed to Save Image"), - &format!("Failed to write file:\n\n{err:?}"), - ErrorType::General, - ); - } else { - tracing::debug!("Image saved"); - return true; - } - } + if save_result.is_err() { + tracing::debug!("Saving image canceled"); + } else if let Ok(Err(err)) = save_result { + obj.window_show_error( + &gettext("Failed to Save Image"), + &format!("Failed to write file:\n\n{err:?}"), + ErrorType::General, + ); + } else { + tracing::debug!("Image saved"); + return true; } } }