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/
46 lines
1 KiB
Rust
46 lines
1 KiB
Rust
//! 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]
|
|
}
|
|
}
|