Add custom window background/clear color (incl. transparency) support, fixes #272

wgpu would currently ignore the alpha: https://github.com/gfx-rs/wgpu/issues/687

glow (and naively patched wgpu) requires premultiplied alpha, so if you don't
multiply the RGB by the A right now, the semi-transparent color would be wrong
(too bright).

winit with_transparent doesn't seem necessary.
This commit is contained in:
Greg V 2020-05-31 16:53:57 +03:00
parent 05750bf186
commit a65d6a11cb
6 changed files with 49 additions and 9 deletions

View File

@ -1,10 +1,11 @@
//! Configure a renderer. //! Configure a renderer.
pub use iced_graphics::Antialiasing; pub use iced_graphics::Antialiasing;
pub use iced_native::Color;
/// The settings of a [`Renderer`]. /// The settings of a [`Renderer`].
/// ///
/// [`Renderer`]: ../struct.Renderer.html /// [`Renderer`]: ../struct.Renderer.html
#[derive(Debug, Clone, Copy, PartialEq, Eq)] #[derive(Debug, Clone, Copy, PartialEq)]
pub struct Settings { pub struct Settings {
/// The bytes of the font that will be used by default. /// The bytes of the font that will be used by default.
/// ///
@ -13,6 +14,9 @@ pub struct Settings {
/// The antialiasing strategy that will be used for triangle primitives. /// The antialiasing strategy that will be used for triangle primitives.
pub antialiasing: Option<Antialiasing>, pub antialiasing: Option<Antialiasing>,
/// The color that will be used to clear the window surface.
pub background_color: Color,
} }
impl Default for Settings { impl Default for Settings {
@ -20,6 +24,7 @@ impl Default for Settings {
Settings { Settings {
default_font: None, default_font: None,
antialiasing: None, antialiasing: None,
background_color: Color::WHITE,
} }
} }
} }

View File

@ -21,7 +21,12 @@ impl iced_graphics::window::GLCompositor for Compositor {
) -> (Self, Self::Renderer) { ) -> (Self, Self::Renderer) {
let gl = glow::Context::from_loader_function(loader_function); let gl = glow::Context::from_loader_function(loader_function);
gl.clear_color(1.0, 1.0, 1.0, 1.0); gl.clear_color(
settings.background_color.r,
settings.background_color.g,
settings.background_color.b,
settings.background_color.a,
);
// Enable auto-conversion from/to sRGB // Enable auto-conversion from/to sRGB
gl.enable(glow::FRAMEBUFFER_SRGB); gl.enable(glow::FRAMEBUFFER_SRGB);

View File

@ -195,6 +195,7 @@ pub trait Application: Sized {
} else { } else {
None None
}, },
background_color: settings.background_color,
..crate::renderer::Settings::default() ..crate::renderer::Settings::default()
}; };

View File

@ -1,8 +1,8 @@
//! Configure your application. //! Configure your application.
use crate::window; use crate::{window, Color};
/// The settings of an application. /// The settings of an application.
#[derive(Debug, Clone, Copy, PartialEq, Eq, Default)] #[derive(Debug, Clone, Copy, PartialEq)]
pub struct Settings<Flags> { pub struct Settings<Flags> {
/// The window settings. /// The window settings.
/// ///
@ -32,6 +32,29 @@ pub struct Settings<Flags> {
/// ///
/// [`Canvas`]: ../widget/canvas/struct.Canvas.html /// [`Canvas`]: ../widget/canvas/struct.Canvas.html
pub antialiasing: bool, pub antialiasing: bool,
/// The background color of the window.
///
/// On supported backends, this makes it possible to have
/// (semi-)transparent windows.
///
/// By default, it is white.
pub background_color: Color,
}
impl<Flags> Default for Settings<Flags>
where
Flags: Default,
{
fn default() -> Self {
Self {
flags: Default::default(),
antialiasing: Default::default(),
default_font: Default::default(),
window: Default::default(),
background_color: Color::WHITE,
}
}
} }
impl<Flags> Settings<Flags> { impl<Flags> Settings<Flags> {
@ -46,6 +69,7 @@ impl<Flags> Settings<Flags> {
antialiasing: Default::default(), antialiasing: Default::default(),
default_font: Default::default(), default_font: Default::default(),
window: Default::default(), window: Default::default(),
background_color: Color::WHITE,
} }
} }
} }

View File

@ -1,10 +1,11 @@
//! Configure a renderer. //! Configure a renderer.
pub use crate::Antialiasing; pub use crate::Antialiasing;
pub use iced_native::Color;
/// The settings of a [`Renderer`]. /// The settings of a [`Renderer`].
/// ///
/// [`Renderer`]: ../struct.Renderer.html /// [`Renderer`]: ../struct.Renderer.html
#[derive(Debug, Clone, Copy, PartialEq, Eq)] #[derive(Debug, Clone, Copy, PartialEq)]
pub struct Settings { pub struct Settings {
/// The output format of the [`Renderer`]. /// The output format of the [`Renderer`].
/// ///
@ -18,6 +19,9 @@ pub struct Settings {
/// The antialiasing strategy that will be used for triangle primitives. /// The antialiasing strategy that will be used for triangle primitives.
pub antialiasing: Option<Antialiasing>, pub antialiasing: Option<Antialiasing>,
/// The color that will be used to clear the window surface.
pub background_color: Color,
} }
impl Default for Settings { impl Default for Settings {
@ -26,6 +30,7 @@ impl Default for Settings {
format: wgpu::TextureFormat::Bgra8UnormSrgb, format: wgpu::TextureFormat::Bgra8UnormSrgb,
default_font: None, default_font: None,
antialiasing: None, antialiasing: None,
background_color: Color::WHITE,
} }
} }
} }

View File

@ -119,10 +119,10 @@ impl iced_graphics::window::Compositor for Compositor {
load_op: wgpu::LoadOp::Clear, load_op: wgpu::LoadOp::Clear,
store_op: wgpu::StoreOp::Store, store_op: wgpu::StoreOp::Store,
clear_color: wgpu::Color { clear_color: wgpu::Color {
r: 1.0, r: self.settings.background_color.r.into(),
g: 1.0, g: self.settings.background_color.g.into(),
b: 1.0, b: self.settings.background_color.b.into(),
a: 1.0, a: self.settings.background_color.a.into(),
}, },
}], }],
depth_stencil_attachment: None, depth_stencil_attachment: None,