Skip to content

Commit

Permalink
Add custom window background/clear color (incl. transparency) support,
Browse files Browse the repository at this point in the history
…fixes iced-rs#272

wgpu would currently ignore the alpha: gfx-rs/wgpu#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.
  • Loading branch information
valpackett committed May 31, 2020
1 parent 05750bf commit de70cb6
Show file tree
Hide file tree
Showing 6 changed files with 34 additions and 9 deletions.
7 changes: 6 additions & 1 deletion glow/src/settings.rs
Original file line number Diff line number Diff line change
@@ -1,10 +1,11 @@
//! Configure a renderer.
pub use iced_graphics::Antialiasing;
pub use iced_native::Color;

/// The settings of a [`Renderer`].
///
/// [`Renderer`]: ../struct.Renderer.html
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
#[derive(Debug, Clone, Copy, PartialEq)]
pub struct Settings {
/// The bytes of the font that will be used by default.
///
Expand All @@ -13,13 +14,17 @@ pub struct Settings {

/// The antialiasing strategy that will be used for triangle primitives.
pub antialiasing: Option<Antialiasing>,

/// The color that will be used to clear the window surface.
pub background_color: Color,
}

impl Default for Settings {
fn default() -> Settings {
Settings {
default_font: None,
antialiasing: None,
background_color: Color::WHITE,
}
}
}
7 changes: 6 additions & 1 deletion glow/src/window/compositor.rs
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,12 @@ impl iced_graphics::window::GLCompositor for Compositor {
) -> (Self, Self::Renderer) {
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
gl.enable(glow::FRAMEBUFFER_SRGB);
Expand Down
1 change: 1 addition & 0 deletions src/application.rs
Original file line number Diff line number Diff line change
Expand Up @@ -195,6 +195,7 @@ pub trait Application: Sized {
} else {
None
},
background_color: settings.background_color,
..crate::renderer::Settings::default()
};

Expand Down
13 changes: 11 additions & 2 deletions src/settings.rs
Original file line number Diff line number Diff line change
@@ -1,8 +1,8 @@
//! Configure your application.
use crate::window;
use crate::{window, Color};

/// The settings of an application.
#[derive(Debug, Clone, Copy, PartialEq, Eq, Default)]
#[derive(Debug, Clone, Copy, PartialEq, Default)]
pub struct Settings<Flags> {
/// The window settings.
///
Expand Down Expand Up @@ -32,6 +32,14 @@ pub struct Settings<Flags> {
///
/// [`Canvas`]: ../widget/canvas/struct.Canvas.html
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> Settings<Flags> {
Expand All @@ -46,6 +54,7 @@ impl<Flags> Settings<Flags> {
antialiasing: Default::default(),
default_font: Default::default(),
window: Default::default(),
background_color: Color::WHITE,
}
}
}
Expand Down
7 changes: 6 additions & 1 deletion wgpu/src/settings.rs
Original file line number Diff line number Diff line change
@@ -1,10 +1,11 @@
//! Configure a renderer.
pub use crate::Antialiasing;
pub use iced_native::Color;

/// The settings of a [`Renderer`].
///
/// [`Renderer`]: ../struct.Renderer.html
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
#[derive(Debug, Clone, Copy, PartialEq)]
pub struct Settings {
/// The output format of the [`Renderer`].
///
Expand All @@ -18,6 +19,9 @@ pub struct Settings {

/// The antialiasing strategy that will be used for triangle primitives.
pub antialiasing: Option<Antialiasing>,

/// The color that will be used to clear the window surface.
pub background_color: Color,
}

impl Default for Settings {
Expand All @@ -26,6 +30,7 @@ impl Default for Settings {
format: wgpu::TextureFormat::Bgra8UnormSrgb,
default_font: None,
antialiasing: None,
background_color: Color::WHITE,
}
}
}
8 changes: 4 additions & 4 deletions wgpu/src/window/compositor.rs
Original file line number Diff line number Diff line change
Expand Up @@ -119,10 +119,10 @@ impl iced_graphics::window::Compositor for Compositor {
load_op: wgpu::LoadOp::Clear,
store_op: wgpu::StoreOp::Store,
clear_color: wgpu::Color {
r: 1.0,
g: 1.0,
b: 1.0,
a: 1.0,
r: self.settings.background_color.r.into(),
g: self.settings.background_color.g.into(),
b: self.settings.background_color.b.into(),
a: self.settings.background_color.a.into(),
},
}],
depth_stencil_attachment: None,
Expand Down

0 comments on commit de70cb6

Please sign in to comment.