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