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