Krita Source Code Documentation
Loading...
Searching...
No Matches
KisCanvasSurfaceColorSpaceManager Class Reference

#include <KisCanvasSurfaceColorSpaceManager.h>

+ Inheritance diagram for KisCanvasSurfaceColorSpaceManager:

Signals

void sigDisplayConfigChanged (const KisDisplayConfig &config)
 

Public Member Functions

QString colorManagementReport () const
 
std::optional< KisSurfaceColorimetry::SurfaceDescriptioncurrentSurfaceDescription () const
 
KisDisplayConfig displayConfig () const
 
bool isReady () const
 
 KisCanvasSurfaceColorSpaceManager (KisSurfaceColorManagerInterface *interface, const KisConfig::CanvasSurfaceMode surfaceMode, const KisDisplayConfig::Options &options, QObject *parent=nullptr)
 
QString lastErrorString () const
 
QString osPreferredColorSpaceReport () const
 
 Private (KisSurfaceColorManagerInterface *interface)
 
SurfaceFormatSelectionResult selectSurfaceDescription (KisConfig::CanvasSurfaceMode surfaceMode, const KisSurfaceColorimetry::SurfaceDescription &compositorPreferred)
 
void setDisplayConfigOptions (const KisConfig::CanvasSurfaceMode surfaceMode, const KisDisplayConfig::Options &options)
 
void setDisplayConfigOptions (const KisDisplayConfig::Options &options)
 
 ~KisCanvasSurfaceColorSpaceManager ()
 
- Public Member Functions inherited from Private
 Private (KisCanvas2 *c)
 

Static Public Member Functions

static KisSurfaceColorimetry::RenderIntent calculateConfigIntent (const KisDisplayConfig::Options &options)
 

Public Attributes

KisDisplayConfig currentConfig
 
QScopedPointer< KisSurfaceColorManagerInterfaceinterface
 
QString lastErrorString
 
std::optional< KisSurfaceColorimetry::RenderIntentproofingIntentOverride
 
KisConfig::CanvasSurfaceMode surfaceMode = KisConfig::CanvasSurfaceMode::Preferred
 
- Public Attributes inherited from Private
KisCanvas2canvas
 
int displayedFrame
 
int intendedFrame
 

Private Slots

void slotInterfacePreferredDescriptionChanged ()
 
void slotInterfaceReadyChanged (bool isReady)
 

Private Member Functions

void reinitializeSurfaceDescription (const KisDisplayConfig::Options &newOptions)
 

Private Attributes

QScopedPointer< Privatem_d
 

Detailed Description

Definition at line 29 of file KisCanvasSurfaceColorSpaceManager.cpp.

Constructor & Destructor Documentation

◆ KisCanvasSurfaceColorSpaceManager()

KisCanvasSurfaceColorSpaceManager::KisCanvasSurfaceColorSpaceManager ( KisSurfaceColorManagerInterface * interface,
const KisConfig::CanvasSurfaceMode surfaceMode,
const KisDisplayConfig::Options & options,
QObject * parent = nullptr )

Definition at line 45 of file KisCanvasSurfaceColorSpaceManager.cpp.

49 : QObject(parent)
50 , m_d(new Private(interface))
51{
52 m_d->currentConfig.profile = KoColorSpaceRegistry::instance()->p709SRGBProfile();
53 m_d->currentConfig.setOptions(options);
54 m_d->currentConfig.isHDR = false;
55 m_d->surfaceMode = surfaceMode;
56
59
60 if (m_d->interface->isReady()) {
62 }
63}
void sigReadyChanged(bool value)
void sigPreferredSurfaceDescriptionChanged(const KisSurfaceColorimetry::SurfaceDescription &desc)
QScopedPointer< KisSurfaceColorManagerInterface > interface
static KoColorSpaceRegistry * instance()
const KoColorProfile * p709SRGBProfile() const

References KoColorSpaceRegistry::instance(), m_d, KoColorSpaceRegistry::p709SRGBProfile(), KisSurfaceColorManagerInterface::sigPreferredSurfaceDescriptionChanged(), KisSurfaceColorManagerInterface::sigReadyChanged(), slotInterfacePreferredDescriptionChanged(), slotInterfaceReadyChanged(), and surfaceMode.

◆ ~KisCanvasSurfaceColorSpaceManager()

KisCanvasSurfaceColorSpaceManager::~KisCanvasSurfaceColorSpaceManager ( )

Definition at line 65 of file KisCanvasSurfaceColorSpaceManager.cpp.

66{
67}

Member Function Documentation

◆ calculateConfigIntent()

static KisSurfaceColorimetry::RenderIntent KisCanvasSurfaceColorSpaceManager::calculateConfigIntent ( const KisDisplayConfig::Options & options)
static

