61 if (!
m_d->interface->isReady()) {
62 str <<
"WARNING: surface color management interface is not ready!" << Qt::endl;
71 str <<
"Configured mode:" <<
m_d->surfaceMode << Qt::endl;
73 RenderIntent preferredIntent = Private::calculateConfigIntent(
m_d->currentConfig.options());
74 str <<
"Configured intent:" << preferredIntent <<
"supported:" <<
m_d->interface->supportsRenderIntent(preferredIntent) << Qt::endl;
76 str <<
"Actual intent:";
77 if (
m_d->interface->renderingIntent()) {
78 str << *
m_d->interface->renderingIntent() << Qt::endl;
80 str <<
"<none>" << Qt::endl;
84 str <<
"Active surface description:";
85 if (
m_d->interface->surfaceDescription()) {
87 str.noquote() <<
m_d->interface->surfaceDescription()->makeTextReport() << Qt::endl;
89 str <<
"<none>" << Qt::endl;
93 str <<
"Selected Profile:";
94 if (
m_d->currentConfig.profile) {
95 auto profile =
m_d->currentConfig.profile;
97 str << profile->name() << Qt::endl;
103 auto colVec = profile->getColorantsxyY();
109 str <<
" red: " << colR << Qt::endl;
110 str <<
" green:" << colG << Qt::endl;
111 str <<
" blue: " << colB << Qt::endl;
115 auto whiteVec = profile->getWhitePointxyY();
119 str <<
" white: " << white << Qt::endl;
124 str <<
"<none>" << Qt::endl;
127 str <<
"Compositor preferred surface description:";
128 if (
m_d->interface->preferredSurfaceDescription()) {
130 str.noquote() <<
m_d->interface->preferredSurfaceDescription()->makeTextReport() << Qt::endl;
132 str <<
"<none>" << Qt::endl;
223 RenderIntent preferredIntent =
224 Private::calculateConfigIntent(newOptions);
226 if (!
m_d->interface->supportsRenderIntent(preferredIntent)) {
227 qWarning() <<
"WARNING: failed to set user preferred rendering"
228 <<
"intent for the surface, intent \""
229 << preferredIntent <<
"\" is unsupported, falling back to \"perceptual\"";
231 preferredIntent = RenderIntent::render_intent_perceptual;
237 std::optional<SurfaceDescription> requestedDescription;
243 requestedDescription = SurfaceDescription();
247 const auto compositorPreferred =
m_d->interface->preferredSurfaceDescription();
252 auto makeKritaRec2020PQLuminance = [] () {
262 if (compositorPreferred->colorSpace.isHDR()) {
266 requestedDescription->colorSpace.primaries = NamedPrimaries::primaries_bt2020;
267 requestedDescription->colorSpace.transferFunction = NamedTransferFunction::transfer_function_st2084_pq;
271 requestedDescription->colorSpace = compositorPreferred->colorSpace;
274 if (std::holds_alternative<NamedTransferFunction>(requestedDescription->colorSpace.transferFunction) &&
275 std::get<NamedTransferFunction>(requestedDescription->colorSpace.transferFunction) == NamedTransferFunction::transfer_function_st2084_pq) {
277 requestedDescription->colorSpace.luminance = makeKritaRec2020PQLuminance();
280 requestedDescription->colorSpace.primaries = NamedPrimaries::primaries_bt2020;
281 requestedDescription->colorSpace.transferFunction = NamedTransferFunction::transfer_function_st2084_pq;
282 requestedDescription->colorSpace.luminance = makeKritaRec2020PQLuminance();
284 requestedDescription->colorSpace.primaries = NamedPrimaries::primaries_srgb;
285 requestedDescription->colorSpace.transferFunction = NamedTransferFunction::transfer_function_gamma22;
286 if (compositorPreferred->colorSpace.luminance) {
288 requestedDescription->colorSpace.luminance =
289 compositorPreferred->colorSpace.luminance->clipToSdr();
292 requestedDescription->colorSpace.primaries = NamedPrimaries::primaries_srgb;
293 requestedDescription->colorSpace.transferFunction = NamedTransferFunction::transfer_function_ext_linear;
294 if (compositorPreferred->colorSpace.luminance) {
307 requestedDescription->colorSpace.luminance =
308 compositorPreferred->colorSpace.luminance->clipToSdr();
312 if (std::holds_alternative<NamedPrimaries>(requestedDescription->colorSpace.primaries) &&
313 std::get<NamedPrimaries>(requestedDescription->colorSpace.primaries) == NamedPrimaries::primaries_unknown) {
315 requestedDescription->colorSpace.primaries = NamedPrimaries::primaries_srgb;
318 if (std::holds_alternative<NamedTransferFunction>(requestedDescription->colorSpace.transferFunction) &&
319 std::get<NamedTransferFunction>(requestedDescription->colorSpace.transferFunction) == NamedTransferFunction::transfer_function_unknown) {
321 requestedDescription->colorSpace.transferFunction = NamedTransferFunction::transfer_function_gamma22;
324 if (!
m_d->interface->supportsSurfaceDescription(*requestedDescription)) {
327 requestedDescription->colorSpace.primaries = NamedPrimaries::primaries_srgb;
328 requestedDescription->colorSpace.transferFunction = NamedTransferFunction::transfer_function_srgb;
330 if (!
m_d->interface->supportsSurfaceDescription(*requestedDescription)) {
331 requestedDescription->colorSpace.transferFunction = NamedTransferFunction::transfer_function_gamma22;
333 if (!
m_d->interface->supportsSurfaceDescription(*requestedDescription)) {
334 qWarning() <<
"WARNING: failed to find a suitable surface format for the compositor";
341 auto request = colorSpaceToRequest(requestedDescription->colorSpace);
342 if (request.isValid()) {
344 request.colorPrimariesType,
345 request.transferFunction);
351 requestedDescription->colorSpace.transferFunction = NamedTransferFunction::transfer_function_gamma22;
352 if (
m_d->interface->supportsSurfaceDescription(*requestedDescription)) {
353 auto request = colorSpaceToRequest(requestedDescription->colorSpace);
354 if (request.isValid()) {
356 request.colorPrimariesType,
357 request.transferFunction);
364 requestedDescription->colorSpace.transferFunction = NamedTransferFunction::transfer_function_srgb;
365 if (
m_d->interface->supportsSurfaceDescription(*requestedDescription)) {
366 auto request = colorSpaceToRequest(requestedDescription->colorSpace);
367 if (request.isValid()) {
369 request.colorPrimariesType,
370 request.transferFunction);
376 qWarning() <<
"WARNING: failed to to create a profile for the compositor's preferred color space";
377 qWarning() <<
" " <<
ppVar(compositorPreferred);
378 qWarning() <<
" " <<
ppVar(*requestedDescription);
387 if (
m_d->interface->surfaceDescription() != requestedDescription ||
388 m_d->interface->renderingIntent() != preferredIntent) {
390 if (requestedDescription) {
391 auto future =
m_d->interface->setSurfaceDescription(*requestedDescription, preferredIntent);
393 if (!result.isValid() || !result.result()) {
395 <<
"WARNING: failed to set color space for the surface, setSurfaceDescription() returned false";
399 m_d->interface->unsetSurfaceDescription();
403 const bool requestedDescriptionIsHDR = requestedDescription && requestedDescription->colorSpace.isHDR();
406 newDisplayConfig.
profile = profile;
408 newDisplayConfig.
isHDR = requestedDescriptionIsHDR;
412 if (
m_d->currentConfig != newDisplayConfig) {
413 m_d->currentConfig = newDisplayConfig;