From 48a36a9feb7ce7c5462a6955f27f5534b6834389 Mon Sep 17 00:00:00 2001 From: Julian Orth Date: Fri, 5 Sep 2025 12:34:22 +0200 Subject: [PATCH] color-management: implement gamma functions for negative values --- src/gfx_apis/vulkan/shaders/transfer_functions.glsl | 12 ++++++------ src/theme.rs | 12 ++++++------ 2 files changed, 12 insertions(+), 12 deletions(-) diff --git a/src/gfx_apis/vulkan/shaders/transfer_functions.glsl b/src/gfx_apis/vulkan/shaders/transfer_functions.glsl index 88236152..3ffdf35f 100644 --- a/src/gfx_apis/vulkan/shaders/transfer_functions.glsl +++ b/src/gfx_apis/vulkan/shaders/transfer_functions.glsl @@ -129,9 +129,9 @@ vec3 apply_eotf(vec3 c) { 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 pow(max(c, 0.0), vec3(2.4)); - case TF_GAMMA22: return pow(max(c, 0.0), vec3(2.2)); - case TF_GAMMA28: return pow(max(c, 0.0), vec3(2.8)); + 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); @@ -146,9 +146,9 @@ vec3 apply_oetf(vec3 c) { 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 pow(max(c, 0.0), vec3(1.0 / 2.4)); - case TF_GAMMA22: return pow(max(c, 0.0), vec3(1.0 / 2.2)); - case TF_GAMMA28: return pow(max(c, 0.0), vec3(1.0 / 2.8)); + 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); diff --git a/src/theme.rs b/src/theme.rs index 23ff6cf2..e6c249fd 100644 --- a/src/theme.rs +++ b/src/theme.rs @@ -113,13 +113,13 @@ impl Color { c.powf(2.6) * 52.37 / 48.0 } fn gamma22(c: f32) -> f32 { - c.powf(2.2) + c.signum() * c.abs().powf(2.2) } fn gamma24(c: f32) -> f32 { - c.powf(2.4) + c.signum() * c.abs().powf(2.4) } fn gamma28(c: f32) -> f32 { - c.powf(2.8) + c.signum() * c.abs().powf(2.8) } macro_rules! convert { ($tf:ident) => {{ @@ -274,13 +274,13 @@ impl Color { (48.0 * c / 52.37).powf(1.0 / 2.6) } fn gamma22(c: f32) -> f32 { - c.powf(1.0 / 2.2) + c.signum() * c.abs().powf(1.0 / 2.2) } fn gamma24(c: f32) -> f32 { - c.powf(1.0 / 2.4) + c.signum() * c.abs().powf(1.0 / 2.4) } fn gamma28(c: f32) -> f32 { - c.powf(1.0 / 2.8) + c.signum() * c.abs().powf(1.0 / 2.8) } macro_rules! convert { ($tf:ident) => {{