Krita Source Code Documentation
Loading...
Searching...
No Matches
KisProofingConfigModel.cpp
Go to the documentation of this file.
1/*
2 * SPDX-FileCopyrightText: 2024 Wolthera van Hövell tot Westerflier <griffinvalley@gmail.com>
3 *
4 * SPDX-License-Identifier: GPL-2.0-or-later
5 */
7#include <KisLager.h>
8#include <KisZug.h>
9#include <KisPortingUtils.h>
10
12#include <lager/lenses/tuple.hpp>
13#include <lager/constant.hpp>
14
15namespace {
16auto conversionFlag = [](KoColorConversionTransformation::ConversionFlag flag) {
17 return lager::lenses::getset(
18 [flag] (const KoColorConversionTransformation::ConversionFlags &value) -> bool {
19 return value.testFlag(flag);
20 },
21 [flag] (KoColorConversionTransformation::ConversionFlags value, const bool &val){
22 value.setFlag(flag, val);
23 return value;
24 }
25 );
26};
27
31{
32 return displayMode == KisProofingConfiguration::Monitor ? globalDisplayIntent:
33 displayMode == KisProofingConfiguration::Paper ?
35}
36
37CheckBoxState calcEffectiveUseBPCState(KisProofingConfiguration::DisplayTransformState displayMode,
38 KoColorConversionTransformation::Intent effectiveDisplayIntent,
39 bool localUseBPC,
40 bool globalUseBPC)
41{
43 return {false, false};
44 }
45
46 switch (displayMode) {
48 return {globalUseBPC, false};
50 return {false, false};
52 return {localUseBPC, true};
53 }
54
55 Q_UNREACHABLE_RETURN({false, false});
56}
57
58CheckBoxState calcEffectiveAdaptationSwitchState(KisProofingConfiguration::DisplayTransformState displayMode,
60 bool adaptationFlag)
61{
62 if (displayMode != KisProofingConfiguration::Custom) return {true, false};
63 if (intent != KoColorConversionTransformation::IntentAbsoluteColorimetric) return {true, false};
64 return {adaptationFlag, true};
65}
66
67ComboBoxState calcIntentComboBoxState(KoColorConversionTransformation::Intent intent, bool enabled)
68{
69 QStringList values;
70 QStringList toolTips;
71
72 values << i18nc("Color conversion intent", "Perceptual");
73 values << i18nc("Color conversion intent", "Relative Colorimetric");
74 values << i18nc("Color conversion intent", "Saturation");
75 values << i18nc("Color conversion intent", "Absolute Colorimetric");
76
77 // no tooltops for now
78#if QT_VERSION < QT_VERSION_CHECK(6, 0, 0)
79 toolTips << "" << "" << "" << "";
80#else
81 toolTips.resize(4);
82#endif
83
84 return {values, static_cast<int>(intent), enabled, toolTips};
85}
86
88{
89 QStringList values;
90 QStringList toolTips;
91
92 values << i18nc("Display Mode", "Use global display settings");
93 values << i18nc("Display Mode", "Simulate paper white and black");
94 values << i18nc("Display Mode", "Custom");
95
96 toolTips << i18nc("@info:tooltip", "Use Rendering Intent, Blackpoint compensation and Adaptation set in the color management configuration.");
97 toolTips << i18nc("@info:tooltip", "Simulate paper by using absolute colorimetric and disabling white point adaptation and blackpoint compensation.");
98 toolTips << i18nc("@info:tooltip", "Select custom settings for the second transform.");
99
100 return {values, static_cast<int>(mode), true, toolTips};
101}
102
103}
104
105KisProofingConfigModel::KisProofingConfigModel(lager::cursor<KisProofingConfiguration> _data)
106 : data(_data)
108 , LAGER_QT(proofingSpaceTuple) {
109 lager::with(
113 )
114 }
115
117 , LAGER_QT(conversionIntentState) {
118 lager::with(
119 LAGER_QT(conversionIntent),
120 lager::make_constant(true))
121 .map(&calcIntentComboBoxState)
122 }
123
125
126 , LAGER_QT(displayTransformMode) {data[&KisProofingConfiguration::displayMode]}
127 , LAGER_QT(displayTransformModeState) {
128 LAGER_QT(displayTransformMode)
129 .map(&calcModeComboBoxState)
130 }
131
132 , LAGER_QT(enableCustomDisplayConfig) {
133 LAGER_QT(displayTransformMode)
134 .xform(kiszug::map_equal<int>(KisProofingConfiguration::Custom))}
135
137 , LAGER_QT(effectiveDisplayIntent) {
138 lager::with(LAGER_QT(displayTransformMode),
139 LAGER_QT(displayIntent),
140 displayConfigOptions
141 .zoom(lager::lenses::first))
142 .map(&calcEffectiveDisplayIntent)
143 }
144 , LAGER_QT(effectiveDisplayIntentState) {
145 lager::with(
146 LAGER_QT(effectiveDisplayIntent),
147 LAGER_QT(enableCustomDisplayConfig))
148 .map(&calcIntentComboBoxState)
149 }
150
152 , LAGER_QT(effectiveDispBlackPointCompensationState) {
153 lager::with(LAGER_QT(displayTransformMode),
154 LAGER_QT(effectiveDisplayIntent),
155 LAGER_QT(dispBlackPointCompensation),
156 displayConfigOptions
157 .zoom(lager::lenses::second)
159 .map(&calcEffectiveUseBPCState)
160 }
161
167 , LAGER_QT(adaptationSwitchState) {
168 lager::with(LAGER_QT(displayTransformMode),
169 LAGER_QT(displayIntent),
170 LAGER_QT(adaptationSwitch)).map(&calcEffectiveAdaptationSwitchState)
171 }
172{
173 lager::watch(data, std::bind(&KisProofingConfigModel::modelChanged, this));
174 lager::watch(displayConfigOptions, std::bind(&KisProofingConfigModel::modelChanged, this));
175}
176
180
182{
183 if (displayConfigOptions.get() == options) return;
184 displayConfigOptions.set(options);
185}
186
187void KisProofingConfigModel::setProofingColorSpaceIdAtomic(const QString &model, const QString &depth, const QString &profile)
188{
189 data.update([&] (KisProofingConfiguration config) {
190 config.proofingModel = model;
191 config.proofingDepth = depth;
192 config.proofingProfile = profile;
193 return config;
194 });
195}
float value(const T *src, size_t ch)
LAGER_QT(proofingSpaceTuple)
std::pair< KoColorConversionTransformation::Intent, KoColorConversionTransformation::ConversionFlags > Options
void setProofingColorSpaceIdAtomic(const QString &model, const QString &depth, const QString &profile)
lager::state< KisDisplayConfig::Options, lager::automatic_tag > displayConfigOptions
lager::cursor< KisProofingConfiguration > data
void updateDisplayConfigOptions(KisDisplayConfig::Options options)
KisProofingConfigModel(lager::cursor< KisProofingConfiguration > _data=lager::make_state(KisProofingConfiguration(), lager::automatic_tag{}))
The KisProofingConfiguration struct Little struct that stores the proofing configuration for a given ...
DisplayTransformState displayMode
@ Custom
Let artists configure their own.
@ Paper
Whether to use Paper settings (absolute colorimetric, 0% adaptation.)
@ Monitor
Whether to use monitor rendering intent and flags for the second transform.
KoColorConversionTransformation::Intent displayIntent
This is the intent for the second transform.
KoColorConversionTransformation::Intent conversionIntent
This is the intent for the first transform.
bool useBlackPointCompensationFirstTransform
Whether to use BCP on the first transform. All other flags are handled by displayFlags;.
KoColorConversionTransformation::ConversionFlags displayFlags
flags for the second transform.
constexpr auto logical_not
Definition KisLager.h:114