@ -397,12 +397,14 @@ ColorDescription DrmOutput::createColorDescription(const std::shared_ptr<OutputC
const auto colorSource = props - > colorProfileSource . 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_ptr<OutputC
const Colorimetry containerColorimetry = effectiveWcg ? Colorimetry : : fromName ( NamedColorimetry : : BT2020 ) : ( colorSource = = ColorProfileSource : : EDID ? nativeColorimetry : Colorimetry : : fromName ( NamedColorimetry : : BT709 ) ) ;
const Colorimetry masteringColorimetry = ( effectiveWcg | | colorSource = = ColorProfileSource : : EDID ) ? nativeColorimetry : Colorimetry : : fromName ( NamedColorimetry : : BT709 ) ;
const Colorimetry sdrColorimetry = effectiveWcg ? Colorimetry : : fromName ( NamedColorimetry : : BT709 ) . interpolateGamutTo ( nativeColorimetry , props - > sdrGamutWideness . 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 ;