summaryrefslogtreecommitdiffstats
path: root/graphics
diff options
context:
space:
mode:
authorLibravatar Héctor Ramón Jiménez <hector0193@gmail.com>2023-05-31 21:31:58 +0200
committerLibravatar Héctor Ramón Jiménez <hector0193@gmail.com>2023-05-31 21:31:58 +0200
commitfaa7627ea41b1ce372bae7f0d2ae36e9b15a97a3 (patch)
treea4e8dfb4fb901bdf8fa401b45601af6cf44c4567 /graphics
parentb5f102c55835cf42427f9f8672634e81a5d724f6 (diff)
downloadiced-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.toml1
-rw-r--r--graphics/src/color.rs46
-rw-r--r--graphics/src/gradient.rs8
-rw-r--r--graphics/src/lib.rs1
-rw-r--r--graphics/src/primitive.rs3
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.