diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml
index dd623d9..5edbbf9 100644
--- a/.gitlab-ci.yml
+++ b/.gitlab-ci.yml
@@ -15,7 +15,7 @@ flatpak:
variables:
# We are running tests manually
RUN_TESTS: "0"
- CONFIG_OPTS: "-Dprofile=ci"
+ CONFIG_OPTS: "-Dprofile=ci -Ddisable-glycin-sandbox=false"
flatpak@aarch64:
extends: ".flatpak@aarch64"
@@ -23,7 +23,7 @@ flatpak@aarch64:
interruptible: true
variables:
RUN_TESTS: "0"
- CONFIG_OPTS: "-Dprofile=ci"
+ CONFIG_OPTS: "-Dprofile=ci -Ddisable-glycin-sandbox=false"
cargo-fmt:
image: "rust:slim"
diff --git a/Cargo.lock b/Cargo.lock
index 52a3484..0af40a9 100644
--- a/Cargo.lock
+++ b/Cargo.lock
@@ -19,9 +19,9 @@ checksum = "f26201604c87b1e01bd3d98f8d5d9a8fcbb815e8cedb41ffccbeb4bf593a35fe"
[[package]]
name = "aho-corasick"
-version = "1.0.1"
+version = "1.0.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "67fc08ce920c31afb70f013dcce1bfc3a3195de6a228474e45e1f145b36f8d04"
+checksum = "43f6cb1bf222025340178f382c426f13757b2960e89779dfcb319c32542a5a41"
dependencies = [
"memchr",
]
@@ -162,6 +162,24 @@ dependencies = [
"event-listener",
]
+[[package]]
+name = "async-process"
+version = "1.7.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "7a9d28b1d97e08915212e2e45310d47854eafa69600756fc735fb788f75199c9"
+dependencies = [
+ "async-io",
+ "async-lock",
+ "autocfg",
+ "blocking",
+ "cfg-if",
+ "event-listener",
+ "futures-lite",
+ "rustix",
+ "signal-hook",
+ "windows-sys",
+]
+
[[package]]
name = "async-recursion"
version = "1.0.4"
@@ -170,7 +188,7 @@ checksum = "0e97ce7de6cf12de5d7226c73f5ba9811622f4db3a5b91b55c53e987e5f91cba"
dependencies = [
"proc-macro2",
"quote",
- "syn 2.0.15",
+ "syn 2.0.18",
]
[[package]]
@@ -183,6 +201,7 @@ dependencies = [
"async-global-executor",
"async-io",
"async-lock",
+ "async-process",
"crossbeam-utils",
"futures-channel",
"futures-core",
@@ -213,7 +232,7 @@ checksum = "b9ccdd8f2a161be9bd5c023df56f1b2a0bd1d83872ae53b71a84a12c9bf6e842"
dependencies = [
"proc-macro2",
"quote",
- "syn 2.0.15",
+ "syn 2.0.18",
]
[[package]]
@@ -243,12 +262,6 @@ dependencies = [
"rustc-demangle",
]
-[[package]]
-name = "bit_field"
-version = "0.10.2"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "dc827186963e592360843fb5ba4b973e145841266c1357f7180c43526f2e5b61"
-
[[package]]
name = "bitflags"
version = "1.3.2"
@@ -287,9 +300,9 @@ dependencies = [
[[package]]
name = "bumpalo"
-version = "3.12.2"
+version = "3.13.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "3c6ed94e98ecff0c12dd1b04c15ec0d7d9458ca8fe806cea6f12954efe74c63b"
+checksum = "a3e2c3daef883ecc1b5d58c15adae93470a91d425f3532ba1695849656af3fc1"
[[package]]
name = "bytemuck"
@@ -305,9 +318,9 @@ checksum = "14c189c53d098945499cdfa7ecc63567cf3886b3332b312a5b4585d8d3a6a610"
[[package]]
name = "cairo-rs"
-version = "0.17.0"
+version = "0.17.10"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "a8af54f5d48af1226928adc1f57edd22f5df1349e7da1fc96ae15cf43db0e871"
+checksum = "ab3603c4028a5e368d09b51c8b624b9a46edcd7c3778284077a6125af73c9f0a"
dependencies = [
"bitflags",
"cairo-sys-rs",
@@ -319,9 +332,9 @@ dependencies = [
[[package]]
name = "cairo-sys-rs"
-version = "0.17.0"
+version = "0.17.10"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "f55382a01d30e5e53f185eee269124f5e21ab526595b872751278dfbb463594e"
+checksum = "691d0c66b1fb4881be80a760cb8fe76ea97218312f9dfe2c9cc0f496ca279cb1"
dependencies = [
"glib-sys",
"libc",
@@ -345,9 +358,9 @@ dependencies = [
[[package]]
name = "cfg-expr"
-version = "0.15.1"
+version = "0.15.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "c8790cf1286da485c72cf5fc7aeba308438800036ec67d89425924c4807268c9"
+checksum = "e70d3ad08698a0568b0562f22710fe6bfc1f4a61a367c77d0398c562eadd453a"
dependencies = [
"smallvec",
"target-lexicon",
@@ -359,12 +372,6 @@ version = "1.0.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd"
-[[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.2.0"
@@ -441,12 +448,6 @@ dependencies = [
"cfg-if",
]
-[[package]]
-name = "crunchy"
-version = "0.2.2"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "7a81dae078cea95a014a339291cec439d2f232ebe854a9d672b796c6afafa9b7"
-
[[package]]
name = "crypto-common"
version = "0.1.6"
@@ -476,22 +477,12 @@ dependencies = [
[[package]]
name = "cssparser-macros"
-version = "0.6.0"
+version = "0.6.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "dfae75de57f2b2e85e8768c3ea840fd159c8f33e2b6522c7835b7abac81be16e"
+checksum = "13b588ba4ac1a99f7f2964d24b3d896ddc6bf847ee3855dbd4366f058cfcd331"
dependencies = [
"quote",
- "syn 1.0.109",
-]
-
-[[package]]
-name = "ctor"
-version = "0.1.26"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "6d2301688392eb071b0bf1a37be05c469d3cc4dbbd95df672fe28ab021e6a096"
-dependencies = [
- "quote",
- "syn 1.0.109",
+ "syn 2.0.18",
]
[[package]]
@@ -526,9 +517,9 @@ dependencies = [
[[package]]
name = "digest"
-version = "0.10.6"
+version = "0.10.7"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "8168378f4e5023e7218c89c891c0fd8ecdb5e5e4f18cb78f38cf245dd021e76f"
+checksum = "9ed9a281f7bc9b7576e61468ba615a66a5c8cfdff42420a70aa82701a3b1e292"
dependencies = [
"block-buffer",
"crypto-common",
@@ -536,15 +527,15 @@ dependencies = [
[[package]]
name = "dtoa"
-version = "0.4.8"
+version = "1.0.6"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "56899898ce76aaf4a0f24d914c97ea6ed976d42fec6ad33fcbb0a1103e07b2b0"
+checksum = "65d09067bfacaa79114679b279d7f5885b53295b1e2cfb4e79c8e4bd3d633169"
[[package]]
name = "dtoa-short"
-version = "0.3.3"
+version = "0.3.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "bde03329ae10e79ede66c9ce4dc930aa8599043b0743008548680f25b91502d6"
+checksum = "dbaceec3c6e4211c79e7b1800fb9680527106beb2f9c51904a3210c03a448c74"
dependencies = [
"dtoa",
]
@@ -588,18 +579,7 @@ checksum = "5e9a1f9f7d83e59740248a6e14ecf93929ade55027844dfcea78beafccc15745"
dependencies = [
"proc-macro2",
"quote",
- "syn 2.0.15",
-]
-
-[[package]]
-name = "enumn"
-version = "0.1.8"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "48016319042fb7c87b78d2993084a831793a897a5cd1a2a67cab9d1eeb4b7d76"
-dependencies = [
- "proc-macro2",
- "quote",
- "syn 2.0.15",
+ "syn 2.0.18",
]
[[package]]
@@ -623,7 +603,7 @@ checksum = "4bcfec3a70f97c962c307b2d2c56e358cf1d00b558d74262b5f929ee8cc7e73a"
dependencies = [
"errno-dragonfly",
"libc",
- "windows-sys 0.48.0",
+ "windows-sys",
]
[[package]]
@@ -642,22 +622,6 @@ version = "2.5.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "0206175f82b8d6bf6652ff7d71a1e27fd2e4efde587fd368662814d6ec1d9ce0"
-[[package]]
-name = "exr"
-version = "1.6.3"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "bdd2162b720141a91a054640662d3edce3d50a944a50ffca5313cd951abb35b4"
-dependencies = [
- "bit_field",
- "flume",
- "half",
- "lebe",
- "miniz_oxide 0.6.2",
- "rayon-core",
- "smallvec",
- "zune-inflate",
-]
-
[[package]]
name = "fastrand"
version = "1.9.0"
@@ -667,22 +631,13 @@ dependencies = [
"instant",
]
-[[package]]
-name = "fdeflate"
-version = "0.3.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "d329bdeac514ee06249dabc27877490f17f5d371ec693360768b838e19f3ae10"
-dependencies = [
- "simd-adler32",
-]
-
[[package]]
name = "field-offset"
-version = "0.3.5"
+version = "0.3.6"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "a3cf3a800ff6e860c863ca6d4b16fd999db8b752819c1606884047b73e468535"
+checksum = "38e2275cc4e4fc009b0669731a1e5ab7ebf11f469eaede2bab9309a5b4d6057f"
dependencies = [
- "memoffset 0.8.0",
+ "memoffset 0.9.0",
"rustc_version",
]
@@ -705,19 +660,6 @@ dependencies = [
"num-traits",
]
-[[package]]
-name = "flume"
-version = "0.10.14"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "1657b4441c3403d9f7b3409e47575237dac27b1b5726df654a6ecbf92f0f7577"
-dependencies = [
- "futures-core",
- "futures-sink",
- "nanorand",
- "pin-project",
- "spin",
-]
-
[[package]]
name = "foreign-types"
version = "0.5.0"
@@ -736,7 +678,7 @@ checksum = "1a5c6c585bc94aaf2c7b51dd4c2ba22680844aba4c687be581871a6f518c5742"
dependencies = [
"proc-macro2",
"quote",
- "syn 2.0.15",
+ "syn 2.0.18",
]
[[package]]
@@ -747,19 +689,13 @@ checksum = "aa9a19cbb55df58761df49b23516a86d432839add4af60fc256da840f66ed35b"
[[package]]
name = "form_urlencoded"
-version = "1.1.0"
+version = "1.2.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "a9c384f161156f5260c24a097c56119f9be8c798586aecc13afbcbe7b7e26bf8"
+checksum = "a62bc1cf6f830c2ec14a513a9fb124d0a213a629668a4186f329db21fe045652"
dependencies = [
"percent-encoding",
]
-[[package]]
-name = "four-cc"
-version = "0.2.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "92d73a076bdabd78c2f9045dba1b90664a655fa8372581c238596e1eb3a5e1b7"
-
[[package]]
name = "futf"
version = "0.1.5"
@@ -841,7 +777,7 @@ checksum = "89ca545a94061b6365f2c7355b4b32bd20df3ff95f02da9329b34ccc3bd6ee72"
dependencies = [
"proc-macro2",
"quote",
- "syn 2.0.15",
+ "syn 2.0.18",
]
[[package]]
@@ -885,9 +821,9 @@ dependencies = [
[[package]]
name = "gdk-pixbuf"
-version = "0.17.0"
+version = "0.17.10"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "b023fbe0c6b407bd3d9805d107d9800da3829dc5a676653210f1d5f16d7f59bf"
+checksum = "695d6bc846438c5708b07007537b9274d883373dd30858ca881d7d71b5540717"
dependencies = [
"bitflags",
"gdk-pixbuf-sys",
@@ -899,9 +835,9 @@ dependencies = [
[[package]]
name = "gdk-pixbuf-sys"
-version = "0.17.0"
+version = "0.17.10"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "7b41bd2b44ed49d99277d3925652a163038bd5ed943ec9809338ffb2f4391e3b"
+checksum = "9285ec3c113c66d7d0ab5676599176f1f42f4944ca1b581852215bf5694870cb"
dependencies = [
"gio-sys",
"glib-sys",
@@ -1015,15 +951,13 @@ dependencies = [
[[package]]
name = "getrandom"
-version = "0.2.9"
+version = "0.2.10"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "c85e1d9ab2eadba7e5040d4e09cbd6d072b76a557ad64e797c2cb9d4da21d7e4"
+checksum = "be4136b2a15dd319360be1c07d9933517ccf0be8f16bf62a3bee4f0d618df427"
dependencies = [
"cfg-if",
- "js-sys",
"libc",
"wasi 0.11.0+wasi-snapshot-preview1",
- "wasm-bindgen",
]
[[package]]
@@ -1046,16 +980,6 @@ dependencies = [
"temp-dir",
]
-[[package]]
-name = "gif"
-version = "0.12.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "80792593675e051cf94a4b111980da2ba60d4a83e43e0048c5693baab3977045"
-dependencies = [
- "color_quant",
- "weezl",
-]
-
[[package]]
name = "gimli"
version = "0.27.2"
@@ -1064,9 +988,9 @@ checksum = "ad0a93d233ebf96623465aad4046a8d3aa4da22d4f4beba5388838c8a434bbb4"
[[package]]
name = "gio"
-version = "0.17.9"
+version = "0.17.10"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "d14522e56c6bcb6f7a3aebc25cbcfb06776af4c0c25232b601b4383252d7cb92"
+checksum = "a6973e92937cf98689b6a054a9e56c657ed4ff76de925e36fc331a15f0c5d30a"
dependencies = [
"bitflags",
"futures-channel",
@@ -1084,9 +1008,9 @@ dependencies = [
[[package]]
name = "gio-sys"
-version = "0.17.4"
+version = "0.17.10"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "6b1d43b0d7968b48455244ecafe41192871257f5740aa6b095eb19db78e362a5"
+checksum = "0ccf87c30a12c469b6d958950f6a9c09f2be20b7773f7e70d20b867fdf2628c3"
dependencies = [
"glib-sys",
"gobject-sys",
@@ -1097,9 +1021,9 @@ dependencies = [
[[package]]
name = "glib"
-version = "0.17.9"
+version = "0.17.10"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "a7f1de7cbde31ea4f0a919453a2dcece5d54d5b70e08f8ad254dc4840f5f09b6"
+checksum = "d3fad45ba8d4d2cea612b432717e834f48031cd8853c8aaf43b2c79fec8d144b"
dependencies = [
"bitflags",
"futures-channel",
@@ -1120,9 +1044,9 @@ dependencies = [
[[package]]
name = "glib-macros"
-version = "0.17.9"
+version = "0.17.10"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "0a7206c5c03851ef126ea1444990e81fdd6765fb799d5bc694e4897ca01bb97f"
+checksum = "eca5c79337338391f1ab8058d6698125034ce8ef31b72a442437fa6c8580de26"
dependencies = [
"anyhow",
"heck",
@@ -1135,9 +1059,9 @@ dependencies = [
[[package]]
name = "glib-sys"
-version = "0.17.4"
+version = "0.17.10"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "49f00ad0a1bf548e61adfff15d83430941d9e1bb620e334f779edd1c745680a5"
+checksum = "d80aa6ea7bba0baac79222204aa786a6293078c210abe69ef1336911d4bdc4f0"
dependencies = [
"libc",
"system-deps",
@@ -1155,11 +1079,46 @@ dependencies = [
"wasm-bindgen",
]
+[[package]]
+name = "glycin"
+version = "0.0.1"
+source = "git+https://gitlab.gnome.org/sophie-h/glycin.git#2e3f9add120a4913e559729d361d6d7e5d010f2b"
+dependencies = [
+ "anyhow",
+ "async-std",
+ "futures",
+ "gdk4",
+ "gio",
+ "glib",
+ "glycin-utils",
+ "lcms2",
+ "memfd",
+ "memmap2 0.6.2",
+ "nix",
+ "rgb",
+ "safe-transmute",
+ "zbus",
+]
+
+[[package]]
+name = "glycin-utils"
+version = "0.0.1"
+source = "git+https://gitlab.gnome.org/sophie-h/glycin.git#2e3f9add120a4913e559729d361d6d7e5d010f2b"
+dependencies = [
+ "anyhow",
+ "async-std",
+ "gettext-rs",
+ "memmap2 0.6.2",
+ "nix",
+ "serde",
+ "zbus",
+]
+
[[package]]
name = "gobject-sys"
-version = "0.17.4"
+version = "0.17.10"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "15e75b0000a64632b2d8ca3cf856af9308e3a970844f6e9659bd197f026793d0"
+checksum = "cd34c3317740a6358ec04572c1bcfd3ac0b5b6529275fae255b237b314bb8062"
dependencies = [
"glib-sys",
"libc",
@@ -1168,9 +1127,9 @@ dependencies = [
[[package]]
name = "graphene-rs"
-version = "0.17.1"
+version = "0.17.10"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "21cf11565bb0e4dfc2f99d4775b6c329f0d40a2cff9c0066214d31a0e1b46256"
+checksum = "def4bb01265b59ed548b05455040d272d989b3012c42d4c1bbd39083cb9b40d9"
dependencies = [
"glib",
"graphene-sys",
@@ -1179,9 +1138,9 @@ dependencies = [
[[package]]
name = "graphene-sys"
-version = "0.17.0"
+version = "0.17.10"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "cf80a4849a8d9565410a8fec6fc3678e9c617f4ac7be182ca55ab75016e07af9"
+checksum = "1856fc817e6a6675e36cea0bd9a3afe296f5d9709d1e2d3182803ac77f0ab21d"
dependencies = [
"glib-sys",
"libc",
@@ -1280,14 +1239,14 @@ dependencies = [
[[package]]
name = "gvdb"
-version = "0.4.0"
+version = "0.4.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "d6fc5915836ff1779eb9455810dad729811334b1026d4316eaf89c3a415e32ea"
+checksum = "00421b382029e13501f36b7243dd05c3e7caa92d252790c3492e5fc7caca165b"
dependencies = [
"byteorder",
"flate2",
"lazy_static",
- "memmap2",
+ "memmap2 0.5.10",
"quick-xml",
"safe-transmute",
"serde",
@@ -1298,9 +1257,9 @@ dependencies = [
[[package]]
name = "gvdb-macros"
-version = "0.1.6"
+version = "0.1.7"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "c5166acbf52c6109ec51fc758532aaa47b0eb8c4becd585c3dde6f5965c6529e"
+checksum = "3ecc079cfae126c9b7cb24c78ee93af7b1231762402d5a1335c948b7e2866e2a"
dependencies = [
"gvdb",
"litrs",
@@ -1321,15 +1280,6 @@ dependencies = [
"system-deps",
]
-[[package]]
-name = "half"
-version = "2.2.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "02b4af3693f1b705df946e9fe5631932443781d0aabb423b62fcd4d73f6d2fd0"
-dependencies = [
- "crunchy",
-]
-
[[package]]
name = "hashbrown"
version = "0.12.3"
@@ -1371,33 +1321,14 @@ checksum = "9a3a5bfb195931eeb336b2a7b4d761daec841b97f947d34394601737a7bba5e4"
[[package]]
name = "idna"
-version = "0.3.0"
+version = "0.4.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "e14ddfc70884202db2244c223200c204c2bda1bc6e0998d11b5e024d657209e6"
+checksum = "7d20d6b07bfbc108882d88ed8e37d39636dcc260e15e30c45e6ba089610b917c"
dependencies = [
"unicode-bidi",
"unicode-normalization",
]
-[[package]]
-name = "image"
-version = "0.24.6"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "527909aa81e20ac3a44803521443a765550f09b5130c2c2fa1ea59c2f8f50a3a"
-dependencies = [
- "bytemuck",
- "byteorder",
- "color_quant",
- "exr",
- "gif",
- "jpeg-decoder",
- "num-rational",
- "num-traits",
- "png",
- "qoi",
- "tiff",
-]
-
[[package]]
name = "indexmap"
version = "1.9.3"
@@ -1419,13 +1350,13 @@ dependencies = [
[[package]]
name = "io-lifetimes"
-version = "1.0.10"
+version = "1.0.11"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "9c66c74d2ae7e79a5a8f7ac924adbe38ee42a859c6539ad869eb51f0b52dc220"
+checksum = "eae7b9aee968036d54dce06cebaefd919e4472e753296daccd6d344e3e2df0c2"
dependencies = [
"hermit-abi 0.3.1",
"libc",
- "windows-sys 0.48.0",
+ "windows-sys",
]
[[package]]
@@ -1437,7 +1368,7 @@ dependencies = [
"hermit-abi 0.3.1",
"io-lifetimes",
"rustix",
- "windows-sys 0.48.0",
+ "windows-sys",
]
[[package]]
@@ -1464,20 +1395,11 @@ dependencies = [
"libc",
]
-[[package]]
-name = "jpeg-decoder"
-version = "0.3.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "bc0000e42512c92e31c2252315bda326620a4e034105e900c98ec492fa077b3e"
-dependencies = [
- "rayon",
-]
-
[[package]]
name = "js-sys"
-version = "0.3.62"
+version = "0.3.63"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "68c16e1bfd491478ab155fd8b4896b86f9ede344949b641e61501e07c2b8b4d5"
+checksum = "2f37a4a5928311ac501dee68b3c7613a1037d0edb30c8e5427bd832d55d1b790"
dependencies = [
"wasm-bindgen",
]
@@ -1534,20 +1456,13 @@ dependencies = [
"pkg-config",
]
-[[package]]
-name = "lebe"
-version = "0.5.2"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "03087c2bad5e1034e8cace5926dec053fb3790248370865f5117a7d0213354c8"
-
[[package]]
name = "libadwaita"
-version = "0.4.1"
+version = "0.4.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "e82776542b73ac5691b2bddf3e2aaf0157d34f35193fb522de2fc258006c1785"
+checksum = "0244f4b13d8c3a8a0f0b86bbc234e2fbba7cfe70b7d14f822e363e5599bb7056"
dependencies = [
"bitflags",
- "futures-channel",
"gdk-pixbuf",
"gdk4",
"gio",
@@ -1555,15 +1470,14 @@ dependencies = [
"gtk4",
"libadwaita-sys",
"libc",
- "once_cell",
"pango",
]
[[package]]
name = "libadwaita-sys"
-version = "0.4.1"
+version = "0.4.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "91be74a61f26efa6946c02dad76eb4cd3021addb0ff85dde445c1cd41d2eca2d"
+checksum = "5bf83ec83c0fc9449b139c721e6f9958137dd7a1d7d47136e4eec929e3bd5265"
dependencies = [
"gdk4-sys",
"gio-sys",
@@ -1577,9 +1491,9 @@ dependencies = [
[[package]]
name = "libc"
-version = "0.2.144"
+version = "0.2.146"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "2b00cc1c228a6782d0f076e7b232802e0c5689d41bb5df366f2a6b6621cfdfe1"
+checksum = "f92be4933c13fd498862a9e02a3055f8a8d9c039ce33db97306fd5a6caa7f29b"
[[package]]
name = "libgweather"
@@ -1594,31 +1508,10 @@ dependencies = [
"libc",
]
-[[package]]
-name = "libheif-rs"
-version = "0.19.2"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "749fcebc2069f334599304546cfa891c30be08cdf4f358ed984a2c71c5e0031f"
-dependencies = [
- "enumn",
- "four-cc",
- "libc",
- "libheif-sys",
-]
-
-[[package]]
-name = "libheif-sys"
-version = "1.14.2"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "6af8b7a4151ae10f6d2e8684f7172c43f09c0258c84190fd9704422588ceec63"
-dependencies = [
- "libc",
-]
-
[[package]]
name = "librsvg"
version = "2.56.0"
-source = "git+https://gitlab.gnome.org/GNOME/librsvg.git#abc1e11396b7cba6cf082c11f4b2c0b1719f911c"
+source = "git+https://gitlab.gnome.org/GNOME/librsvg.git?rev=51c80502b8474ec10c315da3559a049bdf4fe8f1#51c80502b8474ec10c315da3559a049bdf4fe8f1"
dependencies = [
"byteorder",
"cairo-rs",
@@ -1654,9 +1547,9 @@ dependencies = [
[[package]]
name = "linux-raw-sys"
-version = "0.3.7"
+version = "0.3.8"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "ece97ea872ece730aed82664c424eb4c8291e1ff2480247ccf7409044bc6479f"
+checksum = "ef53942eb7bf7ff43a617b3e2c1c4a5ecf5944a7c1bc12d7ee39bbb15e5c1519"
[[package]]
name = "litrs"
@@ -1682,9 +1575,9 @@ dependencies = [
[[package]]
name = "lock_api"
-version = "0.4.9"
+version = "0.4.10"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "435011366fe56583b16cf956f9df0095b405b82d76425bc8981c0e22e60ec4df"
+checksum = "c1cc9717a20b1bb222f333e6a92fd32f7d8a18ddc5a3191a11af45dcbf4dcd16"
dependencies = [
"autocfg",
"scopeguard",
@@ -1692,11 +1585,10 @@ dependencies = [
[[package]]
name = "log"
-version = "0.4.17"
+version = "0.4.18"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "abb12e687cfb44aa40f41fc3978ef76448f9b6038cad6aef4259d3c095a2382e"
+checksum = "518ef76f2f87365916b142844c16d8fefd85039bc5699050210a7778ee1cd1de"
dependencies = [
- "cfg-if",
"value-bag",
]
@@ -1707,24 +1599,21 @@ dependencies = [
"anyhow",
"arc-swap",
"ashpd",
+ "async-channel",
"env_logger",
"futures",
"gettext-rs",
"gio",
+ "glycin",
"gtk4",
"gvdb-macros",
- "image",
"indexmap",
"kamadak-exif",
- "lcms2",
"libadwaita",
"libgweather",
- "libheif-rs",
"librsvg",
"log",
"once_cell",
- "rgb",
- "safe-transmute",
"url",
]
@@ -1779,6 +1668,15 @@ version = "2.5.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "2dffe52ecf27772e601905b7522cb4ef790d2cc203488bbd0e2fe85fcb74566d"
+[[package]]
+name = "memfd"
+version = "0.6.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "ffc89ccdc6e10d6907450f753537ebc5c5d3460d2e4e62ea74bd571db62c0f9e"
+dependencies = [
+ "rustix",
+]
+
[[package]]
name = "memmap2"
version = "0.5.10"
@@ -1788,6 +1686,15 @@ dependencies = [
"libc",
]
+[[package]]
+name = "memmap2"
+version = "0.6.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "6d28bba84adfe6646737845bc5ebbfa2c08424eb1c37e94a1fd2a82adb56a872"
+dependencies = [
+ "libc",
+]
+
[[package]]
name = "memoffset"
version = "0.7.1"
@@ -1806,6 +1713,15 @@ dependencies = [
"autocfg",
]
+[[package]]
+name = "memoffset"
+version = "0.9.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "5a634b1c61a95585bd15607c6ab0c4e5b226e695ff2800ba0cdccddf208c406c"
+dependencies = [
+ "autocfg",
+]
+
[[package]]
name = "miniz_oxide"
version = "0.6.2"
@@ -1822,7 +1738,6 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "e7810e0be55b428ada41041c41f32c9f1a42817901b4ccf45fa3d4b6561e74c7"
dependencies = [
"adler",
- "simd-adler32",
]
[[package]]
@@ -1858,15 +1773,6 @@ dependencies = [
"syn 1.0.109",
]
-[[package]]
-name = "nanorand"
-version = "0.7.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "6a51313c5820b0b02bd422f4b44776fbf47961755c74ce64afc73bfad10226c3"
-dependencies = [
- "getrandom 0.2.9",
-]
-
[[package]]
name = "new_debug_unreachable"
version = "1.0.4"
@@ -1883,6 +1789,7 @@ dependencies = [
"cfg-if",
"libc",
"memoffset 0.7.1",
+ "pin-utils",
"static_assertions",
]
@@ -1972,18 +1879,18 @@ dependencies = [
[[package]]
name = "object"
-version = "0.30.3"
+version = "0.30.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "ea86265d3d3dcb6a27fc51bd29a4bf387fae9d2986b823079d4986af253eb439"
+checksum = "03b4680b86d9cfafba8fc491dc9b6df26b68cf40e9e6cd73909194759a63c385"
dependencies = [
"memchr",
]
[[package]]
name = "once_cell"
-version = "1.17.1"
+version = "1.18.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "b7e5500299e16ebb147ae15a00a942af264cf3688f47923b8fc2cd5858f23ad3"
+checksum = "dd8b5dd2ae5ed71462c540258bedcb51965123ad7e7ccf4b9a8cafaa4a63576d"
[[package]]
name = "ordered-stream"
@@ -1997,9 +1904,9 @@ dependencies = [
[[package]]
name = "pango"
-version = "0.17.4"
+version = "0.17.10"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "52c280b82a881e4208afb3359a8e7fde27a1b272280981f1f34610bed5770d37"
+checksum = "35be456fc620e61f62dff7ff70fbd54dcbaf0a4b920c0f16de1107c47d921d48"
dependencies = [
"bitflags",
"gio",
@@ -2011,9 +1918,9 @@ dependencies = [
[[package]]
name = "pango-sys"
-version = "0.17.0"
+version = "0.17.10"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "4293d0f0b5525eb5c24734d30b0ed02cd02aa734f216883f376b54de49625de8"
+checksum = "3da69f9f3850b0d8990d462f8c709561975e95f689c1cdf0fecdebde78b35195"
dependencies = [
"glib-sys",
"gobject-sys",
@@ -2023,9 +1930,9 @@ dependencies = [
[[package]]
name = "pangocairo"
-version = "0.17.0"
+version = "0.17.10"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "2feeb7ea7874507f83f5e7ba869c54e321959431c8fbd70d4b735c8b15d90506"
+checksum = "86bf29cb1c2e73817944f66011fb12135e1c6d268e8e4c5cfc689101c25822cf"
dependencies = [
"bitflags",
"cairo-rs",
@@ -2037,9 +1944,9 @@ dependencies = [
[[package]]
name = "pangocairo-sys"
-version = "0.17.3"
+version = "0.17.10"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "f60f1be8ef08087ddcbdcc1350e06073bff11113d425d12b622b716d96b9611c"
+checksum = "94dfd38d9bf8ff5f881be2107ba49fcb22090d247aa00133f8dadf96b122b97a"
dependencies = [
"cairo-sys-rs",
"glib-sys",
@@ -2066,15 +1973,15 @@ dependencies = [
[[package]]
name = "parking_lot_core"
-version = "0.9.7"
+version = "0.9.8"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "9069cbb9f99e3a5083476ccb29ceb1de18b9118cafa53e90c9551235de2b9521"
+checksum = "93f00c865fe7cabf650081affecd3871070f26767e7b2070a3ffae14c654b447"
dependencies = [
"cfg-if",
"libc",
- "redox_syscall 0.2.16",
+ "redox_syscall",
"smallvec",
- "windows-sys 0.45.0",
+ "windows-targets",
]
[[package]]
@@ -2085,9 +1992,9 @@ checksum = "9f746c4065a8fa3fe23974dd82f15431cc8d40779821001404d10d2e79ca7d79"
[[package]]
name = "percent-encoding"
-version = "2.2.0"
+version = "2.3.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "478c572c3d73181ff3c2539045f6eb99e5491218eae919370993b890cdbdd98e"
+checksum = "9b2a4787296e9989611394c33f193f676704af1686e70b8f8033ab5ba9a35a94"
[[package]]
name = "phf"
@@ -2181,26 +2088,6 @@ dependencies = [
"siphasher",
]
-[[package]]
-name = "pin-project"
-version = "1.0.12"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "ad29a609b6bcd67fee905812e544992d216af9d755757c05ed2d0e15a74c6ecc"
-dependencies = [
- "pin-project-internal",
-]
-
-[[package]]
-name = "pin-project-internal"
-version = "1.0.12"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "069bdb1e05adc7a8990dce9cc75370895fbe4e3d58b9b73bf1aee56359344a55"
-dependencies = [
- "proc-macro2",
- "quote",
- "syn 1.0.109",
-]
-
[[package]]
name = "pin-project-lite"
version = "0.2.9"
@@ -2219,19 +2106,6 @@ version = "0.3.27"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "26072860ba924cbfa98ea39c8c19b4dd6a4a25423dbdf219c1eca91aa0cf6964"
-[[package]]
-name = "png"
-version = "0.17.8"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "aaeebc51f9e7d2c150d3f3bfeb667f2aa985db5ef1e3d212847bdedb488beeaa"
-dependencies = [
- "bitflags",
- "crc32fast",
- "fdeflate",
- "flate2",
- "miniz_oxide 0.7.1",
-]
-
[[package]]
name = "polling"
version = "2.8.0"
@@ -2245,7 +2119,7 @@ dependencies = [
"libc",
"log",
"pin-project-lite",
- "windows-sys 0.48.0",
+ "windows-sys",
]
[[package]]
@@ -2302,22 +2176,13 @@ checksum = "dc375e1527247fe1a97d8b7156678dfe7c1af2fc075c9a4db3690ecd2a148068"
[[package]]
name = "proc-macro2"
-version = "1.0.56"
+version = "1.0.59"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "2b63bdb0cd06f1f4dedf69b254734f9b45af66e4a031e42a7480257d9898b435"
+checksum = "6aeca18b86b413c660b781aa319e4e2648a3e6f9eadc9b47e9038e6fe9f3451b"
dependencies = [
"unicode-ident",
]
-[[package]]
-name = "qoi"
-version = "0.4.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "7f6d64c71eb498fe9eae14ce4ec935c555749aef511cca85b5568910d6e48001"
-dependencies = [
- "bytemuck",
-]
-
[[package]]
name = "quick-xml"
version = "0.27.1"
@@ -2330,9 +2195,9 @@ dependencies = [
[[package]]
name = "quote"
-version = "1.0.27"
+version = "1.0.28"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "8f4f29d145265ec1c483c7c654450edde0bfe043d3938d6972630663356d9500"
+checksum = "1b9ab9c7eadfd8df19006f1cf1a4aed13540ed5cbc047010ece5826e10825488"
dependencies = [
"proc-macro2",
]
@@ -2397,7 +2262,7 @@ version = "0.6.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c"
dependencies = [
- "getrandom 0.2.9",
+ "getrandom 0.2.10",
]
[[package]]
@@ -2452,15 +2317,6 @@ version = "0.5.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "3b42e27ef78c35d3998403c1d26f3efd9e135d3e5121b0a4845cc5cc27547f4f"
-[[package]]
-name = "redox_syscall"
-version = "0.2.16"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "fb5a58c1855b4b6819d59012155603f0b22ad30cad752600aadfcb695265519a"
-dependencies = [
- "bitflags",
-]
-
[[package]]
name = "redox_syscall"
version = "0.3.5"
@@ -2472,9 +2328,9 @@ dependencies = [
[[package]]
name = "regex"
-version = "1.8.1"
+version = "1.8.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "af83e617f331cc6ae2da5443c602dfa5af81e517212d9d611a5b3ba1777b5370"
+checksum = "d0ab3ca65655bb1e41f2a8c8cd662eb4fb035e67c3f78da1d61dffe89d07300f"
dependencies = [
"aho-corasick",
"memchr",
@@ -2483,9 +2339,9 @@ dependencies = [
[[package]]
name = "regex-syntax"
-version = "0.7.1"
+version = "0.7.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "a5996294f19bd3aae0453a862ad728f60e6600695733dd5df01da90c54363a3c"
+checksum = "436b050e76ed2903236f032a59761c1eb99e1b0aead2c257922771dab1fc8c78"
[[package]]
name = "rgb"
@@ -2522,7 +2378,7 @@ dependencies = [
"io-lifetimes",
"libc",
"linux-raw-sys",
- "windows-sys 0.48.0",
+ "windows-sys",
]
[[package]]
@@ -2539,9 +2395,9 @@ checksum = "98a01dab6acf992653be49205bdd549f32f17cb2803e8eacf1560bf97259aae8"
[[package]]
name = "safe_arch"
-version = "0.6.0"
+version = "0.7.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "794821e4ccb0d9f979512f9c1973480123f9bd62a90d74ab0f9426fcf8f4a529"
+checksum = "62a7484307bd40f8f7ccbacccac730108f2cae119a3b11c74485b48aa9ea650f"
dependencies = [
"bytemuck",
]
@@ -2587,22 +2443,22 @@ checksum = "bebd363326d05ec3e2f532ab7660680f3b02130d780c299bca73469d521bc0ed"
[[package]]
name = "serde"
-version = "1.0.162"
+version = "1.0.163"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "71b2f6e1ab5c2b98c05f0f35b236b22e8df7ead6ffbf51d7808da7f8817e7ab6"
+checksum = "2113ab51b87a539ae008b5c6c02dc020ffa39afd2d83cffcb3f4eb2722cebec2"
dependencies = [
"serde_derive",
]
[[package]]
name = "serde_derive"
-version = "1.0.162"
+version = "1.0.163"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "a2a0814352fd64b58489904a44ea8d90cb1a91dcb6b4f5ebabc32c8318e93cb6"
+checksum = "8c805777e3930c8883389c602315a24224bcc738b63905ef87cd1420353ea93e"
dependencies = [
"proc-macro2",
"quote",
- "syn 2.0.15",
+ "syn 2.0.18",
]
[[package]]
@@ -2624,14 +2480,14 @@ checksum = "bcec881020c684085e55a25f7fd888954d56609ef363479dc5a1305eb0d40cab"
dependencies = [
"proc-macro2",
"quote",
- "syn 2.0.15",
+ "syn 2.0.18",
]
[[package]]
name = "serde_spanned"
-version = "0.6.1"
+version = "0.6.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "0efd8caf556a6cebd3b285caf480045fcc1ac04f6bd786b09a6f11af30c4fcf4"
+checksum = "93107647184f6027e3b7dcb2e11034cf95ffa1e3a682c67951963ac69c1c007d"
dependencies = [
"serde",
]
@@ -2657,6 +2513,25 @@ dependencies = [
"digest",
]
+[[package]]
+name = "signal-hook"
+version = "0.3.15"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "732768f1176d21d09e076c23a93123d40bba92d50c4058da34d45c8de8e682b9"
+dependencies = [
+ "libc",
+ "signal-hook-registry",
+]
+
+[[package]]
+name = "signal-hook-registry"
+version = "1.4.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "d8229b473baa5980ac72ef434c4415e70c4b5e71b423043adb4ba059f89c99a1"
+dependencies = [
+ "libc",
+]
+
[[package]]
name = "simba"
version = "0.8.1"
@@ -2670,12 +2545,6 @@ dependencies = [
"wide",
]
-[[package]]
-name = "simd-adler32"
-version = "0.3.5"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "238abfbb77c1915110ad968465608b68e869e0772622c9656714e73e5a1a522f"
-
[[package]]
name = "siphasher"
version = "0.3.10"
@@ -2707,15 +2576,6 @@ dependencies = [
"winapi",
]
-[[package]]
-name = "spin"
-version = "0.9.8"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "6980e8d7511241f8acf4aebddbb1ff938df5eebe98691418c4468d0b72a96a67"
-dependencies = [
- "lock_api",
-]
-
[[package]]
name = "stable_deref_trait"
version = "1.2.0"
@@ -2767,9 +2627,9 @@ dependencies = [
[[package]]
name = "syn"
-version = "2.0.15"
+version = "2.0.18"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "a34fcf3e8b60f57e6a14301a2e916d323af98b0ea63c599441eec8558660c822"
+checksum = "32d41677bcbe24c20c52e7c70b0d8db04134c5d1066bf98662e2871ad200ea3e"
dependencies = [
"proc-macro2",
"quote",
@@ -2803,15 +2663,16 @@ checksum = "af547b166dd1ea4b472165569fc456cfb6818116f854690b0ff205e636523dab"
[[package]]
name = "tempfile"
-version = "3.5.0"
+version = "3.6.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "b9fbec84f381d5795b08656e4912bec604d162bff9291d6189a78f4c8ab87998"
+checksum = "31c0432476357e58790aaa47a8efb0c5138f137343f3b5f23bd36a27e3b0a6d6"
dependencies = [
+ "autocfg",
"cfg-if",
"fastrand",
- "redox_syscall 0.3.5",
+ "redox_syscall",
"rustix",
- "windows-sys 0.45.0",
+ "windows-sys",
]
[[package]]
@@ -2851,18 +2712,7 @@ checksum = "f9456a42c5b0d803c8cd86e73dd7cc9edd429499f37a3550d286d5e86720569f"
dependencies = [
"proc-macro2",
"quote",
- "syn 2.0.15",
-]
-
-[[package]]
-name = "tiff"
-version = "0.8.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "7449334f9ff2baf290d55d73983a7d6fa15e01198faef72af07e2a8db851e471"
-dependencies = [
- "flate2",
- "jpeg-decoder",
- "weezl",
+ "syn 2.0.18",
]
[[package]]
@@ -2894,9 +2744,9 @@ dependencies = [
[[package]]
name = "toml_datetime"
-version = "0.6.1"
+version = "0.6.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "3ab8ed2edee10b50132aed5f331333428b011c99402b5a534154ed15746f9622"
+checksum = "5a76a9312f5ba4c2dec6b9161fdf25d87ad8a09256ccea5a556fef03c706a10f"
dependencies = [
"serde",
]
@@ -2934,14 +2784,14 @@ checksum = "0f57e3ca2a01450b1a921183a9c9cbfda207fd822cef4ccb00a65402cbba7a74"
dependencies = [
"proc-macro2",
"quote",
- "syn 2.0.15",
+ "syn 2.0.18",
]
[[package]]
name = "tracing-core"
-version = "0.1.30"
+version = "0.1.31"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "24eb03ba0eab1fd845050058ce5e616558e8f8d8fca633e6b163fe25c797213a"
+checksum = "0955b8137a1df6f1a2e9a37d8a6656291ff0297c1a97c24e0d8425fe2312f79a"
dependencies = [
"once_cell",
]
@@ -2970,9 +2820,9 @@ checksum = "92888ba5573ff080736b3648696b70cafad7d250551175acbaa4e0385b3e1460"
[[package]]
name = "unicode-ident"
-version = "1.0.8"
+version = "1.0.9"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "e5464a87b239f13a63a501f2701565754bae92d243d4bb7eb12f6d57d2269bf4"
+checksum = "b15811caf2415fb889178633e7724bad2509101cde276048e013b9def5e51fa0"
[[package]]
name = "unicode-normalization"
@@ -2985,9 +2835,9 @@ dependencies = [
[[package]]
name = "url"
-version = "2.3.1"
+version = "2.4.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "0d68c799ae75762b8c3fe375feb6600ef5602c883c5d21eb51c09f22b83c4643"
+checksum = "50bff7831e19200a85b17131d085c25d7811bc4e186efdaf54bbd132994a88cb"
dependencies = [
"form_urlencoded",
"idna",
@@ -3003,13 +2853,9 @@ checksum = "09cc8ee72d2a9becf2f2febe0205bbed8fc6615b7cb429ad062dc7b7ddd036a9"
[[package]]
name = "value-bag"
-version = "1.0.0-alpha.9"
+version = "1.4.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "2209b78d1249f7e6f3293657c9779fe31ced465df091bbd433a1cf88e916ec55"
-dependencies = [
- "ctor",
- "version_check",
-]
+checksum = "a4d330786735ea358f3bc09eea4caa098569c1c93f342d9aca0514915022fe7e"
[[package]]
name = "version-compare"
@@ -3053,9 +2899,9 @@ checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423"
[[package]]
name = "wasm-bindgen"
-version = "0.2.85"
+version = "0.2.86"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "5b6cb788c4e39112fbe1822277ef6fb3c55cd86b95cb3d3c4c1c9597e4ac74b4"
+checksum = "5bba0e8cb82ba49ff4e229459ff22a191bbe9a1cb3a341610c9c33efc27ddf73"
dependencies = [
"cfg-if",
"wasm-bindgen-macro",
@@ -3063,24 +2909,24 @@ dependencies = [
[[package]]
name = "wasm-bindgen-backend"
-version = "0.2.85"
+version = "0.2.86"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "35e522ed4105a9d626d885b35d62501b30d9666283a5c8be12c14a8bdafe7822"
+checksum = "19b04bc93f9d6bdee709f6bd2118f57dd6679cf1176a1af464fca3ab0d66d8fb"
dependencies = [
"bumpalo",
"log",
"once_cell",
"proc-macro2",
"quote",
- "syn 2.0.15",
+ "syn 2.0.18",
"wasm-bindgen-shared",
]
[[package]]
name = "wasm-bindgen-futures"
-version = "0.4.35"
+version = "0.4.36"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "083abe15c5d88556b77bdf7aef403625be9e327ad37c62c4e4129af740168163"
+checksum = "2d1985d03709c53167ce907ff394f5316aa22cb4e12761295c5dc57dacb6297e"
dependencies = [
"cfg-if",
"js-sys",
@@ -3090,9 +2936,9 @@ dependencies = [
[[package]]
name = "wasm-bindgen-macro"
-version = "0.2.85"
+version = "0.2.86"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "358a79a0cb89d21db8120cbfb91392335913e4890665b1a7981d9e956903b434"
+checksum = "14d6b024f1a526bb0234f52840389927257beb670610081360e5a03c5df9c258"
dependencies = [
"quote",
"wasm-bindgen-macro-support",
@@ -3100,44 +2946,38 @@ dependencies = [
[[package]]
name = "wasm-bindgen-macro-support"
-version = "0.2.85"
+version = "0.2.86"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "4783ce29f09b9d93134d41297aded3a712b7b979e9c6f28c32cb88c973a94869"
+checksum = "e128beba882dd1eb6200e1dc92ae6c5dbaa4311aa7bb211ca035779e5efc39f8"
dependencies = [
"proc-macro2",
"quote",
- "syn 2.0.15",
+ "syn 2.0.18",
"wasm-bindgen-backend",
"wasm-bindgen-shared",
]
[[package]]
name = "wasm-bindgen-shared"
-version = "0.2.85"
+version = "0.2.86"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "a901d592cafaa4d711bc324edfaff879ac700b19c3dfd60058d2b445be2691eb"
+checksum = "ed9d5b4305409d1fc9482fee2d7f9bcbf24b3972bf59817ef757e23982242a93"
[[package]]
name = "web-sys"
-version = "0.3.62"
+version = "0.3.63"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "16b5f940c7edfdc6d12126d98c9ef4d1b3d470011c47c76a6581df47ad9ba721"
+checksum = "3bdd9ef4e984da1187bf8110c5cf5b845fbc87a23602cdf912386a76fcd3a7c2"
dependencies = [
"js-sys",
"wasm-bindgen",
]
-[[package]]
-name = "weezl"
-version = "0.1.7"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "9193164d4de03a926d909d3bc7c30543cecb35400c02114792c2cae20d5e2dbb"
-
[[package]]
name = "wide"
-version = "0.7.8"
+version = "0.7.10"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "b689b6c49d6549434bf944e6b0f39238cf63693cb7a147e9d887507fffa3b223"
+checksum = "40018623e2dba2602a9790faba8d33f2ebdebf4b86561b83928db735f8784728"
dependencies = [
"bytemuck",
"safe_arch",
@@ -3174,37 +3014,13 @@ version = "0.4.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f"
-[[package]]
-name = "windows-sys"
-version = "0.45.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "75283be5efb2831d37ea142365f009c02ec203cd29a3ebecbc093d52315b66d0"
-dependencies = [
- "windows-targets 0.42.2",
-]
-
[[package]]
name = "windows-sys"
version = "0.48.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "677d2418bec65e3338edb076e806bc1ec15693c5d0104683f2efe857f61056a9"
dependencies = [
- "windows-targets 0.48.0",
-]
-
-[[package]]
-name = "windows-targets"
-version = "0.42.2"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "8e5180c00cd44c9b1c88adb3693291f1cd93605ded80c250a75d472756b4d071"
-dependencies = [
- "windows_aarch64_gnullvm 0.42.2",
- "windows_aarch64_msvc 0.42.2",
- "windows_i686_gnu 0.42.2",
- "windows_i686_msvc 0.42.2",
- "windows_x86_64_gnu 0.42.2",
- "windows_x86_64_gnullvm 0.42.2",
- "windows_x86_64_msvc 0.42.2",
+ "windows-targets",
]
[[package]]
@@ -3213,93 +3029,51 @@ version = "0.48.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "7b1eb6f0cd7c80c79759c929114ef071b87354ce476d9d94271031c0497adfd5"
dependencies = [
- "windows_aarch64_gnullvm 0.48.0",
- "windows_aarch64_msvc 0.48.0",
- "windows_i686_gnu 0.48.0",
- "windows_i686_msvc 0.48.0",
- "windows_x86_64_gnu 0.48.0",
- "windows_x86_64_gnullvm 0.48.0",
- "windows_x86_64_msvc 0.48.0",
+ "windows_aarch64_gnullvm",
+ "windows_aarch64_msvc",
+ "windows_i686_gnu",
+ "windows_i686_msvc",
+ "windows_x86_64_gnu",
+ "windows_x86_64_gnullvm",
+ "windows_x86_64_msvc",
]
-[[package]]
-name = "windows_aarch64_gnullvm"
-version = "0.42.2"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "597a5118570b68bc08d8d59125332c54f1ba9d9adeedeef5b99b02ba2b0698f8"
-
[[package]]
name = "windows_aarch64_gnullvm"
version = "0.48.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "91ae572e1b79dba883e0d315474df7305d12f569b400fcf90581b06062f7e1bc"
-[[package]]
-name = "windows_aarch64_msvc"
-version = "0.42.2"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "e08e8864a60f06ef0d0ff4ba04124db8b0fb3be5776a5cd47641e942e58c4d43"
-
[[package]]
name = "windows_aarch64_msvc"
version = "0.48.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "b2ef27e0d7bdfcfc7b868b317c1d32c641a6fe4629c171b8928c7b08d98d7cf3"
-[[package]]
-name = "windows_i686_gnu"
-version = "0.42.2"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "c61d927d8da41da96a81f029489353e68739737d3beca43145c8afec9a31a84f"
-
[[package]]
name = "windows_i686_gnu"
version = "0.48.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "622a1962a7db830d6fd0a69683c80a18fda201879f0f447f065a3b7467daa241"
-[[package]]
-name = "windows_i686_msvc"
-version = "0.42.2"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "44d840b6ec649f480a41c8d80f9c65108b92d89345dd94027bfe06ac444d1060"
-
[[package]]
name = "windows_i686_msvc"
version = "0.48.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "4542c6e364ce21bf45d69fdd2a8e455fa38d316158cfd43b3ac1c5b1b19f8e00"
-[[package]]
-name = "windows_x86_64_gnu"
-version = "0.42.2"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "8de912b8b8feb55c064867cf047dda097f92d51efad5b491dfb98f6bbb70cb36"
-
[[package]]
name = "windows_x86_64_gnu"
version = "0.48.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "ca2b8a661f7628cbd23440e50b05d705db3686f894fc9580820623656af974b1"
-[[package]]
-name = "windows_x86_64_gnullvm"
-version = "0.42.2"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "26d41b46a36d453748aedef1486d5c7a85db22e56aff34643984ea85514e94a3"
-
[[package]]
name = "windows_x86_64_gnullvm"
version = "0.48.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "7896dbc1f41e08872e9d5e8f8baa8fdd2677f29468c4e156210174edc7f7b953"
-[[package]]
-name = "windows_x86_64_msvc"
-version = "0.42.2"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "9aec5da331524158c6d1a4ac0ab1541149c0b9505fde06423b02f5ef0106b9f0"
-
[[package]]
name = "windows_x86_64_msvc"
version = "0.48.0"
@@ -3308,9 +3082,9 @@ checksum = "1a515f5799fe4961cb532f983ce2b23082366b898e52ffbce459c86f67c8378a"
[[package]]
name = "winnow"
-version = "0.4.6"
+version = "0.4.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "61de7bac303dc551fe038e2b3cef0f571087a47571ea6e79a87692ac99b99699"
+checksum = "ae8970b36c66498d8ff1d66685dc86b91b29db0c7739899012f63a63814b4b28"
dependencies = [
"memchr",
]
@@ -3338,15 +3112,16 @@ dependencies = [
[[package]]
name = "zbus"
-version = "3.12.0"
+version = "3.13.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "29242fa5ec5693629ae74d6eb1f69622a9511f600986d6d9779bccf36ac316e3"
+checksum = "6c3d77c9966c28321f1907f0b6c5a5561189d1f7311eea6d94180c6be9daab29"
dependencies = [
"async-broadcast",
"async-executor",
"async-fs",
"async-io",
"async-lock",
+ "async-process",
"async-recursion",
"async-task",
"async-trait",
@@ -3377,43 +3152,35 @@ dependencies = [
[[package]]
name = "zbus_macros"
-version = "3.12.0"
+version = "3.13.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "537793e26e9af85f774801dc52c6f6292352b2b517c5cf0449ffd3735732a53a"
+checksum = "f6e341d12edaff644e539ccbbf7f161601294c9a84ed3d7e015da33155b435af"
dependencies = [
"proc-macro-crate",
"proc-macro2",
"quote",
"regex",
"syn 1.0.109",
+ "winnow",
"zvariant_utils",
]
[[package]]
name = "zbus_names"
-version = "2.5.0"
+version = "2.5.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "f34f314916bd89bdb9934154627fab152f4f28acdda03e7c4c68181b214fe7e3"
+checksum = "82441e6033be0a741157a72951a3e4957d519698f3a824439cc131c5ba77ac2a"
dependencies = [
"serde",
"static_assertions",
"zvariant",
]
-[[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 = "zvariant"
-version = "3.12.0"
+version = "3.14.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "46fe4914a985446d6fd287019b5fceccce38303d71407d9e6e711d44954a05d8"
+checksum = "622cc473f10cef1b0d73b7b34a266be30ebdcfaea40ec297dd8cbda088f9f93c"
dependencies = [
"byteorder",
"enumflags2",
@@ -3426,9 +3193,9 @@ dependencies = [
[[package]]
name = "zvariant_derive"
-version = "3.12.0"
+version = "3.14.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "34c20260af4b28b3275d6676c7e2a6be0d4332e8e0aba4616d34007fd84e462a"
+checksum = "5d9c1b57352c25b778257c661f3c4744b7cefb7fc09dd46909a153cce7773da2"
dependencies = [
"proc-macro-crate",
"proc-macro2",
@@ -3439,9 +3206,9 @@ dependencies = [
[[package]]
name = "zvariant_utils"
-version = "1.0.0"
+version = "1.0.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "53b22993dbc4d128a17a3b6c92f1c63872dd67198537ee728d8b5d7c40640a8b"
+checksum = "7234f0d811589db492d16893e3f21e8e2fd282e6d01b0cddee310322062cc200"
dependencies = [
"proc-macro2",
"quote",
diff --git a/Cargo.toml b/Cargo.toml
index 97e341a..5ffbc92 100644
--- a/Cargo.toml
+++ b/Cargo.toml
@@ -9,26 +9,26 @@ license = "GPL-3.0-or-later"
lto = true
codegen-units = 1
+[features]
+disable-glycin-sandbox = []
+
[dependencies]
anyhow = { version = "1.0.66", features = ["backtrace"] }
arc-swap = "1.6.0"
+async-channel = "1.8.0"
env_logger = "0.10.0"
futures = "0.3.25"
gvdb-macros = "0.1.6"
indexmap = "1.9.2"
kamadak-exif = "0.5.5"
-lcms2 = "5.6.0"
libgweather = "4.2.0"
log = "0.4.17"
once_cell = "1.16.0"
-rgb = "0.8.36"
-safe-transmute = "0.11.2"
url = "2.3.1"
# decoders
-image-rs = { package = "image", version = "0.24.6" }
-libheif-rs = "0.19.0"
-librsvg = { git = "https://gitlab.gnome.org/GNOME/librsvg.git" }
+librsvg = { git = "https://gitlab.gnome.org/GNOME/librsvg.git", rev = "51c80502b8474ec10c315da3559a049bdf4fe8f1" }
+glycin = { git = "https://gitlab.gnome.org/sophie-h/glycin.git" }
[dependencies.ashpd]
version = "0.4.0"
diff --git a/README.md b/README.md
index f62231a..5ff991d 100644
--- a/README.md
+++ b/README.md
@@ -18,38 +18,15 @@ Bundles will not be automatically updated after installation.
## Features
- Fast GPU accelerated image rendering with tiled rendering for SVGs
+- Extendable and sandboxed (expect SVG) image decoding with
+- Support for more than 15 image formats by default
- Extensive support for touchpad and touchscreen gestures
-- Build-in support for more than 15 image formats
- Accessible presentation of the most important metadata
- Sleek but powerful interface developed in conjunction with GNOME Human Interface Guidelines
## Supported Formats
-| Format | View | Optional | ICC | CICP | EXIF | XMP | Animation | Library |
-|----------|------|----------|-----|------|------|-----|-----------|----------------------------|
-| AVIF | ✔ | ✔ | ✔ | ✔ | ✔ | ✘ | ✘ | libheif-rs + libheif (C++) |
-| BMP | ✔ | | ✘ | — | — | — | — | image-rs |
-| DDS | ✔ | | — | — | — | — | — | image-rs |
-| farbfeld | ✔ | | — | — | — | — | — | image-rs |
-| QOI | ✔ | | — | — | — | — | — | image-rs |
-| GIF | ✔ | | ✘ * | — | — | ✘ | ✔ | image-rs |
-| HEIC | ✔ | ✔ | ✔ | ✔ | ✔ | ✘ | ✘ | libheif-rs + libheif (C++) |
-| ICO | ✔ | | — | — | — | — | — | image-rs |
-| JPEG | ✔ | | ✔ | — | ✔ | ✘ | — | image-rs |
-| OpenEXR | ✔ | | — | — | — | — | — | image-rs |
-| PNG | ✔ | | ✔ | ✘ | ✔ | ✘ | ✔ | image-rs |
-| PNM | ✔ | | — | — | — | — | — | image-rs |
-| SVG | ✔ | | ✘ | — | — | ✘ * | — | librsvg |
-| TGA | ✔ | | — | — | — | — | — | image-rs |
-| TIFF | ✔ | | ✘ | — | ✔ | ✘ | — | image-rs |
-| WEBP | ✔ | | — | — | ✔ | ✘ | ✔ | image-rs |
-
-| Symbol | Meaning |
-|--------|------------------------------------------------|
-| * | Unclear if used in practice, needs research |
-| ✘ | Supported by format but not implemented yet |
-| ? | Unclear if supported by format, needs research |
-| ✔ | Supported |
+Loupe uses [glycin](https://gitlab.gnome.org/sophie-h/glycin) for loading images. You can check [glycin's README](https://gitlab.gnome.org/sophie-h/glycin#supported-image-formats) for more details about the formats supported by the default loaders. However, glycin supports adding loaders for additional formats. Therefore, the supported formats on your system may vary and might be changed by installing or removing glycin loaders.
## Building
diff --git a/build-aux/flatpak/org.gnome.Loupe.Devel.json b/build-aux/flatpak/org.gnome.Loupe.Devel.json
index 16c5ce7..cdf3510 100644
--- a/build-aux/flatpak/org.gnome.Loupe.Devel.json
+++ b/build-aux/flatpak/org.gnome.Loupe.Devel.json
@@ -9,7 +9,6 @@
],
"command" : "loupe",
"finish-args" : [
- "--share=network",
"--share=ipc",
"--socket=fallback-x11",
"--socket=wayland",
@@ -120,8 +119,8 @@
"tag" : "v1.0.11"
}
]
- },
- {
+ },
+ {
"name" : "libheif",
"buildsystem" : "cmake",
"config-opts": [
@@ -146,7 +145,18 @@
{
"type" : "git",
"url" : "https://github.com/strukturag/libheif.git",
- "tag" : "v1.15.1"
+ "tag" : "v1.16.2"
+ }
+ ]
+ },
+ {
+ "name" : "glycin",
+ "buildsystem" : "meson",
+ "sources" : [
+ {
+ "type" : "git",
+ "url" : "https://gitlab.gnome.org/sophie-h/glycin.git",
+ "commit" : "2e3f9add120a4913e559729d361d6d7e5d010f2b"
}
]
},
@@ -154,7 +164,8 @@
"name" : "loupe",
"buildsystem" : "meson",
"config-opts": [
- "-Dprofile=development"
+ "-Dprofile=development",
+ "-Ddisable-glycin-sandbox=true"
],
"sources" : [
{
diff --git a/meson_options.txt b/meson_options.txt
index 39c56f3..2a4698c 100644
--- a/meson_options.txt
+++ b/meson_options.txt
@@ -9,3 +9,8 @@ option(
],
value: 'release'
)
+option(
+ 'disable-glycin-sandbox',
+ type: 'boolean',
+ description: 'Disable sandboxing of image loaders in glycin. Only intended for development purposes.',
+)
\ No newline at end of file
diff --git a/po/POTFILES.in b/po/POTFILES.in
index 2ad9b08..f266ae9 100644
--- a/po/POTFILES.in
+++ b/po/POTFILES.in
@@ -7,8 +7,7 @@ data/org.gnome.Loupe.desktop.in.in
data/org.gnome.Loupe.metainfo.xml.in.in
data/resources/gtk/help-overlay.ui
src/application.rs
-src/decoder/formats/heif.rs
-src/decoder/formats/image_rs_other.rs
+src/decoder/formats/glycin_proxy.rs
src/decoder/formats/mod.rs
src/decoder/formats/svg.rs
src/decoder/mod.rs
diff --git a/src/decoder/formats/glycin_proxy.rs b/src/decoder/formats/glycin_proxy.rs
new file mode 100644
index 0000000..e11be4a
--- /dev/null
+++ b/src/decoder/formats/glycin_proxy.rs
@@ -0,0 +1,155 @@
+// Copyright (c) 2023 Sophie Herold
+//
+// This program is free software: you can redistribute it and/or modify
+// it under the terms of the GNU General Public License as published by
+// the Free Software Foundation, either version 3 of the License, or
+// (at your option) any later version.
+//
+// This program is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+// GNU General Public License for more details.
+//
+// You should have received a copy of the GNU General Public License
+// along with this program. If not, see .
+//
+// SPDX-License-Identifier: GPL-3.0-or-later
+
+//! Decode using glycin
+use super::*;
+use crate::decoder::tiling::{self, FrameBufferExt};
+use crate::deps::*;
+use crate::image_metadata::ImageMetadata;
+
+use arc_swap::ArcSwap;
+use gtk::prelude::*;
+
+use std::sync::Arc;
+
+pub const FRAME_BUFFER: usize = 3;
+
+#[derive(Debug)]
+pub struct Glycin {
+ cancellable: gio::Cancellable,
+ next_frame_send: async_channel::Sender<()>,
+}
+
+impl Drop for Glycin {
+ fn drop(&mut self) {
+ self.cancellable.cancel();
+ }
+}
+
+impl Glycin {
+ pub fn new(
+ file: gio::File,
+ updater: UpdateSender,
+ tiles: Arc>,
+ ) -> Self {
+ let cancellable = gio::Cancellable::new();
+ let cancellable_ = cancellable.clone();
+
+ let (next_frame_send, next_frame_recv) = async_channel::bounded(2);
+
+ glib::MainContext::default().spawn(async move {
+ let update_sender = updater.clone();
+
+ let result: Result<(), glycin::Error> = async move {
+ let mut image_request = glycin::ImageRequest::new(file);
+
+ #[cfg(feature = "disable-glycin-sandbox")]
+ image_request.sandbox_mechanism(Some(glycin::SandboxMechanism::NotSandboxed));
+
+ image_request.cancellable(cancellable_);
+
+ let image = image_request.request().await?;
+
+ if let Some(exif_raw) = image.info().exif.clone().into() {
+ updater.send(DecoderUpdate::Metadata(ImageMetadata::from_exif_bytes(
+ exif_raw,
+ )));
+ }
+
+ let dimensions = (image.info().width, image.info().height);
+ tiles.set_original_dimensions(dimensions);
+
+ updater.send(DecoderUpdate::Format(ImageFormat::new(
+ image.mime_type(),
+ image.format_name(),
+ )));
+
+ let frame = image.next_frame().await?;
+
+ if let Some(delay) = frame.delay {
+ updater.send(DecoderUpdate::Animated);
+
+ let position = (0, 0);
+
+ let tile = tiling::Tile {
+ position,
+ zoom_level: tiling::zoom_to_level(1.),
+ bleed: 0,
+ texture: frame.texture,
+ };
+
+ tiles.push_frame(tile, dimensions, delay);
+ updater.send(DecoderUpdate::Redraw);
+
+ loop {
+ if next_frame_recv.recv().await.is_ok() {
+ loop {
+ let frame = image.next_frame().await?;
+
+ let position = (0, 0);
+
+ let tile = tiling::Tile {
+ position,
+ zoom_level: tiling::zoom_to_level(1.),
+ bleed: 0,
+ texture: frame.texture,
+ };
+
+ tiles.push_frame(tile, dimensions, delay);
+
+ if tiles.n_frames() >= FRAME_BUFFER {
+ break;
+ }
+ }
+ } else {
+ log::debug!("Animation handler gone");
+ return Ok(());
+ }
+ }
+ } else {
+ let tile = tiling::Tile {
+ position: (0, 0),
+ zoom_level: tiling::zoom_to_level(1.),
+ bleed: 0,
+ texture: frame.texture,
+ };
+
+ tiles.push(tile);
+ }
+
+ Ok(())
+ }
+ .await;
+
+ if let Err(err) = result {
+ if err.unsupported_format().is_some() {
+ update_sender.send(DecoderUpdate::UnsupportedFormat);
+ }
+ update_sender.send(DecoderUpdate::Error(err.into()));
+ }
+ });
+
+ Self {
+ cancellable,
+ next_frame_send,
+ }
+ }
+
+ pub fn fill_frame_buffer(&self) {
+ let _result = self.next_frame_send.try_send(());
+ }
+}
diff --git a/src/decoder/formats/heif.rs b/src/decoder/formats/heif.rs
deleted file mode 100644
index 05227c5..0000000
--- a/src/decoder/formats/heif.rs
+++ /dev/null
@@ -1,278 +0,0 @@
-// Copyright (c) 2023 Sophie Herold
-//
-// This program is free software: you can redistribute it and/or modify
-// it under the terms of the GNU General Public License as published by
-// the Free Software Foundation, either version 3 of the License, or
-// (at your option) any later version.
-//
-// This program is distributed in the hope that it will be useful,
-// but WITHOUT ANY WARRANTY; without even the implied warranty of
-// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-// GNU General Public License for more details.
-//
-// You should have received a copy of the GNU General Public License
-// along with this program. If not, see .
-//
-// SPDX-License-Identifier: GPL-3.0-or-later
-
-///! Decode using libheif-rs
-use super::*;
-use crate::decoder::tiling::{self, FrameBufferExt};
-use crate::deps::*;
-use crate::image_metadata::ImageMetadata;
-use crate::util;
-use crate::util::gettext::*;
-use crate::util::ToBufRead;
-
-use anyhow::{anyhow, bail, Context};
-use arc_swap::ArcSwap;
-use gtk::prelude::*;
-use libheif_rs::{ColorProfile, ColorSpace, HeifContext, LibHeif, Plane, RgbChroma};
-use once_cell::sync::Lazy;
-use rgb::AsPixels;
-
-use std::sync::Arc;
-
-#[derive(Debug)]
-pub struct Heif {
- cancellable: gio::Cancellable,
-}
-
-impl Drop for Heif {
- fn drop(&mut self) {
- self.cancellable.cancel();
- }
-}
-
-/// Loads plugins on first use
-static LIBHEIF: Lazy = Lazy::new(LibHeif::new);
-
-impl Heif {
- pub fn new(
- file: gio::File,
- updater: UpdateSender,
- tiles: Arc>,
- ) -> Self {
- log::debug!("Loading HEIF");
- let cancellable = gio::Cancellable::new();
- let cancellable_ = cancellable.clone();
-
- updater.clone().spawn_error_handled(move || {
- let file_size = file
- .query_info(
- gio::FILE_ATTRIBUTE_STANDARD_SIZE,
- gio::FileQueryInfoFlags::NONE,
- gio::Cancellable::NONE,
- )
- .context(gettext("Failed to read image file information"))?
- .size();
- let buf_reader = file.to_buf_read(&cancellable)?;
- let stream_reader = libheif_rs::StreamReader::new(buf_reader, file_size as u64);
- let ctx = HeifContext::read_from_reader(Box::new(stream_reader))
- .context(gettext("Failed to decode image"))?;
- let handle = ctx.primary_image_handle()?;
-
- let mut metadata = Self::exif(&handle, &file);
-
- // TODO: Later use libheif 1.16 to get info if there is a transformation
- metadata.heif_transform = true;
-
- updater.send(DecoderUpdate::Metadata(metadata));
-
- tiles.set_original_dimensions((handle.width(), handle.height()));
-
- let rgb_chroma = if handle.luma_bits_per_pixel() > 8 {
- if handle.has_alpha_channel() {
- #[cfg(target_endian = "little")]
- {
- RgbChroma::HdrRgbaLe
- }
- #[cfg(target_endian = "big")]
- {
- RgbChroma::HdrRgbaBe
- }
- } else {
- #[cfg(target_endian = "little")]
- {
- RgbChroma::HdrRgbLe
- }
- #[cfg(target_endian = "big")]
- {
- RgbChroma::HdrRgbBe
- }
- }
- } else if handle.has_alpha_channel() {
- RgbChroma::Rgba
- } else {
- RgbChroma::Rgb
- };
-
- let image_result = LIBHEIF.decode(&handle, ColorSpace::Rgb(rgb_chroma), None);
-
- let mut image = match image_result {
- Err(err)
- if matches!(err.sub_code, libheif_rs::HeifErrorSubCode::UnsupportedCodec) =>
- {
- updater.send(DecoderUpdate::UnsupportedFormat);
- bail!(anyhow!(err).context(gettext("Unknown image format")));
- }
- image => image.context(gettext("Failed to decode image"))?,
- };
-
- let icc_profile = if let Some(profile) = handle.color_profile_raw() {
- if [
- libheif_rs::color_profile_types::R_ICC,
- libheif_rs::color_profile_types::PROF,
- ]
- .contains(&profile.profile_type())
- {
- Some(profile.data)
- } else {
- None
- }
- } else {
- None
- };
-
- let plane = image
- .planes_mut()
- .interleaved
- .context("Interleaved plane does not exist")?;
-
- let decoded = Decoded {
- plane,
- has_alpha_channel: handle.has_alpha_channel(),
- pre_multiplied_alpha: handle.is_premultiplied_alpha(),
- rgb_chroma,
- icc_profile,
- };
-
- let tile = tiling::Tile {
- position: (0, 0),
- zoom_level: tiling::zoom_to_level(1.),
- bleed: 0,
- texture: decoded.into_texture()?,
- };
-
- tiles.push(tile);
-
- Ok(())
- });
-
- Heif {
- cancellable: cancellable_,
- }
- }
-
- fn exif(handle: &libheif_rs::ImageHandle, file: &gio::File) -> ImageMetadata {
- let mut meta_ids = vec![0];
- handle.metadata_block_ids(&mut meta_ids, b"Exif");
-
- if let Some(meta_id) = meta_ids.first() {
- match handle.metadata(*meta_id) {
- Ok(mut exif_bytes) => {
- if let Some(skip) = exif_bytes
- .get(0..4)
- .map(|x| u32::from_be_bytes(x.try_into().unwrap()) as usize)
- {
- if exif_bytes.len() > skip + 4 {
- exif_bytes.drain(0..skip + 4);
- return ImageMetadata::from_exif_bytes(exif_bytes);
- } else {
- log::warn!("EXIF data has far too few bytes in {}", file.uri());
- }
- } else {
- log::warn!("EXIF data has far too few bytes in {}", file.uri());
- }
- }
- Err(err) => {
- log::warn!("Unable to decode EXIF data for {}: {err}", file.uri());
- }
- }
- }
-
- ImageMetadata::default()
- }
-}
-
-pub struct Decoded<'a> {
- plane: Plane<&'a mut [u8]>,
- has_alpha_channel: bool,
- pre_multiplied_alpha: bool,
- rgb_chroma: RgbChroma,
- icc_profile: Option>,
-}
-
-impl<'a> Decoded<'a> {
- pub fn into_texture(self) -> anyhow::Result {
- let memory_format = match self.rgb_chroma {
- RgbChroma::HdrRgbBe
- | RgbChroma::HdrRgbaBe
- | RgbChroma::HdrRgbLe
- | RgbChroma::HdrRgbaLe => {
- if let Ok(transmuted) =
- safe_transmute::transmute_many_pedantic_mut::(self.plane.data)
- {
- // Scale HDR pixels to 16bit (they are usually 10bit or 12bit)
- for pixel in transmuted.iter_mut() {
- *pixel <<= 16 - self.plane.bits_per_pixel;
- }
- } else {
- log::error!("Could not transform HDR (16bit) data to u16");
- }
-
- if self.has_alpha_channel {
- if self.pre_multiplied_alpha {
- gdk::MemoryFormat::R16g16b16a16Premultiplied
- } else {
- gdk::MemoryFormat::R16g16b16a16
- }
- } else {
- gdk::MemoryFormat::R16g16b16
- }
- }
- RgbChroma::Rgb | RgbChroma::Rgba => {
- if self.has_alpha_channel {
- if self.pre_multiplied_alpha {
- gdk::MemoryFormat::R8g8b8a8Premultiplied
- } else {
- gdk::MemoryFormat::R8g8b8a8
- }
- } else {
- gdk::MemoryFormat::R8g8b8
- }
- }
- RgbChroma::C444 => unreachable!(),
- };
-
- let mut buffer = self.plane.data.to_vec();
-
- if let Some(icc_profile) = &self.icc_profile {
- if memory_format == gdk::MemoryFormat::R8g8b8 {
- util::appply_icc_profile::(
- icc_profile,
- lcms2::PixelFormat::RGB_8,
- buffer.as_pixels_mut(),
- );
- } else if memory_format == gdk::MemoryFormat::R8g8b8a8 {
- util::appply_icc_profile::(
- icc_profile,
- lcms2::PixelFormat::RGBA_8,
- buffer.as_pixels_mut(),
- );
- }
- }
-
- let bytes = glib::Bytes::from_owned(buffer);
-
- let tex = gdk::MemoryTexture::new(
- self.plane.width as i32,
- self.plane.height as i32,
- memory_format,
- &bytes,
- self.plane.stride,
- );
-
- Ok(tex.upcast())
- }
-}
diff --git a/src/decoder/formats/image_rs_other.rs b/src/decoder/formats/image_rs_other.rs
deleted file mode 100644
index d8a521d..0000000
--- a/src/decoder/formats/image_rs_other.rs
+++ /dev/null
@@ -1,393 +0,0 @@
-// Copyright (c) 2023 Sophie Herold
-//
-// This program is free software: you can redistribute it and/or modify
-// it under the terms of the GNU General Public License as published by
-// the Free Software Foundation, either version 3 of the License, or
-// (at your option) any later version.
-//
-// This program is distributed in the hope that it will be useful,
-// but WITHOUT ANY WARRANTY; without even the implied warranty of
-// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-// GNU General Public License for more details.
-//
-// You should have received a copy of the GNU General Public License
-// along with this program. If not, see .
-//
-// SPDX-License-Identifier: GPL-3.0-or-later
-
-///! Decode using image-rs
-use super::*;
-use crate::decoder::tiling::{self, FrameBufferExt};
-use crate::deps::*;
-use crate::image_metadata::ImageMetadata;
-use crate::util;
-use crate::util::gettext::*;
-use crate::util::{BufReadSeek, ToBufRead};
-
-use anyhow::Context;
-use arc_swap::ArcSwap;
-use gtk::prelude::*;
-use image_rs::{AnimationDecoder, ImageDecoder};
-use rgb::AsPixels;
-
-use std::sync::Arc;
-
-#[derive(Debug)]
-pub struct ImageRsOther {
- thread_handle: Option>,
- cancellable: gio::Cancellable,
-}
-
-impl Drop for ImageRsOther {
- fn drop(&mut self) {
- if let Some(handle) = &self.thread_handle {
- self.cancellable.cancel();
- handle.thread().unpark();
- }
- }
-}
-
-impl ImageRsOther {
- fn reader(
- file: &gio::File,
- format: image_rs::ImageFormat,
- cancellable: &gio::Cancellable,
- ) -> anyhow::Result>> {
- let buf_read = file.to_buf_read(cancellable)?;
- let mut reader = image_rs::io::Reader::new(buf_read);
- reader.set_format(format);
- Ok(reader)
- }
-
- pub fn new(
- file: gio::File,
- format: image_rs::ImageFormat,
- updater: UpdateSender,
- tiles: Arc>,
- ) -> Self {
- let cancellable = gio::Cancellable::new();
-
- let thread_handle = match format {
- image_rs::ImageFormat::Gif
- | image_rs::ImageFormat::WebP
- | image_rs::ImageFormat::Png => Some(Self::new_animated(
- file,
- format,
- updater,
- tiles,
- cancellable.clone(),
- )),
- _ => {
- Self::new_static(file, format, updater, tiles, cancellable.clone());
- None
- }
- };
-
- ImageRsOther {
- thread_handle,
- cancellable,
- }
- }
-
- fn new_static(
- file: gio::File,
- format: image_rs::ImageFormat,
- updater: UpdateSender,
- tiles: Arc>,
- cancellable: gio::Cancellable,
- ) {
- updater.clone().spawn_error_handled(move || {
- updater.send(DecoderUpdate::Metadata(ImageMetadata::load(&file)));
-
- let reader = Self::reader(&file, format, &cancellable)?;
- let dimensions = reader
- .into_dimensions()
- .context("Failed to read image dimensions")?;
-
- tiles.set_original_dimensions(dimensions);
-
- let (icc_profile, dynamic_image) = match format {
- image_rs::ImageFormat::Jpeg => {
- let reader = file.to_buf_read(&cancellable)?;
- let mut decoder = image_rs::codecs::jpeg::JpegDecoder::new(reader)?;
- let _ = decoder.set_limits(image_rs::io::Limits::no_limits());
- let icc_profile = decoder.icc_profile();
- let dynamic_image = image_rs::DynamicImage::from_decoder(decoder)
- .context(gettext("Failed to decode image"))?;
- (icc_profile, dynamic_image)
- }
- image_rs::ImageFormat::Png => {
- let reader = file.to_buf_read(&cancellable)?;
- let mut decoder = image_rs::codecs::png::PngDecoder::new(reader)?;
- let _ = decoder.set_limits(image_rs::io::Limits::no_limits());
- let icc_profile = decoder.icc_profile();
- let dynamic_image = image_rs::DynamicImage::from_decoder(decoder)
- .context(gettext("Failed to decode image"))?;
- (icc_profile, dynamic_image)
- }
- _ => {
- let mut reader = Self::reader(&file, format, &cancellable)?;
- reader.limits(image_rs::io::Limits::no_limits());
- let dynamic_image =
- reader.decode().context(gettext("Failed to decode image"))?;
- (None, dynamic_image)
- }
- };
-
- let decoded_image = Decoded {
- dynamic_image,
- icc_profile,
- };
-
- let tile = tiling::Tile {
- position: (0, 0),
- zoom_level: tiling::zoom_to_level(1.),
- bleed: 0,
- texture: decoded_image.into_texture()?,
- };
-
- tiles.push(tile);
-
- Ok(())
- });
- }
-
- fn new_animated(
- file: gio::File,
- format: image_rs::ImageFormat,
- updater: UpdateSender,
- tiles: Arc>,
- cancellable: gio::Cancellable,
- ) -> std::thread::JoinHandle<()> {
- updater.clone().spawn_error_handled(move || {
- updater.send(DecoderUpdate::Metadata(ImageMetadata::load(&file)));
-
- let mut nth_frame = 1;
-
- // We are currently decoding for each repetition of the animation
- // TODO: Check if/how that can be solved differently
- loop {
- let buf_reader = file.to_buf_read(&cancellable)?;
-
- let (frames, animated_format) = match format {
- image_rs::ImageFormat::Gif => (
- image_rs::codecs::gif::GifDecoder::new(buf_reader)?.into_frames(),
- ImageFormat::AnimatedGif,
- ),
- image_rs::ImageFormat::WebP => {
- let decoder = image_rs::codecs::webp::WebPDecoder::new(buf_reader)?;
- if decoder.has_animation() {
- (decoder.into_frames(), ImageFormat::AnimatedWebP)
- } else {
- // Static WebP images need a different decoder
- Self::new_static(file, format, updater, tiles, cancellable);
- return Ok(());
- }
- }
- image_rs::ImageFormat::Png => {
- let decoder = image_rs::codecs::png::PngDecoder::new(buf_reader)?;
- if decoder.is_apng() {
- (decoder.apng().into_frames(), ImageFormat::AnimatedPng)
- } else {
- // Static PNG images need a different decoder
- Self::new_static(file, format, updater, tiles, cancellable);
- return Ok(());
- }
- }
- _ => todo!(),
- };
-
- for frame in frames {
- match frame {
- Err(err) => {
- log::warn!("Skipping frame: {err}");
- }
- Ok(frame) => {
- if nth_frame == 2 {
- // We have at least two frames so this is animated
- updater.send(DecoderUpdate::Format(animated_format));
- nth_frame = 3;
- }
-
- let (delay_num, delay_den) = frame.delay().numer_denom_ms();
- let delay = std::time::Duration::from_micros(f64::round(
- delay_num as f64 * 1000. / delay_den as f64,
- )
- as u64);
- let position = (frame.left(), frame.top());
- let rgb_image = frame.into_buffer();
- let dimensions = (
- rgb_image.width() + position.0,
- rgb_image.height() + position.1,
- );
-
- let dynamic_image = image_rs::DynamicImage::from(rgb_image);
-
- let decoded_image = Decoded {
- dynamic_image,
- icc_profile: None,
- };
-
- let tile = tiling::Tile {
- position,
- zoom_level: tiling::zoom_to_level(1.),
- bleed: 0,
- texture: decoded_image.into_texture()?,
- };
-
- tiles.push_frame(tile, dimensions, delay);
-
- if nth_frame == 1 {
- updater.send(DecoderUpdate::Dimensions(Default::default()));
- updater.send(DecoderUpdate::Redraw);
- nth_frame = 2;
- }
- }
- }
-
- if tiles.n_frames() >= 3 {
- std::thread::park();
- }
-
- if cancellable.is_cancelled() {
- log::debug!("Terminating decoder thread.");
- return Ok(());
- }
- }
- }
- })
- }
-
- pub fn fill_frame_buffer(&self) {
- if let Some(handle) = &self.thread_handle {
- handle.thread().unpark();
- } else {
- log::error!("Trying to wake up one-shot decoder");
- }
- }
-}
-
-pub struct Decoded {
- dynamic_image: image_rs::DynamicImage,
- icc_profile: Option>,
-}
-
-impl Decoded {
- pub fn into_texture(self) -> anyhow::Result {
- let (n_bytes, memory_format, layout, data) = match self.dynamic_image {
- img @ image_rs::DynamicImage::ImageLuma8(_) => {
- let buffer = img.to_rgb8();
- (
- 1,
- gdk::MemoryFormat::R8g8b8,
- buffer.sample_layout(),
- buffer.into_raw(),
- )
- }
- img @ image_rs::DynamicImage::ImageLumaA8(_) => {
- let buffer = img.to_rgba8();
- (
- 1,
- gdk::MemoryFormat::R8g8b8a8,
- buffer.sample_layout(),
- buffer.into_raw(),
- )
- }
- image_rs::DynamicImage::ImageRgb8(mut buffer) => {
- if let Some(icc_profile) = &self.icc_profile {
- util::appply_icc_profile::(
- icc_profile,
- lcms2::PixelFormat::RGB_8,
- buffer.as_pixels_mut(),
- );
- }
- (
- 1,
- gdk::MemoryFormat::R8g8b8,
- buffer.sample_layout(),
- buffer.into_raw(),
- )
- }
- image_rs::DynamicImage::ImageRgba8(mut buffer) => {
- if let Some(icc_profile) = &self.icc_profile {
- util::appply_icc_profile::(
- icc_profile,
- lcms2::PixelFormat::RGBA_8,
- buffer.as_pixels_mut(),
- );
- }
- (
- 1,
- gdk::MemoryFormat::R8g8b8a8,
- buffer.sample_layout(),
- buffer.into_raw(),
- )
- }
- img @ image_rs::DynamicImage::ImageLuma16(_) => {
- let buffer = img.to_rgb16();
- (
- 2,
- gdk::MemoryFormat::R16g16b16,
- buffer.sample_layout(),
- image_rs::DynamicImage::from(buffer).into_bytes(),
- )
- }
- img @ image_rs::DynamicImage::ImageLumaA16(_) => {
- let buffer = img.to_rgba16();
- (
- 2,
- gdk::MemoryFormat::R16g16b16a16,
- buffer.sample_layout(),
- image_rs::DynamicImage::from(buffer).into_bytes(),
- )
- }
- image_rs::DynamicImage::ImageRgb16(buffer) => (
- 2,
- gdk::MemoryFormat::R16g16b16,
- buffer.sample_layout(),
- image_rs::DynamicImage::from(buffer).into_bytes(),
- ),
- image_rs::DynamicImage::ImageRgba16(buffer) => (
- 2,
- gdk::MemoryFormat::R16g16b16a16,
- buffer.sample_layout(),
- image_rs::DynamicImage::from(buffer).into_bytes(),
- ),
- image_rs::DynamicImage::ImageRgb32F(buffer) => (
- 4,
- gdk::MemoryFormat::R32g32b32Float,
- buffer.sample_layout(),
- image_rs::DynamicImage::from(buffer).into_bytes(),
- ),
- image_rs::DynamicImage::ImageRgba32F(buffer) => (
- 4,
- gdk::MemoryFormat::R32g32b32a32Float,
- buffer.sample_layout(),
- image_rs::DynamicImage::from(buffer).into_bytes(),
- ),
- img => {
- let buffer = img.to_rgba16();
- (
- 2,
- gdk::MemoryFormat::R16g16b16a16,
- buffer.sample_layout(),
- safe_transmute::transmute_vec(buffer.into_raw())
- .context("Failed to transform into 16 bit texture")?,
- )
- }
- };
-
- let bytes = glib::Bytes::from_owned(data);
-
- let texture = gdk::MemoryTexture::new(
- layout.width as i32,
- layout.height as i32,
- memory_format,
- &bytes,
- layout.height_stride * n_bytes,
- )
- .upcast();
-
- Ok(texture)
- }
-}
diff --git a/src/decoder/formats/mod.rs b/src/decoder/formats/mod.rs
index 233ab6b..19ebfed 100644
--- a/src/decoder/formats/mod.rs
+++ b/src/decoder/formats/mod.rs
@@ -15,66 +15,40 @@
//
// SPDX-License-Identifier: GPL-3.0-or-later
-mod heif;
-mod image_rs_other;
+mod glycin_proxy;
mod svg;
-pub use heif::Heif;
-pub use image_rs_other::ImageRsOther;
+pub use glycin_proxy::Glycin;
pub use svg::{Svg, RSVG_MAX_SIZE};
use super::{DecoderUpdate, UpdateSender};
-use crate::util::gettext::*;
-#[derive(Clone, Copy, Debug)]
-pub enum ImageFormat {
- ImageRs(image_rs::ImageFormat),
- AnimatedGif,
- AnimatedWebP,
- AnimatedPng,
- // TODO: Add details about contained format
- Heif,
- Svg,
+#[derive(Clone, Debug)]
+pub struct ImageFormat {
+ mime_type: glycin::MimeType,
+ name: String,
}
impl ImageFormat {
- pub fn is_animated(&self) -> bool {
- matches!(
- self,
- ImageFormat::AnimatedGif | ImageFormat::AnimatedWebP | ImageFormat::AnimatedPng
- )
+ pub fn new(mime_type: glycin::MimeType, name: String) -> Self {
+ Self { mime_type, name }
}
pub fn is_svg(&self) -> bool {
- matches!(self, Self::Svg)
+ matches!(
+ self.mime_type.as_str(),
+ "image/svg+xml" | "image/svg+xml-compressed"
+ )
}
pub fn is_potentially_transparent(&self) -> bool {
- !matches!(
- self,
- Self::ImageRs(image_rs::ImageFormat::Bmp) | Self::ImageRs(image_rs::ImageFormat::Jpeg)
- )
+ !matches!(self.mime_type.as_str(), "image/bmp" | "image/jpeg")
}
}
impl std::fmt::Display for ImageFormat {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> Result<(), std::fmt::Error> {
- match self {
- Self::ImageRs(format) => {
- let debug = format!("{:?}", format);
- if debug.len() <= 4 {
- // uppercase abbreviations
- write!(f, "{}", debug.to_uppercase())
- } else {
- write!(f, "{}", debug)
- }
- }
- Self::AnimatedGif => write!(f, "{}", gettext("Animated GIF")),
- Self::AnimatedWebP => write!(f, "{}", gettext("Animated WebP")),
- Self::AnimatedPng => write!(f, "{}", gettext("Animated PNG")),
- Self::Heif => write!(f, "HEIF Container"),
- Self::Svg => write!(f, "SVG"),
- }
+ write!(f, "{}", self.name)
}
}
diff --git a/src/decoder/formats/svg.rs b/src/decoder/formats/svg.rs
index 0841016..76e51c1 100644
--- a/src/decoder/formats/svg.rs
+++ b/src/decoder/formats/svg.rs
@@ -15,7 +15,7 @@
//
// SPDX-License-Identifier: GPL-3.0-or-later
-///! Decode using librsvg
+//! Decode using librsvg
use super::*;
use crate::decoder::tiling::{self, FrameBufferExt};
use crate::decoder::TileRequest;
diff --git a/src/decoder/mod.rs b/src/decoder/mod.rs
index 198e64e..4899319 100644
--- a/src/decoder/mod.rs
+++ b/src/decoder/mod.rs
@@ -15,7 +15,7 @@
//
// SPDX-License-Identifier: GPL-3.0-or-later
-///! Decodes several image formats
+//! Decodes several image formats
pub mod formats;
pub mod tiling;
@@ -23,17 +23,14 @@ pub use formats::ImageDimensionDetails;
use crate::deps::*;
use crate::image_metadata::ImageMetadata;
-use crate::util::gettext::*;
-use crate::util::ToBufRead;
use formats::*;
use tiling::FrameBufferExt;
-use anyhow::{anyhow, bail, Context, Result};
+use anyhow::Result;
use arc_swap::ArcSwap;
use futures::channel::mpsc;
use gio::prelude::*;
-use std::io::Read;
use std::sync::Arc;
pub use formats::{ImageFormat, RSVG_MAX_SIZE};
@@ -67,6 +64,8 @@ pub enum DecoderUpdate {
UnsupportedFormat,
/// New image data available, redraw
Redraw,
+ /// Start animation
+ Animated,
/// And error occured during decoding
Error(anyhow::Error),
}
@@ -102,9 +101,8 @@ pub struct Decoder {
#[derive(Debug)]
enum FormatDecoder {
- ImageRsOther(ImageRsOther),
+ Glycin(Glycin),
Svg(Svg),
- Heif(Heif),
}
impl Decoder {
@@ -115,31 +113,16 @@ impl Decoder {
pub async fn new(
file: gio::File,
tiles: Arc>,
- ) -> (Result, mpsc::UnboundedReceiver) {
+ ) -> (Self, mpsc::UnboundedReceiver) {
let (sender, receiver) = mpsc::unbounded();
let update_sender = UpdateSender { sender };
tiles.set_update_sender(update_sender.clone());
- let format_decoder = gio::spawn_blocking(
- glib::clone!(@strong update_sender => move || Self::format_decoder(
- update_sender,
- file,
- tiles
- )),
- )
- .await
- .map_err(|_| anyhow!("Constructing the FormatDecoder failed unexpectedly"));
-
- let decoder = match format_decoder {
- Ok(Ok(decoder)) => Ok(Self {
- decoder,
- update_sender,
- }),
- Err(err) | Ok(Err(err)) => {
- update_sender.send(DecoderUpdate::Error(err));
- Err(())
- }
+ let format_decoder = Self::format_decoder(update_sender.clone(), file, tiles);
+ let decoder = Self {
+ decoder: format_decoder,
+ update_sender,
};
(decoder, receiver)
@@ -149,33 +132,12 @@ impl Decoder {
update_sender: UpdateSender,
file: gio::File,
tiles: Arc>,
- ) -> anyhow::Result {
- let format = Self::guess_format(&file)?;
-
- if let Some(format) = format {
- match format {
- image_rs::ImageFormat::Avif => {
- update_sender.send(DecoderUpdate::Format(ImageFormat::Heif));
- return Ok(FormatDecoder::Heif(Heif::new(file, update_sender, tiles)));
- }
- format => {
- update_sender.send(DecoderUpdate::Format(ImageFormat::ImageRs(format)));
- return Ok(FormatDecoder::ImageRsOther(ImageRsOther::new(
- file,
- format,
- update_sender,
- tiles,
- )));
- }
- }
- } else {
- let file_info = file
- .query_info(
- gio::FILE_ATTRIBUTE_STANDARD_CONTENT_TYPE,
- gio::FileQueryInfoFlags::NONE,
- gio::Cancellable::NONE,
- )
- .context("Could not read content type information")?;
+ ) -> FormatDecoder {
+ if let Ok(file_info) = file.query_info(
+ gio::FILE_ATTRIBUTE_STANDARD_CONTENT_TYPE,
+ gio::FileQueryInfoFlags::NONE,
+ gio::Cancellable::NONE,
+ ) {
if let Some(mime_type) = file_info
.content_type()
.as_ref()
@@ -185,62 +147,32 @@ impl Decoder {
// - image/svg+xml
// - image/svg+xml-compressed
if mime_type.split('+').next() == Some("image/svg") {
- update_sender.send(DecoderUpdate::Format(ImageFormat::Svg));
- return Ok(FormatDecoder::Svg(Svg::new(file, update_sender, tiles)));
- } else if ["image/avif", "image/heif", "image/heic"].contains(&mime_type.as_str()) {
- update_sender.send(DecoderUpdate::Format(ImageFormat::Heif));
- return Ok(FormatDecoder::Heif(Heif::new(file, update_sender, tiles)));
- } else {
- update_sender.send(DecoderUpdate::UnsupportedFormat);
- bail!(gettext_f("Unknown image format: {}", &[mime_type.as_str()]));
+ update_sender.send(DecoderUpdate::Format(ImageFormat::new(
+ mime_type.into(),
+ "SVG".into(),
+ )));
+ return FormatDecoder::Svg(Svg::new(file, update_sender, tiles));
}
}
}
- update_sender.send(DecoderUpdate::UnsupportedFormat);
- bail!(gettext("Unknown image format"))
+ FormatDecoder::Glycin(Glycin::new(file, update_sender, tiles))
}
/// Request missing tiles
pub fn request(&self, tile_request: TileRequest) {
- match &self.decoder {
- FormatDecoder::Svg(svg) => {
- if let Err(err) = svg.request(tile_request) {
- self.update_sender.send(DecoderUpdate::Error(err));
- }
+ if let FormatDecoder::Svg(svg) = &self.decoder {
+ if let Err(err) = svg.request(tile_request) {
+ self.update_sender.send(DecoderUpdate::Error(err));
}
- FormatDecoder::Heif(_) => {}
- _ => {}
- };
+ }
}
pub fn fill_frame_buffer(&self) {
- if let FormatDecoder::ImageRsOther(decoder) = &self.decoder {
+ if let FormatDecoder::Glycin(decoder) = &self.decoder {
decoder.fill_frame_buffer();
} else {
log::error!("Trying to fill frame buffer for decoder without animation support");
}
}
-
- fn guess_format(file: &gio::File) -> anyhow::Result