From f14cb540ebafcd60dde0b6b115038f46466ddfa1 Mon Sep 17 00:00:00 2001 From: Sophie Herold Date: Mon, 25 Dec 2023 21:34:18 +0100 Subject: [PATCH] decoder: Use glycin 1.0 --- Cargo.lock | 98 ++++++++++++-------- Cargo.toml | 2 +- build-aux/flatpak/org.gnome.Loupe.Devel.json | 94 +++++++++---------- src/decoder/formats/glycin_proxy.rs | 4 +- src/decoder/formats/svg.rs | 7 +- src/decoder/mod.rs | 2 +- src/main.rs | 2 +- src/metadata/format.rs | 12 ++- src/metadata/gps.rs | 2 +- 9 files changed, 124 insertions(+), 99 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index afdbbfc..8d70b86 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -122,6 +122,17 @@ dependencies = [ "futures-lite 1.13.0", ] +[[package]] +name = "async-fs" +version = "2.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dd1f344136bad34df1f83a47f3fd7f2ab85d75cb8a940af4ccf6d482a84ea01b" +dependencies = [ + "async-lock 3.2.0", + "blocking", + "futures-lite 2.1.0", +] + [[package]] name = "async-global-executor" version = "2.4.1" @@ -213,6 +224,24 @@ dependencies = [ "windows-sys 0.48.0", ] +[[package]] +name = "async-process" +version = "2.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "15c1cd5d253ecac3d3cf15e390fd96bd92a13b1d14497d81abf077304794fb04" +dependencies = [ + "async-channel 2.1.1", + "async-io 2.2.2", + "async-lock 3.2.0", + "async-signal", + "blocking", + "cfg-if", + "event-listener 4.0.1", + "futures-lite 2.1.0", + "rustix 0.38.28", + "windows-sys 0.52.0", +] + [[package]] name = "async-recursion" version = "1.0.5" @@ -252,7 +281,6 @@ dependencies = [ "async-global-executor", "async-io 1.13.0", "async-lock 2.8.0", - "async-process", "crossbeam-utils", "futures-channel", "futures-core", @@ -657,21 +685,6 @@ dependencies = [ "percent-encoding", ] -[[package]] -name = "futures" -version = "0.3.30" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "645c6916888f6cb6350d2550b80fb63e734897a8498abe35cfb732b6487804b0" -dependencies = [ - "futures-channel", - "futures-core", - "futures-executor", - "futures-io", - "futures-sink", - "futures-task", - "futures-util", -] - [[package]] name = "futures-channel" version = "0.3.30" @@ -679,7 +692,6 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "eac8f7d7865dcb88bd4373ab671c8cf4508703796caa2b1985a9ca867b3fcb78" dependencies = [ "futures-core", - "futures-sink", ] [[package]] @@ -762,7 +774,6 @@ version = "0.3.30" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3d6401deb83407ab3da39eba7e33987a73c3df0c82b4bb5813ee871c19c41d48" dependencies = [ - "futures-channel", "futures-core", "futures-io", "futures-macro", @@ -1021,13 +1032,16 @@ dependencies = [ [[package]] name = "glycin" -version = "0.1.0" +version = "1.0.0-alpha" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ad6c03181c84fdbe028957f3e90747686038b2f0f85ea2a2bf68bef287a6cb8a" +checksum = "c9b4551bd5e514034e097a219e5d24569d881bd89a2298e00c6dc1372ab4b332" dependencies = [ "anyhow", - "async-std", - "futures", + "async-fs 2.1.0", + "async-global-executor", + "async-process 2.0.1", + "futures-channel", + "futures-util", "gdk4", "gio", "glycin-utils", @@ -1035,23 +1049,20 @@ dependencies = [ "lcms2-sys", "memfd", "memmap2", - "nix", + "nix 0.27.1", "rgb", - "safe-transmute", "zbus", ] [[package]] name = "glycin-utils" -version = "0.1.0" +version = "1.0.0-alpha" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6ecc581b89258e8cd90d8aa90a2864ce634270d6f9d2b0c28a050b491a66c874" +checksum = "c141d45a216382d88ebb29620abd688d159200d95428779e3cacd4721a139b8b" dependencies = [ "anyhow", - "async-std", "gettext-rs", - "memmap2", - "nix", + "rustix 0.37.27", "serde", "zbus", ] @@ -1348,10 +1359,11 @@ checksum = "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646" [[package]] name = "lcms2" -version = "5.6.0" +version = "6.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b9d50a4d00d909da0ec023ab34ea09bf3b3b79b5a36b3e0da3a305112edaf150" +checksum = "745453cbf12c57cce42c1d1db6075d481ca1956fa9bf661f770018656d55e1bd" dependencies = [ + "bytemuck", "foreign-types", "lcms2-sys", ] @@ -1513,9 +1525,9 @@ dependencies = [ [[package]] name = "memmap2" -version = "0.7.1" +version = "0.9.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f49388d20533534cd19360ad3d6a7dadc885944aa802ba3995040c5ec11288c6" +checksum = "45fd3a57831bf88bc63f8cebc0cf956116276e97fef3966103e96416209f7c92" dependencies = [ "libc", ] @@ -1563,7 +1575,17 @@ dependencies = [ "cfg-if", "libc", "memoffset 0.7.1", - "pin-utils", +] + +[[package]] +name = "nix" +version = "0.27.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2eb04e9c688eff1c89d72b407f168cf79bb9e867a9d3323ed6c01519eb9cc053" +dependencies = [ + "bitflags 2.4.1", + "cfg-if", + "libc", ] [[package]] @@ -2575,7 +2597,7 @@ version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2769203cd13a0c6015d515be729c526d041e9cf2c0cc478d57faee85f40c6dcd" dependencies = [ - "nix", + "nix 0.26.4", "winapi", ] @@ -2587,10 +2609,10 @@ checksum = "31de390a2d872e4cd04edd71b425e29853f786dc99317ed72d73d6fcf5ebb948" dependencies = [ "async-broadcast", "async-executor", - "async-fs", + "async-fs 1.6.0", "async-io 1.13.0", "async-lock 2.8.0", - "async-process", + "async-process 1.8.1", "async-recursion", "async-task", "async-trait", @@ -2603,7 +2625,7 @@ dependencies = [ "futures-sink", "futures-util", "hex", - "nix", + "nix 0.26.4", "once_cell", "ordered-stream", "rand", diff --git a/Cargo.toml b/Cargo.toml index 4ab41b3..decb8dc 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -19,7 +19,7 @@ async-channel = "2.1.0" env_logger = "0.10.0" futures-channel = "0.3.25" futures-lite = "2.1.0" -glycin = "0.1.0" +glycin = "1.0.0-alpha" gvdb-macros = "0.1.6" indexmap = "2.0.0" kamadak-exif = "0.5.5" diff --git a/build-aux/flatpak/org.gnome.Loupe.Devel.json b/build-aux/flatpak/org.gnome.Loupe.Devel.json index 6b07a3f..c04dfb5 100644 --- a/build-aux/flatpak/org.gnome.Loupe.Devel.json +++ b/build-aux/flatpak/org.gnome.Loupe.Devel.json @@ -1,14 +1,14 @@ { - "id" : "org.gnome.Loupe.Devel", - "runtime" : "org.gnome.Platform", - "runtime-version" : "master", - "sdk" : "org.gnome.Sdk", - "sdk-extensions" : [ + "id": "org.gnome.Loupe.Devel", + "runtime": "org.gnome.Platform", + "runtime-version": "master", + "sdk": "org.gnome.Sdk", + "sdk-extensions": [ "org.freedesktop.Sdk.Extension.rust-stable", "org.freedesktop.Sdk.Extension.llvm16" ], - "command" : "loupe", - "finish-args" : [ + "command": "loupe", + "finish-args": [ "--share=ipc", "--socket=fallback-x11", "--socket=wayland", @@ -20,20 +20,20 @@ "--filesystem=xdg-run/gvfs", "--filesystem=xdg-run/gvfsd" ], - "build-options" : { - "append-path" : "/usr/lib/sdk/rust-stable/bin:/usr/lib/sdk/llvm16/bin", - "build-args" : [ + "build-options": { + "append-path": "/usr/lib/sdk/rust-stable/bin:/usr/lib/sdk/llvm16/bin", + "build-args": [ "--share=network" ], - "env" : { - "RUSTFLAGS" : "-C force-frame-pointers=yes", - "CARGO_TARGET_X86_64_UNKNOWN_LINUX_GNU_LINKER" : "clang", - "CARGO_TARGET_AARCH64_UNKNOWN_LINUX_GNU_LINKER" : "clang", - "CARGO_TARGET_X86_64_UNKNOWN_LINUX_GNU_RUSTFLAGS" : "-C link-arg=-fuse-ld=/usr/lib/sdk/rust-stable/bin/mold", - "CARGO_TARGET_AARCH64_UNKNOWN_LINUX_GNU_RUSTFLAGS" : "-C link-arg=-fuse-ld=/usr/lib/sdk/rust-stable/bin/mold" + "env": { + "RUSTFLAGS": "-C force-frame-pointers=yes", + "CARGO_TARGET_X86_64_UNKNOWN_LINUX_GNU_LINKER": "clang", + "CARGO_TARGET_AARCH64_UNKNOWN_LINUX_GNU_LINKER": "clang", + "CARGO_TARGET_X86_64_UNKNOWN_LINUX_GNU_RUSTFLAGS": "-C link-arg=-fuse-ld=/usr/lib/sdk/rust-stable/bin/mold", + "CARGO_TARGET_AARCH64_UNKNOWN_LINUX_GNU_RUSTFLAGS": "-C link-arg=-fuse-ld=/usr/lib/sdk/rust-stable/bin/mold" } }, - "cleanup" : [ + "cleanup": [ "/include", "/lib/pkgconfig", "/man", @@ -46,18 +46,18 @@ ], "add-extensions": { /* Exile HEIC (x265) codec into extension */ - "org.gnome.Loupe.Devel.HEIC" : { + "org.gnome.Loupe.Devel.HEIC": { /* Relative to app dir */ - "directory" : "lib/libheif-heic", + "directory": "lib/libheif-heic", /* Relative to directory above */ - "add-ld-path" : "lib", + "add-ld-path": "lib", /* Remove extension data from main flatpak package */ - "bundle" : true, + "bundle": true, /* Remove this extension when Loupe is deinstalled */ - "autodelete" : true + "autodelete": true } }, - "modules" : [ + "modules": [ { "name": "geocode-glib", "buildsystem": "meson", @@ -105,24 +105,24 @@ }, { /* HEIC (x265) decoder */ - "name" : "libde265", - "buildsystem" : "cmake", + "name": "libde265", + "buildsystem": "cmake", "config-opts": [ /* Install into folder for extension */ "-DCMAKE_INSTALL_PREFIX=/app/lib/libheif-heic", "-DENABLE_SDL=Off" ], - "sources" : [ + "sources": [ { - "type" : "git", - "url" : "https://github.com/strukturag/libde265.git", - "tag" : "v1.0.11" + "type": "git", + "url": "https://github.com/strukturag/libde265.git", + "tag": "v1.0.11" } ] }, { - "name" : "libheif", - "buildsystem" : "cmake", + "name": "libheif", + "buildsystem": "cmake", "config-opts": [ /* Build HEIC (x265) as plugin */ "-DWITH_LIBDE265_PLUGIN=On", @@ -141,38 +141,38 @@ /* No need for examples */ "-DWITH_EXAMPLES=Off" ], - "sources" : [ + "sources": [ { - "type" : "git", - "url" : "https://github.com/strukturag/libheif.git", - "tag" : "v1.16.2" + "type": "git", + "url": "https://github.com/strukturag/libheif.git", + "tag": "v1.17.2" } ] }, { - "name" : "glycin", - "buildsystem" : "meson", - "sources" : [ + "name": "glycin", + "buildsystem": "meson", + "sources": [ { - "type" : "git", - "url" : "https://gitlab.gnome.org/sophie-h/glycin.git", - "commit" : "84885234beca8185ca739bfcca229fb52b339800" + "type": "git", + "url": "https://gitlab.gnome.org/sophie-h/glycin.git", + "commit": "2775373f373056ba79f5c3e0afd256815ad0dc32" } ] }, { - "name" : "loupe", - "buildsystem" : "meson", + "name": "loupe", + "buildsystem": "meson", "config-opts": [ "-Dprofile=development", "-Ddisable-glycin-sandbox=true" ], - "sources" : [ + "sources": [ { - "type" : "git", - "url" : "https://gitlab.gnome.org/GNOME/loupe.git" + "type": "git", + "url": "https://gitlab.gnome.org/GNOME/loupe.git" } ] } ] -} +} \ No newline at end of file diff --git a/src/decoder/formats/glycin_proxy.rs b/src/decoder/formats/glycin_proxy.rs index e6e142d..ca6e8f1 100644 --- a/src/decoder/formats/glycin_proxy.rs +++ b/src/decoder/formats/glycin_proxy.rs @@ -57,10 +57,10 @@ impl Glycin { let image = image_request.request().await?; - if let Some(exif_raw) = image.info().exif.clone().into() { + if let Some(exif_raw) = image.info().details.exif.clone() { let mut metadata = Metadata::default(); metadata.set_exif_bytes(exif_raw); - metadata.set_transformations_applied(image.info().transformations_applied); + metadata.set_transformations_applied(image.info().details.transformations_applied); updater.send(DecoderUpdate::Metadata(metadata)); } diff --git a/src/decoder/formats/svg.rs b/src/decoder/formats/svg.rs index 04dc372..4539652 100644 --- a/src/decoder/formats/svg.rs +++ b/src/decoder/formats/svg.rs @@ -78,11 +78,8 @@ impl Svg { let image = image_request.request().await?; - let dimensions = if let Some(string) = image.info().dimensions_text.as_ref() { - ImageDimensionDetails::Svg( - string.to_string(), - image.info().dimensions_inch.clone().into(), - ) + let dimensions = if let Some(string) = image.info().details.dimensions_text.as_ref() { + ImageDimensionDetails::Svg(string.to_string(), image.info().details.dimensions_inch) } else { ImageDimensionDetails::None }; diff --git a/src/decoder/mod.rs b/src/decoder/mod.rs index ac32b18..b41fa47 100644 --- a/src/decoder/mod.rs +++ b/src/decoder/mod.rs @@ -146,7 +146,7 @@ impl Decoder { if mime_type.split('+').next() == Some("image/svg") { update_sender.send(DecoderUpdate::Format(ImageFormat::new( mime_type, - "SVG".into(), + Some("SVG".into()), ))); return FormatDecoder::Svg(Svg::new(file, update_sender, tiles)); } diff --git a/src/main.rs b/src/main.rs index 95fe7c8..6645ae0 100644 --- a/src/main.rs +++ b/src/main.rs @@ -62,7 +62,7 @@ mod widgets; mod window; mod deps { - pub use gtk::{cairo, gdk, gdk_pixbuf, gio, glib, graphene, gsk}; + pub use gtk::{cairo, gdk, gio, glib, graphene, gsk}; } use application::LpApplication; diff --git a/src/metadata/format.rs b/src/metadata/format.rs index 8b5b22f..79e0349 100644 --- a/src/metadata/format.rs +++ b/src/metadata/format.rs @@ -15,14 +15,16 @@ // // SPDX-License-Identifier: GPL-3.0-or-later +use crate::util::gettext::*; + #[derive(Clone, Debug)] pub struct ImageFormat { mime_type: glycin::MimeType, - name: String, + name: Option, } impl ImageFormat { - pub fn new(mime_type: glycin::MimeType, name: String) -> Self { + pub fn new(mime_type: glycin::MimeType, name: Option) -> Self { Self { mime_type, name } } @@ -40,6 +42,10 @@ impl ImageFormat { impl std::fmt::Display for ImageFormat { fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> Result<(), std::fmt::Error> { - write!(f, "{}", self.name) + write!( + f, + "{}", + self.name.clone().unwrap_or_else(|| gettext("Unknown")) + ) } } diff --git a/src/metadata/gps.rs b/src/metadata/gps.rs index f93b826..ea8f3e8 100644 --- a/src/metadata/gps.rs +++ b/src/metadata/gps.rs @@ -74,7 +74,7 @@ impl GPSCoord { } fn position_exif(position: &[exif::Rational]) -> Option<(f64, Option, Option)> { - let (deg, mut min, mut sec) = (position.get(0)?, position.get(1), position.get(2)); + let (deg, mut min, mut sec) = (position.first()?, position.get(1), position.get(2)); if let (Some(min_), Some(sec_)) = (min, sec) { if min_.denom > 1 && sec_.num == 0 {