Anyway, due to limitations of 10-bit integer surfaces in rec709-g10 mode, we just refuse to support that.
217{
222
224 Private::calculateConfigIntent(newOptions);
225
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\"";
230
231 preferredIntent = RenderIntent::render_intent_perceptual;
232
233
235 }
236
237 std::optional<SurfaceDescription> requestedDescription;
239
242 } else {
243 requestedDescription = SurfaceDescription();
244
246
247 const auto compositorPreferred =
m_d->interface->preferredSurfaceDescription();
249
250
251
252 auto makeKritaRec2020PQLuminance = [] () {
257 return luminance;
258 };
259
261
262 if (compositorPreferred->colorSpace.isHDR()) {
263
264
265
266 requestedDescription->colorSpace.primaries = NamedPrimaries::primaries_bt2020;
267 requestedDescription->colorSpace.transferFunction = NamedTransferFunction::transfer_function_st2084_pq;
268 } else {
269
270
271 requestedDescription->colorSpace = compositorPreferred->colorSpace;
272 }
273
274 if (std::holds_alternative<NamedTransferFunction>(requestedDescription->colorSpace.transferFunction) &&
275 std::get<NamedTransferFunction>(requestedDescription->colorSpace.transferFunction) == NamedTransferFunction::transfer_function_st2084_pq) {
276
277 requestedDescription->colorSpace.luminance = makeKritaRec2020PQLuminance();
278 }
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) {
287
288 requestedDescription->colorSpace.luminance =
289 compositorPreferred->colorSpace.luminance->clipToSdr();
290 }
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();
309 }
310 }
311
312 if (std::holds_alternative<NamedPrimaries>(requestedDescription->colorSpace.primaries) &&
313 std::get<NamedPrimaries>(requestedDescription->colorSpace.primaries) == NamedPrimaries::primaries_unknown) {
314
315 requestedDescription->colorSpace.primaries = NamedPrimaries::primaries_srgb;
316 }
317
318 if (std::holds_alternative<NamedTransferFunction>(requestedDescription->colorSpace.transferFunction) &&
319 std::get<NamedTransferFunction>(requestedDescription->colorSpace.transferFunction) == NamedTransferFunction::transfer_function_unknown) {
320
321 requestedDescription->colorSpace.transferFunction = NamedTransferFunction::transfer_function_gamma22;
322 }
323
324 if (!
m_d->interface->supportsSurfaceDescription(*requestedDescription)) {
325
326
327 requestedDescription->colorSpace.primaries = NamedPrimaries::primaries_srgb;
328 requestedDescription->colorSpace.transferFunction = NamedTransferFunction::transfer_function_srgb;
329
330 if (!
m_d->interface->supportsSurfaceDescription(*requestedDescription)) {
331 requestedDescription->colorSpace.transferFunction = NamedTransferFunction::transfer_function_gamma22;
332
333 if (!
m_d->interface->supportsSurfaceDescription(*requestedDescription)) {
334 qWarning() << "WARNING: failed to find a suitable surface format for the compositor";
335 return;
336 }
337 }
338 }
339
340 {
342 if (request.isValid()) {
344 request.colorPrimariesType,
345 request.transferFunction);
346 }
347 }
348
349 if (!profile) {
350
351 requestedDescription->colorSpace.transferFunction = NamedTransferFunction::transfer_function_gamma22;
352 if (
m_d->interface->supportsSurfaceDescription(*requestedDescription)) {
354 if (request.isValid()) {
356 request.colorPrimariesType,
357 request.transferFunction);
358 }
359 }
360 }
361
362 if (!profile) {
363
364 requestedDescription->colorSpace.transferFunction = NamedTransferFunction::transfer_function_srgb;
365 if (
m_d->interface->supportsSurfaceDescription(*requestedDescription)) {
367 if (request.isValid()) {
369 request.colorPrimariesType,
370 request.transferFunction);
371 }
372 }
373 }
374
375 if (!profile) {
376 qWarning() << "WARNING: failed to to create a profile for the compositor's preferred color space";
377 qWarning() <<
" " <<
ppVar(compositorPreferred);
378 qWarning() <<
" " <<
ppVar(*requestedDescription);
379
380 return;
381 }
382 }
383
386
387 if (
m_d->interface->surfaceDescription() != requestedDescription ||
388 m_d->interface->renderingIntent() != preferredIntent) {
389
390 if (requestedDescription) {
391 auto future =
m_d->interface->setSurfaceDescription(*requestedDescription, preferredIntent);
393 if (!result.isValid() || !result.result()) {
394 qWarning()
395 << "WARNING: failed to set color space for the surface, setSurfaceDescription() returned false";
396 }
397 });
398 } else {
399 m_d->interface->unsetSurfaceDescription();
400 }
401 }
402
403 const bool requestedDescriptionIsHDR = requestedDescription && requestedDescription->colorSpace.isHDR();
404
406 newDisplayConfig.
profile = profile;
408 newDisplayConfig.
isHDR = requestedDescriptionIsHDR;
409
411
412 if (
m_d->currentConfig != newDisplayConfig) {
413 m_d->currentConfig = newDisplayConfig;
415 }
416}
KisDisplayConfig This class keeps track of the color management configuration for image to display....
void setOptions(const Options &options)
const KoColorProfile * profile
#define KIS_SAFE_ASSERT_RECOVER_RETURN(cond)
PigmentProfileRequest colorSpaceToRequest(ColorSpace cs)
void sigDisplayConfigChanged(const KisDisplayConfig &config)
uint32_t referenceLuminance
const KoColorProfile * profileFor(const QVector< double > &colorants, ColorPrimaries colorPrimaries, TransferCharacteristics transferFunction) const
profileFor tries to find the profile that matches these characteristics, if no such profile is found,...