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

#include <KisMultiSurfaceStateManager.h>

Classes

struct  State
 

Public Member Functions

State createInitializingConfig (bool isCanvasOpenGL, int screenId, KisProofingConfigurationSP proofingConfig) const
 
 KisMultiSurfaceStateManager ()
 
State onCanvasSurfaceFormatChanged (const State &oldState, const KisDisplayConfig &canvasConfig) const
 
State onConfigChanged (const State &oldState, int screenId, KisConfig::CanvasSurfaceMode surfaceMode, const KisDisplayConfig::Options &options) const
 
State onGuiSurfaceFormatChanged (const State &oldState, const KoColorProfile *uiProfile) const
 
State onProofingChanged (const State &oldState, KisProofingConfigurationSP proofingConfig) const
 
State onScreenChanged (const State &oldState, int screenId) const
 
 ~KisMultiSurfaceStateManager ()
 

Private Member Functions

KisDisplayConfig::Options overriddenWithProofingConfig (const KisDisplayConfig::Options &options, KisProofingConfigurationSP proofingConfig) const
 

Detailed Description

On some systems the canvas may have a surface format different from the rest of the GUI. This class help to manage the state of both the surfaces, GUI and canvas ones in an atomic way using value-based semantics.

Every incoming event accept the current state and transitions it forward into a new state that is returned from the function. The calling code should only check for the changes and apply the said changes to the actual consumers: KisDisplayColorConverter, KisOpenGLCanvas2 and KisCanvasSurfaceColorSpaceManager.

Handling the state in a value-based atomic way allows us to avoid weird flow of updates between different consumers. Such flows are almost impossible to manage externally because we have three different canvas managemend modes:

1) Legacy HDR mode (the one used on Windows), where the whole main window's surface is switched into the HDR space and compositing happens indide Qt

2) Wayland-style HDR mode, where the canvas has its own surface, which color space is managed by OS

3) Unmanaged mode, where we assume OS just passes color data directly to the GPU, so we perform all the color management ourselves.

Definition at line 51 of file KisMultiSurfaceStateManager.h.

Constructor & Destructor Documentation

◆ KisMultiSurfaceStateManager()

KisMultiSurfaceStateManager::KisMultiSurfaceStateManager ( )

Definition at line 17 of file KisMultiSurfaceStateManager.cpp.

18{
19}

◆ ~KisMultiSurfaceStateManager()

KisMultiSurfaceStateManager::~KisMultiSurfaceStateManager ( )

Definition at line 21 of file KisMultiSurfaceStateManager.cpp.

22{
23}

Member Function Documentation

◆ createInitializingConfig()

KisMultiSurfaceStateManager::State KisMultiSurfaceStateManager::createInitializingConfig ( bool isCanvasOpenGL,
int screenId,
KisProofingConfigurationSP proofingConfig ) const

Definition at line 32 of file KisMultiSurfaceStateManager.cpp.

33{
34 State state;
35 KisMultiSurfaceDisplayConfig &multiConfig = state.multiConfig;
36
37 state.isCanvasOpenGL = isCanvasOpenGL;
38
39 KisConfig cfg(true);
40
41 state.optionsFromConfig = KisDisplayConfig::optionsFromKisConfig(cfg);
42 state.surfaceMode = cfg.canvasSurfaceColorSpaceManagementMode();
43 state.proofingConfig = proofingConfig;
44
45 if (KisOpenGLModeProber::instance()->useHDRMode()) {
46 multiConfig.canvasProfile = state.isCanvasOpenGL
50
51 } else if (KisPlatformPluginInterfaceFactory::instance()->surfaceColorManagedByOS()) {
52#if KRITA_USE_SURFACE_COLOR_MANAGEMENT_API
53 KIS_SAFE_ASSERT_RECOVER_NOOP(m_rootSurfaceInfoProxy);
54 if (m_rootSurfaceInfoProxy) {
55 multiConfig.canvasProfile = m_rootSurfaceInfoProxy->rootSurfaceProfile();
56 multiConfig.uiProfile = m_rootSurfaceInfoProxy->rootSurfaceProfile();
57 }
58#else
59 KIS_SAFE_ASSERT_RECOVER_NOOP(0 && "managed surface mode is active, but Krita is compiled without it!");
62#endif /* KRITA_USE_SURFACE_COLOR_MANAGEMENT_API */
63 } else {
64 const KoColorProfile *profile = cfg.displayProfile(screenId);
67 }
68
69 multiConfig.canvasProfile = profile;
70 multiConfig.uiProfile = profile;
71 }
72
73 multiConfig.setOptions(overriddenWithProofingConfig(state.optionsFromConfig, state.proofingConfig));
74 multiConfig.isCanvasHDR = false;
75
76 return state;
77}
static Options optionsFromKisConfig(const KisConfig &cfg)
void setOptions(const Options &options)
const KoColorProfile * uiProfile
const KoColorProfile * canvasProfile
KisDisplayConfig::Options overriddenWithProofingConfig(const KisDisplayConfig::Options &options, KisProofingConfigurationSP proofingConfig) const
static KisOpenGLModeProber * instance()
const KoColorProfile * rootSurfaceColorProfile() const
static KisPlatformPluginInterfaceFactory * instance()
#define KIS_SAFE_ASSERT_RECOVER(cond)
Definition kis_assert.h:126
#define KIS_SAFE_ASSERT_RECOVER_NOOP(cond)
Definition kis_assert.h:130
static KoColorSpaceRegistry * instance()
const KoColorProfile * p709SRGBProfile() const

