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

388 : KisConfigWidget(parent, f)
389 , m_dev(dev)
390 , m_page(new WdgPerChannel(this))
391{
392 Q_ASSERT(m_dev);
393
394 const KoColorSpace *targetColorSpace = dev->compositionSourceColorSpace();
396}
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 444 of file kis_multichannel_filter_base.cpp.

445{
447 delete m_histogram;
448}
#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 563 of file kis_multichannel_filter_base.cpp.

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

References p.

◆ findDefaultVirtualChannelSelection()

int KisMultiChannelConfigWidget::findDefaultVirtualChannelSelection ( )
protectedvirtual

Reimplemented in KisCrossChannelConfigWidget.

Definition at line 558 of file kis_multichannel_filter_base.cpp.

559{
560 return 0;
561}

◆ getDefaultConfiguration()

virtual KisPropertiesConfigurationSP KisMultiChannelConfigWidget::getDefaultConfiguration ( )
protectedpure virtual

◆ getHistogram()

QPixmap KisMultiChannelConfigWidget::getHistogram ( )
inlineprotected

Definition at line 588 of file kis_multichannel_filter_base.cpp.

589{
590 int i;
591 int height = 256;
592 QPixmap pix(256, height);
594
595
596 bool logarithmic = m_page->chkLogarithmic->isChecked();
597
598 if (logarithmic)
600 else
602
603
604 QPalette appPalette = QApplication::palette();
605
606 pix.fill(QColor(appPalette.color(QPalette::Base)));
607
608 QPainter p(&pix);
609 p.setPen(QColor(appPalette.color(QPalette::Text)));
610 p.save();
611 p.setOpacity(0.2);
612
614
615
616 if (info.type() == VirtualChannelInfo::REAL) {
618
619 double highest = (double)m_histogram->calculations().getHighest();
620
621 qint32 bins = m_histogram->producer()->numberOfBins();
622
624 double factor = (double)height / highest;
625 for (i = 0; i < bins; ++i) {
626 p.drawLine(i, height, i, height - int(m_histogram->getValue(i) * factor));
627 }
628 } else {
629 double factor = (double)height / (double)log(highest);
630 for (i = 0; i < bins; ++i) {
631 p.drawLine(i, height, i, height - int(log((double)m_histogram->getValue(i)) * factor));
632 }
633 }
634 }
635
636 p.restore();
637
638 return pix;
639}
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 402 of file kis_multichannel_filter_base.cpp.

402 {
403 QHBoxLayout * layout = new QHBoxLayout(this);
404 Q_CHECK_PTR(layout);
405 layout->setContentsMargins(0,0,0,0);
406 layout->addWidget(m_page);
407
408 resetCurves();
409
410 const int virtualChannelCount = m_virtualChannels.size();
411 for (int i = 0; i < virtualChannelCount; i++) {
412 const VirtualChannelInfo &info = m_virtualChannels[i];
413 m_page->cmbChannel->addItem(info.name(), i);
414 }
415
416 connect(m_page->cmbChannel, SIGNAL(activated(int)), this, SLOT(slotChannelSelected(int)));
417 connect((QObject*)(m_page->chkLogarithmic), SIGNAL(toggled(bool)), this, SLOT(logHistView()));
418 connect((QObject*)(m_page->resetButton), SIGNAL(clicked()), this, SLOT(resetCurve()));
419
420 // create the horizontal and vertical gradient labels
421 m_page->hgradient->setPixmap(createGradient(Qt::Horizontal));
422 m_page->vgradient->setPixmap(createGradient(Qt::Vertical));
423
424 // init histogram calculator
425 const KoColorSpace *targetColorSpace = m_dev->compositionSourceColorSpace();
426 QList<QString> keys =
428
429 if (keys.size() > 0) {
433 }
434
435 m_page->curveWidget->setCurve(m_curves[0]);
436 connect(m_page->curveWidget, SIGNAL(modified()), this, SLOT(slotCurveModified()));
437
438 {
439 KisSignalsBlocker b(m_page->curveWidget);
441 }
442}
connect(this, SIGNAL(optionsChanged()), this, SLOT(saveOptions()))
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(), connect(), 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 672 of file kis_multichannel_filter_base.cpp.

673{
674 m_page->curveWidget->setPixmap(getHistogram());
675}

References getHistogram(), and m_page.

◆ resetCurve

void KisMultiChannelConfigWidget::resetCurve ( )
protectedslot

Definition at line 677 of file kis_multichannel_filter_base.cpp.

678{
679 const KisPropertiesConfigurationSP &defaultConfiguration = getDefaultConfiguration();
680 const auto *defaults = dynamic_cast<const KisMultiChannelFilterConfiguration*>(defaultConfiguration.data());
682
683 auto defaultCurves = defaults->curves();
684 KIS_SAFE_ASSERT_RECOVER_RETURN(defaultCurves.size() > m_activeVChannel);
685
686 m_page->curveWidget->setCurve(defaultCurves[m_activeVChannel]);
687}
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 450 of file kis_multichannel_filter_base.cpp.

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

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

657{
658 if (ch == m_activeVChannel) return;
661
662 m_activeVChannel = ch;
663 m_page->curveWidget->setCurve(m_curves[m_activeVChannel]);
664 m_page->curveWidget->setPixmap(getHistogram());
665
666 const int index = m_page->cmbChannel->findData(m_activeVChannel);
667 m_page->cmbChannel->setCurrentIndex(index);
668
670}
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 465 of file kis_multichannel_filter_base.cpp.

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

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

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: