diff --git a/src/cli/damage_tracking.rs b/src/cli/damage_tracking.rs index 9532ff1b..1b13ed9e 100644 --- a/src/cli/damage_tracking.rs +++ b/src/cli/damage_tracking.rs @@ -86,7 +86,7 @@ impl DamageTracking { } DamageTrackingCmd::SetColor(c) => { let color = parse_color(&c.color); - let [r, g, b, a] = color.to_array(TransferFunction::Srgb); + let [r, g, b, a] = color.to_array(TransferFunction::Gamma22); tc.send(SetVisualizerColor { self_id: dt, r, diff --git a/src/cmm/cmm_manager.rs b/src/cmm/cmm_manager.rs index c4e36e11..3ca236d3 100644 --- a/src/cmm/cmm_manager.rs +++ b/src/cmm/cmm_manager.rs @@ -63,7 +63,7 @@ impl ColorManager { Some(NamedPrimaries::Srgb), Primaries::SRGB, Luminance::SRGB, - TransferFunction::Srgb, + TransferFunction::Gamma22, Primaries::SRGB, Luminance::SRGB.to_target(), None, diff --git a/src/cmm/cmm_transfer_function.rs b/src/cmm/cmm_transfer_function.rs index b7c15e0e..b4ffec67 100644 --- a/src/cmm/cmm_transfer_function.rs +++ b/src/cmm/cmm_transfer_function.rs @@ -2,14 +2,12 @@ use linearize::Linearize; #[derive(Copy, Clone, Debug, PartialEq, Eq, Hash, Linearize)] pub enum TransferFunction { - Srgb, Linear, St2084Pq, Bt1886, Gamma22, Gamma28, St240, - ExtSrgb, Log100, Log316, St428, diff --git a/src/config/handler.rs b/src/config/handler.rs index ba7e624e..d9b576a9 100644 --- a/src/config/handler.rs +++ b/src/config/handler.rs @@ -2365,7 +2365,7 @@ impl ConfigProxyHandler { fn handle_get_color(&self, colorable: Colorable) -> Result<(), CphError> { let color = self.get_color(colorable)?.get(); - let [r, g, b, a] = color.to_array(TransferFunction::Srgb); + let [r, g, b, a] = color.to_array(TransferFunction::Gamma22); let color = jay_config::theme::Color::new_f32_premultiplied(r, g, b, a); self.respond(Response::GetColor { color }); Ok(()) diff --git a/src/gfx_apis/gl.rs b/src/gfx_apis/gl.rs index 283ee59c..242ebdf3 100644 --- a/src/gfx_apis/gl.rs +++ b/src/gfx_apis/gl.rs @@ -309,7 +309,7 @@ fn run_ops(fb: &Framebuffer, ops: &[GfxApiOpt]) -> Option { } fn fill_boxes3(ctx: &GlRenderContext, boxes: &[[f32; 2]], color: &Color) { - let [r, g, b, a] = color.to_array(TransferFunction::Srgb); + let [r, g, b, a] = color.to_array(TransferFunction::Gamma22); let gles = ctx.ctx.dpy.gles; unsafe { (gles.glUseProgram)(ctx.fill_prog.prog); diff --git a/src/gfx_apis/gl/renderer/framebuffer.rs b/src/gfx_apis/gl/renderer/framebuffer.rs index 92b293f4..01df7baa 100644 --- a/src/gfx_apis/gl/renderer/framebuffer.rs +++ b/src/gfx_apis/gl/renderer/framebuffer.rs @@ -82,7 +82,7 @@ impl Framebuffer { (gles.glBindFramebuffer)(GL_FRAMEBUFFER, self.gl.fbo); (gles.glViewport)(0, 0, self.gl.width, self.gl.height); if let Some(c) = clear { - let [r, g, b, a] = c.to_array(TransferFunction::Srgb); + let [r, g, b, a] = c.to_array(TransferFunction::Gamma22); (gles.glClearColor)(r, g, b, a); (gles.glClear)(GL_COLOR_BUFFER_BIT); } diff --git a/src/gfx_apis/vulkan/shaders/transfer_functions.glsl b/src/gfx_apis/vulkan/shaders/transfer_functions.glsl index 3ffdf35f..2c85ebee 100644 --- a/src/gfx_apis/vulkan/shaders/transfer_functions.glsl +++ b/src/gfx_apis/vulkan/shaders/transfer_functions.glsl @@ -3,60 +3,16 @@ #include "frag_spec_const.glsl" -#define TF_SRGB 0 #define TF_LINEAR 1 #define TF_ST2084_PQ 2 #define TF_GAMMA24 3 #define TF_GAMMA22 4 #define TF_GAMMA28 5 #define TF_ST240 6 -#define TF_EXT_SRGB 7 #define TF_LOG100 8 #define TF_LOG316 9 #define TF_ST428 10 -vec3 eotf_srgb(vec3 c) { - return mix( - c * vec3(1.0 / 12.92), - pow((c + vec3(0.055)) / vec3(1.055), vec3(2.4)), - greaterThan(c, vec3(0.04045)) - ); -} - -vec3 oetf_srgb(vec3 c) { - c = clamp(c, 0.0, 1.0); - return mix( - c * vec3(12.92), - vec3(1.055) * pow(c, vec3(1/2.4)) - vec3(0.055), - greaterThan(c, vec3(0.0031308)) - ); -} - -vec3 eotf_ext_srgb(vec3 c) { - return mix( - -pow((c - vec3(0.055)) / vec3(-1.055), vec3(2.4)), - mix( - c * vec3(1.0 / 12.92), - pow((c + vec3(0.055)) / vec3(1.055), vec3(2.4)), - greaterThan(c, vec3(0.04045)) - ), - greaterThan(c, vec3(-0.04045)) - ); -} - -vec3 oetf_ext_srgb(vec3 c) { - c = clamp(c, -0.6038, 7.5913); - return mix( - vec3(-1.055) * pow(-c, vec3(1/2.4)) + vec3(0.055), - mix( - c * vec3(12.92), - vec3(1.055) * pow(c, vec3(1/2.4)) - vec3(0.055), - greaterThan(c, vec3(0.0031308)) - ), - greaterThan(c, vec3(-0.0031308)) - ); -} - vec3 eotf_st2084_pq(vec3 c) { c = clamp(c, 0.0, 1.0); vec3 cp = pow(c, vec3(1.0 / 78.84375)); @@ -126,14 +82,12 @@ vec3 oetf_st428(vec3 c) { vec3 apply_eotf(vec3 c) { switch (eotf) { - case TF_SRGB: return eotf_srgb(c); case TF_LINEAR: return c; case TF_ST2084_PQ: return eotf_st2084_pq(c); case TF_GAMMA24: return sign(c) * pow(abs(c), vec3(2.4)); case TF_GAMMA22: return sign(c) * pow(abs(c), vec3(2.2)); case TF_GAMMA28: return sign(c) * pow(abs(c), vec3(2.8)); case TF_ST240: return eotf_st240(c); - case TF_EXT_SRGB: return eotf_ext_srgb(c); case TF_LOG100: return eotf_log100(c); case TF_LOG316: return eotf_log316(c); case TF_ST428: return eotf_st428(c); @@ -143,14 +97,12 @@ vec3 apply_eotf(vec3 c) { vec3 apply_oetf(vec3 c) { switch (oetf) { - case TF_SRGB: return oetf_srgb(c); case TF_LINEAR: return c; case TF_ST2084_PQ: return oetf_st2084_pq(c); case TF_GAMMA24: return sign(c) * pow(abs(c), vec3(1.0 / 2.4)); case TF_GAMMA22: return sign(c) * pow(abs(c), vec3(1.0 / 2.2)); case TF_GAMMA28: return sign(c) * pow(abs(c), vec3(1.0 / 2.8)); case TF_ST240: return oetf_st240(c); - case TF_EXT_SRGB: return oetf_ext_srgb(c); case TF_LOG100: return oetf_log100(c); case TF_LOG316: return oetf_log316(c); case TF_ST428: return oetf_st428(c); diff --git a/src/gfx_apis/vulkan/transfer_functions.rs b/src/gfx_apis/vulkan/transfer_functions.rs index 7853ed8c..09c123b4 100644 --- a/src/gfx_apis/vulkan/transfer_functions.rs +++ b/src/gfx_apis/vulkan/transfer_functions.rs @@ -1,13 +1,11 @@ use crate::cmm::cmm_transfer_function::TransferFunction; -pub const TF_SRGB: u32 = 0; pub const TF_LINEAR: u32 = 1; pub const TF_ST2084_PQ: u32 = 2; pub const TF_GAMMA24: u32 = 3; pub const TF_GAMMA22: u32 = 4; pub const TF_GAMMA28: u32 = 5; pub const TF_ST240: u32 = 6; -pub const TF_EXT_SRGB: u32 = 7; pub const TF_LOG100: u32 = 8; pub const TF_LOG316: u32 = 9; pub const TF_ST428: u32 = 10; @@ -19,14 +17,12 @@ pub trait TransferFunctionExt: Sized { impl TransferFunctionExt for TransferFunction { fn to_vulkan(self) -> u32 { match self { - TransferFunction::Srgb => TF_SRGB, TransferFunction::Linear => TF_LINEAR, TransferFunction::St2084Pq => TF_ST2084_PQ, TransferFunction::Bt1886 => TF_GAMMA24, TransferFunction::Gamma22 => TF_GAMMA22, TransferFunction::Gamma28 => TF_GAMMA28, TransferFunction::St240 => TF_ST240, - TransferFunction::ExtSrgb => TF_EXT_SRGB, TransferFunction::Log100 => TF_LOG100, TransferFunction::Log316 => TF_LOG316, TransferFunction::St428 => TF_ST428, diff --git a/src/icons.rs b/src/icons.rs index ba916498..53f8f0d6 100644 --- a/src/icons.rs +++ b/src/icons.rs @@ -221,7 +221,7 @@ impl PathBuilderExt for PathBuilder { impl From for Color { fn from(v: crate::theme::Color) -> Self { - let [r, g, b, a] = v.to_array(TransferFunction::Srgb); + let [r, g, b, a] = v.to_array(TransferFunction::Gamma22); let mut c = Self::TRANSPARENT; c.set_red(r / a); c.set_green(g / a); @@ -242,7 +242,7 @@ fn calculate_accents(srgb: crate::theme::Color) -> [Color; 2] { } fn srgb_to_lab(srgb: crate::theme::Color) -> [f32; 4] { - let [mut r, mut g, mut b, alpha] = srgb.to_array(TransferFunction::Srgb); + let [mut r, mut g, mut b, alpha] = srgb.to_array(TransferFunction::Gamma22); if alpha < 1.0 { r /= alpha; g /= alpha; diff --git a/src/ifs/color_management/wp_image_description_creator_params_v1.rs b/src/ifs/color_management/wp_image_description_creator_params_v1.rs index 22356594..0b04164e 100644 --- a/src/ifs/color_management/wp_image_description_creator_params_v1.rs +++ b/src/ifs/color_management/wp_image_description_creator_params_v1.rs @@ -109,8 +109,8 @@ impl WpImageDescriptionCreatorParamsV1RequestHandler for WpImageDescriptionCreat TRANSFER_FUNCTION_EXT_LINEAR => TransferFunction::Linear, TRANSFER_FUNCTION_LOG_100 => TransferFunction::Log100, TRANSFER_FUNCTION_LOG_316 => TransferFunction::Log316, - TRANSFER_FUNCTION_SRGB => TransferFunction::Srgb, - TRANSFER_FUNCTION_EXT_SRGB => TransferFunction::ExtSrgb, + TRANSFER_FUNCTION_SRGB => TransferFunction::Gamma22, + TRANSFER_FUNCTION_EXT_SRGB => TransferFunction::Gamma22, TRANSFER_FUNCTION_ST2084_PQ => TransferFunction::St2084Pq, TRANSFER_FUNCTION_ST428 => TransferFunction::St428, _ => { diff --git a/src/ifs/color_management/wp_image_description_info_v1.rs b/src/ifs/color_management/wp_image_description_info_v1.rs index 352f7a90..acb3488a 100644 --- a/src/ifs/color_management/wp_image_description_info_v1.rs +++ b/src/ifs/color_management/wp_image_description_info_v1.rs @@ -8,11 +8,10 @@ use { ifs::color_management::{ MIN_LUM_MUL, PRIMARIES_ADOBE_RGB, PRIMARIES_BT2020, PRIMARIES_CIE1931_XYZ, PRIMARIES_DCI_P3, PRIMARIES_DISPLAY_P3, PRIMARIES_GENERIC_FILM, PRIMARIES_MUL, - PRIMARIES_NTSC, PRIMARIES_PAL, PRIMARIES_PAL_M, TRANSFER_FUNCTION_BT1886, - TRANSFER_FUNCTION_EXT_LINEAR, TRANSFER_FUNCTION_EXT_SRGB, TRANSFER_FUNCTION_GAMMA22, + PRIMARIES_NTSC, PRIMARIES_PAL, PRIMARIES_PAL_M, PRIMARIES_SRGB, + TRANSFER_FUNCTION_BT1886, TRANSFER_FUNCTION_EXT_LINEAR, TRANSFER_FUNCTION_GAMMA22, TRANSFER_FUNCTION_GAMMA28, TRANSFER_FUNCTION_LOG_100, TRANSFER_FUNCTION_LOG_316, TRANSFER_FUNCTION_ST240, TRANSFER_FUNCTION_ST428, TRANSFER_FUNCTION_ST2084_PQ, - consts::{PRIMARIES_SRGB, TRANSFER_FUNCTION_SRGB}, }, leaks::Tracker, object::{Object, Version}, @@ -33,14 +32,12 @@ pub struct WpImageDescriptionInfoV1 { impl WpImageDescriptionInfoV1 { pub fn send_description(&self, d: &ColorDescription) { let tf = match d.transfer_function { - TransferFunction::Srgb => TRANSFER_FUNCTION_SRGB, TransferFunction::Linear => TRANSFER_FUNCTION_EXT_LINEAR, TransferFunction::St2084Pq => TRANSFER_FUNCTION_ST2084_PQ, TransferFunction::Bt1886 => TRANSFER_FUNCTION_BT1886, TransferFunction::Gamma22 => TRANSFER_FUNCTION_GAMMA22, TransferFunction::Gamma28 => TRANSFER_FUNCTION_GAMMA28, TransferFunction::St240 => TRANSFER_FUNCTION_ST240, - TransferFunction::ExtSrgb => TRANSFER_FUNCTION_EXT_SRGB, TransferFunction::Log100 => TRANSFER_FUNCTION_LOG_100, TransferFunction::Log316 => TRANSFER_FUNCTION_LOG_316, TransferFunction::St428 => TRANSFER_FUNCTION_ST428, diff --git a/src/ifs/jay_damage_tracking.rs b/src/ifs/jay_damage_tracking.rs index 126a2c10..94d355c2 100644 --- a/src/ifs/jay_damage_tracking.rs +++ b/src/ifs/jay_damage_tracking.rs @@ -97,7 +97,7 @@ impl JayDamageTrackingRequestHandler for JayDamageTracking { req: SetVisualizerColor, _slf: &Rc, ) -> Result<(), Self::Error> { - let color = Color::new(TransferFunction::Srgb, req.r, req.g, req.b) * req.a; + let color = Color::new(TransferFunction::Gamma22, req.r, req.g, req.b) * req.a; self.client.state.damage_visualizer.set_color(color); Ok(()) } diff --git a/src/ifs/wl_output.rs b/src/ifs/wl_output.rs index 9872a970..41df0025 100644 --- a/src/ifs/wl_output.rs +++ b/src/ifs/wl_output.rs @@ -353,7 +353,7 @@ impl WlOutputGlobal { }; luminance.white.0 = luminance.max.0 * brightness / output_max; } - TransferFunction::Srgb + TransferFunction::Gamma22 } BackendTransferFunction::Pq => { luminance = Luminance::ST2084_PQ; diff --git a/src/it/test_ifs/test_single_pixel_buffer_manager.rs b/src/it/test_ifs/test_single_pixel_buffer_manager.rs index 4685279c..103639f8 100644 --- a/src/it/test_ifs/test_single_pixel_buffer_manager.rs +++ b/src/it/test_ifs/test_single_pixel_buffer_manager.rs @@ -32,7 +32,7 @@ impl TestSinglePixelBufferManager { destroyed: Cell::new(false), }); let map = |c: f32| (c as f64 * u32::MAX as f64) as u32; - let [r, g, b, a] = color.to_array(TransferFunction::Srgb); + let [r, g, b, a] = color.to_array(TransferFunction::Gamma22); self.tran.send(CreateU32RgbaBuffer { self_id: self.id, id: obj.id, diff --git a/src/it/tests/t0039_alpha_modifier/screenshot_2.qoi b/src/it/tests/t0039_alpha_modifier/screenshot_2.qoi index 5c908f15..9874e2f5 100644 Binary files a/src/it/tests/t0039_alpha_modifier/screenshot_2.qoi and b/src/it/tests/t0039_alpha_modifier/screenshot_2.qoi differ diff --git a/src/it/tests/t0042_toplevel_select/screenshot_1.qoi b/src/it/tests/t0042_toplevel_select/screenshot_1.qoi index 81e7340e..6423ef6d 100644 Binary files a/src/it/tests/t0042_toplevel_select/screenshot_1.qoi and b/src/it/tests/t0042_toplevel_select/screenshot_1.qoi differ diff --git a/src/it/tests/t0042_toplevel_select/screenshot_2.qoi b/src/it/tests/t0042_toplevel_select/screenshot_2.qoi index e25c77ab..823fd750 100644 Binary files a/src/it/tests/t0042_toplevel_select/screenshot_2.qoi and b/src/it/tests/t0042_toplevel_select/screenshot_2.qoi differ diff --git a/src/it/tests/t0042_toplevel_select/screenshot_3.qoi b/src/it/tests/t0042_toplevel_select/screenshot_3.qoi index e25c77ab..823fd750 100644 Binary files a/src/it/tests/t0042_toplevel_select/screenshot_3.qoi and b/src/it/tests/t0042_toplevel_select/screenshot_3.qoi differ diff --git a/src/portal/ptl_text.rs b/src/portal/ptl_text.rs index 5e8da166..ce5b04db 100644 --- a/src/portal/ptl_text.rs +++ b/src/portal/ptl_text.rs @@ -79,7 +79,7 @@ pub fn render( let data = create_data(font, width, height, scale)?; data.layout.set_text(text); let font_height = data.layout.pixel_size().1; - let [r, g, b, a] = color.to_array(TransferFunction::Srgb); + let [r, g, b, a] = color.to_array(TransferFunction::Gamma22); data.cctx.set_operator(CAIRO_OPERATOR_SOURCE); data.cctx.set_source_rgba(r as _, g as _, b as _, a as _); let y = y.unwrap_or((height - font_height) / 2); diff --git a/src/text.rs b/src/text.rs index c9d99f82..5b3f4f31 100644 --- a/src/text.rs +++ b/src/text.rs @@ -188,7 +188,7 @@ fn render( data.layout.set_text(text); } let font_height = data.layout.pixel_size().1; - let [r, g, b, a] = color.to_array(TransferFunction::Srgb); + let [r, g, b, a] = color.to_array(TransferFunction::Gamma22); data.cctx.set_operator(CAIRO_OPERATOR_SOURCE); data.cctx.set_source_rgba(r as _, g as _, b as _, a as _); let y = y.unwrap_or((height - font_height) / 2); diff --git a/src/theme.rs b/src/theme.rs index e6c249fd..3d58d0b1 100644 --- a/src/theme.rs +++ b/src/theme.rs @@ -69,13 +69,6 @@ impl Color { }; pub fn new(transfer_function: TransferFunction, mut r: f32, mut g: f32, mut b: f32) -> Self { - fn srgb(c: f32) -> f32 { - if c <= 0.04045 { - c / 12.92 - } else { - ((c + 0.055) / 1.055).powf(2.4) - } - } #[inline(always)] fn linear(c: f32) -> f32 { c @@ -86,16 +79,6 @@ impl Color { let den = 18.8515625 - 18.6875 * cp; (num / den).powf(1.0 / 0.1593017578125) } - fn ext_srgb(c: f32) -> f32 { - let c = c.clamp(-0.6038, 7.5913); - if c <= -0.0031308 { - -1.055 * (-c).powf(1.0 / 2.4) + 0.055 - } else if c <= 0.0031308 { - c * 12.92 - } else { - 1.055 * c.powf(1.0 / 2.4) - 0.055 - } - } fn st240(c: f32) -> f32 { if c < 0.0913 { c / 4.0 @@ -129,14 +112,12 @@ impl Color { }}; } match transfer_function { - TransferFunction::Srgb => convert!(srgb), TransferFunction::Linear => convert!(linear), TransferFunction::St2084Pq => convert!(st2084_pq), TransferFunction::Bt1886 => convert!(gamma24), TransferFunction::Gamma22 => convert!(gamma22), TransferFunction::Gamma28 => convert!(gamma28), TransferFunction::St240 => convert!(st240), - TransferFunction::ExtSrgb => convert!(ext_srgb), TransferFunction::Log100 => convert!(log100), TransferFunction::Log316 => convert!(log316), TransferFunction::St428 => convert!(st428), @@ -175,12 +156,12 @@ impl Color { } pub fn from_srgb(r: u8, g: u8, b: u8) -> Self { - Self::new(TransferFunction::Srgb, to_f32(r), to_f32(g), to_f32(b)) + Self::new(TransferFunction::Gamma22, to_f32(r), to_f32(g), to_f32(b)) } pub fn from_srgba_premultiplied(r: u8, g: u8, b: u8, a: u8) -> Self { Self::new_premultiplied( - TransferFunction::Srgb, + TransferFunction::Gamma22, to_f32(r), to_f32(g), to_f32(b), @@ -208,7 +189,7 @@ impl Color { } pub fn from_srgba_straight(r: u8, g: u8, b: u8, a: u8) -> Self { - let mut c = Self::new(TransferFunction::Srgb, to_f32(r), to_f32(g), to_f32(b)); + let mut c = Self::new(TransferFunction::Gamma22, to_f32(r), to_f32(g), to_f32(b)); if a < 255 { c = c * to_f32(a); } @@ -216,7 +197,7 @@ impl Color { } pub fn to_srgba_premultiplied(self) -> [u8; 4] { - let [r, g, b, a] = self.to_array(TransferFunction::Srgb); + let [r, g, b, a] = self.to_array(TransferFunction::Gamma22); [to_u8(r), to_u8(g), to_u8(b), to_u8(a)] } @@ -226,13 +207,6 @@ impl Color { pub fn to_array2(self, transfer_function: TransferFunction, alpha: Option) -> [f32; 4] { let mut res = [self.r, self.g, self.b, self.a]; - fn srgb(c: f32) -> f32 { - if c <= 0.0031308 { - c * 12.92 - } else { - 1.055 * c.powf(1.0 / 2.4) - 0.055 - } - } fn linear(c: f32) -> f32 { c } @@ -242,15 +216,6 @@ impl Color { let den = 1.0 + 18.6875 * c.powf(0.1593017578125); (num / den).powf(78.84375) } - fn ext_srgb(c: f32) -> f32 { - if c < -0.04045 { - -((c - 0.055) / -1.055).powf(2.4) - } else if c < 0.04045 { - c / 12.92 - } else { - ((c + 0.055) / 1.055).powf(2.4) - } - } fn st240(c: f32) -> f32 { if c < 0.0228 { 4.0 * c @@ -296,14 +261,12 @@ impl Color { } } match transfer_function { - TransferFunction::Srgb => convert!(srgb), TransferFunction::Linear => convert!(linear), TransferFunction::St2084Pq => convert!(st2084_pq), TransferFunction::Bt1886 => convert!(gamma24), TransferFunction::Gamma22 => convert!(gamma22), TransferFunction::Gamma28 => convert!(gamma28), TransferFunction::St240 => convert!(st240), - TransferFunction::ExtSrgb => convert!(ext_srgb), TransferFunction::Log100 => convert!(log100), TransferFunction::Log316 => convert!(log316), TransferFunction::St428 => convert!(st428), @@ -335,7 +298,7 @@ impl Color { impl From for Color { fn from(f: jay_config::theme::Color) -> Self { let [r, g, b, a] = f.to_f32_premultiplied(); - Self::new_premultiplied(TransferFunction::Srgb, r, g, b, a) + Self::new_premultiplied(TransferFunction::Gamma22, r, g, b, a) } }