References KisMultiSurfaceDisplayConfig::canvasProfile, KisConfig::canvasSurfaceColorSpaceManagementMode(), KisConfig::displayProfile(), KoColorSpaceRegistry::instance(), KisPlatformPluginInterfaceFactory::instance(), KisOpenGLModeProber::instance(), KisMultiSurfaceDisplayConfig::isCanvasHDR, KisMultiSurfaceStateManager::State::isCanvasOpenGL, KIS_SAFE_ASSERT_RECOVER, KIS_SAFE_ASSERT_RECOVER_NOOP, KisMultiSurfaceStateManager::State::multiConfig, KisMultiSurfaceStateManager::State::optionsFromConfig, KisDisplayConfig::optionsFromKisConfig(), overriddenWithProofingConfig(), KoColorSpaceRegistry::p709SRGBProfile(), KisMultiSurfaceStateManager::State::proofingConfig, KisOpenGLModeProber::rootSurfaceColorProfile(), KisMultiSurfaceDisplayConfig::setOptions(), KisMultiSurfaceStateManager::State::surfaceMode, and KisMultiSurfaceDisplayConfig::uiProfile.

◆ onCanvasSurfaceFormatChanged()

KisMultiSurfaceStateManager::State KisMultiSurfaceStateManager::onCanvasSurfaceFormatChanged ( const State & oldState,
const KisDisplayConfig & canvasConfig ) const

Surface changed signal is possible only for the managed surface under an openGL canvas. In legacy HDR mode it is not possible to get that.

Definition at line 79 of file KisMultiSurfaceStateManager.cpp.

81{
86 KIS_SAFE_ASSERT_RECOVER_RETURN_VALUE(oldState.isCanvasOpenGL, oldState);
87
88 // the surface format change should not change the conversion
89 // options of the surface
90 // TODO: downgrade to a warning!
91 KIS_SAFE_ASSERT_RECOVER_NOOP(oldState.multiConfig.options() == canvasConfig.options());
92
93 State newState = oldState;
94 KisMultiSurfaceDisplayConfig &newMultiConfig = newState.multiConfig;
95
96 newMultiConfig.canvasProfile = canvasConfig.profile;
97 newMultiConfig.setOptions(canvasConfig.options());
98 newMultiConfig.isCanvasHDR = canvasConfig.isHDR;
99
100 return newState;
101}
Options options() const
const KoColorProfile * profile
#define KIS_SAFE_ASSERT_RECOVER_RETURN_VALUE(cond, val)
Definition kis_assert.h:129

References KisMultiSurfaceDisplayConfig::canvasProfile, KisPlatformPluginInterfaceFactory::instance(), KisOpenGLModeProber::instance(), KisMultiSurfaceDisplayConfig::isCanvasHDR, KisMultiSurfaceStateManager::State::isCanvasOpenGL, KisDisplayConfig::isHDR, KIS_SAFE_ASSERT_RECOVER_NOOP, KIS_SAFE_ASSERT_RECOVER_RETURN_VALUE, KisMultiSurfaceStateManager::State::multiConfig, KisDisplayConfig::options(), KisMultiSurfaceDisplayConfig::options(), KisDisplayConfig::profile, and KisMultiSurfaceDisplayConfig::setOptions().

◆ onConfigChanged()

KisMultiSurfaceStateManager::State KisMultiSurfaceStateManager::onConfigChanged ( const State & oldState,
int screenId,
KisConfig::CanvasSurfaceMode surfaceMode,
const KisDisplayConfig::Options & options ) const

Definition at line 126 of file KisMultiSurfaceStateManager.cpp.

