diff options
author | 2024-02-10 00:50:49 +0100 | |
---|---|---|
committer | 2024-02-10 00:50:49 +0100 | |
commit | c63529095604ffde00a504ed083474707ab484de (patch) | |
tree | 76a8a103f6352263ccd30a7e230089fbb2d54822 | |
parent | 7ee00e751a8fe5cedadeeb478c6f0e7d6a5dc0dc (diff) | |
parent | 0bcdefeb00c899c23bc7b54903df5bcbc644fbb5 (diff) | |
download | iced-c63529095604ffde00a504ed083474707ab484de.tar.gz iced-c63529095604ffde00a504ed083474707ab484de.tar.bz2 iced-c63529095604ffde00a504ed083474707ab484de.zip |
Merge pull request #2231 from Koranir/transparency-fix
Fix alpha mode misconfiguration in wgpu renderer
-rw-r--r-- | CHANGELOG.md | 2 | ||||
-rw-r--r-- | examples/gradient/Cargo.toml | 5 | ||||
-rw-r--r-- | examples/gradient/src/main.rs | 55 | ||||
-rw-r--r-- | examples/solar_system/src/main.rs | 2 | ||||
-rw-r--r-- | style/src/theme.rs | 17 | ||||
-rw-r--r-- | wgpu/src/window/compositor.rs | 55 |
6 files changed, 106 insertions, 30 deletions
diff --git a/CHANGELOG.md b/CHANGELOG.md index 8f0f96a3..7c51be76 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -103,6 +103,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - `Subscription::map` using unreliable function pointer hash to identify mappers. [#2237](https://github.com/iced-rs/iced/pull/2237) - Missing feature flag docs for `time::every`. [#2188](https://github.com/iced-rs/iced/pull/2188) - Event loop not being resumed on Windows while resizing. [#2214](https://github.com/iced-rs/iced/pull/2214) +- Alpha mode misconfiguration in `iced_wgpu`. [#2231](https://github.com/iced-rs/iced/pull/2231) Many thanks to... @@ -134,6 +135,7 @@ Many thanks to... - @jim-ec - @joshuamegnauth54 - @jpttrssn +- @Koranir - @lufte - @matze - @MichalLebeda diff --git a/examples/gradient/Cargo.toml b/examples/gradient/Cargo.toml index 2dea2c4f..8102b866 100644 --- a/examples/gradient/Cargo.toml +++ b/examples/gradient/Cargo.toml @@ -5,4 +5,7 @@ edition = "2021" publish = false [dependencies] -iced = { path = "../.." } +iced.workspace = true +iced.features = ["debug"] + +tracing-subscriber = "0.3" diff --git a/examples/gradient/src/main.rs b/examples/gradient/src/main.rs index 1bf5822d..32b2e4aa 100644 --- a/examples/gradient/src/main.rs +++ b/examples/gradient/src/main.rs @@ -1,11 +1,23 @@ -use iced::gradient; -use iced::widget::{column, container, horizontal_space, row, slider, text}; +use iced::application; +use iced::theme::{self, Theme}; +use iced::widget::{ + checkbox, column, container, horizontal_space, row, slider, text, +}; +use iced::{gradient, window}; use iced::{ Alignment, Background, Color, Element, Length, Radians, Sandbox, Settings, }; pub fn main() -> iced::Result { - Gradient::run(Settings::default()) + tracing_subscriber::fmt::init(); + + Gradient::run(Settings { + window: window::Settings { + transparent: true, + ..Default::default() + }, + ..Default::default() + }) } #[derive(Debug, Clone, Copy)] @@ -13,6 +25,7 @@ struct Gradient { start: Color, end: Color, angle: Radians, + transparent: bool, } #[derive(Debug, Clone, Copy)] @@ -20,6 +33,7 @@ enum Message { StartChanged(Color), EndChanged(Color), AngleChanged(Radians), + TransparentToggled(bool), } impl Sandbox for Gradient { @@ -30,6 +44,7 @@ impl Sandbox for Gradient { start: Color::WHITE, end: Color::new(0.0, 0.0, 1.0, 1.0), angle: Radians(0.0), + transparent: false, } } @@ -42,11 +57,19 @@ impl Sandbox for Gradient { Message::StartChanged(color) => self.start = color, Message::EndChanged(color) => self.end = color, Message::AngleChanged(angle) => self.angle = angle, + Message::TransparentToggled(transparent) => { + self.transparent = transparent; + } } } fn view(&self) -> Element<Message> { - let Self { start, end, angle } = *self; + let Self { + start, + end, + angle, + transparent, + } = *self; let gradient_box = container(horizontal_space(Length::Fill)) .width(Length::Fill) @@ -72,14 +95,34 @@ impl Sandbox for Gradient { .padding(8) .align_items(Alignment::Center); + let transparency_toggle = iced::widget::Container::new( + checkbox("Transparent window", transparent) + .on_toggle(Message::TransparentToggled), + ) + .padding(8); + column![ color_picker("Start", self.start).map(Message::StartChanged), color_picker("End", self.end).map(Message::EndChanged), angle_picker, - gradient_box + transparency_toggle, + gradient_box, ] .into() } + + fn style(&self) -> theme::Application { + if self.transparent { + theme::Application::custom(|theme: &Theme| { + application::Appearance { + background_color: Color::TRANSPARENT, + text_color: theme.palette().text, + } + }) + } else { + theme::Application::Default + } + } } fn color_picker(label: &str, color: Color) -> Element<'_, Color> { @@ -91,6 +134,8 @@ fn color_picker(label: &str, color: Color) -> Element<'_, Color> { .step(0.01), slider(0.0..=1.0, color.b, move |b| { Color { b, ..color } }) .step(0.01), + slider(0.0..=1.0, color.a, move |a| { Color { a, ..color } }) + .step(0.01), ] .spacing(8) .padding(8) diff --git a/examples/solar_system/src/main.rs b/examples/solar_system/src/main.rs index 82421a86..a58ca683 100644 --- a/examples/solar_system/src/main.rs +++ b/examples/solar_system/src/main.rs @@ -88,7 +88,7 @@ impl Application for SolarSystem { } } - theme::Application::from(dark_background as fn(&Theme) -> _) + theme::Application::custom(dark_background) } fn subscription(&self) -> Subscription<Message> { diff --git a/style/src/theme.rs b/style/src/theme.rs index afb4d027..235aecbd 100644 --- a/style/src/theme.rs +++ b/style/src/theme.rs @@ -172,6 +172,15 @@ pub enum Application { Custom(Box<dyn application::StyleSheet<Style = Theme>>), } +impl Application { + /// Creates a custom [`Application`] style. + pub fn custom( + custom: impl application::StyleSheet<Style = Theme> + 'static, + ) -> Self { + Self::Custom(Box::new(custom)) + } +} + impl application::StyleSheet for Theme { type Style = Application; @@ -196,14 +205,6 @@ impl<T: Fn(&Theme) -> application::Appearance> application::StyleSheet for T { } } -impl<T: Fn(&Theme) -> application::Appearance + 'static> From<T> - for Application -{ - fn from(f: T) -> Self { - Self::Custom(Box::new(f)) - } -} - /// The style of a button. #[derive(Default)] pub enum Button { diff --git a/wgpu/src/window/compositor.rs b/wgpu/src/window/compositor.rs index 58f3f654..33133016 100644 --- a/wgpu/src/window/compositor.rs +++ b/wgpu/src/window/compositor.rs @@ -15,6 +15,7 @@ pub struct Compositor { device: wgpu::Device, queue: wgpu::Queue, format: wgpu::TextureFormat, + alpha_mode: wgpu::CompositeAlphaMode, } impl Compositor { @@ -61,25 +62,48 @@ impl Compositor { log::info!("Selected: {:#?}", adapter.get_info()); - let format = compatible_surface.as_ref().and_then(|surface| { - let capabilities = surface.get_capabilities(&adapter); + let (format, alpha_mode) = + compatible_surface.as_ref().and_then(|surface| { + let capabilities = surface.get_capabilities(&adapter); - let mut formats = capabilities.formats.iter().copied(); + let mut formats = capabilities.formats.iter().copied(); - let format = if color::GAMMA_CORRECTION { - formats.find(wgpu::TextureFormat::is_srgb) - } else { - formats.find(|format| !wgpu::TextureFormat::is_srgb(format)) - }; + log::info!("Available formats: {formats:#?}"); - format.or_else(|| { - log::warn!("No format found!"); + let format = if color::GAMMA_CORRECTION { + formats.find(wgpu::TextureFormat::is_srgb) + } else { + formats.find(|format| !wgpu::TextureFormat::is_srgb(format)) + }; - capabilities.formats.first().copied() - }) - })?; + let format = format.or_else(|| { + log::warn!("No format found!"); + + capabilities.formats.first().copied() + }); + + let alpha_modes = capabilities.alpha_modes; + + log::info!("Available alpha modes: {alpha_modes:#?}"); - log::info!("Selected format: {format:?}"); + let preferred_alpha = if alpha_modes + .contains(&wgpu::CompositeAlphaMode::PostMultiplied) + { + wgpu::CompositeAlphaMode::PostMultiplied + } else if alpha_modes + .contains(&wgpu::CompositeAlphaMode::PreMultiplied) + { + wgpu::CompositeAlphaMode::PreMultiplied + } else { + wgpu::CompositeAlphaMode::Auto + }; + + format.zip(Some(preferred_alpha)) + })?; + + log::info!( + "Selected format: {format:?} with alpha mode: {alpha_mode:?}" + ); #[cfg(target_arch = "wasm32")] let limits = [wgpu::Limits::downlevel_webgl2_defaults() @@ -120,6 +144,7 @@ impl Compositor { device, queue, format, + alpha_mode, }) } @@ -249,7 +274,7 @@ impl graphics::Compositor for Compositor { present_mode: self.settings.present_mode, width, height, - alpha_mode: wgpu::CompositeAlphaMode::Auto, + alpha_mode: self.alpha_mode, view_formats: vec![], desired_maximum_frame_latency: 2, }, |