15#include <QDomDocument>
17#include <QRegularExpression>
53 int defaultDriver = 0;
65 m_driverChannels(rhs.m_driverChannels)
89 const QString
name = QLatin1String(
"driver") + QString::number(i);
98 const QString
name = QLatin1String(
"driver") + QString::number(i);
111 QRegularExpression rx(
"^driver(\\d+)$");
112 QRegularExpressionMatch match;
113 for (QDomElement e = root.firstChildElement(); !e.isNull(); e = e.nextSiblingElement()) {
114 const QString attributeName = e.attribute(
"name");
116 if (attributeName.contains(rx, &match)) {
117 int channel = match.captured(1).toUShort();
134 QDomElement param = doc.createElement(
"param");
135 param.setAttribute(
"name", QString(
"driver%1").arg(i));
138 param.appendChild(text);
140 root.appendChild(param);
146 const QList<QPointF> points { QPointF(0.0f, 0.5f), QPointF(1.0f, 0.5f) };
161 if (
name ==
"nTransfers") {
164 const qint32 newChannelCount =
value.toInt();
167 if (newChannelCount == prevChannelCount) {
175 if (newChannelCount > prevChannelCount) {
176 int defaultDriver = 0;
183 for (qint32 i = prevChannelCount; i < newChannelCount; ++i) {
186 const QString
name = QLatin1String(
"driver") + QString::number(i);
190 for (qint32 i = newChannelCount; i < prevChannelCount; ++i) {
191 const QString
name = QLatin1String(
"driver") + QString::number(i);
199 if (
name ==
"activeCurve") {
214 const int driver =
value.toInt();
221 QRegularExpression rx(
"driver(\\d+)");
222 QRegularExpressionMatch match;
223 if (!
name.contains(rx, &match)) {
227 driverIndex = match.captured(1).toUShort();
239 for (
int i = 0; i < virtualChannelCount; i++) {
246 m_page->cmbDriverChannel->addItem(info.
name(), i);
271 int initialChannel = -1;
279 if (initialChannel < 0) {
283 return initialChannel;
306 m_page->cmbDriverChannel->setCurrentIndex(index);
317 const int channel =
m_page->cmbDriverChannel->itemData(index).toInt();
345 switch (channel.
type()) {
378 if (originalTransfers.size() >
int(virtualChannels.size())) {
385 for (
int i = virtualChannels.size() - 1; i >= 0; i--) {
386 if (!curves[i].isConstant(0.5)) {
388 int driverChannel =
mapChannel(virtualChannels[drivers[i]]);
389 QHash<QString, QVariant> params;
390 params[
"channel"] = channel;
391 params[
"driverChannel"] = driverChannel;
392 params[
"curve"] = QVariant::fromValue(originalTransfers[i]);
393 params[
"relative"] =
true;
float value(const T *src, size_t ch)
KisFilterConfigurationSP clone() const override
virtual bool compareTo(const KisPropertiesConfiguration *rhs) const override
~KisCrossChannelFilterConfiguration() override
void setProperty(const QString &name, const QVariant &value) override
void fromXML(const QDomElement &e) override
QVector< int > m_driverChannels
QString toXML() const override
const QVector< int > driverChannels() const
KisCrossChannelFilterConfiguration(int channelCount, const KoColorSpace *cs, KisResourcesInterfaceSP resourcesInterface)
bool channelIndexFromDriverPropertyName(const QString &name, int &channelIndex) const
Takes a driver property name with format "driver#", where # is the index of the channel and puts the ...
KisCubicCurve getDefaultCurve() override
void setDriverChannels(QVector< int > driverChannels)
const KoColorSpace * m_colorSpace
KisConfigWidget * createConfigurationWidget(QWidget *parent, const KisPaintDeviceSP dev, bool useForMasks) const override
KoColorTransformation * createTransformation(const KoColorSpace *cs, const KisFilterConfigurationSP config) const override
KisFilterConfigurationSP factoryConfiguration(KisResourcesInterfaceSP resourcesInterface) const override
~KisCrossChannelFilter() override
static KisResourcesInterfaceSP instance()
void setProperty(const QString &name, const QVariant &value) override
QList< KisCubicCurve > m_curves
const QVector< QVector< quint16 > > & transfers() const
void setActiveCurve(int value)
QString toXML() const override
const QList< KisCubicCurve > & curves() const
virtual bool compareTo(const KisPropertiesConfiguration *rhs) const override
void fromXML(const QDomElement &e) override
static QVector< VirtualChannelInfo > getVirtualChannels(const KoColorSpace *cs, int maxChannels=-1)
static int findChannel(const QVector< VirtualChannelInfo > &virtualChannels, const VirtualChannelInfo::Type &channelType)
const KoColorSpace * colorSpace() const
QVector< qreal > lumaCoefficients
KoColorTransformation * createColorTransformation(const QString &id, const QHash< QString, QVariant > ¶meters) const
#define KIS_SAFE_ASSERT_RECOVER_RETURN_VALUE(cond, val)
#define KIS_SAFE_ASSERT_RECOVER_RETURN(cond)
#define KIS_SAFE_ASSERT_RECOVER_NOOP(cond)
int mapChannel(const VirtualChannelInfo &channel)
int toInt(const QString &str, bool *ok=nullptr)
QString toString(const QString &value)
void removeProperty(const QString &name)