130{
131 State newState = oldState;
132 newState.surfaceMode = surfaceMode;
133 newState.optionsFromConfig = options;
134 newState.multiConfig.setOptions(
135 overriddenWithProofingConfig(newState.optionsFromConfig, newState.proofingConfig));
136
137 if (!KisOpenGLModeProber::instance()->useHDRMode() &&
138 !KisPlatformPluginInterfaceFactory::instance()->surfaceColorManagedByOS()) {
139
140 KisConfig cfg(true);
141 const KoColorProfile *profile = cfg.displayProfile(screenId);
142 KIS_SAFE_ASSERT_RECOVER(profile) {
144 }
145 newState.multiConfig.canvasProfile = profile;
146 newState.multiConfig.uiProfile = profile;
147 }
148
149 return newState;
150}

References KisMultiSurfaceDisplayConfig::canvasProfile, KisConfig::displayProfile(), KoColorSpaceRegistry::instance(), KisPlatformPluginInterfaceFactory::instance(), KisOpenGLModeProber::instance(), KIS_SAFE_ASSERT_RECOVER, KisMultiSurfaceStateManager::State::multiConfig, KisMultiSurfaceStateManager::State::optionsFromConfig, overriddenWithProofingConfig(), KoColorSpaceRegistry::p709SRGBProfile(), KisMultiSurfaceStateManager::State::proofingConfig, KisMultiSurfaceDisplayConfig::setOptions(), KisMultiSurfaceStateManager::State::surfaceMode, and KisMultiSurfaceDisplayConfig::uiProfile.

◆ onGuiSurfaceFormatChanged()

KisMultiSurfaceStateManager::State KisMultiSurfaceStateManager::onGuiSurfaceFormatChanged ( const State & oldState,
const KoColorProfile * uiProfile ) const

Surface changed signal is possible only on OS with managed surface color space

Definition at line 103 of file KisMultiSurfaceStateManager.cpp.

105{
110
111 State newState = oldState;
112 newState.multiConfig.uiProfile = uiProfile;
113
114 return newState;
115}

References KisPlatformPluginInterfaceFactory::instance(), KisOpenGLModeProber::instance(), KIS_SAFE_ASSERT_RECOVER_RETURN_VALUE, KisMultiSurfaceStateManager::State::multiConfig, and KisMultiSurfaceDisplayConfig::uiProfile.

◆ onProofingChanged()

KisMultiSurfaceStateManager::State KisMultiSurfaceStateManager::onProofingChanged ( const State & oldState,
KisProofingConfigurationSP proofingConfig ) const

Definition at line 117 of file KisMultiSurfaceStateManager.cpp.

118{
119 State newState = oldState;
120 newState.proofingConfig = proofingConfig;
121 newState.multiConfig.setOptions(
122 overriddenWithProofingConfig(newState.optionsFromConfig, newState.proofingConfig));
123 return newState;
124}

References KisMultiSurfaceStateManager::State::multiConfig, KisMultiSurfaceStateManager::State::optionsFromConfig, overriddenWithProofingConfig(), KisMultiSurfaceStateManager::State::proofingConfig, and KisMultiSurfaceDisplayConfig::setOptions().

◆ onScreenChanged()

KisMultiSurfaceStateManager::State KisMultiSurfaceStateManager::onScreenChanged ( const State & oldState,
int screenId ) const

Definition at line 152 of file KisMultiSurfaceStateManager.cpp.

153{
154 if (KisOpenGLModeProber::instance()->useHDRMode() ||
155 KisPlatformPluginInterfaceFactory::instance()->surfaceColorManagedByOS()) {
156 return oldState;
157 }
158
159 return onConfigChanged(oldState, screenId, oldState.surfaceMode, oldState.optionsFromConfig);
160}
State onConfigChanged(const State &oldState, int screenId, KisConfig::CanvasSurfaceMode surfaceMode, const KisDisplayConfig::Options &options) const

References KisPlatformPluginInterfaceFactory::instance(), KisOpenGLModeProber::instance(), onConfigChanged(), KisMultiSurfaceStateManager::State::optionsFromConfig, and KisMultiSurfaceStateManager::State::surfaceMode.

◆ overriddenWithProofingConfig()

KisDisplayConfig::Options KisMultiSurfaceStateManager::overriddenWithProofingConfig ( const KisDisplayConfig::Options & options,
KisProofingConfigurationSP proofingConfig ) const
private

Definition at line 162 of file KisMultiSurfaceStateManager.cpp.

163{
164 if (proofingConfig && proofingConfig->displayFlags.testFlag(KoColorConversionTransformation::SoftProofing)) {
165 return { proofingConfig->determineDisplayIntent(options.first),
166 proofingConfig->determineDisplayFlags(options.second) };
167 }
168
169 return options;
170}

References KoColorConversionTransformation::SoftProofing.


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