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 */