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)
 
void syncActiveChannelUi ()
 
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 445 of file kis_multichannel_filter_base.cpp.

446{
448 delete m_histogram;
449}
#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 564 of file kis_multichannel_filter_base.cpp.

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

References p.

◆ findDefaultVirtualChannelSelection()

int KisMultiChannelConfigWidget::findDefaultVirtualChannelSelection ( )
protectedvirtual

Reimplemented in KisCrossChannelConfigWidget.

Definition at line 559 of file kis_multichannel_filter_base.cpp.

560{
561 return 0;
562}

◆ getDefaultConfiguration()

virtual KisPropertiesConfigurationSP KisMultiChannelConfigWidget::getDefaultConfiguration ( )
protectedpure virtual

◆ getHistogram()

QPixmap KisMultiChannelConfigWidget::getHistogram ( )
inlineprotected

Definition at line 589 of file kis_multichannel_filter_base.cpp.

590{
591 int i;
592 int height = 256;
593 QPixmap pix(256, height);
595
596
597 bool logarithmic = m_page->chkLogarithmic->isChecked();
598
599 if (logarithmic)
601 else
603
604
605 QPalette appPalette = QApplication::palette();
606
607 pix.fill(QColor(appPalette.color(QPalette::Base)));
608
609 QPainter p(&pix);
610 p.setPen(QColor(appPalette.color(QPalette::Text)));
611 p.save();
612 p.setOpacity(0.2);
613
615
616
617 if (info.type() == VirtualChannelInfo::REAL) {
619
620 double highest = (double)m_histogram->calculations().getHighest();
621
622 qint32 bins = m_histogram->producer()->numberOfBins();
623
625 double factor = (double)height / highest;
626 for (i = 0; i < bins; ++i) {
627 p.drawLine(i, height, i, height - int(m_histogram->getValue(i) * factor));
628 }
629 } else {
630 double factor = (double)height / (double)log(highest);
631 for (i = 0; i < bins; ++i) {
632 p.drawLine(i, height, i, height - int(log((double)m_histogram->getValue(i)) * factor));
633 }
634 }
635 }
636
637 p.restore();
638
639 return pix;
640}
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 connect(m_page->curveWidget, SIGNAL(modified()), this, SLOT(slotCurveModified()));
438
439 {
440 KisSignalsBlocker b(m_page->curveWidget);
442 }
443}
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_dev, m_histogram, m_page, m_virtualChannels, VirtualChannelInfo::name(), resetCurve(), resetCurves(), slotChannelSelected(), slotCurveModified(), and syncActiveChannelUi().

◆ logHistView

void KisMultiChannelConfigWidget::logHistView ( )
protectedslot

Definition at line 679 of file kis_multichannel_filter_base.cpp.

680{
681 m_page->curveWidget->setPixmap(getHistogram());
682}

References getHistogram(), and m_page.

◆ resetCurve

void KisMultiChannelConfigWidget::resetCurve ( )
protectedslot

Definition at line 684 of file kis_multichannel_filter_base.cpp.

685{
686 const KisPropertiesConfigurationSP &defaultConfiguration = getDefaultConfiguration();
687 const auto *defaults = dynamic_cast<const KisMultiChannelFilterConfiguration*>(defaultConfiguration.data());
689
690 auto defaultCurves = defaults->curves();
691 KIS_SAFE_ASSERT_RECOVER_RETURN(defaultCurves.size() > m_activeVChannel);
692
693 m_page->curveWidget->setCurve(defaultCurves[m_activeVChannel]);
694}
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 451 of file kis_multichannel_filter_base.cpp.

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

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

◆ setActiveChannel()

void KisMultiChannelConfigWidget::setActiveChannel ( int ch)
protected

◆ 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 466 of file kis_multichannel_filter_base.cpp.

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

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

References m_page, and setActiveChannel().

◆ slotCurveModified

void KisMultiChannelConfigWidget::slotCurveModified ( )
protectedslot

◆ syncActiveChannelUi()

void KisMultiChannelConfigWidget::syncActiveChannelUi ( )
protected

Definition at line 668 of file kis_multichannel_filter_base.cpp.

669{
670 m_page->curveWidget->setCurve(m_curves[m_activeVChannel]);
671 m_page->curveWidget->setPixmap(getHistogram());
672
673 const int index = m_page->cmbChannel->findData(m_activeVChannel);
674 m_page->cmbChannel->setCurrentIndex(index);
675
677}
virtual void updateChannelControls()=0

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

◆ updateChannelControls()

virtual void KisMultiChannelConfigWidget::updateChannelControls ( )
protectedpure virtual

Member Data Documentation

◆ m_activeVChannel

int KisMultiChannelConfigWidget::m_activeVChannel {0}
protected

Definition at line 140 of file kis_multichannel_filter_base.h.

140{0};

◆ m_curves

QList<KisCubicCurve> KisMultiChannelConfigWidget::m_curves
mutableprotected

Definition at line 141 of file kis_multichannel_filter_base.h.

◆ m_dev

KisPaintDeviceSP KisMultiChannelConfigWidget::m_dev
protected

Definition at line 143 of file kis_multichannel_filter_base.h.

◆ m_histogram

KisHistogram* KisMultiChannelConfigWidget::m_histogram {nullptr}
protected

Definition at line 145 of file kis_multichannel_filter_base.h.

145{nullptr};

◆ m_page

WdgPerChannel* KisMultiChannelConfigWidget::m_page {nullptr}
protected

Definition at line 144 of file kis_multichannel_filter_base.h.

144{nullptr};

◆ m_virtualChannels

QVector<VirtualChannelInfo> KisMultiChannelConfigWidget::m_virtualChannels
protected

Definition at line 139 of file kis_multichannel_filter_base.h.


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