Krita Source Code Documentation
Loading...
Searching...
No Matches
lutdocker_dock.cpp
Go to the documentation of this file.
1/*
2 * SPDX-FileCopyrightText: 2004 Boudewijn Rempt <boud@valdyas.org>
3 * SPDX-FileCopyrightText: 2021 L. E. Segovia <amy@amyspark.me>
4 *
5 * SPDX-License-Identifier: GPL-2.0-or-later
6 */
7
8#include "lutdocker_dock.h"
9#include <config-hdr.h>
10
11#include <sstream>
12
13#include <QLayout>
14#include <QPixmap>
15#include <QPainter>
16#include <QFormLayout>
17#include <QCheckBox>
18#include <QApplication>
19#include <QScreen>
20#include <QDir>
21
22
23#include <klocalizedstring.h>
24
25#include <KisMainWindow.h>
26#include <KoFileDialog.h>
27#include <KoChannelInfo.h>
28#include <KoColorSpace.h>
29#include <KoColorSpaceFactory.h>
30#include <KoColorProfile.h>
32
33#include "kis_icon_utils.h"
34#include <KisViewManager.h>
35#include <KisDocument.h>
36#include <kis_config.h>
37#include <kis_canvas2.h>
39#include <kis_config_notifier.h>
40#include <kis_image.h>
41#include <KisSqueezedComboBox.h>
42#include "kis_signals_blocker.h"
43#include "krita_utils.h"
45
48
50
51
52OCIO::ConstConfigRcPtr defaultRawProfile()
53{
57 const char * INTERNAL_RAW_PROFILE =
58 "ocio_profile_version: 1\n"
59 "strictparsing: false\n"
60 "roles:\n"
61 " default: raw\n"
62 "displays:\n"
63 " sRGB:\n"
64 " - !<View> {name: Raw, colorspace: raw}\n"
65 "colorspaces:\n"
66 " - !<ColorSpace>\n"
67 " name: raw\n"
68 " family: raw\n"
69 " equalitygroup:\n"
70 " bitdepth: 32f\n"
71 " isdata: true\n"
72 " allocation: uniform\n"
73 " description: 'A raw color space. Conversions to and from this space are no-ops.'\n";
74
75
76 std::istringstream istream;
77 istream.str(INTERNAL_RAW_PROFILE);
78 return OCIO::Config::CreateFromStream(istream);
79}
80
82 : QDockWidget(i18n("LUT Management"))
83 , m_canvas(0)
84{
85 using namespace std::placeholders; // For _1
90
91 m_page = new QWidget(this);
92 setupUi(m_page);
93 setWidget(m_page);
94
95 KisConfig cfg(true);
96 m_chkUseOcio->setChecked(cfg.useOcio());
97 connect(m_chkUseOcio, SIGNAL(toggled(bool)), SLOT(updateDisplaySettings()));
98 connect(m_colorManagement, SIGNAL(currentIndexChanged(int)), SLOT(slotColorManagementModeChanged()));
99
100 m_bnSelectConfigurationFile->setToolTip(i18n("Select custom configuration file."));
101 connect(m_bnSelectConfigurationFile,SIGNAL(clicked()), SLOT(selectOcioConfiguration()));
102
103 KisOcioConfiguration ocioOptions = cfg.ocioConfiguration();
104 m_txtConfigurationPath->setText(ocioOptions.configurationPath);
105 m_txtLut->setText(ocioOptions.lutPath);
106
107 m_bnSelectLut->setToolTip(i18n("Select LUT file"));
108 connect(m_bnSelectLut, SIGNAL(clicked()), SLOT(selectLut()));
109 connect(m_bnClearLut, SIGNAL(clicked()), SLOT(clearLut()));
110
111 // See https://groups.google.com/group/ocio-dev/browse_thread/thread/ec95c5f54a74af65 -- maybe need to be reinstated
112 // when people ask for it.
113 m_lblLut->hide();
114 m_txtLut->hide();
115 m_bnSelectLut->hide();
116 m_bnClearLut->hide();
117
118 connect(m_cmbDisplayDevice, SIGNAL(currentIndexChanged(int)), SLOT(refillViewCombobox()));
119
120 m_exposureDoubleWidget->setToolTip(i18n("Select the exposure (stops) for HDR images."));
121 m_exposureDoubleWidget->setRange(-10.0, 10.0, 2);
122 m_exposureDoubleWidget->setValue(0.0);
123 m_exposureDoubleWidget->setSingleStep(0.25);
124
125 connect(m_exposureDoubleWidget, QOverload<double>::of(&KisDoubleSliderSpinBox::valueChanged),
126 [this](double value){ m_exposureCompressor->start(value); });
127
128 // Gamma needs to be exponential (gamma *= 1.1f, gamma /= 1.1f as steps)
129
130 m_gammaDoubleWidget->setToolTip(i18n("Select the amount of gamma modification for display. This does not affect the pixels of your image."));
131 m_gammaDoubleWidget->setRange(0.1, 5.0, 2);
132 m_gammaDoubleWidget->setValue(1.0);
133 m_gammaDoubleWidget->setSingleStep(0.1);
134
135 connect(m_gammaDoubleWidget, QOverload<double>::of(&KisDoubleSliderSpinBox::valueChanged),
136 [this](double value){ m_gammaCompressor->start(value); });
137
139
140 connect(m_bwPointChooser, SIGNAL(sigBlackPointChanged(qreal)), SLOT(updateDisplaySettings()));
141 connect(m_bwPointChooser, SIGNAL(sigWhitePointChanged(qreal)), SLOT(updateDisplaySettings()));
142
143 connect(m_btnConvertCurrentColor, SIGNAL(toggled(bool)), SLOT(updateDisplaySettings()));
144 connect(m_btmShowBWConfiguration, SIGNAL(clicked()), SLOT(slotShowBWConfiguration()));
146
147 connect(m_cmbInputColorSpace, SIGNAL(currentIndexChanged(int)), SLOT(updateDisplaySettings()));
148 connect(m_cmbDisplayDevice, SIGNAL(currentIndexChanged(int)), SLOT(updateDisplaySettings()));
149 connect(m_cmbView, SIGNAL(currentIndexChanged(int)), SLOT(updateDisplaySettings()));
150 connect(m_cmbLook, SIGNAL(currentIndexChanged(int)), SLOT(updateDisplaySettings()));
151 connect(m_cmbComponents, SIGNAL(currentIndexChanged(int)), SLOT(updateDisplaySettings()));
152
153 connect(KisConfigNotifier::instance(), SIGNAL(configChanged()), SLOT(resetOcioConfiguration()));
154
156}
157
161
163{
164 if (m_canvas) {
165 m_canvas->disconnect(this);
166 }
167
168 setEnabled(_canvas != 0);
169
170 if (KisCanvas2* canvas = dynamic_cast<KisCanvas2*>(_canvas)) {
171 m_canvas = canvas;
172 if (m_canvas) {
173 if (!m_canvas->displayFilter()) {
176 }
177 else {
178 m_displayFilter = m_canvas->displayFilter();
179 OcioDisplayFilter *displayFilter = qobject_cast<OcioDisplayFilter*>(m_displayFilter.data());
180 Q_ASSERT(displayFilter);
181 m_ocioConfig = displayFilter->config;
182 KisSignalsBlocker exposureBlocker(m_exposureDoubleWidget);
183 m_exposureDoubleWidget->setValue(displayFilter->exposure);
184 KisSignalsBlocker gammaBlocker(m_gammaDoubleWidget);
185 m_gammaDoubleWidget->setValue(displayFilter->gamma);
186 KisSignalsBlocker componentsBlocker(m_cmbComponents);
187 m_cmbComponents->setCurrentIndex((int)displayFilter->swizzle);
191 }
192
193 connect(m_canvas->image(), SIGNAL(sigColorSpaceChanged(const KoColorSpace*)), SLOT(slotImageColorSpaceChanged()), Qt::UniqueConnection);
194 connect(m_canvas->viewManager()->mainWindow(), SIGNAL(themeChanged()), SLOT(slotUpdateIcons()), Qt::UniqueConnection);
195
196 }
197 }
198}
199
201{
202 m_canvas = 0;
203 setEnabled(false);
205}
206
208{
209 m_btnConvertCurrentColor->setIcon(KisIconUtils::loadIcon("krita_tool_freehand"));
210 m_btmShowBWConfiguration->setIcon(KisIconUtils::loadIcon("settings-button"));
211 m_lblOcioVersion->setText(QString("OCIO: %1 | %2").arg(OCIO_VERSION_FULL_STR, KisOpenGL::currentDriver()));
212 m_lblOcioVersion->setWordWrap(true);
213 m_lblOcioVersion->setEnabled(false);
214}
215
217{
218 m_bwPointChooser->showPopup(m_btmShowBWConfiguration->mapToGlobal(QPoint()));
219}
220
222{
223 if (!m_chkUseOcio->isChecked() || !m_ocioConfig) return false;
224
225 const bool externalColorManagementEnabled =
226 m_colorManagement->currentIndex() != (int)KisOcioConfiguration::INTERNAL;
227
228
229#ifdef HAVE_HDR
230 KisSurfaceColorSpaceWrapper currentColorSpace =
232 KisOpenGLModeProber::instance()->surfaceformatInUse().colorSpace());
233#endif
234
235 const bool exposureManagementEnabled =
236 externalColorManagementEnabled
237#ifdef HAVE_HDR
239#endif
240 ;
241
242 return exposureManagementEnabled;
243}
244
246{
247 if (!m_displayFilter) return 0.0;
248 OcioDisplayFilter *displayFilter = qobject_cast<OcioDisplayFilter*>(m_displayFilter.data());
249 return canChangeExposureAndGamma() ? displayFilter->exposure : 0.0;
250}
251
253{
254 if (!canChangeExposureAndGamma()) return;
255 m_exposureDoubleWidget->setValue(value);
256 if(m_canvas) {
257 m_canvas->viewManager()->showFloatingMessage(
258 i18nc("floating message about exposure", "Exposure: %1",
259 KritaUtils::prettyFormatReal(m_exposureDoubleWidget->value())),
260 QIcon(), 500, KisFloatingMessage::Low);
261 }
262}
263
265{
266 if (!m_displayFilter) return 1.0;
267 OcioDisplayFilter *displayFilter = qobject_cast<OcioDisplayFilter*>(m_displayFilter.data());
268 return canChangeExposureAndGamma() ? displayFilter->gamma : 1.0;
269}
270
272{
273 if (!canChangeExposureAndGamma()) return;
274 m_gammaDoubleWidget->setValue(value);
275 if (m_canvas) {
276 m_canvas->viewManager()->showFloatingMessage(
277 i18nc("floating message about gamma", "Gamma: %1",
278 KritaUtils::prettyFormatReal(m_gammaDoubleWidget->value())),
279 QIcon(), 500, KisFloatingMessage::Low);
280 }
281}
282
289
291{
292 if (m_canvas) {
293 m_canvas->viewManager()->canvasResourceProvider()->setHDRExposure(exposure);
295 }
296}
297
299{
300 if (m_canvas) {
301 m_canvas->viewManager()->canvasResourceProvider()->setHDRGamma(gamma);
303 }
304}
305
307{
308 bool canDoExternalColorCorrection = false;
309
310 if (m_canvas) {
311 KisImageSP image = m_canvas->viewManager()->image();
312 canDoExternalColorCorrection =
314 }
315
316 if (!canDoExternalColorCorrection) {
317 KisSignalsBlocker colorManagementBlocker(m_colorManagement);
318 Q_UNUSED(colorManagementBlocker);
319 m_colorManagement->setCurrentIndex((int) KisOcioConfiguration::INTERNAL);
320 }
321
322 const bool ocioEnabled = m_chkUseOcio->isChecked();
323 m_colorManagement->setEnabled(ocioEnabled && canDoExternalColorCorrection);
324
325 const bool externalColorManagementEnabled =
326 m_colorManagement->currentIndex() != (int)KisOcioConfiguration::INTERNAL;
327
328 m_lblInputColorSpace->setEnabled(ocioEnabled && externalColorManagementEnabled);
329 m_cmbInputColorSpace->setEnabled(ocioEnabled && externalColorManagementEnabled);
330 m_lblDisplayDevice->setEnabled(ocioEnabled && externalColorManagementEnabled);
331 m_cmbDisplayDevice->setEnabled(ocioEnabled && externalColorManagementEnabled);
332 m_lblView->setEnabled(ocioEnabled && externalColorManagementEnabled);
333 m_cmbView->setEnabled(ocioEnabled && externalColorManagementEnabled);
334 m_lblLook->setEnabled(ocioEnabled && externalColorManagementEnabled);
335 m_cmbLook->setEnabled(ocioEnabled && externalColorManagementEnabled);
336
337 const bool exposureManagementEnabled = canChangeExposureAndGamma();
338
339 m_exposureDoubleWidget->setEnabled(exposureManagementEnabled);
340 m_gammaDoubleWidget->setEnabled(exposureManagementEnabled);
341 m_lblExposure->setEnabled(exposureManagementEnabled);
342 m_lblGamma->setEnabled(exposureManagementEnabled);
343
344 QString exposureToolTip;
345
346 if (!exposureManagementEnabled) {
347 exposureToolTip = i18nc("@info:tooltip", "Exposure and Gamma corrections are disabled in Internal mode. Switch to OCIO mode to use them");
348 }
349 m_exposureDoubleWidget->setToolTip(exposureToolTip);
350 m_gammaDoubleWidget->setToolTip(exposureToolTip);
351 m_lblExposure->setToolTip(exposureToolTip);
352 m_lblGamma->setToolTip(exposureToolTip);
353
354 bool enableConfigPath = m_colorManagement->currentIndex() == (int) KisOcioConfiguration::OCIO_CONFIG;
355
356 lblConfig->setEnabled(ocioEnabled && enableConfigPath);
357 m_txtConfigurationPath->setEnabled(ocioEnabled && enableConfigPath);
358 m_bnSelectConfigurationFile->setEnabled(ocioEnabled && enableConfigPath);
359}
360
362{
363 if (!m_canvas || !m_canvas->viewManager() || !m_canvas->viewManager()->image()) {
364 return;
365 }
366
369
370 if (m_chkUseOcio->isChecked() && m_ocioConfig) {
371 KIS_SAFE_ASSERT_RECOVER_NOOP(!m_canvas->displayFilter() ||
372 m_canvas->displayFilter() == m_displayFilter);
373
374 if (!m_displayFilter) {
376 m_canvas->displayFilter() ?
377 m_canvas->displayFilter() :
379 }
380
381 OcioDisplayFilter *displayFilter = qobject_cast<OcioDisplayFilter*>(m_displayFilter.data());
382 displayFilter->config = m_ocioConfig;
383 displayFilter->inputColorSpaceName = m_ocioConfig->getColorSpaceNameByIndex(m_cmbInputColorSpace->currentIndex());
384 displayFilter->displayDevice = m_ocioConfig->getDisplay(m_cmbDisplayDevice->currentIndex());
385 displayFilter->view = m_ocioConfig->getView(displayFilter->displayDevice, m_cmbView->currentIndex());
386 displayFilter->look = m_ocioConfig->getLookNameByIndex(m_cmbLook->currentIndex());
387 displayFilter->gamma = m_gammaDoubleWidget->isEnabled() ? m_gammaDoubleWidget->value() : 1.0;
388 displayFilter->exposure = m_exposureDoubleWidget->isEnabled() ? m_exposureDoubleWidget->value() : 0.0;
389 displayFilter->swizzle = (OCIO_CHANNEL_SWIZZLE)m_cmbComponents->currentIndex();
390
391 displayFilter->blackPoint = m_bwPointChooser->blackPoint();
392 displayFilter->whitePoint = m_bwPointChooser->whitePoint();
393
394 displayFilter->forceInternalColorManagement =
395 m_colorManagement->currentIndex() == (int)KisOcioConfiguration::INTERNAL;
396
397 displayFilter->setLockCurrentColorVisualRepresentation(m_btnConvertCurrentColor->isChecked());
398
399 displayFilter->updateProcessor();
400 m_canvas->setDisplayFilter(m_displayFilter);
401 }
402 else {
403 m_canvas->setDisplayFilter(QSharedPointer<KisDisplayFilter>(0));
404 }
405 m_canvas->updateCanvas();
406}
407
409{
410 KisOcioConfiguration ocioOptions;
411 ocioOptions.mode = (KisOcioConfiguration::Mode)m_colorManagement->currentIndex();
412 ocioOptions.configurationPath = m_txtConfigurationPath->text();
413 ocioOptions.lutPath = m_txtLut->text();
414 ocioOptions.inputColorSpace = m_cmbInputColorSpace->currentUnsqueezedText();
415 ocioOptions.displayDevice = m_cmbDisplayDevice->currentUnsqueezedText();
416 ocioOptions.displayView = m_cmbView->currentUnsqueezedText();
417 ocioOptions.look = m_cmbLook->currentUnsqueezedText();
418
419 KisConfig cfg(false);
420 cfg.setUseOcio(m_chkUseOcio->isChecked());
421 cfg.setOcioConfiguration(ocioOptions);
422 cfg.setOcioLockColorVisualRepresentation(m_btnConvertCurrentColor->isChecked());
423}
424
431
433{
434 QString filename = m_txtConfigurationPath->text();
435
436 KoFileDialog dialog(this, KoFileDialog::OpenFile, "lutdocker");
437 dialog.setCaption(i18n("Select OpenColorIO Configuration"));
438 dialog.setDefaultDir(QDir::cleanPath(filename.isEmpty() ? QDir::homePath() : filename));
439 dialog.setMimeTypeFilters(QStringList() << "application/x-opencolorio-configuration");
440 filename = dialog.filename();
441 QFile f(filename);
442 if (f.exists()) {
443 m_txtConfigurationPath->setText(filename);
446 }
447}
448
450{
451 KisConfig cfg(true);
452 KisOcioConfiguration ocioOptions = cfg.ocioConfiguration();
453 m_ocioConfig.reset();
454
455 try {
456 if (ocioOptions.mode == KisOcioConfiguration::INTERNAL) {
458 } else if (ocioOptions.mode == KisOcioConfiguration::OCIO_ENVIRONMENT) {
459 m_ocioConfig = OCIO::Config::CreateFromEnv();
460 }
461 else if (ocioOptions.mode == KisOcioConfiguration::OCIO_CONFIG) {
462 QString configFile = ocioOptions.configurationPath;
463
464 if (QFile::exists(configFile)) {
465 m_ocioConfig = OCIO::Config::CreateFromFile(configFile.toUtf8());
466 } else {
468 }
469 }
470 if (m_ocioConfig) {
471 OCIO::SetCurrentConfig(m_ocioConfig);
472 }
473 } catch (OCIO::Exception &exception) {
474 errKrita << "OpenColorIO Error:" << exception.what() << "Cannot create the LUT docker";
475 }
476
477
478 if (m_ocioConfig) {
480 }
481}
482
484{
485 if (!m_canvas) return;
486 if (!m_canvas->viewManager()) return;
487 if (!m_canvas->viewManager()->canvasResourceProvider()) return;
488 if (!m_canvas->viewManager()->image()) return;
489
491
492 KisConfig cfg(true);
493 KisOcioConfiguration ocioOptions = cfg.ocioConfiguration();
494
495 { // Color Management Mode
496 KisSignalsBlocker modeBlocker(m_colorManagement);
497 m_colorManagement->setCurrentIndex((int) ocioOptions.mode);
498 }
499
500 { // Exposure
501 KisSignalsBlocker exposureBlocker(m_exposureDoubleWidget);
502 m_exposureDoubleWidget->setValue(m_canvas->viewManager()->canvasResourceProvider()->HDRExposure());
503 }
504
505 { // Gamma
506 KisSignalsBlocker gammaBlocker(m_gammaDoubleWidget);
507 m_gammaDoubleWidget->setValue(m_canvas->viewManager()->canvasResourceProvider()->HDRGamma());
508 }
509
510 { // Components
511 const KoColorSpace *cs = m_canvas->viewManager()->image()->colorSpace();
512
513 QStringList itemsList;
514 itemsList << i18n("Luminance");
515 itemsList << i18n("All Channels");
516 Q_FOREACH (KoChannelInfo *channel, KoChannelInfo::displayOrderSorted(cs->channels())) {
517 itemsList << channel->name();
518 }
519
520 if (m_cmbComponents->originalTexts() != itemsList) {
521 KisSignalsBlocker componentsBlocker(m_cmbComponents);
522 m_cmbComponents->resetOriginalTexts(itemsList);
523 m_cmbComponents->setCurrentIndex(1); // All Channels...
524 }
525 }
526
527 { // Input Color Space
528 QStringList itemsList;
529 int numOcioColorSpaces = m_ocioConfig->getNumColorSpaces();
530 for(int i = 0; i < numOcioColorSpaces; ++i) {
531 const char *cs = m_ocioConfig->getColorSpaceNameByIndex(i);
532 OCIO::ConstColorSpaceRcPtr colorSpace = m_ocioConfig->getColorSpace(cs);
533 itemsList << QString::fromUtf8(colorSpace->getName());
534 }
535
536 KisSignalsBlocker inputCSBlocker(m_cmbInputColorSpace);
537
538 if (itemsList != m_cmbInputColorSpace->originalTexts()) {
539 m_cmbInputColorSpace->resetOriginalTexts(itemsList);
540 }
541
542 m_cmbInputColorSpace->setCurrent(ocioOptions.inputColorSpace);
543 }
544
545 { // Display Device
546 QStringList itemsList;
547 int numDisplays = m_ocioConfig->getNumDisplays();
548 for (int i = 0; i < numDisplays; ++i) {
549 itemsList << QString::fromUtf8(m_ocioConfig->getDisplay(i));
550 }
551
552 KisSignalsBlocker displayDeviceLocker(m_cmbDisplayDevice);
553
554 if (itemsList != m_cmbDisplayDevice->originalTexts()) {
555 m_cmbDisplayDevice->resetOriginalTexts(itemsList);
556 }
557
558 m_cmbDisplayDevice->setCurrent(ocioOptions.displayDevice);
559 }
560
561 { // Lock Current Color
562 KisSignalsBlocker locker(m_btnConvertCurrentColor);
563 m_btnConvertCurrentColor->setChecked(cfg.ocioLockColorVisualRepresentation());
564 }
565
567
568 {
569 QStringList itemsList;
570 int numLooks = m_ocioConfig->getNumLooks();
571 for (int k = 0; k < numLooks; k++) {
572 itemsList << QString::fromUtf8(m_ocioConfig->getLookNameByIndex(k));
573 }
574 itemsList << i18nc("Item to indicate no look transform being selected","None");
575
576 KisSignalsBlocker LookComboLocker(m_cmbLook);
577
578 if (itemsList != m_cmbLook->originalTexts()) {
579 m_cmbLook->resetOriginalTexts(itemsList);
580 }
581
582 m_cmbLook->setCurrent(ocioOptions.look);
583 }
585}
586
588{
589 KisSignalsBlocker viewComboLocker(m_cmbView);
590 m_cmbView->clear();
591
592 if (!m_canvas || !m_ocioConfig) return;
593
594 const char *display = m_ocioConfig->getDisplay(m_cmbDisplayDevice->currentIndex());
595 int numViews = m_ocioConfig->getNumViews(display);
596
597 for (int j = 0; j < numViews; ++j) {
598 m_cmbView->addSqueezedItem(QString::fromUtf8(m_ocioConfig->getView(display, j)));
599 }
600
601 KisConfig cfg(true);
602 KisOcioConfiguration ocioOptions = cfg.ocioConfiguration();
603 m_cmbView->setCurrent(ocioOptions.displayView);
604}
605
607{
608 QString filename = m_txtLut->text();
609
610 KoFileDialog dialog(this, KoFileDialog::OpenFile, "lutdocker");
611 dialog.setCaption(i18n("Select LUT file"));
612 dialog.setDefaultDir(QDir::cleanPath(filename));
613 dialog.setMimeTypeFilters(QStringList() << "application/octet-stream", "application/octet-stream");
614 filename = dialog.filename();
615
616 QFile f(filename);
617 if (f.exists() && filename != m_txtLut->text()) {
618 m_txtLut->setText(filename);
621 }
622}
623
625{
626 m_txtLut->clear();
628}
629
float value(const T *src, size_t ch)
QList< QString > QStringList
const KoID RGBAColorModelID("RGBA", ki18n("RGB/Alpha"))
connect(this, SIGNAL(optionsChanged()), this, SLOT(saveOptions()))
void showPopup(const QPoint &basePoint)
static KisConfigNotifier * instance()
bool useOcio(bool defaultValue=false) const
KisOcioConfiguration ocioConfiguration(bool defaultValue=false) const
void setOcioConfiguration(const KisOcioConfiguration &cfg)
void setUseOcio(bool useOCIO) const
void setOcioLockColorVisualRepresentation(bool value)
bool ocioLockColorVisualRepresentation(bool defaultValue=false) const
const KoColorSpace * colorSpace() const
static KisOpenGLModeProber * instance()
static QString currentDriver()
static KisSurfaceColorSpaceWrapper fromQtColorSpace(const QColorSpace &colorSpace)
QString name() const
static QList< KoChannelInfo * > displayOrderSorted(const QList< KoChannelInfo * > &channels)
QList< KoChannelInfo * > channels
virtual KoID colorModelId() const =0
void unsetCanvas() override
void setCurrentExposure(qreal value) override
OCIO::ConstConfigRcPtr m_ocioConfig
~LutDockerDock() override
void exposureValueChanged(double exposure)
void resetOcioConfiguration()
qreal currentExposure() const override
BlackWhitePointChooser * m_bwPointChooser
QPointer< KisCanvas2 > m_canvas
void setCurrentGamma(qreal value) override
QScopedPointer< KisSignalCompressorWithParam< qreal > > m_exposureCompressor
void updateDisplaySettings()
QScopedPointer< KisSignalCompressorWithParam< qreal > > m_gammaCompressor
void setCanvas(KoCanvasBase *canvas) override
reimplemented from KoCanvasObserverBase
QSharedPointer< KisDisplayFilter > m_displayFilter
void slotImageColorSpaceChanged()
qreal currentGamma() const override
QWidget * m_page
void selectOcioConfiguration()
bool canChangeExposureAndGamma() const override
void slotShowBWConfiguration()
void gammaValueChanged(double exposure)
void slotColorManagementModeChanged()
OCIO::ConstConfigRcPtr config
OCIO_CHANNEL_SWIZZLE swizzle
void setLockCurrentColorVisualRepresentation(bool value)
#define KIS_ASSERT_RECOVER_RETURN(cond)
Definition kis_assert.h:75
#define KIS_SAFE_ASSERT_RECOVER_NOOP(cond)
Definition kis_assert.h:130
#define errKrita
Definition kis_debug.h:107
OCIO::ConstConfigRcPtr defaultRawProfile()
#define OCIO_VERSION_FULL_STR
QIcon loadIcon(const QString &name)
QString KRITAIMAGE_EXPORT prettyFormatReal(qreal value)