File indexing completed on 2024-06-09 04:21:54

0001 /*
0002  *  SPDX-FileCopyrightText: 2006 Boudewijn Rempt <boud@valdyas.org>
0003  *
0004  *  SPDX-License-Identifier: GPL-2.0-or-later
0005  */
0006 
0007 #include "filter/kis_filter_configuration.h"
0008 #include "filter/kis_filter.h"
0009 
0010 #include <kis_debug.h>
0011 #include <QDomDocument>
0012 #include <QString>
0013 
0014 #include "filter/kis_filter_registry.h"
0015 #include "kis_transaction.h"
0016 #include "kis_undo_adapter.h"
0017 #include "kis_painter.h"
0018 #include "kis_selection.h"
0019 #include "KoID.h"
0020 #include "kis_types.h"
0021 #include <KisRequiredResourcesOperators.h>
0022 
0023 #include "kis_config_widget.h"
0024 
0025 struct Q_DECL_HIDDEN KisFilterConfiguration::Private {
0026     QString name;
0027     qint32 version;
0028     QBitArray channelFlags;
0029     KisCubicCurve curve;
0030     QList< KisCubicCurve > curves;
0031     KisResourcesInterfaceSP resourcesInterface = 0;
0032 
0033     Private(const QString & _name, qint32 _version, KisResourcesInterfaceSP _resourcesInterface)
0034         : name(_name),
0035           version(_version),
0036           resourcesInterface(_resourcesInterface)
0037     {
0038     }
0039 
0040     Private(const Private &rhs)
0041         : name(rhs.name),
0042           version(rhs.version),
0043           channelFlags(rhs.channelFlags),
0044           curve(rhs.curve),
0045           curves(rhs.curves),
0046           resourcesInterface(rhs.resourcesInterface)
0047     {
0048     }
0049 
0050 #ifdef SANITY_CHECK_FILTER_CONFIGURATION_OWNER
0051     QAtomicInt sanityUsageCounter;
0052 #endif /* SANITY_CHECK_FILTER_CONFIGURATION_OWNER */
0053 };
0054 
0055 KisFilterConfiguration::KisFilterConfiguration(const QString & name, qint32 version, KisResourcesInterfaceSP resourcesInterface)
0056     : d(new Private(name, version, resourcesInterface))
0057 {
0058 }
0059 
0060 KisFilterConfigurationSP KisFilterConfiguration::clone() const
0061 {
0062     return new KisFilterConfiguration(*this);
0063 }
0064 
0065 KisFilterConfiguration::KisFilterConfiguration(const KisFilterConfiguration & rhs)
0066     : KisPropertiesConfiguration(rhs)
0067     , d(new Private(*rhs.d))
0068 {
0069 }
0070 
0071 KisFilterConfiguration::~KisFilterConfiguration()
0072 {
0073     delete d;
0074 }
0075 
0076 void KisFilterConfiguration::fromLegacyXML(const QDomElement& root)
0077 {
0078     clearProperties();
0079     d->name = root.attribute("name");
0080     d->version = root.attribute("version").toInt();
0081 
0082     QDomElement e;
0083     for (e = root.firstChildElement("property"); !e.isNull(); e = e.nextSiblingElement()) {
0084         QString name = e.attribute("name");
0085         QString type = e.attribute("type");
0086         QString value = e.text();
0087 
0088         // XXX: Convert the variant pro-actively to the right type?
0089         setProperty(name, QVariant(value));
0090     }
0091 }
0092 
0093 void KisFilterConfiguration::fromXML(const QDomElement& elt)
0094 {
0095     d->version = elt.attribute("version").toInt();
0096     KisPropertiesConfiguration::fromXML(elt);
0097 }
0098 
0099 void KisFilterConfiguration::toXML(QDomDocument& doc, QDomElement& elt) const
0100 {
0101     elt.setAttribute("version", d->version);
0102     KisPropertiesConfiguration::toXML(doc, elt);
0103 }
0104 
0105 
0106 const QString & KisFilterConfiguration::name() const
0107 {
0108     return d->name;
0109 }
0110 
0111 qint32 KisFilterConfiguration::version() const
0112 {
0113     return d->version;
0114 }
0115 
0116 void KisFilterConfiguration::setVersion(qint32 version)
0117 {
0118     d->version = version;
0119 }
0120 
0121 const KisCubicCurve& KisFilterConfiguration::curve() const
0122 {
0123     return d->curve;
0124 }
0125 
0126 void KisFilterConfiguration::setCurve(const KisCubicCurve& curve)
0127 {
0128     d->curve = curve;
0129 }
0130 
0131 const QList< KisCubicCurve >& KisFilterConfiguration::curves() const
0132 {
0133     return d->curves;
0134 }
0135 
0136 KisResourcesInterfaceSP KisFilterConfiguration::resourcesInterface() const
0137 {
0138     return d->resourcesInterface;
0139 }
0140 
0141 void KisFilterConfiguration::setResourcesInterface(KisResourcesInterfaceSP resourcesInterface)
0142 {
0143     d->resourcesInterface = resourcesInterface;
0144 }
0145 
0146 void KisFilterConfiguration::createLocalResourcesSnapshot(KisResourcesInterfaceSP globalResourcesInterface)
0147 {
0148     KisRequiredResourcesOperators::createLocalResourcesSnapshot(this, globalResourcesInterface);
0149 }
0150 
0151 bool KisFilterConfiguration::hasLocalResourcesSnapshot() const
0152 {
0153     return KisRequiredResourcesOperators::hasLocalResourcesSnapshot(this);
0154 }
0155 
0156 KisFilterConfigurationSP KisFilterConfiguration::cloneWithResourcesSnapshot(KisResourcesInterfaceSP globalResourcesInterface) const
0157 {
0158     return KisRequiredResourcesOperators::cloneWithResourcesSnapshot<KisFilterConfigurationSP>(this, globalResourcesInterface);
0159 }
0160 
0161 QList<KoResourceLoadResult> KisFilterConfiguration::requiredResources(KisResourcesInterfaceSP globalResourcesInterface) const
0162 {
0163     return linkedResources(globalResourcesInterface) + embeddedResources(globalResourcesInterface);
0164 }
0165 
0166 QList<KoResourceLoadResult> KisFilterConfiguration::linkedResources(KisResourcesInterfaceSP globalResourcesInterface) const
0167 {
0168     Q_UNUSED(globalResourcesInterface);
0169     return {};
0170 }
0171 
0172 QList<KoResourceLoadResult> KisFilterConfiguration::embeddedResources(KisResourcesInterfaceSP globalResourcesInterface) const
0173 {
0174     Q_UNUSED(globalResourcesInterface);
0175     return {};
0176 }
0177 
0178 void KisFilterConfiguration::setCurves(QList< KisCubicCurve >& curves)
0179 {
0180     d->curves = curves;
0181 }
0182 
0183 bool KisFilterConfiguration::isCompatible(const KisPaintDeviceSP) const
0184 {
0185     return true;
0186 }
0187 
0188 bool KisFilterConfiguration::compareTo(const KisPropertiesConfiguration *rhs) const
0189 {
0190     const KisFilterConfiguration *otherConfig = dynamic_cast<const KisFilterConfiguration *>(rhs);
0191 
0192     return otherConfig
0193             && KisPropertiesConfiguration::compareTo(rhs)
0194             && name() == otherConfig->name()
0195             && version() == otherConfig->version()
0196             && channelFlags() == otherConfig->channelFlags()
0197             && curve() == otherConfig->curve()
0198             && curves() == otherConfig->curves();
0199 }
0200 
0201 QBitArray KisFilterConfiguration::channelFlags() const
0202 {
0203     return d->channelFlags;
0204 }
0205 
0206 void KisFilterConfiguration::setChannelFlags(QBitArray channelFlags)
0207 {
0208     d->channelFlags = channelFlags;
0209 }
0210 
0211 #ifdef SANITY_CHECK_FILTER_CONFIGURATION_OWNER
0212 
0213 int KisFilterConfiguration::sanityRefUsageCounter()
0214 {
0215     return d->sanityUsageCounter.ref();
0216 }
0217 
0218 int KisFilterConfiguration::sanityDerefUsageCounter()
0219 {
0220     return d->sanityUsageCounter.deref();
0221 }
0222 
0223 #endif /* SANITY_CHECK_FILTER_CONFIGURATION_OWNER */