mirror of
https://github.com/wez/wezterm.git
synced 2024-12-24 05:42:03 +03:00
background: allow specifying a solid color layer
The color can have alpha and blend with other layers. This is helpful if your image has fully transparent portions and you want to explicitly place a color in there.
This commit is contained in:
parent
4cb75c154f
commit
e85258a212
@ -295,6 +295,15 @@ impl SrgbaTuple {
|
||||
)
|
||||
}
|
||||
|
||||
pub fn to_srgb_u8(self) -> (u8, u8, u8, u8) {
|
||||
(
|
||||
(self.0 * 255.) as u8,
|
||||
(self.1 * 255.) as u8,
|
||||
(self.2 * 255.) as u8,
|
||||
(self.3 * 255.) as u8,
|
||||
)
|
||||
}
|
||||
|
||||
/// Returns a string of the form `#RRGGBB`
|
||||
pub fn to_rgb_string(self) -> String {
|
||||
format!(
|
||||
|
@ -1,4 +1,4 @@
|
||||
use crate::{default_one_point_oh, Config, HsbTransform};
|
||||
use crate::{default_one_point_oh, Config, HsbTransform, RgbaColor};
|
||||
use luahelper::impl_lua_conversion_dynamic;
|
||||
use wezterm_dynamic::{FromDynamic, FromDynamicOptions, ToDynamic, Value};
|
||||
|
||||
@ -48,6 +48,7 @@ impl FromDynamic for ImageFileSourceWrap {
|
||||
pub enum BackgroundSource {
|
||||
Gradient(Gradient),
|
||||
File(ImageFileSourceWrap),
|
||||
Color(RgbaColor),
|
||||
}
|
||||
|
||||
#[derive(Debug, Clone, FromDynamic, ToDynamic)]
|
||||
|
@ -207,6 +207,39 @@ fn load_background_layer(
|
||||
width, height, data,
|
||||
)))
|
||||
}
|
||||
BackgroundSource::Color(color) => {
|
||||
// In theory we could just make a 1x1 texture and allow
|
||||
// the shader to stretch it, but if we do that, it'll blend
|
||||
// around the edges and look weird.
|
||||
// So we make a square texture in the ballpark of the window
|
||||
// surface.
|
||||
// It's not ideal.
|
||||
let width = match layer.width {
|
||||
BackgroundSize::Percent(p) => (p as u32 * dimensions.pixel_width as u32) / 100,
|
||||
BackgroundSize::Length(u) => u as u32,
|
||||
unsup => anyhow::bail!("{:?} not yet implemented", unsup),
|
||||
};
|
||||
let height = match layer.height {
|
||||
BackgroundSize::Percent(p) => (p as u32 * dimensions.pixel_height as u32) / 100,
|
||||
BackgroundSize::Length(u) => u as u32,
|
||||
unsup => anyhow::bail!("{:?} not yet implemented", unsup),
|
||||
};
|
||||
|
||||
let size = width.min(height);
|
||||
|
||||
let mut imgbuf = image::RgbaImage::new(size, size);
|
||||
let src_pixel = {
|
||||
let (r, g, b, a) = color.to_srgb_u8();
|
||||
image::Rgba([r, g, b, a])
|
||||
};
|
||||
for (_x, _y, pixel) in imgbuf.enumerate_pixels_mut() {
|
||||
*pixel = src_pixel;
|
||||
}
|
||||
let data = imgbuf.into_vec();
|
||||
Arc::new(ImageData::with_data(ImageDataType::new_single_frame(
|
||||
size, size, data,
|
||||
)))
|
||||
}
|
||||
BackgroundSource::File(source) => CachedImage::load(&source.path, source.speed)?,
|
||||
};
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user