summaryrefslogtreecommitdiffstats
path: root/graphics/src
diff options
context:
space:
mode:
authorLibravatar Héctor Ramón <hector0193@gmail.com>2023-06-03 03:04:38 +0200
committerLibravatar GitHub <noreply@github.com>2023-06-03 03:04:38 +0200
commitc15f1b5f6575792cc89bb5fba2e613428397e46a (patch)
tree77526943d7aac8004e3ac7dca07154dcbbe25a0f /graphics/src
parentb353767d2d9703aae35f10ebf8a9ee1490c3ae37 (diff)
parentb5fc0f4a3aa45d33d81d5799396f0b0770c4dff3 (diff)
downloadiced-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.rs46
-rw-r--r--graphics/src/gradient.rs8
-rw-r--r--graphics/src/lib.rs1
-rw-r--r--graphics/src/primitive.rs3
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.