diff options
author | 2023-06-03 03:04:38 +0200 | |
---|---|---|
committer | 2023-06-03 03:04:38 +0200 | |
commit | c15f1b5f6575792cc89bb5fba2e613428397e46a (patch) | |
tree | 77526943d7aac8004e3ac7dca07154dcbbe25a0f /graphics/src | |
parent | b353767d2d9703aae35f10ebf8a9ee1490c3ae37 (diff) | |
parent | b5fc0f4a3aa45d33d81d5799396f0b0770c4dff3 (diff) | |
download | iced-c15f1b5f6575792cc89bb5fba2e613428397e46a.tar.gz iced-c15f1b5f6575792cc89bb5fba2e613428397e46a.tar.bz2 iced-c15f1b5f6575792cc89bb5fba2e613428397e46a.zip |
Merge pull request #1888 from iced-rs/web-colors
Introduce `web-colors` feature flag to enable "sRGB linear" blending
Diffstat (limited to 'graphics/src')
-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 |
4 files changed, 55 insertions, 3 deletions
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. |