From 229f54abf7db12ced5ee5666e93461f9a39a3b62 Mon Sep 17 00:00:00 2001 From: Pavel Kirilin <win10@list.ru> Date: Thu, 12 Mar 2020 15:26:21 +0400 Subject: [PATCH] Fixed dynamic resolution resolver and zero width. Signed-off-by: Pavel Kirilin <win10@list.ru> --- src/background.rs | 6 ++-- src/img_processors/crop.rs | 15 +++------ src/img_processors/mod.rs | 12 ++++--- src/img_processors/scale.rs | 2 +- src/player_dbus.rs | 64 +++++++++++++++++-------------------- 5 files changed, 45 insertions(+), 54 deletions(-) diff --git a/src/background.rs b/src/background.rs index a715bed..bc0016f 100644 --- a/src/background.rs +++ b/src/background.rs @@ -4,7 +4,7 @@ use dbus::blocking::Connection; use dbus::Message; use crate::img_processors::process_image; -use crate::result::{MBGResult}; +use crate::result::MBGResult; pub fn reset_background_handler(_: (), _: &Connection, message: &Message) -> bool { let member_name = message.read1::<String>(); @@ -24,10 +24,10 @@ pub fn nitrogen_restore() { } } -pub fn process_image_url(image_url: String, screen_height: i32, screen_width: i32) -> MBGResult<()> { +pub fn process_image_url(image_url: String) -> MBGResult<()> { let img_bytes = reqwest::blocking::get(image_url.as_str())?.bytes()?; let bytes_vec = img_bytes.into_iter().collect::<Vec<u8>>(); - let res = process_image(bytes_vec.clone(), screen_height, screen_width)?; + let res = process_image(bytes_vec)?; let img_path = "/dev/shm/test.png"; res.save(img_path)?; set_wallpaper(img_path); diff --git a/src/img_processors/crop.rs b/src/img_processors/crop.rs index 2187675..72a5794 100644 --- a/src/img_processors/crop.rs +++ b/src/img_processors/crop.rs @@ -1,7 +1,7 @@ use image::{DynamicImage, GenericImageView}; use crate::config::image_processors::ProcessorParams; -use crate::result::{MBGResult}; +use crate::result::MBGResult; use super::ImageProcessor; @@ -17,16 +17,11 @@ pub struct CropProcessor { impl ImageProcessor for CropProcessor { fn process(&self, img: &DynamicImage) -> MBGResult<DynamicImage> { let mut res = img.clone(); - let mut requested_width = self.width; - let mut requested_height = self.height; - if self.fit { - debug!("Cropping image to match screen size"); - requested_width = self.screen_width as u32; - requested_height = self.screen_height as u32; - } + let requested_width = if self.fit { self.screen_width as u32 } else { self.width }; + let requested_height = if self.fit { self.screen_height as u32 } else { self.height }; debug!("Cropping image to be {}x{}", requested_width, requested_height); - let start_x = (res.width() / 2) - (requested_width / 2); - let start_y = (res.height() / 2) - (requested_height / 2); + let start_x = (res.width() / 2).checked_sub(requested_width / 2).unwrap_or_else(|| 0); + let start_y = (res.height() / 2).checked_sub(requested_height / 2).unwrap_or_else(|| 0); Ok(res.crop(start_x, start_y, requested_width, requested_height)) } } \ No newline at end of file diff --git a/src/img_processors/mod.rs b/src/img_processors/mod.rs index c7eaa19..4a2c523 100644 --- a/src/img_processors/mod.rs +++ b/src/img_processors/mod.rs @@ -1,9 +1,9 @@ - use image::{DynamicImage, GenericImageView}; use image::imageops::overlay; use crate::config::Config; use crate::config::image_processors::ProcessorParams; +use crate::display::get_max_resolution; use crate::result::{MBGError, MBGResult}; pub mod scale; @@ -54,14 +54,16 @@ impl Default for Processors { } } -pub fn process_image(img_bytes: Vec<u8>, screen_height: i32, screen_width: i32) -> MBGResult<DynamicImage> { +pub fn process_image(img_bytes: Vec<u8>) -> MBGResult<DynamicImage> { let conf = Config::get_props(); + let (screen_height, screen_width) = get_max_resolution()?; + debug!("Maximum resolution: {}x{}", screen_width, screen_height); let image = image::load_from_memory(img_bytes.as_slice())?; let mut layers = vec![image.clone()]; for params in conf.processors.into_iter() { let processor = mapper(params, screen_height, screen_width); - if let Some(layer_img) = layers.get(usize::from(processor.get_layer())) { - layers[usize::from(processor.get_layer())] = processor.process(layer_img)?; + if let Some(layer_img) = layers.get(processor.get_layer()) { + layers[processor.get_layer()] = processor.process(layer_img)?; } else { layers.push(processor.process(&image.clone())?); } @@ -87,7 +89,7 @@ pub fn blend_layers(layers: Vec<DynamicImage>, blender: Vec<u8>) -> MBGResult<Dy overlay(&mut res, layer, pos_x, pos_y); } } - Ok(res.clone()) + Ok(res) } impl_params_getter!( diff --git a/src/img_processors/scale.rs b/src/img_processors/scale.rs index 7589d64..3b8320d 100644 --- a/src/img_processors/scale.rs +++ b/src/img_processors/scale.rs @@ -2,7 +2,7 @@ use image::{DynamicImage, GenericImageView}; use image::imageops::FilterType; use crate::config::image_processors::ProcessorParams; -use crate::result::{MBGResult}; +use crate::result::MBGResult; pub struct ScaleProcessor { pub params: ProcessorParams, diff --git a/src/player_dbus.rs b/src/player_dbus.rs index 50564a3..dabcdf4 100644 --- a/src/player_dbus.rs +++ b/src/player_dbus.rs @@ -11,7 +11,6 @@ use crate::config::Config; use crate::dbus_interface::main_dbus::DBusNameOwnerChanged; use crate::dbus_interface::media_player::OrgMprisMediaPlayer2Player; use crate::dbus_interface::statuses::PlayerStatus; -use crate::display::get_max_resolution; use crate::result::{MBGError, MBGResult}; pub fn player_exit_handler(connection: &Connection) -> MBGResult<()> { @@ -26,16 +25,13 @@ pub fn player_state_watcher(connection: &Connection) -> MBGResult<()> { let mut property_changed_rule = MatchRule::new(); property_changed_rule.path = Some("/org/mpris/MediaPlayer2".into()); property_changed_rule.member = Some("PropertiesChanged".into()); - let (height, width) = get_max_resolution()?; - connection.add_match(property_changed_rule, player_state_router(height, width))?; + connection.add_match(property_changed_rule, player_state_router)?; Ok(()) } #[allow(clippy::implicit_hasher)] pub fn process_metadata( metadata: HashMap<String, arg::Variant<Box<dyn arg::RefArg + 'static>>>, - screen_height: i32, - screen_width: i32, ) -> MBGResult<()> { let art_url = metadata.get("mpris:artUrl"); if art_url.is_none() { @@ -52,42 +48,40 @@ pub fn process_metadata( } let url = url.unwrap().to_string(); debug!("Found url: {}", url); - process_image_url(url, screen_height, screen_width)?; + process_image_url(url)?; Ok(()) } -pub fn player_state_router(screen_height: i32, screen_width: i32) -> impl FnMut((), &Connection, &Message) -> bool { - move |_: (), connection: &Connection, message: &Message| { - let current_status = PlayerStatus::from(message); - debug!("Updated player state"); - match current_status { - PlayerStatus::Playing => { - if message.sender().is_none() { - return true; - } - let sender = message.sender().unwrap(); - let proxy = - connection.with_proxy(sender, "/org/mpris/MediaPlayer2", Duration::new(2, 0)); - let metadata = proxy.metadata(); - if let Err(d_bus_err) = metadata { - let my_err = MBGError::from(d_bus_err); - error!("{}", my_err); - return true; - } - let metadata = metadata.unwrap(); - let process_result = process_metadata(metadata, screen_height, screen_width); - if let Err(error) = process_result { - error!("Found error while processing metadata."); - error!("{}", error); - return true; - } +pub fn player_state_router(_: (), connection: &Connection, message: &Message) -> bool { + let current_status = PlayerStatus::from(message); + debug!("Updated player state"); + match current_status { + PlayerStatus::Playing => { + if message.sender().is_none() { + return true; + } + let sender = message.sender().unwrap(); + let proxy = + connection.with_proxy(sender, "/org/mpris/MediaPlayer2", Duration::new(2, 0)); + let metadata = proxy.metadata(); + if let Err(d_bus_err) = metadata { + let my_err = MBGError::from(d_bus_err); + error!("{}", my_err); + return true; + } + let metadata = metadata.unwrap(); + let process_result = process_metadata(metadata); + if let Err(error) = process_result { + error!("Found error while processing metadata."); + error!("{}", error); + return true; } - PlayerStatus::Paused => nitrogen_restore(), - PlayerStatus::Stopped => nitrogen_restore(), - PlayerStatus::Unknown => {} } - true + PlayerStatus::Paused => nitrogen_restore(), + PlayerStatus::Stopped => nitrogen_restore(), + PlayerStatus::Unknown => {} } + true } pub fn setup_connection() -> MBGResult<Connection> { -- GitLab