◆ colorManagementReport()

QString KisCanvasSurfaceColorSpaceManager::colorManagementReport ( ) const

Definition at line 69 of file KisCanvasSurfaceColorSpaceManager.cpp.

70{
71 QString report;
72 QDebug str(&report);
73
74 if (!m_d->interface->isReady()) {
75 str << "WARNING: surface color management interface is not ready!" << Qt::endl;
76 str << Qt::endl;
77 }
78
83
84 if (!m_d->lastErrorString.isEmpty()) {
85 str.noquote().nospace()
86 << "ERROR: Failed to set up color management for the surface: "
87 << m_d->lastErrorString
88 << Qt::endl;
89 str << Qt::endl;
90 }
91
92 str << "Configured mode:" << m_d->surfaceMode << Qt::endl;
93
94 RenderIntent preferredIntent = Private::calculateConfigIntent(m_d->currentConfig.options());
95 str << "Configured intent:" << preferredIntent << "supported:" << m_d->interface->supportsRenderIntent(preferredIntent) << Qt::endl;
96
97 str << "Actual intent:";
98 if (m_d->interface->renderingIntent()) {
99 str << *m_d->interface->renderingIntent() << Qt::endl;
100 } else {
101 str << "<none>" << Qt::endl;
102 }
103 str << Qt::endl;
104
105 str << "Active surface description:";
106 if (m_d->interface->surfaceDescription()) {
107 str << Qt::endl;
108 str.noquote() << m_d->interface->surfaceDescription()->makeTextReport() << Qt::endl;
109 } else {
110 str << "<none>" << Qt::endl;
111 }
112 str << Qt::endl;
113
114 str << "Selected Profile:";
115 if (m_d->currentConfig.profile) {
116 auto profile = m_d->currentConfig.profile;
117
118 str << profile->name() << Qt::endl;
119 str << " primaries:" << KoColorProfile::getColorPrimariesName(profile->getColorPrimaries()) << Qt::endl;
120 str << " transfer: " << KoColorProfile::getTransferCharacteristicName(profile->getTransferCharacteristics()) << Qt::endl;
121 str << Qt::endl;
122
123 {
124 auto colVec = profile->getColorantsxyY();
125 KIS_SAFE_ASSERT_RECOVER_RETURN_VALUE(colVec.size() == 3, report);
126 KoColorimetryUtils::xyY colR = colVec[0];
127 KoColorimetryUtils::xyY colG = colVec[1];
128 KoColorimetryUtils::xyY colB = colVec[2];
129
130 str << " red: " << colR << Qt::endl;
131 str << " green:" << colG << Qt::endl;
132 str << " blue: " << colB << Qt::endl;
133 }
134
135 {
136 KoColorimetryUtils::xyY white = profile->getWhitePointxyY();
137
138 str << " white: " << white << Qt::endl;
139 str << Qt::endl;
140 }
141
142 } else {
143 str << "<none>" << Qt::endl;
144 }
145
146 str << "Compositor preferred surface description:";
147 if (m_d->interface->preferredSurfaceDescription()) {
148 str << Qt::endl;
149 str.noquote() << m_d->interface->preferredSurfaceDescription()->makeTextReport() << Qt::endl;
150 } else {
151 str << "<none>" << Qt::endl;
152 }
153 str << Qt::endl;
154
155 return report;
156}
#define KIS_SAFE_ASSERT_RECOVER_RETURN_VALUE(cond, val)
Definition kis_assert.h:129
static QString getTransferCharacteristicName(TransferCharacteristics curve)
getTransferCharacteristicName
static QString getColorPrimariesName(ColorPrimaries primaries)
getColorPrimariesName

References KoColorProfile::getColorPrimariesName(), KoColorProfile::getTransferCharacteristicName(), KIS_SAFE_ASSERT_RECOVER_RETURN_VALUE, and m_d.

◆ currentSurfaceDescription()

std::optional< KisSurfaceColorimetry::SurfaceDescription > KisCanvasSurfaceColorSpaceManager::currentSurfaceDescription ( ) const

Definition at line 178 of file KisCanvasSurfaceColorSpaceManager.cpp.

179{
180 return m_d->interface->preferredSurfaceDescription();
181}

References m_d.

◆ displayConfig()

KisDisplayConfig KisCanvasSurfaceColorSpaceManager::displayConfig ( ) const

Definition at line 469 of file KisCanvasSurfaceColorSpaceManager.cpp.

470{
471 return m_d->currentConfig;
472}

References m_d.

◆ isReady()

bool KisCanvasSurfaceColorSpaceManager::isReady ( ) const

