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
251
252
253 requestedDescription->colorSpace = compositorPreferred->colorSpace;
254
255 if (std::holds_alternative<NamedTransferFunction>(requestedDescription->colorSpace.transferFunction) &&
256 std::get<NamedTransferFunction>(requestedDescription->colorSpace.transferFunction) == NamedTransferFunction::transfer_function_st2084_pq) {
257
258
259
260 requestedDescription->colorSpace.luminance =
Luminance();
261 requestedDescription->colorSpace.luminance->minLuminance = 0;
262 requestedDescription->colorSpace.luminance->referenceLuminance = 80;
263 requestedDescription->colorSpace.luminance->maxLuminance = 10000;
264 }
265
267 requestedDescription->colorSpace.primaries = NamedPrimaries::primaries_srgb;
268 requestedDescription->colorSpace.transferFunction = NamedTransferFunction::transfer_function_gamma22;
269 if (compositorPreferred->colorSpace.luminance) {
270
271 requestedDescription->colorSpace.luminance =
272 compositorPreferred->colorSpace.luminance->clipToSdr();
273 }
275 requestedDescription->colorSpace.primaries = NamedPrimaries::primaries_srgb;
276 requestedDescription->colorSpace.transferFunction = NamedTransferFunction::transfer_function_ext_linear;
277 if (compositorPreferred->colorSpace.luminance) {
278
279 requestedDescription->colorSpace.luminance =
280 compositorPreferred->colorSpace.luminance->clipToSdr();
281 }
282 }
283
284 if (std::holds_alternative<NamedPrimaries>(requestedDescription->colorSpace.primaries) &&
285 std::get<NamedPrimaries>(requestedDescription->colorSpace.primaries) == NamedPrimaries::primaries_unknown) {
286
287 requestedDescription->colorSpace.primaries = NamedPrimaries::primaries_srgb;
288 }
289
290 if (std::holds_alternative<NamedTransferFunction>(requestedDescription->colorSpace.transferFunction) &&
291 std::get<NamedTransferFunction>(requestedDescription->colorSpace.transferFunction) == NamedTransferFunction::transfer_function_unknown) {
292
293 requestedDescription->colorSpace.transferFunction = NamedTransferFunction::transfer_function_gamma22;
294 }
295
296 if (!
m_d->interface->supportsSurfaceDescription(*requestedDescription)) {
297
298
299 requestedDescription->colorSpace.primaries = NamedPrimaries::primaries_srgb;
300 requestedDescription->colorSpace.transferFunction = NamedTransferFunction::transfer_function_srgb;
301
302 if (!
m_d->interface->supportsSurfaceDescription(*requestedDescription)) {
303 requestedDescription->colorSpace.transferFunction = NamedTransferFunction::transfer_function_gamma22;
304
305 if (!
m_d->interface->supportsSurfaceDescription(*requestedDescription)) {
306 qWarning() << "WARNING: failed to find a suitable surface format for the compositor";
307 return;
308 }
309 }
310 }
311
312 {
314 if (request.isValid()) {
316 request.colorPrimariesType,
317 request.transferFunction);
318 }
319 }
320
321 if (!profile) {
322
323 requestedDescription->colorSpace.transferFunction = NamedTransferFunction::transfer_function_gamma22;
324 if (
m_d->interface->supportsSurfaceDescription(*requestedDescription)) {
326 if (request.isValid()) {
328 request.colorPrimariesType,
329 request.transferFunction);
330 }
331 }
332 }
333
334 if (!profile) {
335
336 requestedDescription->colorSpace.transferFunction = NamedTransferFunction::transfer_function_srgb;
337 if (
m_d->interface->supportsSurfaceDescription(*requestedDescription)) {
339 if (request.isValid()) {
341 request.colorPrimariesType,
342 request.transferFunction);
343 }
344 }
345 }
346
347 if (!profile) {
348 qWarning() << "WARNING: failed to to create a profile for the compositor's preferred color space";
349 qWarning() <<
" " <<
ppVar(compositorPreferred);
350 qWarning() <<
" " <<
ppVar(*requestedDescription);
351
352 return;
353 }
354 }
355
358
359 if (
m_d->interface->surfaceDescription() != requestedDescription ||
360 m_d->interface->renderingIntent() != preferredIntent) {
361
362 if (requestedDescription) {
363 auto future =
m_d->interface->setSurfaceDescription(*requestedDescription, preferredIntent);
365 if (!result.isValid() || !result.result()) {
366 qWarning()
367 << "WARNING: failed to set color space for the surface, setSurfaceDescription() returned false";
368 }
369 });
370 } else {
371 m_d->interface->unsetSurfaceDescription();
372 }
373 }
374
375 const bool requestedDescriptionIsHDR = requestedDescription && requestedDescription->colorSpace.isHDR();
376
378 newDisplayConfig.
profile = profile;
380 newDisplayConfig.
isHDR = requestedDescriptionIsHDR;
381
383
384 if (
m_d->currentConfig != newDisplayConfig) {
385 m_d->currentConfig = newDisplayConfig;
387 }
388}
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)
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,...