From 36a925da06761a5706b95600e8f4da1d33b3e9ec Mon Sep 17 00:00:00 2001 From: Maciek <108873945+rozwader@users.noreply.github.com> Date: Wed, 23 Sep 2026 13:31:29 +0200 Subject: [PATCH] fix: homepage cover images are now in much better quality without bigger memory use (#862) * fix: fixed background covers rendering poorly on bigger resolutions * fix: fixed onboarding cached images stacking from ~80MB to again ~20MB (like it was before) --- packages/oneclient_app/src/layout/app_shell.rs | 2 ++ .../src/view/onboarding/downloading/backdrop.rs | 1 - packages/oneclient_core/src/images/mod.rs | 6 ++++++ 3 files changed, 8 insertions(+), 1 deletion(-) diff --git a/packages/oneclient_app/src/layout/app_shell.rs b/packages/oneclient_app/src/layout/app_shell.rs index 11b7191e..fbf7dbe3 100644 --- a/packages/oneclient_app/src/layout/app_shell.rs +++ b/packages/oneclient_app/src/layout/app_shell.rs @@ -17,6 +17,7 @@ use crate::layout::AnimatedAppOutlet; use crate::theme; use crate::use_settings_snapshot; use oneclient_core::clusters::Cluster; +use oneclient_core::images::BACKGROUND_IMAGE_EDGE; use oneclient_db::models::ClusterId; use crate::hooks::{ @@ -274,6 +275,7 @@ fn home_cluster(clusters: &[Cluster], active: Option) -> Option<&Clus fn home_art(cluster: Option<&Cluster>) -> DynamicArt { cluster .map_or_else(DynamicArt::fallback, DynamicArt::for_cluster) + .max_edge(BACKGROUND_IMAGE_EDGE) .preview_edge(ART_PREVIEW_EDGE) } diff --git a/packages/oneclient_app/src/view/onboarding/downloading/backdrop.rs b/packages/oneclient_app/src/view/onboarding/downloading/backdrop.rs index c346abe1..81ac8358 100644 --- a/packages/oneclient_app/src/view/onboarding/downloading/backdrop.rs +++ b/packages/oneclient_app/src/view/onboarding/downloading/backdrop.rs @@ -121,7 +121,6 @@ impl Component for LoadingBackdrop { let pan_x = cx * sw * PARALLAX_STRENGTH; let pan_y = cy * sh * PARALLAX_STRENGTH; - // Default edge on purpose home shows the same art next so the same variant avoids a second fetch let art = match clusters.get(current) { Some(cluster) => DynamicArt::for_cluster(cluster), None => DynamicArt::fallback(), diff --git a/packages/oneclient_core/src/images/mod.rs b/packages/oneclient_core/src/images/mod.rs index b253cee0..81823499 100644 --- a/packages/oneclient_core/src/images/mod.rs +++ b/packages/oneclient_core/src/images/mod.rs @@ -13,6 +13,8 @@ use polyio::sha1_bytes; pub const DEFAULT_IMAGE_EDGE: u32 = 1200; +pub const BACKGROUND_IMAGE_EDGE: u32 = 2560; + /// Image urls come from untrusted remote descriptions, so cap what is fetched and decoded. const MAX_IMAGE_BYTES: usize = 8 * 1024 * 1024; @@ -135,6 +137,10 @@ static DECODE_LIMIT: std::sync::LazyLock = std::sync::LazyLock::new(|| tokio::sync::Semaphore::new(2)); async fn downscale_if_oversized(bytes: Bytes, max_edge: u32) -> Bytes { + if max_edge == 0 { + return bytes; + } + let _permit = DECODE_LIMIT.acquire().await; let candidate = bytes.clone(); match tokio::task::spawn_blocking(move || downscale(&candidate, max_edge)).await {