Definition at line 464 of file KisCanvasSurfaceColorSpaceManager.cpp.

465{
466 return m_d->interface->isReady();
467}

References m_d.

◆ lastErrorString()

QString KisCanvasSurfaceColorSpaceManager::lastErrorString ( ) const

Non-empty string means there was an error with setting up the surface format

◆ osPreferredColorSpaceReport()

QString KisCanvasSurfaceColorSpaceManager::osPreferredColorSpaceReport ( ) const

Definition at line 158 of file KisCanvasSurfaceColorSpaceManager.cpp.

159{
160 QString report;
161 QDebug str(&report);
162
163 if (!m_d->interface->isReady()) {
164 str << "WARNING: surface color management interface is not ready!" << Qt::endl;
165 str << Qt::endl;
166 }
167
168 if (m_d->interface->preferredSurfaceDescription()) {
169 str << Qt::endl;
170 str.noquote() << m_d->interface->preferredSurfaceDescription()->makeTextReport() << Qt::endl;
171 } else {
172 str << "<none>" << Qt::endl;
173 }
174
175 return report;
176}

References m_d.

◆ Private()

KisCanvasSurfaceColorSpaceManager::Private ( KisSurfaceColorManagerInterface * interface)
inline

Definition at line 31 of file KisCanvasSurfaceColorSpaceManager.cpp.

◆ reinitializeSurfaceDescription()

void KisCanvasSurfaceColorSpaceManager::reinitializeSurfaceDescription ( const KisDisplayConfig::Options & newOptions)
private

Definition at line 390 of file KisCanvasSurfaceColorSpaceManager.cpp.

391{
396
397 RenderIntent preferredIntent =
398 Private::calculateConfigIntent(newOptions);
399
400 if (!m_d->interface->supportsRenderIntent(preferredIntent)) {
401 qWarning() << "WARNING: failed to set user preferred rendering"
402 << "intent for the surface, intent \""
403 << preferredIntent << "\" is unsupported, falling back to \"perceptual\"";
404
405 preferredIntent = RenderIntent::render_intent_perceptual;
406
407 // perceptual intent is guaranteed to be supported by the compositor
408 KIS_SAFE_ASSERT_RECOVER_RETURN(m_d->interface->supportsRenderIntent(preferredIntent));
409 }
410
411 std::optional<SurfaceDescription> requestedDescription;
412 const KoColorProfile *profile = nullptr;
413
414 if (m_d->surfaceMode == KisConfig::CanvasSurfaceMode::Unmanaged) {
416 m_d->lastErrorString.clear();
417 } else {
418 const auto compositorPreferred = m_d->interface->preferredSurfaceDescription();
419 KIS_SAFE_ASSERT_RECOVER_RETURN(compositorPreferred);
420
421 auto result = m_d->selectSurfaceDescription(m_d->surfaceMode, *compositorPreferred);
422 profile = result.profile;
423 requestedDescription = result.requestedDescription;
424 m_d->lastErrorString = result.errorMessage;
425 }
426
428 KIS_SAFE_ASSERT_RECOVER_RETURN(!requestedDescription || m_d->interface->supportsSurfaceDescription(*requestedDescription));
429
430 if (m_d->interface->surfaceDescription() != requestedDescription ||
431 m_d->interface->renderingIntent() != preferredIntent) {
432
433 if (requestedDescription) {
434 auto future = m_d->interface->setSurfaceDescription(*requestedDescription, preferredIntent);
435 future.then([this](QFuture<bool> result) {
436 if (!result.isValid() || !result.result()) {
437 QString errorMessage = "failed to set color space for the surface, setSurfaceDescription() returned false";
438 m_d->lastErrorString = errorMessage;
439 qWarning().nospace().noquote() << "ERROR: " << errorMessage;
440 }
441 });
442 } else {
443 m_d->interface->unsetSurfaceDescription();
444 }
445 }
446
447 const bool requestedDescriptionIsHDR = requestedDescription && requestedDescription->colorSpace.isHDR();
448
449 KisDisplayConfig newDisplayConfig;
450 newDisplayConfig.profile = profile;
451 newDisplayConfig.setOptions(newOptions); // TODO: think about failure to set the intent and infinite update loop
452 newDisplayConfig.isHDR = requestedDescriptionIsHDR;
453
454 KIS_SAFE_ASSERT_RECOVER(m_d->currentConfig.profile) {
455 m_d->currentConfig.profile = KoColorSpaceRegistry::instance()->p709SRGBProfile();
456 }
457
458 if (m_d->currentConfig != newDisplayConfig) {
459 m_d->currentConfig = newDisplayConfig;
460 Q_EMIT sigDisplayConfigChanged(m_d->currentConfig);
461 }
462}
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(cond)
Definition kis_assert.h:126
#define KIS_SAFE_ASSERT_RECOVER_RETURN(cond)
Definition kis_assert.h:128
void sigDisplayConfigChanged(const KisDisplayConfig &config)

