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:
parent
05750bf186
commit
a65d6a11cb
@ -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,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -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);
|
||||||
|
@ -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()
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -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,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -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,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -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,
|
||||||
|
Loading…
x
Reference in New Issue
Block a user