Skip to content
Snippets Groups Projects
Unverified Commit 229f54ab authored by Pavel Kirilin's avatar Pavel Kirilin :alien:
Browse files

Fixed dynamic resolution resolver and zero width.


Signed-off-by: default avatarPavel Kirilin <win10@list.ru>
parent dd5c2606
No related branches found
No related tags found
No related merge requests found
......@@ -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);
......
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
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!(
......
......@@ -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,
......
......@@ -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> {
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment