Krita Source Code Documentation
Loading...
Searching...
No Matches
KisMultiChannelConfigWidget Class Referenceabstract

#include <kis_multichannel_filter_base.h>

+ Inheritance diagram for KisMultiChannelConfigWidget:

Public Member Functions

 KisMultiChannelConfigWidget (QWidget *parent, KisPaintDeviceSP dev, Qt::WindowFlags f=Qt::WindowFlags())
 
void setConfiguration (const KisPropertiesConfigurationSP config) override
 
 ~KisMultiChannelConfigWidget () override
 
- Public Member Functions inherited from KisConfigWidget
virtual KoCanvasResourcesInterfaceSP canvasResourcesInterface () const
 
virtual KisPropertiesConfigurationSP configuration () const =0
 
virtual void setCanvasResourcesInterface (KoCanvasResourcesInterfaceSP canvasResourcesInterface)
 
virtual void setView (KisViewManager *view)
 
 ~KisConfigWidget () override
 

Protected Slots

void logHistView ()
 
void resetCurve ()
 
void slotChannelSelected (int index)
 
void slotCurveModified ()
 

Protected Member Functions

QPixmap createGradient (Qt::Orientation orient)
 
virtual int findDefaultVirtualChannelSelection ()
 
virtual KisPropertiesConfigurationSP getDefaultConfiguration ()=0
 
QPixmap getHistogram ()
 
void init ()
 
void resetCurves ()
 
void setActiveChannel (int ch)
 
virtual void updateChannelControls ()=0
 
- Protected Member Functions inherited from KisConfigWidget
 KisConfigWidget (QWidget *parent=0, Qt::WindowFlags f=Qt::WindowFlags(), int delay=200)
 

Protected Attributes

int m_activeVChannel {0}
 
QList< KisCubicCurvem_curves
 
KisPaintDeviceSP m_dev
 
KisHistogramm_histogram {nullptr}
 
WdgPerChannelm_page {nullptr}
 
QVector< VirtualChannelInfom_virtualChannels
 

Additional Inherited Members

- Signals inherited from KisConfigWidget
void sigConfigurationItemChanged ()
 
void sigConfigurationUpdated ()
 
void sigDropLockedConfig (KisPropertiesConfigurationSP p)
 
void sigSaveLockedConfig (KisPropertiesConfigurationSP p)
 

Detailed Description

Base class for configuration widgets of KisMultiChannelFilter subclasses

Definition at line 110 of file kis_multichannel_filter_base.h.

Constructor & Destructor Documentation

◆ KisMultiChannelConfigWidget()

KisMultiChannelConfigWidget::KisMultiChannelConfigWidget ( QWidget * parent,
KisPaintDeviceSP dev,
Qt::WindowFlags f = Qt::WindowFlags() )

Definition at line 389 of file kis_multichannel_filter_base.cpp.

390 : KisConfigWidget(parent, f)
391 , m_dev(dev)
392 , m_page(new WdgPerChannel(this))
393{
394 Q_ASSERT(m_dev);
395
396 const KoColorSpace *targetColorSpace = dev->compositionSourceColorSpace();
398}
KisConfigWidget(QWidget *parent=0, Qt::WindowFlags f=Qt::WindowFlags(), int delay=200)
QVector< VirtualChannelInfo > m_virtualChannels
static QVector< VirtualChannelInfo > getVirtualChannels(const KoColorSpace *cs, int maxChannels=-1)
virtual const KoColorSpace * compositionSourceColorSpace() const

References KisPaintDevice::compositionSourceColorSpace(), KisMultiChannelFilter::getVirtualChannels(), m_dev, and m_virtualChannels.

◆ ~KisMultiChannelConfigWidget()

KisMultiChannelConfigWidget::~KisMultiChannelConfigWidget ( )
override

Definition at line 446 of file kis_multichannel_filter_base.cpp.

447{
449 delete m_histogram;
450}
#define KIS_ASSERT(cond)
Definition kis_assert.h:33

References KIS_ASSERT, and m_histogram.

Member Function Documentation

◆ createGradient()

QPixmap KisMultiChannelConfigWidget::createGradient ( Qt::Orientation orient)
inlineprotected

Definition at line 565 of file kis_multichannel_filter_base.cpp.

566{
567 int width;
568 int height;
569 int *i, inc, col;
570 int x = 0, y = 0;
571
572 if (orient == Qt::Horizontal) {
573 i = &x; inc = 1; col = 0;
574 width = 256; height = 1;
575 } else {
576 i = &y; inc = -1; col = 255;
577 width = 1; height = 256;
578 }
579
580 QPixmap gradientpix(width, height);
581 QPainter p(&gradientpix);
582 p.setPen(QPen(QColor(0, 0, 0), 1, Qt::SolidLine));
583 for (; *i < 256; (*i)++, col += inc) {
584 p.setPen(QColor(col, col, col));
585 p.drawPoint(x, y);
586 }
587 return gradientpix;
588}
const Params2D p

References p.

◆ findDefaultVirtualChannelSelection()

int KisMultiChannelConfigWidget::findDefaultVirtualChannelSelection ( )
protectedvirtual

Reimplemented in KisCrossChannelConfigWidget.

Definition at line 560 of file kis_multichannel_filter_base.cpp.

561{
562 return 0;
563}

◆ getDefaultConfiguration()

virtual KisPropertiesConfigurationSP KisMultiChannelConfigWidget::getDefaultConfiguration ( )
protectedpure virtual

◆ getHistogram()

QPixmap KisMultiChannelConfigWidget::getHistogram ( )
inlineprotected

Definition at line 590 of file kis_multichannel_filter_base.cpp.

591{
592 int i;
593 int height = 256;
594 QPixmap pix(256, height);
596
597
598 bool logarithmic = m_page->chkLogarithmic->isChecked();
599
600 if (logarithmic)
602 else
604
605
606 QPalette appPalette = QApplication::palette();
607
608 pix.fill(QColor(appPalette.color(QPalette::Base)));
609
610 QPainter p(&pix);
611 p.setPen(QColor(appPalette.color(QPalette::Text)));
612 p.save();
613 p.setOpacity(0.2);
614
616
617
618 if (info.type() == VirtualChannelInfo::REAL) {
620
621 double highest = (double)m_histogram->calculations().getHighest();
622
623 qint32 bins = m_histogram->producer()->numberOfBins();
624
626 double factor = (double)height / highest;
627 for (i = 0; i < bins; ++i) {
628 p.drawLine(i, height, i, height - int(m_histogram->getValue(i) * factor));
629 }
630 } else {
631 double factor = (double)height / (double)log(highest);
632 for (i = 0; i < bins; ++i) {
633 p.drawLine(i, height, i, height - int(log((double)m_histogram->getValue(i)) * factor));
634 }
635 }
636 }
637
638 p.restore();
639
640 return pix;
641}
quint32 getHighest()
This function return the highest value of the histogram.
void setChannel(qint32 channel)
quint32 getValue(quint8 i)
void setHistogramType(enumHistogramType type)
KoHistogramProducer * producer()
enumHistogramType getHistogramType()
Calculations calculations()
virtual qint32 numberOfBins()=0
#define KIS_SAFE_ASSERT_RECOVER_RETURN_VALUE(cond, val)
Definition kis_assert.h:129
@ LOGARITHMIC
@ LINEAR
Definition nugrid.h:26

References KisHistogram::calculations(), KisHistogram::Calculations::getHighest(), KisHistogram::getHistogramType(), KisHistogram::getValue(), KIS_SAFE_ASSERT_RECOVER_RETURN_VALUE, LINEAR, LOGARITHMIC, m_activeVChannel, m_histogram, m_page, m_virtualChannels, KoHistogramProducer::numberOfBins(), p, VirtualChannelInfo::pixelIndex(), KisHistogram::producer(), VirtualChannelInfo::REAL, KisHistogram::setChannel(), KisHistogram::setHistogramType(), and VirtualChannelInfo::type().

◆ init()

void KisMultiChannelConfigWidget::init ( )
protected

Initialize the dialog. Note: m_virtualChannels must be populated before calling this

Definition at line 404 of file kis_multichannel_filter_base.cpp.

404 {
405 QHBoxLayout * layout = new QHBoxLayout(this);
406 Q_CHECK_PTR(layout);
407 layout->setContentsMargins(0,0,0,0);
408 layout->addWidget(m_page);
409
410 resetCurves();
411
412 const int virtualChannelCount = m_virtualChannels.size();
413 for (int i = 0; i < virtualChannelCount; i++) {
414 const VirtualChannelInfo &info = m_virtualChannels[i];
415 m_page->cmbChannel->addItem(info.name(), i);
416 }
417
418 connect(m_page->cmbChannel, SIGNAL(activated(int)), this, SLOT(slotChannelSelected(int)));
419 connect((QObject*)(m_page->chkLogarithmic), SIGNAL(toggled(bool)), this, SLOT(logHistView()));
420 connect((QObject*)(m_page->resetButton), SIGNAL(clicked()), this, SLOT(resetCurve()));
421
422 // create the horizontal and vertical gradient labels
423 m_page->hgradient->setPixmap(createGradient(Qt::Horizontal));
424 m_page->vgradient->setPixmap(createGradient(Qt::Vertical));
425
426 // init histogram calculator
427 const KoColorSpace *targetColorSpace = m_dev->compositionSourceColorSpace();
428 QList<QString> keys =
430
431 if (keys.size() > 0) {
435 }
436
437 m_page->curveWidget->setCurve(m_curves[0]);
438 connect(m_page->curveWidget, SIGNAL(modified()), this, SLOT(slotCurveModified()));
439
440 {
441 KisSignalsBlocker b(m_page->curveWidget);
443 }
444}
QPixmap createGradient(Qt::Orientation orient)
QRect exactBounds() const
T get(const QString &id) const
QList< QString > keysCompatibleWith(const KoColorSpace *colorSpace, bool isStrict=false) const
returns a list, sorted by preference: higher preference comes first
static KoHistogramProducerFactoryRegistry * instance()
virtual KoHistogramProducer * generate()=0
Factory method, generates a new KoHistogramProducer.

References KisPaintDevice::compositionSourceColorSpace(), createGradient(), KisPaintDevice::exactBounds(), KoHistogramProducerFactory::generate(), KoGenericRegistry< T >::get(), KoHistogramProducerFactoryRegistry::instance(), KoHistogramProducerFactoryRegistry::keysCompatibleWith(), LINEAR, logHistView(), m_curves, m_dev, m_histogram, m_page, m_virtualChannels, VirtualChannelInfo::name(), resetCurve(), resetCurves(), setActiveChannel(), slotChannelSelected(), and slotCurveModified().

◆ logHistView

void KisMultiChannelConfigWidget::logHistView ( )
protectedslot

Definition at line 674 of file kis_multichannel_filter_base.cpp.

675{
676 m_page->curveWidget->setPixmap(getHistogram());
677}

References getHistogram(), and m_page.

◆ resetCurve

void KisMultiChannelConfigWidget::resetCurve ( )
protectedslot

Definition at line 679 of file kis_multichannel_filter_base.cpp.

680{
681 const KisPropertiesConfigurationSP &defaultConfiguration = getDefaultConfiguration();
682 const auto *defaults = dynamic_cast<const KisMultiChannelFilterConfiguration*>(defaultConfiguration.data());
684
685 auto defaultCurves = defaults->curves();
686 KIS_SAFE_ASSERT_RECOVER_RETURN(defaultCurves.size() > m_activeVChannel);
687
688 m_page->curveWidget->setCurve(defaultCurves[m_activeVChannel]);
689}
virtual KisPropertiesConfigurationSP getDefaultConfiguration()=0
#define KIS_SAFE_ASSERT_RECOVER_RETURN(cond)
Definition kis_assert.h:128

References KisSharedPtr< T >::data(), getDefaultConfiguration(), KIS_SAFE_ASSERT_RECOVER_RETURN, m_activeVChannel, and m_page.

◆ resetCurves()

void KisMultiChannelConfigWidget::resetCurves ( )
protected

Definition at line 452 of file kis_multichannel_filter_base.cpp.

453{
454 const KisPropertiesConfigurationSP &defaultConfiguration = getDefaultConfiguration();
455 const auto *defaults = dynamic_cast<const KisMultiChannelFilterConfiguration*>(defaultConfiguration.data());
456
458 m_curves = defaults->curves();
459
460 const int virtualChannelCount = m_virtualChannels.size();
461 for (int i = 0; i < virtualChannelCount; i++) {
462 const VirtualChannelInfo &info = m_virtualChannels[i];
463 m_curves[i].setName(info.name());
464 }
465}

References KisSharedPtr< T >::data(), getDefaultConfiguration(), KIS_SAFE_ASSERT_RECOVER_RETURN, m_curves, m_virtualChannels, and VirtualChannelInfo::name().

◆ setActiveChannel()

void KisMultiChannelConfigWidget::setActiveChannel ( int ch)
protected

Definition at line 658 of file kis_multichannel_filter_base.cpp.

659{
660 if (ch == m_activeVChannel) return;
663
664 m_activeVChannel = ch;
665 m_page->curveWidget->setCurve(m_curves[m_activeVChannel]);
666 m_page->curveWidget->setPixmap(getHistogram());
667
668 const int index = m_page->cmbChannel->findData(m_activeVChannel);
669 m_page->cmbChannel->setCurrentIndex(index);
670
672}
virtual void updateChannelControls()=0

References getHistogram(), KIS_SAFE_ASSERT_RECOVER_RETURN, m_activeVChannel, m_curves, m_page, and updateChannelControls().

◆ setConfiguration()

void KisMultiChannelConfigWidget::setConfiguration ( const KisPropertiesConfigurationSP config)
overridevirtual
Parameters
configthe configuration for this configuration widget.

HACK ALERT: our configuration factory generates default configuration with nTransfers==0. Catching it here. Just set everything to defaults instead.

Adjust the layout of channels in the configuration to the layout of the current version of Krita. When we pass number of loaded channels to getVirtualChannels() it automatically detects the version of Krita the configuration was created in.

Implements KisConfigWidget.

Definition at line 467 of file kis_multichannel_filter_base.cpp.

468{
469 const KisMultiChannelFilterConfiguration * cfg = dynamic_cast<const KisMultiChannelFilterConfiguration *>(config.data());
470 if (!cfg) {
471 return;
472 }
473
474 if (cfg->curves().empty()) {
480 const KisPropertiesConfigurationSP &defaultConfiguration = getDefaultConfiguration();
481 const auto *defaults = dynamic_cast<const KisMultiChannelFilterConfiguration*>(defaultConfiguration.data());
483
484 if (!defaults->curves().isEmpty()) {
485 setConfiguration(defaultConfiguration);
486 return;
487 }
488 } else if (cfg->curves().size() > m_virtualChannels.size()) {
489 QMessageBox::warning(this, i18nc("@title:window", "Krita"), i18n("The current configuration was created for a different colorspace and cannot be used. All curves will be reset."));
490 warnKrita << "WARNING: trying to load a curve with invalid number of channels!";
491 warnKrita << "WARNING: expected:" << m_virtualChannels.size();
492 warnKrita << "WARNING: got:" << cfg->curves().size();
493 return;
494 } else {
495 if (cfg->curves().size() == m_virtualChannels.size()) {
496 for (int ch = 0; ch < cfg->curves().size(); ch++) {
497 m_curves[ch] = cfg->curves()[ch];
498 }
499 } else {
500 // The configuration does not cover all our channels.
501 // This happens when loading a document from an older version, which supported fewer channels.
502 // Reset to make sure the unspecified channels have their default values.
503 resetCurves();
504
505 auto compareChannels =
506 [] (const VirtualChannelInfo &lhs, const VirtualChannelInfo &rhs) -> bool {
507 return lhs.type() == rhs.type() &&
508 (lhs.type() != VirtualChannelInfo::REAL || lhs.pixelIndex() == rhs.pixelIndex());
509 };
510
511 const KoColorSpace *targetColorSpace = m_dev->compositionSourceColorSpace();
512
513
520 QVector<VirtualChannelInfo> detectedCurves = KisMultiChannelUtils::getVirtualChannels(targetColorSpace, cfg->curves().size());
521
522 for (auto detectedIt = detectedCurves.begin(); detectedIt != detectedCurves.end(); ++detectedIt) {
523 auto dstIt = std::find_if(m_virtualChannels.begin(), m_virtualChannels.end(),
524 [=] (const VirtualChannelInfo &info) {
525 return compareChannels(*detectedIt, info);
526 });
527 if (dstIt != m_virtualChannels.end()) {
528 const int srcIndex = std::distance(detectedCurves.begin(), detectedIt);
529 const int dstIndex = std::distance(m_virtualChannels.begin(), dstIt);
530 m_curves[dstIndex] = cfg->curves()[srcIndex];
531 } else {
532 warnKrita << "WARNING: failed to find mapping of the channel in the filter configuration:";
533 warnKrita << "WARNING: channel:" << ppVar(detectedIt->name()) << ppVar(detectedIt->type())<< ppVar(detectedIt->pixelIndex());
534 warnKrita << "WARNING:";
535
536 for (auto it = detectedCurves.begin(); it != detectedCurves.end(); ++it) {
537 warnKrita << "WARNING: detected channels" << std::distance(detectedCurves.begin(), it) << ":" << it->name();
538 }
539
540 for (auto it = m_virtualChannels.begin(); it != m_virtualChannels.end(); ++it) {
541 warnKrita << "WARNING: read channels" << std::distance(m_virtualChannels.begin(), it) << ":" << it->name();
542 }
543 }
544 }
545 }
546 }
547
548 const int activeChannel =
549 config->hasProperty("activeCurve") ?
550 qBound(0, config->getInt("activeCurve"), m_curves.size()) :
552
553 if (activeChannel == m_activeVChannel) {
554 m_page->curveWidget->setCurve(m_curves[m_activeVChannel]);
555 } else {
556 setActiveChannel(activeChannel);
557 }
558}
void setConfiguration(const KisPropertiesConfigurationSP config) override
const QList< KisCubicCurve > & curves() const
#define warnKrita
Definition kis_debug.h:87
#define ppVar(var)
Definition kis_debug.h:155
int size(const Forest< T > &forest)
Definition KisForest.h:1232
QVector< VirtualChannelInfo > getVirtualChannels(const KoColorSpace *cs, int maxChannels, bool supportsLightness, bool supportsHue, bool supportsSaturation)

