🏡 index : ~doyle/shalom.git

author Jordan Doyle <jordan@doyle.la> 2024-01-03 19:49:29.0 +00:00:00
committer Jordan Doyle <jordan@doyle.la> 2024-01-03 19:49:29.0 +00:00:00
commit
6d04d3065e3e4c9a7d8befdb6ead797a9fba18de [patch]
tree
3f0bdca4b960db88b708120c68399753faadada1
parent
18f5cc459df09145600ebee7f591ad9e7550e6b8
download
6d04d3065e3e4c9a7d8befdb6ead797a9fba18de.tar.gz

Trim padding from artist logos



Diff

 shalom/src/pages/room/listen.rs |  8 ++++--
 shalom/src/subscriptions.rs     |  7 ++----
 shalom/src/theme.rs             | 52 +++++++++++++++++++++++++++++++++++++++++-
 3 files changed, 60 insertions(+), 7 deletions(-)

diff --git a/shalom/src/pages/room/listen.rs b/shalom/src/pages/room/listen.rs
index 7f30573..4169f83 100644
--- a/shalom/src/pages/room/listen.rs
+++ b/shalom/src/pages/room/listen.rs
@@ -12,7 +12,7 @@ use crate::{
    hass_client::MediaPlayerRepeat,
    oracle::{MediaPlayerSpeaker, MediaPlayerSpeakerState, Oracle, Room},
    subscriptions::{download_image, find_fanart_urls, find_musicbrainz_artist, MaybePendingImage},
    theme::darken_image,
    theme::{darken_image, trim_transparent_padding},
    widgets,
};

@@ -209,7 +209,11 @@ impl Listen {
            };

        let logo_subscription = if let Some(MaybePendingImage::Loading(url)) = &self.artist_logo {
            download_image(url.clone(), identity, Message::ArtistLogoDownloaded)
            download_image(
                url.clone(),
                trim_transparent_padding,
                Message::ArtistLogoDownloaded,
            )
        } else {
            Subscription::none()
        };
diff --git a/shalom/src/subscriptions.rs b/shalom/src/subscriptions.rs
index 3a6c05a..222710f 100644
--- a/shalom/src/subscriptions.rs
+++ b/shalom/src/subscriptions.rs
@@ -1,6 +1,5 @@
use std::num::NonZeroUsize;

use ::image::GenericImageView;
use iced::{futures::stream, subscription, widget::image, Subscription};
use lru::LruCache;
use once_cell::sync::Lazy;
@@ -51,10 +50,10 @@ pub fn download_image<M: 'static>(
            let handle = tokio::task::spawn_blocking(move || {
                eprintln!("parsing image");
                let img = ::image::load_from_memory(&bytes).unwrap();
                let (h, w) = img.dimensions();
                eprintln!("post processing");
                let data = post_process(img.into_rgba8()).into_raw();
                image::Handle::from_pixels(h, w, data)
                let data = post_process(img.into_rgba8());
                let (h, w) = data.dimensions();
                image::Handle::from_pixels(h, w, data.into_raw())
            })
            .await
            .unwrap();
diff --git a/shalom/src/theme.rs b/shalom/src/theme.rs
index 12a6910..89fb405 100644
--- a/shalom/src/theme.rs
+++ b/shalom/src/theme.rs
@@ -1,4 +1,4 @@
use ::image::{GenericImageView, Pixel, Rgba, RgbaImage};
use ::image::{imageops, GenericImageView, Pixel, Rgba, RgbaImage};
use iced::{
    advanced::svg::Handle,
    widget::{image, svg},
@@ -202,3 +202,53 @@ pub fn blur(img: &RgbaImage, radius: usize) -> RgbaImage {

    image
}

pub fn trim_transparent_padding(mut image: RgbaImage) -> RgbaImage {
    let (width, height) = image.dimensions();
    let mut top = 0;
    let mut bottom = height;
    let mut left = 0;
    let mut right = width;

    'outer: for y in 0..height {
        for x in 0..width {
            let pixel = image.get_pixel(x, y);
            if pixel[3] != 0 {
                top = y;
                break 'outer;
            }
        }
    }

    'outer: for y in (top..height).rev() {
        for x in 0..width {
            let pixel = image.get_pixel(x, y);
            if pixel[3] != 0 {
                bottom = y + 1;
                break 'outer;
            }
        }
    }

    'outer: for x in 0..width {
        for y in top..bottom {
            let pixel = image.get_pixel(x, y);
            if pixel[3] != 0 {
                left = x;
                break 'outer;
            }
        }
    }

    'outer: for x in (left..width).rev() {
        for y in top..bottom {
            let pixel = image.get_pixel(x, y);
            if pixel[3] != 0 {
                right = x + 1;
                break 'outer;
            }
        }
    }

    imageops::crop(&mut image, left, top, right - left, bottom - top).to_image()
}