cmm: add support for compound_power_2_4
This commit is contained in:
parent
3e3cb3114c
commit
b5c0e3a07e
11 changed files with 58 additions and 7 deletions
|
|
@ -13,6 +13,7 @@ pub enum Eotf {
|
|||
Log316,
|
||||
St428,
|
||||
Pow(EotfPow),
|
||||
CompoundPower24,
|
||||
}
|
||||
|
||||
const MUL: u32 = 10_000;
|
||||
|
|
|
|||
|
|
@ -11,6 +11,7 @@ pub const EOTF_LOG316: u32 = 9;
|
|||
pub const EOTF_ST428: u32 = 10;
|
||||
pub const EOTF_POW: u32 = 11;
|
||||
pub const EOTF_GAMMA24: u32 = 12;
|
||||
pub const EOTF_COMPOUND_POWER_2_4: u32 = 13;
|
||||
|
||||
#[derive(Copy, Clone, Debug, PartialEq, Eq, Hash, Linearize)]
|
||||
pub enum VulkanEotf {
|
||||
|
|
@ -25,6 +26,7 @@ pub enum VulkanEotf {
|
|||
Log316,
|
||||
St428,
|
||||
Pow,
|
||||
CompoundPower24,
|
||||
}
|
||||
|
||||
pub trait EotfExt: Sized {
|
||||
|
|
@ -54,6 +56,7 @@ impl EotfExt for Eotf {
|
|||
Log316,
|
||||
St428,
|
||||
Pow,
|
||||
CompoundPower24,
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -72,6 +75,7 @@ impl VulkanEotf {
|
|||
Self::Log316 => EOTF_LOG316,
|
||||
Self::St428 => EOTF_ST428,
|
||||
Self::Pow => EOTF_POW,
|
||||
Self::CompoundPower24 => EOTF_COMPOUND_POWER_2_4,
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -15,6 +15,7 @@
|
|||
#define TF_ST428 10
|
||||
#define TF_POW 11
|
||||
#define TF_GAMMA24 12
|
||||
#define TF_COMPOUND_POWER_2_4 13
|
||||
|
||||
vec3 eotf_bt1886(vec3 c) {
|
||||
c = clamp(c, 0.0, 1.0);
|
||||
|
|
@ -101,6 +102,22 @@ vec3 inv_eotf_st428(vec3 c) {
|
|||
return pow(vec3(48.0) * c / vec3(52.37), vec3(1.0 / 2.6));
|
||||
}
|
||||
|
||||
vec3 eotf_compound_power_2_4(vec3 c) {
|
||||
return mix(
|
||||
c * vec3(1.0 / 12.92),
|
||||
pow((c + vec3(0.055)) * vec3(1.0 / 1.055), vec3(2.4)),
|
||||
greaterThanEqual(c, vec3(0.04045))
|
||||
);
|
||||
}
|
||||
|
||||
vec3 inv_eotf_compound_power_2_4(vec3 c) {
|
||||
return mix(
|
||||
vec3(12.92) * c,
|
||||
vec3(1.055) * pow(c, vec3(1.0 / 2.4)) - vec3(0.055),
|
||||
greaterThanEqual(c, vec3(0.0031308))
|
||||
);
|
||||
}
|
||||
|
||||
vec3 apply_eotf(vec3 c) {
|
||||
switch (eotf) {
|
||||
case TF_LINEAR: return c;
|
||||
|
|
@ -114,6 +131,7 @@ vec3 apply_eotf(vec3 c) {
|
|||
case TF_LOG316: return eotf_log316(c);
|
||||
case TF_ST428: return eotf_st428(c);
|
||||
case TF_POW: return sign(c) * pow(abs(c), vec3(cm_eotf_args.arg1));
|
||||
case TF_COMPOUND_POWER_2_4: return eotf_compound_power_2_4(c);
|
||||
default: return c;
|
||||
}
|
||||
}
|
||||
|
|
@ -131,6 +149,7 @@ vec3 apply_inv_eotf(vec3 c) {
|
|||
case TF_LOG316: return inv_eotf_log316(c);
|
||||
case TF_ST428: return inv_eotf_st428(c);
|
||||
case TF_POW: return sign(c) * pow(abs(c), vec3(cm_inv_eotf_args.arg1));
|
||||
case TF_COMPOUND_POWER_2_4: return inv_eotf_compound_power_2_4(c);
|
||||
default: return c;
|
||||
}
|
||||
}
|
||||
|
|
|
|||
Binary file not shown.
Binary file not shown.
|
|
@ -1,4 +1,4 @@
|
|||
f49076a6465a6790c72a6d290c13d5f14c7dae8ae3eed6ca71c57424e3306f66 src/gfx_apis/vulkan/shaders/eotfs.glsl
|
||||
b6a0df1e231fab533499329636b7a580384784418baee06c147af5fcc384cf5c src/gfx_apis/vulkan/shaders/eotfs.glsl
|
||||
8a38df18851cd13884499820f26939fb7319f45d913d867f254d8118d59fb117 src/gfx_apis/vulkan/shaders/fill.common.glsl
|
||||
21c488d12aa5ad2f109ec44cb856dfe837e02ea9025b5ed64439d742c17cbf30 src/gfx_apis/vulkan/shaders/fill.frag
|
||||
4fb481d8d73afdfb0d8f077eb8665d86f06c8a32a91e44ed369ef5dff554646d src/gfx_apis/vulkan/shaders/fill.vert
|
||||
|
|
|
|||
|
|
@ -12,6 +12,7 @@ pub mod wp_image_description_v1;
|
|||
|
||||
const UNIQUE_CM_IDS_SINCE: Version = Version(2);
|
||||
const SRGB_DEPRECATED_SINCE: Version = Version(2);
|
||||
const COMPOUND_POWER_2_4_SINCE: Version = Version(2);
|
||||
|
||||
const PRIMARIES_MUL: f64 = 1_000_000.0;
|
||||
const PRIMARIES_MUL_INV: f64 = 1.0 / PRIMARIES_MUL;
|
||||
|
|
|
|||
|
|
@ -4,8 +4,9 @@ use {
|
|||
globals::{Global, GlobalName},
|
||||
ifs::{
|
||||
color_management::{
|
||||
FEATURE_EXTENDED_TARGET_VOLUME, FEATURE_SET_MASTERING_DISPLAY_PRIMARIES,
|
||||
FEATURE_SET_TF_POWER, SRGB_DEPRECATED_SINCE,
|
||||
COMPOUND_POWER_2_4_SINCE, FEATURE_EXTENDED_TARGET_VOLUME,
|
||||
FEATURE_SET_MASTERING_DISPLAY_PRIMARIES, FEATURE_SET_TF_POWER,
|
||||
SRGB_DEPRECATED_SINCE, TRANSFER_FUNCTION_COMPOUND_POWER_2_4,
|
||||
consts::{
|
||||
FEATURE_PARAMETRIC, FEATURE_SET_LUMINANCES, FEATURE_SET_PRIMARIES,
|
||||
FEATURE_WINDOWS_SCRGB, PRIMARIES_ADOBE_RGB, PRIMARIES_BT2020,
|
||||
|
|
@ -96,6 +97,9 @@ impl WpColorManagerV1 {
|
|||
}
|
||||
self.send_supported_tf_named(TRANSFER_FUNCTION_ST2084_PQ);
|
||||
self.send_supported_tf_named(TRANSFER_FUNCTION_ST428);
|
||||
if self.version >= COMPOUND_POWER_2_4_SINCE {
|
||||
self.send_supported_tf_named(TRANSFER_FUNCTION_COMPOUND_POWER_2_4);
|
||||
}
|
||||
self.send_supported_primaries_named(PRIMARIES_SRGB);
|
||||
self.send_supported_primaries_named(PRIMARIES_PAL_M);
|
||||
self.send_supported_primaries_named(PRIMARIES_PAL);
|
||||
|
|
|
|||
|
|
@ -7,7 +7,8 @@ use {
|
|||
cmm_primaries::{NamedPrimaries, Primaries},
|
||||
},
|
||||
ifs::color_management::{
|
||||
MIN_LUM_MUL_INV, PRIMARIES_MUL_INV, SRGB_DEPRECATED_SINCE,
|
||||
COMPOUND_POWER_2_4_SINCE, MIN_LUM_MUL_INV, PRIMARIES_MUL_INV, SRGB_DEPRECATED_SINCE,
|
||||
TRANSFER_FUNCTION_COMPOUND_POWER_2_4,
|
||||
consts::{
|
||||
PRIMARIES_ADOBE_RGB, PRIMARIES_BT2020, PRIMARIES_CIE1931_XYZ, PRIMARIES_DCI_P3,
|
||||
PRIMARIES_DISPLAY_P3, PRIMARIES_GENERIC_FILM, PRIMARIES_NTSC, PRIMARIES_PAL,
|
||||
|
|
@ -120,6 +121,9 @@ impl WpImageDescriptionCreatorParamsV1RequestHandler for WpImageDescriptionCreat
|
|||
TRANSFER_FUNCTION_EXT_SRGB if self.version < SRGB_DEPRECATED_SINCE => Eotf::Gamma22,
|
||||
TRANSFER_FUNCTION_ST2084_PQ => Eotf::St2084Pq,
|
||||
TRANSFER_FUNCTION_ST428 => Eotf::St428,
|
||||
TRANSFER_FUNCTION_COMPOUND_POWER_2_4 if self.version >= COMPOUND_POWER_2_4_SINCE => {
|
||||
Eotf::CompoundPower24
|
||||
}
|
||||
_ => {
|
||||
return Err(WpImageDescriptionCreatorParamsV1Error::UnsupportedTf(
|
||||
req.tf,
|
||||
|
|
|
|||
|
|
@ -10,9 +10,10 @@ use {
|
|||
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, 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,
|
||||
TRANSFER_FUNCTION_BT1886, TRANSFER_FUNCTION_COMPOUND_POWER_2_4,
|
||||
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,
|
||||
},
|
||||
leaks::Tracker,
|
||||
object::{Object, Version},
|
||||
|
|
@ -51,6 +52,7 @@ impl WpImageDescriptionInfoV1 {
|
|||
self.send_tf_power(e);
|
||||
break 'tf;
|
||||
}
|
||||
Eotf::CompoundPower24 => TRANSFER_FUNCTION_COMPOUND_POWER_2_4,
|
||||
};
|
||||
self.send_tf_named(tf);
|
||||
}
|
||||
|
|
|
|||
16
src/theme.rs
16
src/theme.rs
|
|
@ -108,6 +108,13 @@ impl Color {
|
|||
fn gamma28(c: f32) -> f32 {
|
||||
c.signum() * c.abs().powf(2.8)
|
||||
}
|
||||
fn compound_power_2_4(c: f32) -> f32 {
|
||||
if c < 0.04045 {
|
||||
c / 12.92
|
||||
} else {
|
||||
((c + 0.055) / 1.055).powf(2.4)
|
||||
}
|
||||
}
|
||||
macro_rules! convert {
|
||||
($tf:ident) => {{
|
||||
r = $tf(r);
|
||||
|
|
@ -135,6 +142,7 @@ impl Color {
|
|||
let pow = |c: f32| -> f32 { c.signum() * c.abs().powf(e) };
|
||||
convert!(pow)
|
||||
}
|
||||
Eotf::CompoundPower24 => convert!(compound_power_2_4),
|
||||
}
|
||||
Self { r, g, b, a: 1.0 }
|
||||
}
|
||||
|
|
@ -237,6 +245,13 @@ impl Color {
|
|||
fn gamma28(c: f32) -> f32 {
|
||||
c.signum() * c.abs().powf(1.0 / 2.8)
|
||||
}
|
||||
fn compound_power_2_4(c: f32) -> f32 {
|
||||
if c < 0.0031308 {
|
||||
12.92 * c
|
||||
} else {
|
||||
1.055 * c.powf(1.0 / 2.4) - 0.055
|
||||
}
|
||||
}
|
||||
macro_rules! convert {
|
||||
($tf:ident) => {{
|
||||
for c in &mut res[..3] {
|
||||
|
|
@ -270,6 +285,7 @@ impl Color {
|
|||
let pow = |c: f32| -> f32 { c.signum() * c.abs().powf(e) };
|
||||
convert!(pow)
|
||||
}
|
||||
Eotf::CompoundPower24 => convert!(compound_power_2_4),
|
||||
}
|
||||
if self.a < 1.0 {
|
||||
for c in &mut res[..3] {
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue