diff --git a/src/backends/drm/drm_output.cpp b/src/backends/drm/drm_output.cpp index 659282a843..b4334e490b 100644 --- a/src/backends/drm/drm_output.cpp +++ b/src/backends/drm/drm_output.cpp @@ -397,12 +397,14 @@ ColorDescription DrmOutput::createColorDescription(const std::shared_ptrcolorProfileSource.value_or(colorProfileSource()); const bool hdr = props->highDynamicRange.value_or(m_state.highDynamicRange); const bool wcg = props->wideColorGamut.value_or(m_state.wideColorGamut); + const double sdrGamutWideness = props->sdrGamutWideness.value_or(m_state.sdrGamutWideness); const auto iccProfile = props->iccProfile.value_or(m_state.iccProfile); if (colorSource == ColorProfileSource::ICC && !hdr && !wcg && iccProfile) { const double minBrightness = iccProfile->minBrightness().value_or(0); const double maxBrightness = iccProfile->maxBrightness().value_or(200); + const auto sdrColor = Colorimetry::fromName(NamedColorimetry::BT709).interpolateGamutTo(iccProfile->colorimetry(), sdrGamutWideness); // TODO properly apply night light here as well, somehow - return ColorDescription(iccProfile->colorimetry(), TransferFunction(TransferFunction::gamma22, minBrightness, maxBrightness), maxBrightness, minBrightness, maxBrightness, maxBrightness); + return ColorDescription(iccProfile->colorimetry(), TransferFunction(TransferFunction::gamma22, minBrightness, maxBrightness), maxBrightness, minBrightness, maxBrightness, maxBrightness, iccProfile->colorimetry(), sdrColor); } const bool supportsHdr = (capabilities() & Capability::HighDynamicRange) && (capabilities() & Capability::WideColorGamut); const bool effectiveHdr = hdr && supportsHdr; @@ -411,7 +413,7 @@ ColorDescription DrmOutput::createColorDescription(const std::shared_ptrsdrGamutWideness.value_or(m_state.sdrGamutWideness)) : Colorimetry::fromName(NamedColorimetry::BT709); + const Colorimetry sdrColorimetry = (effectiveWcg || colorSource == ColorProfileSource::EDID) ? Colorimetry::fromName(NamedColorimetry::BT709).interpolateGamutTo(nativeColorimetry, sdrGamutWideness) : Colorimetry::fromName(NamedColorimetry::BT709); // TODO the EDID can contain a gamma value, use that when available and colorSource == ColorProfileSource::EDID const double maxAverageBrightness = effectiveHdr ? props->maxAverageBrightnessOverride.value_or(m_state.maxAverageBrightnessOverride).value_or(m_connector->edid()->desiredMaxFrameAverageLuminance().value_or(m_state.referenceLuminance)) : 200; const double maxPeakBrightness = effectiveHdr ? props->maxPeakBrightnessOverride.value_or(m_state.maxPeakBrightnessOverride).value_or(m_connector->edid()->desiredMaxLuminance().value_or(800)) : 200 * m_state.artificialHdrHeadroom;