diff options
author | 2023-05-31 21:31:58 +0200 | |
---|---|---|
committer | 2023-05-31 21:31:58 +0200 | |
commit | faa7627ea41b1ce372bae7f0d2ae36e9b15a97a3 (patch) | |
tree | a4e8dfb4fb901bdf8fa401b45601af6cf44c4567 /graphics | |
parent | b5f102c55835cf42427f9f8672634e81a5d724f6 (diff) | |
download | iced-faa7627ea41b1ce372bae7f0d2ae36e9b15a97a3.tar.gz iced-faa7627ea41b1ce372bae7f0d2ae36e9b15a97a3.tar.bz2 iced-faa7627ea41b1ce372bae7f0d2ae36e9b15a97a3.zip |
Introduce `web-colors` feature flag to enable sRGB linear blending
This is how browsers perform color management. They treat
gamma-corrected sRGB colors as if they were linear RGB.
Correctness aside, this mode is introduced for legacy reasons. Most
UI/UX tooling uses this color management as well, and many have created
an intuition about how color should behave from interacting with a
browser.
This feature flag should facilitate application development with `iced`
in those cases.
More details: https://webcolorisstillbroken.com/
Diffstat (limited to '')
-rw-r--r-- | graphics/Cargo.toml | 1 | ||||
-rw-r--r-- | graphics/src/color.rs | 46 | ||||
-rw-r--r-- | graphics/src/gradient.rs | 8 | ||||
-rw-r--r-- | graphics/src/lib.rs | 1 | ||||
-rw-r--r-- | graphics/src/primitive.rs | 3 |
5 files changed, 56 insertions, 3 deletions
diff --git a/graphics/Cargo.toml b/graphics/Cargo.toml index 903a2069..0e22227d 100644 --- a/graphics/Cargo.toml +++ b/graphics/Cargo.toml @@ -14,6 +14,7 @@ categories = ["gui"] geometry = ["lyon_path"] opengl = [] image = ["dep:image", "kamadak-exif"] +web-colors = [] [dependencies] glam = "0.24" diff --git a/graphics/src/color.rs b/graphics/src/color.rs new file mode 100644 index 00000000..92448a68 --- /dev/null +++ b/graphics/src/color.rs @@ -0,0 +1,46 @@ +//! Manage colors for shaders. +use crate::core::Color; + +use bytemuck::{Pod, Zeroable}; + +/// A color packed as 4 floats representing RGBA channels. +#[derive(Debug, Clone, Copy, PartialEq, Zeroable, Pod)] +#[repr(C)] +pub struct Packed([f32; 4]); + +impl Packed { + /// Returns the internal components of the [`Packed`] color. + pub fn components(self) -> [f32; 4] { + self.0 + } +} + +/// A flag that indicates whether the renderer should perform gamma correction. +pub const GAMMA_CORRECTION: bool = internal::GAMMA_CORRECTION; + +/// Packs a [`Color`]. +pub fn pack(color: impl Into<Color>) -> Packed { + Packed(internal::pack(color.into())) +} + +#[cfg(not(feature = "web-colors"))] +mod internal { + use crate::core::Color; + + pub const GAMMA_CORRECTION: bool = true; + + pub fn pack(color: Color) -> [f32; 4] { + color.into_linear() + } +} + +#[cfg(feature = "web-colors")] +mod internal { + use crate::core::Color; + + pub const GAMMA_CORRECTION: bool = false; + + pub fn pack(color: Color) -> [f32; 4] { + [color.r, color.g, color.b, color.a] + } +} diff --git a/graphics/src/gradient.rs b/graphics/src/gradient.rs index d3eabb6f..d26b5665 100644 --- a/graphics/src/gradient.rs +++ b/graphics/src/gradient.rs @@ -3,8 +3,10 @@ //! For a gradient that you can use as a background variant for a widget, see [`Gradient`]. //! //! [`Gradient`]: crate::core::Gradient; +use crate::color; use crate::core::gradient::ColorStop; use crate::core::{self, Color, Point, Rectangle}; + use std::cmp::Ordering; #[derive(Debug, Clone, PartialEq)] @@ -101,7 +103,8 @@ impl Linear { for (index, stop) in self.stops.iter().enumerate() { let [r, g, b, a] = - stop.map_or(Color::default(), |s| s.color).into_linear(); + color::pack(stop.map_or(Color::default(), |s| s.color)) + .components(); data[index * 4] = r; data[(index * 4) + 1] = g; @@ -133,7 +136,8 @@ pub fn pack(gradient: &core::Gradient, bounds: Rectangle) -> Packed { for (index, stop) in linear.stops.iter().enumerate() { let [r, g, b, a] = - stop.map_or(Color::default(), |s| s.color).into_linear(); + color::pack(stop.map_or(Color::default(), |s| s.color)) + .components(); data[index * 4] = r; data[(index * 4) + 1] = g; diff --git a/graphics/src/lib.rs b/graphics/src/lib.rs index bfaac19f..f6bc87fb 100644 --- a/graphics/src/lib.rs +++ b/graphics/src/lib.rs @@ -27,6 +27,7 @@ mod transformation; mod viewport; pub mod backend; +pub mod color; pub mod compositor; pub mod damage; pub mod gradient; diff --git a/graphics/src/primitive.rs b/graphics/src/primitive.rs index 2d4f5511..187c6c6c 100644 --- a/graphics/src/primitive.rs +++ b/graphics/src/primitive.rs @@ -1,4 +1,5 @@ //! Draw using different graphical primitives. +use crate::color; use crate::core::alignment; use crate::core::image; use crate::core::svg; @@ -248,7 +249,7 @@ pub struct ColoredVertex2D { pub position: [f32; 2], /// The color of the vertex in __linear__ RGBA. - pub color: [f32; 4], + pub color: color::Packed, } /// A vertex which contains 2D position & packed gradient data. |