References KisPaintDevice::compositionSourceColorSpace(), KisMultiChannelFilterConfiguration::curves(), KisSharedPtr< T >::data(), findDefaultVirtualChannelSelection(), getDefaultConfiguration(), KisMultiChannelUtils::getVirtualChannels(), KIS_SAFE_ASSERT_RECOVER_RETURN, m_activeVChannel, m_curves, m_dev, m_page, m_virtualChannels, VirtualChannelInfo::pixelIndex(), ppVar, VirtualChannelInfo::REAL, resetCurves(), setActiveChannel(), setConfiguration(), VirtualChannelInfo::type(), and warnKrita.

◆ slotChannelSelected

void KisMultiChannelConfigWidget::slotChannelSelected ( int index)
protectedslot

Definition at line 643 of file kis_multichannel_filter_base.cpp.

644{
645 const int virtualChannel = m_page->cmbChannel->itemData(index).toInt();
646 setActiveChannel(virtualChannel);
647}

References m_page, and setActiveChannel().

◆ slotCurveModified

void KisMultiChannelConfigWidget::slotCurveModified ( )
protectedslot

◆ updateChannelControls()

virtual void KisMultiChannelConfigWidget::updateChannelControls ( )
protectedpure virtual

Member Data Documentation

◆ m_activeVChannel

int KisMultiChannelConfigWidget::m_activeVChannel {0}
protected

Definition at line 139 of file kis_multichannel_filter_base.h.

139{0};

◆ m_curves

QList<KisCubicCurve> KisMultiChannelConfigWidget::m_curves
mutableprotected

Definition at line 140 of file kis_multichannel_filter_base.h.

◆ m_dev

KisPaintDeviceSP KisMultiChannelConfigWidget::m_dev
protected

Definition at line 142 of file kis_multichannel_filter_base.h.

◆ m_histogram

KisHistogram* KisMultiChannelConfigWidget::m_histogram {nullptr}
protected

Definition at line 144 of file kis_multichannel_filter_base.h.

144{nullptr};

◆ m_page

WdgPerChannel* KisMultiChannelConfigWidget::m_page {nullptr}
protected

Definition at line 143 of file kis_multichannel_filter_base.h.

143{nullptr};

◆ m_virtualChannels

QVector<VirtualChannelInfo> KisMultiChannelConfigWidget::m_virtualChannels
protected

Definition at line 138 of file kis_multichannel_filter_base.h.


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