summaryrefslogtreecommitdiff
path: root/src/protocols
diff options
context:
space:
mode:
authorUjinT34 <41110182+UjinT34@users.noreply.github.com>2026-01-13 18:44:36 +0300
committerGitHub <noreply@github.com>2026-01-13 16:44:36 +0100
commite0cf88809de12c39ad8a1ad1c0194967b0029ec8 (patch)
tree187ea356114248b08ed88739104a47fceac2cca0 /src/protocols
parente43f949f8a80611fdfe21068f55dfe9fb7604ae8 (diff)
protocols/cm: Fix image description info events (#12781)
* fix image description info events * always send some target primaries * set edid values as target primaries and luminances * init monitor image description * set default luminances for tf * fix BT1886 luminances * fix mastering values and overrides * set maxCLL & maxFALL * typo * add FALL & CLL to preferred HDR image description * fix ref luminances
Diffstat (limited to 'src/protocols')
-rw-r--r--src/protocols/ColorManagement.cpp44
-rw-r--r--src/protocols/types/ColorManagement.hpp6
2 files changed, 39 insertions, 11 deletions
diff --git a/src/protocols/ColorManagement.cpp b/src/protocols/ColorManagement.cpp
index afab5a20..90840217 100644
--- a/src/protocols/ColorManagement.cpp
+++ b/src/protocols/ColorManagement.cpp
@@ -505,6 +505,14 @@ CColorManagementParametricCreator::CColorManagementParametricCreator(SP<CWpImage
return;
}
+ if ((m_valuesSet & PC_TF) && !(m_valuesSet & PC_LUMINANCES)) {
+ m_settings.luminances = {
+ .min = m_settings.getTFMinLuminance(),
+ .max = m_settings.getTFMaxLuminance(),
+ .reference = m_settings.getTFRefLuminance(),
+ };
+ }
+
RESOURCE->m_self = RESOURCE;
RESOURCE->m_settings = CImageDescription::from(m_settings);
RESOURCE->resource()->sendReady(RESOURCE->m_settings->id());
@@ -730,19 +738,39 @@ CColorManagementImageDescriptionInfo::CColorManagementImageDescriptionInfo(SP<CW
m_resource->sendPrimaries(toProto(m_settings.primaries.red.x), toProto(m_settings.primaries.red.y), toProto(m_settings.primaries.green.x),
toProto(m_settings.primaries.green.y), toProto(m_settings.primaries.blue.x), toProto(m_settings.primaries.blue.y),
toProto(m_settings.primaries.white.x), toProto(m_settings.primaries.white.y));
+
if (m_settings.primariesNameSet)
m_resource->sendPrimariesNamed(m_settings.primariesNamed);
- m_resource->sendTfPower(std::round(m_settings.transferFunctionPower * 10000));
+
m_resource->sendTfNamed(m_settings.transferFunction);
+
+ if (m_settings.transferFunctionPower != 1.0f)
+ m_resource->sendTfPower(std::round(m_settings.transferFunctionPower * 10000));
+
m_resource->sendLuminances(std::round(m_settings.luminances.min * 10000), m_settings.luminances.max, m_settings.luminances.reference);
- // send expected display paramateres
- m_resource->sendTargetPrimaries(toProto(m_settings.masteringPrimaries.red.x), toProto(m_settings.masteringPrimaries.red.y), toProto(m_settings.masteringPrimaries.green.x),
- toProto(m_settings.masteringPrimaries.green.y), toProto(m_settings.masteringPrimaries.blue.x), toProto(m_settings.masteringPrimaries.blue.y),
- toProto(m_settings.masteringPrimaries.white.x), toProto(m_settings.masteringPrimaries.white.y));
- m_resource->sendTargetLuminance(std::round(m_settings.masteringLuminances.min * 10000), m_settings.masteringLuminances.max);
- m_resource->sendTargetMaxCll(m_settings.maxCLL);
- m_resource->sendTargetMaxFall(m_settings.maxFALL);
+ const auto& targetPrimaries = ( //
+ m_settings.masteringPrimaries.red.x != 0 || m_settings.masteringPrimaries.red.y != 0 || //
+ m_settings.masteringPrimaries.green.x != 0 || m_settings.masteringPrimaries.green.y != 0 || //
+ m_settings.masteringPrimaries.blue.x != 0 || m_settings.masteringPrimaries.blue.y != 0) ?
+ m_settings.masteringPrimaries :
+ m_settings.primaries;
+
+ m_resource->sendTargetPrimaries( //
+ toProto(targetPrimaries.red.x), toProto(targetPrimaries.red.y), //
+ toProto(targetPrimaries.green.x), toProto(targetPrimaries.green.y), //
+ toProto(targetPrimaries.blue.x), toProto(targetPrimaries.blue.y), //
+ toProto(targetPrimaries.white.x), toProto(targetPrimaries.white.y));
+
+ if (m_settings.masteringLuminances.max > 0)
+ m_resource->sendTargetLuminance(std::round(m_settings.masteringLuminances.min * 10000), m_settings.masteringLuminances.max);
+ else
+ m_resource->sendTargetLuminance(std::round(m_settings.luminances.min * 10000), m_settings.luminances.max);
+
+ if (m_settings.maxCLL > 0 || m_settings.maxFALL > 0) {
+ m_resource->sendTargetMaxCll(m_settings.maxCLL);
+ m_resource->sendTargetMaxFall(m_settings.maxFALL);
+ }
m_resource->sendDone();
}
diff --git a/src/protocols/types/ColorManagement.hpp b/src/protocols/types/ColorManagement.hpp
index 01077704..3a1796a3 100644
--- a/src/protocols/types/ColorManagement.hpp
+++ b/src/protocols/types/ColorManagement.hpp
@@ -223,9 +223,9 @@ namespace NColorManagement {
case CM_TRANSFER_FUNCTION_EXT_LINEAR: return 0;
case CM_TRANSFER_FUNCTION_ST2084_PQ:
case CM_TRANSFER_FUNCTION_HLG: return HDR_MIN_LUMINANCE;
+ case CM_TRANSFER_FUNCTION_BT1886: return 0.01;
case CM_TRANSFER_FUNCTION_GAMMA22:
case CM_TRANSFER_FUNCTION_GAMMA28:
- case CM_TRANSFER_FUNCTION_BT1886:
case CM_TRANSFER_FUNCTION_ST240:
case CM_TRANSFER_FUNCTION_LOG_100:
case CM_TRANSFER_FUNCTION_LOG_316:
@@ -243,9 +243,9 @@ namespace NColorManagement {
return SDR_MAX_LUMINANCE; // assume Windows scRGB. white color range 1.0 - 125.0 maps to SDR_MAX_LUMINANCE (80) - HDR_MAX_LUMINANCE (10000)
case CM_TRANSFER_FUNCTION_ST2084_PQ: return HDR_MAX_LUMINANCE;
case CM_TRANSFER_FUNCTION_HLG: return HLG_MAX_LUMINANCE;
+ case CM_TRANSFER_FUNCTION_BT1886: return 100;
case CM_TRANSFER_FUNCTION_GAMMA22:
case CM_TRANSFER_FUNCTION_GAMMA28:
- case CM_TRANSFER_FUNCTION_BT1886:
case CM_TRANSFER_FUNCTION_ST240:
case CM_TRANSFER_FUNCTION_LOG_100:
case CM_TRANSFER_FUNCTION_LOG_316:
@@ -262,9 +262,9 @@ namespace NColorManagement {
case CM_TRANSFER_FUNCTION_EXT_LINEAR:
case CM_TRANSFER_FUNCTION_ST2084_PQ:
case CM_TRANSFER_FUNCTION_HLG: return HDR_REF_LUMINANCE;
+ case CM_TRANSFER_FUNCTION_BT1886: return 100;
case CM_TRANSFER_FUNCTION_GAMMA22:
case CM_TRANSFER_FUNCTION_GAMMA28:
- case CM_TRANSFER_FUNCTION_BT1886:
case CM_TRANSFER_FUNCTION_ST240:
case CM_TRANSFER_FUNCTION_LOG_100:
case CM_TRANSFER_FUNCTION_LOG_316: