diff --git a/Cargo.lock b/Cargo.lock index 8a26432..a3bf710 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -314,12 +314,6 @@ version = "0.21.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "35636a1494ede3b646cc98f74f8e62c773a38a659ebc777a2cf26b9b74171df9" -[[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" @@ -628,30 +622,6 @@ dependencies = [ "crossbeam-utils", ] -[[package]] -name = "crossbeam-deque" -version = "0.8.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ce6fd6f855243022dcecf8702fef0c297d4338e226845fe067f6341ad9fa0cef" -dependencies = [ - "cfg-if", - "crossbeam-epoch", - "crossbeam-utils", -] - -[[package]] -name = "crossbeam-epoch" -version = "0.9.15" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ae211234986c545741a7dc064309f67ee1e5ad243d0e48335adc0484d960bcc7" -dependencies = [ - "autocfg", - "cfg-if", - "crossbeam-utils", - "memoffset 0.9.0", - "scopeguard", -] - [[package]] name = "crossbeam-utils" version = "0.8.16" @@ -661,12 +631,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" @@ -704,12 +668,6 @@ dependencies = [ "syn 2.0.39", ] -[[package]] -name = "cty" -version = "0.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b365fabc795046672053e29c954733ec3b05e4be654ab130fe8f1f94d7051f35" - [[package]] name = "data-encoding" version = "2.4.0" @@ -907,32 +865,6 @@ dependencies = [ "pin-project-lite", ] -[[package]] -name = "exr" -version = "1.71.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "832a761f35ab3e6664babfbdc6cef35a4860e816ec3916dcfd0882954e98a8a8" -dependencies = [ - "bit_field", - "flume", - "half", - "lebe", - "miniz_oxide", - "rayon-core", - "smallvec", - "zune-inflate", -] - -[[package]] -name = "fast_image_resize" -version = "2.7.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cc789a40040e11bbe4ba31ca319406805a12fe3f8d71314bbc4bd076602ad55a" -dependencies = [ - "num-traits", - "thiserror", -] - [[package]] name = "fastrand" version = "1.9.0" @@ -977,15 +909,6 @@ dependencies = [ "miniz_oxide", ] -[[package]] -name = "flume" -version = "0.11.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "55ac459de2512911e4b674ce33cf20befaba382d05b62b008afc1c8b57cbf181" -dependencies = [ - "spin", -] - [[package]] name = "fnv" version = "1.0.7" @@ -1277,26 +1200,6 @@ dependencies = [ "wasi 0.11.0+wasi-snapshot-preview1", ] -[[package]] -name = "gexiv2-sys" -version = "1.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c4edf7a47be383873c52eb34426723c7c9b040f9e58cf5088f2253cef149daf1" -dependencies = [ - "libc", - "pkg-config", -] - -[[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.28.0" @@ -1464,15 +1367,6 @@ dependencies = [ "tracing", ] -[[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" @@ -1627,14 +1521,8 @@ dependencies = [ "bytemuck", "byteorder", "color_quant", - "exr", - "gif", - "jpeg-decoder", "num-rational", "num-traits", - "png", - "qoi", - "tiff", ] [[package]] @@ -1677,6 +1565,15 @@ dependencies = [ "windows-sys 0.48.0", ] +[[package]] +name = "itertools" +version = "0.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b1c173a5686ce8bfa551b3563d0c2170bf24ca44da99c7ca4bfdab5418c3fe57" +dependencies = [ + "either", +] + [[package]] name = "itoa" version = "0.4.8" @@ -1734,15 +1631,6 @@ version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8eaf4bc02d17cbdd7ff4c7438cafcdf7fb9a4613313ad11b4f8fefe7d3fa0130" -[[package]] -name = "jpeg-decoder" -version = "0.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bc0000e42512c92e31c2252315bda326620a4e034105e900c98ec492fa077b3e" -dependencies = [ - "rayon", -] - [[package]] name = "kuchikiki" version = "0.8.2" @@ -1762,12 +1650,6 @@ version = "1.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646" -[[package]] -name = "lebe" -version = "0.5.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "03087c2bad5e1034e8cace5926dec053fb3790248370865f5117a7d0213354c8" - [[package]] name = "libc" version = "0.2.150" @@ -1888,6 +1770,12 @@ dependencies = [ "unicase", ] +[[package]] +name = "minimal-lexical" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "68354c5c6bd36d73ff3feceb05efa59b6acb7626617f4962be322a825e61f79a" + [[package]] name = "miniz_oxide" version = "0.7.1" @@ -1929,20 +1817,22 @@ dependencies = [ [[package]] name = "native-dialog" -version = "0.6.4" +version = "0.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1bbf55edb2747e4e4b3a9cd3989194b88aae32274b4422635dcf98aa6e84197b" +checksum = "84e7038885d2aeab236bd60da9e159a5967b47cde3292da3b15ff1bec27c039f" dependencies = [ "ascii", "block", - "cocoa 0.24.1", + "cocoa 0.25.0", + "core-foundation", "dirs-next", "objc", "objc-foundation", "objc_id", "once_cell", - "raw-window-handle 0.4.3", + "raw-window-handle", "thiserror", + "versions", "wfd", "which", "winapi", @@ -1958,7 +1848,7 @@ dependencies = [ "jni-sys", "ndk-sys", "num_enum", - "raw-window-handle 0.5.2", + "raw-window-handle", "thiserror", ] @@ -2001,6 +1891,16 @@ version = "0.1.14" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "72ef4a56884ca558e5ddb05a1d1e7e1bfd9a68d9ed024c21704cc98872dae1bb" +[[package]] +name = "nom" +version = "7.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d273983c5a657a70a3e8f2a01329822f3b8c8172b73826411a55751e404a0a4a" +dependencies = [ + "memchr", + "minimal-lexical", +] + [[package]] name = "num-integer" version = "0.1.45" @@ -2461,15 +2361,6 @@ 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 = "quote" version = "1.0.33" @@ -2560,41 +2451,12 @@ dependencies = [ "rand_core 0.5.1", ] -[[package]] -name = "raw-window-handle" -version = "0.4.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b800beb9b6e7d2df1fe337c9e3d04e3af22a124460fb4c30fcc22c9117cefb41" -dependencies = [ - "cty", -] - [[package]] name = "raw-window-handle" version = "0.5.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f2ff9a1f06a88b01621b7ae906ef0211290d1c8a168a15542486a8f61c0833b9" -[[package]] -name = "rayon" -version = "1.8.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9c27db03db7734835b3f53954b534c91069375ce6ccaa2e065441e07d9b6cdb1" -dependencies = [ - "either", - "rayon-core", -] - -[[package]] -name = "rayon-core" -version = "1.12.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5ce3fb6ad83f861aac485e76e1985cd109d9a3713802152be56c3b1f0e0658ed" -dependencies = [ - "crossbeam-deque", - "crossbeam-utils", -] - [[package]] name = "redox_syscall" version = "0.4.1" @@ -2644,17 +2506,6 @@ version = "0.8.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c08c74e62047bb2de4ff487b251e4a92e24f48745648451635cec7d591162d9f" -[[package]] -name = "rexiv2" -version = "0.10.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "11ecb9dccad43fea1bf58ea7bb8e34614446bea8aa00f78add6624d7ee26fb87" -dependencies = [ - "gexiv2-sys", - "libc", - "num-rational", -] - [[package]] name = "rust-embed" version = "8.0.0" @@ -2910,14 +2761,10 @@ dependencies = [ "anyhow", "clap", "directories", - "fast_image_resize", - "image", "log", "native-dialog", - "rexiv2", "rust-embed", "simplelog", - "tempfile", "tokio", "warp", "wry", @@ -3006,9 +2853,6 @@ 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" @@ -3125,7 +2969,7 @@ dependencies = [ "once_cell", "parking_lot", "png", - "raw-window-handle 0.5.2", + "raw-window-handle", "scopeguard", "serde", "tao-macros", @@ -3214,17 +3058,6 @@ dependencies = [ "syn 2.0.39", ] -[[package]] -name = "tiff" -version = "0.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6d172b0f4d3fba17ba89811858b9d3d97f928aece846475bbda076ca46736211" -dependencies = [ - "flate2", - "jpeg-decoder", - "weezl", -] - [[package]] name = "time" version = "0.3.30" @@ -3542,6 +3375,16 @@ version = "0.9.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "49874b5167b65d7193b8aba1567f5c7d93d001cafc34600cee003eda787e483f" +[[package]] +name = "versions" +version = "5.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c73a36bc44e3039f51fbee93e39f41225f6b17b380eb70cc2aab942df06b34dd" +dependencies = [ + "itertools", + "nom", +] + [[package]] name = "waker-fn" version = "1.1.1" @@ -3690,12 +3533,6 @@ dependencies = [ "windows-core", ] -[[package]] -name = "weezl" -version = "0.1.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9193164d4de03a926d909d3bc7c30543cecb35400c02114792c2cae20d5e2dbb" - [[package]] name = "wfd" version = "0.1.7" @@ -4066,15 +3903,6 @@ dependencies = [ "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.15.0" diff --git a/Cargo.toml b/Cargo.toml index da6e2e9..7e234ee 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -8,13 +8,9 @@ anyhow = "1.0" log = "0.4" simplelog = "0.12" wry = "0.34" -native-dialog = "0.6" +native-dialog = "0.7" rust-embed = "8" directories = "5" clap = "4" warp = "0.3" -tokio = { version = "1", features = ["full"] } -image = "0.24" -rexiv2 = "0.10" -tempfile = "3" -fast_image_resize = "2" \ No newline at end of file +tokio = { version = "1", features = ["full"] } \ No newline at end of file diff --git a/src/main.rs b/src/main.rs index 0d28049..b57754d 100644 --- a/src/main.rs +++ b/src/main.rs @@ -2,15 +2,11 @@ use anyhow::{anyhow, bail, Result}; use clap::{Arg, Command}; -use fast_image_resize as fr; -use image::{io::Reader as ImageReader, DynamicImage}; use log::info; use native_dialog::{FileDialog, MessageDialog}; -use rexiv2::Metadata; use rust_embed::RustEmbed; use simplelog::{ColorChoice, ConfigBuilder, LevelFilter, TermLogger, TerminalMode}; -use std::{fs::File, io::BufWriter, num::NonZeroU32, path::PathBuf, thread::JoinHandle}; -use tempfile::tempdir; +use std::{borrow::Cow, path::PathBuf, thread::JoinHandle}; use warp::Filter; use wry::{ application::{ @@ -37,9 +33,10 @@ fn main() -> Result<()> { ColorChoice::Auto, )?; - let tmp_dir = tempdir()?; - let cmd = Command::new("Simple panorama viewer") + .version(env!("CARGO_PKG_VERSION")) + .author(env!("CARGO_PKG_AUTHORS")) + .about(env!("CARGO_PKG_DESCRIPTION")) .arg( Arg::new("filename") .value_parser(clap::value_parser!(PathBuf)) @@ -48,7 +45,7 @@ fn main() -> Result<()> { .get_matches(); let img_path = if let Some(img_path) = cmd.get_one::("filename") { - img_path.clone() + Cow::Borrowed(img_path) } else { let user_dirs = directories::UserDirs::new().unwrap(); let dir = if let Some(img_dir) = user_dirs.picture_dir() { @@ -56,16 +53,18 @@ fn main() -> Result<()> { } else { user_dirs.home_dir() }; - FileDialog::new() - .add_filter( - "Images", - &[ - "jpg", "JPG", "jpeg", "pjpeg", "pjpg", "PJPG", "webp", "avif", - ], - ) - .set_location(dir) - .show_open_single_file()? - .ok_or_else(|| anyhow!("No file"))? + Cow::Owned( + FileDialog::new() + .add_filter( + "Images", + &[ + "jpg", "JPG", "jpeg", "pjpeg", "pjpg", "PJPG", "webp", "avif", + ], + ) + .set_location(dir) + .show_open_single_file()? + .ok_or_else(|| anyhow!("No file"))?, + ) }; if !img_path.exists() { @@ -77,53 +76,8 @@ fn main() -> Result<()> { bail!("File `{}` does not exist !", img_path.display()); } - info!("Open `{}`", img_path.display()); - let (width, height) = image::image_dimensions(&img_path)?; - const MAX_IMG_SIZE: u32 = 20_000_000; - info!("Image size {} * {}", width, height); - let img_data_path = if height * width > MAX_IMG_SIZE { - // @todo Option pas de resize / taille en ligne de commande - // @todo Option pas de resize / taille dans une config (confy) - // @todo Demande ensergistre l’action la première fois - // @todo Option always en ligne de commnade - // @todo Icon - // @todo no dialog with v0.7 - let ratio = (height * width) as f64 / MAX_IMG_SIZE as f64; - let new_height = (height as f64 / ratio.sqrt()) as u32; - let new_width = (width as f64 / ratio.sqrt()) as u32; - - if MessageDialog::new() - .set_title("Resize") - .set_type(native_dialog::MessageType::Info) - .set_text(&format!( - "Resize the file to {} × {}", - new_width, new_height - )) - .show_confirm()? - { - // Resize image - let img = ImageReader::open(&img_path)?.decode()?; - info!("Resize image to {} × {}", new_width, new_height); - let image_resized = fast_image_resize(&img, new_width, new_height)?; - - // Save file and add metadata - let tmp_img_path = tmp_dir.path().join("img.jpg"); - image_resized.write_to( - &mut BufWriter::new(File::create(&tmp_img_path)?), - image::ImageOutputFormat::Jpeg(95), - )?; - let metadata = Metadata::new_from_path(&img_path)?; - metadata.save_to_file(&tmp_img_path)?; - tmp_img_path - } else { - img_path - } - } else { - img_path - }; - info!("Run server"); - run_server(img_data_path); + run_server(img_path.to_path_buf()); info!("Create webview"); let event_loop = EventLoop::new(); @@ -192,49 +146,3 @@ fn get_file_data(filename: &str) -> String { "".to_string() } } - -/// Fast resize -pub fn fast_image_resize( - img: &DynamicImage, - max_width: u32, - max_height: u32, -) -> Result { - // Create source image - let width = NonZeroU32::new(img.width()).unwrap(); - let height = NonZeroU32::new(img.height()).unwrap(); - let src_image = - fr::Image::from_vec_u8(width, height, img.to_rgb8().into_raw(), fr::PixelType::U8x3)?; - let mut src_view = src_image.view(); - - // Create container for data of destination image - let (dst_width, dst_height) = if width > height { - ( - NonZeroU32::new(max_width).unwrap(), - NonZeroU32::new((max_width * img.height()) / img.width()).unwrap(), - ) - } else { - ( - NonZeroU32::new((max_height * img.width()) / img.height()).unwrap(), - NonZeroU32::new(max_height).unwrap(), - ) - }; - src_view.set_crop_box_to_fit_dst_size(dst_width, dst_height, None); - let mut dst_image = fr::Image::new(dst_width, dst_height, src_view.pixel_type()); - - // Get mutable view of destination image data - let mut dst_view = dst_image.view_mut(); - - // Create Resizer instance and resize source image into buffer of destination image - let mut resizer = fr::Resizer::new(fr::ResizeAlg::Convolution(fr::FilterType::Lanczos3)); - resizer.resize(&src_view, &mut dst_view)?; - - // Create Dynamic image - let img_buffer = image::RgbImage::from_raw( - dst_image.width().get(), - dst_image.height().get(), - dst_image.into_vec(), - ) - .unwrap(); - - Ok(img_buffer.into()) -}