File indexing completed on 2024-05-26 04:33:03

0001 /*
0002  * This file is part of Krita
0003  *
0004  * SPDX-FileCopyrightText: 2018 Jouni Pentikainen <joupent@gmail.com>
0005  * SPDX-FileCopyrightText: 2020 L. E. Segovia <amy@amyspark.me>
0006  *
0007  *  SPDX-License-Identifier: GPL-2.0-or-later
0008 */
0009 
0010 #ifndef _KIS_CROSSCHANNEL_FILTER_H_
0011 #define _KIS_CROSSCHANNEL_FILTER_H_
0012 
0013 #include <QPair>
0014 #include <QList>
0015 
0016 #include <filter/kis_color_transformation_filter.h>
0017 #include <filter/kis_color_transformation_configuration.h>
0018 #include <kis_config_widget.h>
0019 #include <kis_paint_device.h>
0020 #include "ui_wdg_perchannel.h"
0021 
0022 #include "virtual_channel_info.h"
0023 
0024 #include "kis_multichannel_filter_base.h"
0025 #include <KisCurveWidgetControlsManager.h>
0026 
0027 /**
0028  * Filter which applies a relative adjustment to a (virtual) color channel based on the value of another.
0029  * The amount of adjustment for a given input is controlled by a user-defined curve.
0030  */
0031 class KisCrossChannelFilter : public KisMultiChannelFilter
0032 {
0033 public:
0034     KisCrossChannelFilter();
0035     ~KisCrossChannelFilter() override;
0036 
0037     KisConfigWidget * createConfigurationWidget(QWidget *parent, const KisPaintDeviceSP dev, bool useForMasks) const override;
0038     KisFilterConfigurationSP factoryConfiguration(KisResourcesInterfaceSP resourcesInterface) const override;
0039 
0040     KoColorTransformation* createTransformation(const KoColorSpace *cs, const KisFilterConfigurationSP config) const override;
0041 
0042     static inline KoID id() {
0043         return KoID("crosschannel", i18n("Cross-channel color adjustment"));
0044     }
0045 };
0046 
0047 class KisCrossChannelFilterConfiguration : public KisMultiChannelFilterConfiguration
0048 {
0049 public:
0050     KisCrossChannelFilterConfiguration(int channelCount, const KoColorSpace *cs, KisResourcesInterfaceSP resourcesInterface);
0051     KisCrossChannelFilterConfiguration(const KisCrossChannelFilterConfiguration&rhs);
0052 
0053     ~KisCrossChannelFilterConfiguration() override;
0054 
0055     KisFilterConfigurationSP clone() const override;
0056 
0057     const QVector<int> driverChannels() const;
0058 
0059     void setDriverChannels(QVector<int> driverChannels);
0060     using KisFilterConfiguration::fromXML;
0061 
0062     using KisFilterConfiguration::toXML;
0063     void fromXML(const QDomElement& e) override;
0064     void toXML(QDomDocument& doc, QDomElement& root) const override;
0065 
0066     KisCubicCurve getDefaultCurve() override;
0067 
0068     virtual bool compareTo(const KisPropertiesConfiguration* rhs) const override;
0069 
0070 private:
0071     QVector<int> m_driverChannels;
0072 };
0073 
0074 class KisCrossChannelConfigWidget : public KisMultiChannelConfigWidget
0075 {
0076     Q_OBJECT
0077 
0078 public:
0079     KisCrossChannelConfigWidget(QWidget * parent, KisPaintDeviceSP dev, Qt::WindowFlags f = Qt::WindowFlags());
0080     ~KisCrossChannelConfigWidget() override;
0081 
0082     void setConfiguration(const KisPropertiesConfigurationSP config) override;
0083     KisPropertiesConfigurationSP configuration() const override;
0084 
0085 protected:
0086     void updateChannelControls() override;
0087 
0088     virtual KisPropertiesConfigurationSP getDefaultConfiguration() override;
0089 
0090 private Q_SLOTS:
0091     void slotDriverChannelSelected(int index);
0092 
0093 private:
0094     QVector<int> m_driverChannels;
0095     QScopedPointer<KisCurveWidgetControlsManagerInt> m_curveControlsManager;
0096 };
0097 
0098 #endif