References KoColorSpaceRegistry::instance(), KisDisplayConfig::isHDR, KIS_SAFE_ASSERT_RECOVER, KIS_SAFE_ASSERT_RECOVER_RETURN, m_d, KoColorSpaceRegistry::p709SRGBProfile(), KisDisplayConfig::profile, KisDisplayConfig::setOptions(), sigDisplayConfigChanged(), and KisConfig::Unmanaged.

◆ selectSurfaceDescription()

SurfaceFormatSelectionResult KisCanvasSurfaceColorSpaceManager::selectSurfaceDescription ( KisConfig::CanvasSurfaceMode surfaceMode,
const KisSurfaceColorimetry::SurfaceDescription & compositorPreferred )

◆ setDisplayConfigOptions() [1/2]

void KisCanvasSurfaceColorSpaceManager::setDisplayConfigOptions ( const KisConfig::CanvasSurfaceMode surfaceMode,
const KisDisplayConfig::Options & options )

Definition at line 211 of file KisCanvasSurfaceColorSpaceManager.cpp.

212{
213 if (!m_d->interface->isReady()) return;
214 if (surfaceMode == m_d->surfaceMode && options == m_d->currentConfig.options()) return;
215
216 m_d->surfaceMode = surfaceMode;
218}
void reinitializeSurfaceDescription(const KisDisplayConfig::Options &newOptions)

References m_d, reinitializeSurfaceDescription(), and surfaceMode.

◆ setDisplayConfigOptions() [2/2]

void KisCanvasSurfaceColorSpaceManager::setDisplayConfigOptions ( const KisDisplayConfig::Options & options)

Definition at line 220 of file KisCanvasSurfaceColorSpaceManager.cpp.

221{
222 setDisplayConfigOptions(m_d->surfaceMode, options);
223}
void setDisplayConfigOptions(const KisConfig::CanvasSurfaceMode surfaceMode, const KisDisplayConfig::Options &options)

References m_d, and setDisplayConfigOptions().

◆ sigDisplayConfigChanged

void KisCanvasSurfaceColorSpaceManager::sigDisplayConfigChanged ( const KisDisplayConfig & config)
signal

◆ slotInterfacePreferredDescriptionChanged

void KisCanvasSurfaceColorSpaceManager::slotInterfacePreferredDescriptionChanged ( )
privateslot

Definition at line 232 of file KisCanvasSurfaceColorSpaceManager.cpp.

233{
234 reinitializeSurfaceDescription(m_d->currentConfig.options());
235}

References m_d, and reinitializeSurfaceDescription().

◆ slotInterfaceReadyChanged

void KisCanvasSurfaceColorSpaceManager::slotInterfaceReadyChanged ( bool isReady)
privateslot

Definition at line 225 of file KisCanvasSurfaceColorSpaceManager.cpp.

226{
227 if (isReady) {
228 reinitializeSurfaceDescription(m_d->currentConfig.options());
229 }
230}

References isReady(), m_d, and reinitializeSurfaceDescription().

Member Data Documentation

◆ currentConfig

KisDisplayConfig KisCanvasSurfaceColorSpaceManager::currentConfig

Definition at line 34 of file KisCanvasSurfaceColorSpaceManager.cpp.

◆ interface

QScopedPointer<KisSurfaceColorManagerInterface> KisCanvasSurfaceColorSpaceManager::interface

Definition at line 33 of file KisCanvasSurfaceColorSpaceManager.cpp.

◆ lastErrorString

QString KisCanvasSurfaceColorSpaceManager::lastErrorString

Definition at line 37 of file KisCanvasSurfaceColorSpaceManager.cpp.

◆ m_d

QScopedPointer<Private> KisCanvasSurfaceColorSpaceManager::m_d
private

Definition at line 61 of file KisCanvasSurfaceColorSpaceManager.h.

◆ proofingIntentOverride

std::optional<KisSurfaceColorimetry::RenderIntent> KisCanvasSurfaceColorSpaceManager::proofingIntentOverride

Definition at line 35 of file KisCanvasSurfaceColorSpaceManager.cpp.

◆ surfaceMode

KisConfig::CanvasSurfaceMode KisCanvasSurfaceColorSpaceManager::surfaceMode = KisConfig::CanvasSurfaceMode::Preferred

Definition at line 36 of file KisCanvasSurfaceColorSpaceManager.cpp.


The documentation for this class was generated from the following files: