Fix gamma correction for colored glyphs in iced_wgpu
This commit is contained in:
parent
9af0a27e67
commit
be340a8cd8
4 changed files with 43 additions and 14 deletions
|
|
@ -89,6 +89,26 @@ impl Color {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Creates a [`Color`] from its linear RGBA components.
|
||||||
|
pub fn from_linear_rgba(r: f32, g: f32, b: f32, a: f32) -> Self {
|
||||||
|
// As described in:
|
||||||
|
// https://en.wikipedia.org/wiki/SRGB
|
||||||
|
fn gamma_component(u: f32) -> f32 {
|
||||||
|
if u < 0.0031308 {
|
||||||
|
12.92 * u
|
||||||
|
} else {
|
||||||
|
1.055 * u.powf(1.0 / 2.4) - 0.055
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
Self {
|
||||||
|
r: gamma_component(r),
|
||||||
|
g: gamma_component(g),
|
||||||
|
b: gamma_component(b),
|
||||||
|
a,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/// Converts the [`Color`] into its RGBA8 equivalent.
|
/// Converts the [`Color`] into its RGBA8 equivalent.
|
||||||
#[must_use]
|
#[must_use]
|
||||||
pub fn into_rgba8(self) -> [u8; 4] {
|
pub fn into_rgba8(self) -> [u8; 4] {
|
||||||
|
|
|
||||||
|
|
@ -8,6 +8,7 @@ pub use paragraph::Paragraph;
|
||||||
|
|
||||||
pub use cosmic_text;
|
pub use cosmic_text;
|
||||||
|
|
||||||
|
use crate::color;
|
||||||
use crate::core::font::{self, Font};
|
use crate::core::font::{self, Font};
|
||||||
use crate::core::text::Shaping;
|
use crate::core::text::Shaping;
|
||||||
use crate::core::{Color, Size};
|
use crate::core::{Color, Size};
|
||||||
|
|
@ -131,7 +132,12 @@ pub fn to_shaping(shaping: Shaping) -> cosmic_text::Shaping {
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn to_color(color: Color) -> cosmic_text::Color {
|
pub fn to_color(color: Color) -> cosmic_text::Color {
|
||||||
let [r, g, b, a] = color.into_rgba8();
|
let [r, g, b, a] = color::pack(color).components();
|
||||||
|
|
||||||
cosmic_text::Color::rgba(r, g, b, a)
|
cosmic_text::Color::rgba(
|
||||||
|
(r * 255.0) as u8,
|
||||||
|
(g * 255.0) as u8,
|
||||||
|
(b * 255.0) as u8,
|
||||||
|
(a * 255.0) as u8,
|
||||||
|
)
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -1,6 +1,7 @@
|
||||||
use crate::core::alignment;
|
use crate::core::alignment;
|
||||||
use crate::core::text::{LineHeight, Shaping};
|
use crate::core::text::{LineHeight, Shaping};
|
||||||
use crate::core::{Color, Font, Pixels, Point, Rectangle};
|
use crate::core::{Color, Font, Pixels, Point, Rectangle};
|
||||||
|
use crate::graphics::color;
|
||||||
use crate::graphics::text::cache::{self, Cache};
|
use crate::graphics::text::cache::{self, Cache};
|
||||||
use crate::graphics::text::editor;
|
use crate::graphics::text::editor;
|
||||||
use crate::graphics::text::font_system;
|
use crate::graphics::text::font_system;
|
||||||
|
|
@ -216,7 +217,18 @@ fn draw(
|
||||||
fn from_color(color: cosmic_text::Color) -> Color {
|
fn from_color(color: cosmic_text::Color) -> Color {
|
||||||
let [r, g, b, a] = color.as_rgba();
|
let [r, g, b, a] = color.as_rgba();
|
||||||
|
|
||||||
Color::from_rgba8(r, g, b, a as f32 / 255.0)
|
if color::GAMMA_CORRECTION {
|
||||||
|
// `cosmic_text::Color` is linear RGB in this case, so we
|
||||||
|
// need to convert back to sRGB
|
||||||
|
Color::from_linear_rgba(
|
||||||
|
r as f32 / 255.0,
|
||||||
|
g as f32 / 255.0,
|
||||||
|
b as f32 / 255.0,
|
||||||
|
a as f32 / 255.0,
|
||||||
|
)
|
||||||
|
} else {
|
||||||
|
Color::from_rgba8(r, g, b, a as f32 / 255.0)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
#[derive(Debug, Clone, Default)]
|
#[derive(Debug, Clone, Default)]
|
||||||
|
|
|
||||||
|
|
@ -2,7 +2,7 @@ use crate::core::alignment;
|
||||||
use crate::core::{Rectangle, Size};
|
use crate::core::{Rectangle, Size};
|
||||||
use crate::graphics::color;
|
use crate::graphics::color;
|
||||||
use crate::graphics::text::cache::{self, Cache};
|
use crate::graphics::text::cache::{self, Cache};
|
||||||
use crate::graphics::text::{font_system, Editor, Paragraph};
|
use crate::graphics::text::{font_system, to_color, Editor, Paragraph};
|
||||||
use crate::layer::Text;
|
use crate::layer::Text;
|
||||||
|
|
||||||
use std::borrow::Cow;
|
use std::borrow::Cow;
|
||||||
|
|
@ -214,16 +214,7 @@ impl Pipeline {
|
||||||
right: (clip_bounds.x + clip_bounds.width) as i32,
|
right: (clip_bounds.x + clip_bounds.width) as i32,
|
||||||
bottom: (clip_bounds.y + clip_bounds.height) as i32,
|
bottom: (clip_bounds.y + clip_bounds.height) as i32,
|
||||||
},
|
},
|
||||||
default_color: {
|
default_color: to_color(color),
|
||||||
let [r, g, b, a] = color::pack(color).components();
|
|
||||||
|
|
||||||
glyphon::Color::rgba(
|
|
||||||
(r * 255.0) as u8,
|
|
||||||
(g * 255.0) as u8,
|
|
||||||
(b * 255.0) as u8,
|
|
||||||
(a * 255.0) as u8,
|
|
||||||
)
|
|
||||||
},
|
|
||||||
})
|
})
|
||||||
},
|
},
|
||||||
);
|
);
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue