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

0001 /*
0002  * KDE. Krita Project.
0003  *
0004  * SPDX-FileCopyrightText: 2020 Deif Lou <ginoba@gmail.com>
0005  *
0006  * SPDX-License-Identifier: GPL-2.0-or-later
0007  */
0008 
0009 #include <generator/kis_generator.h>
0010 #include <generator/kis_generator_registry.h>
0011 #include <KoResourceLoadResult.h>
0012 
0013 #include "KisHalftoneFilterConfiguration.h"
0014 
0015 KisHalftoneFilterConfiguration::KisHalftoneFilterConfiguration(const QString & name,
0016                                                                qint32 version,
0017                                                                KisResourcesInterfaceSP resourcesInterface)
0018     : KisFilterConfiguration(name, version, resourcesInterface)
0019 {}
0020 
0021 KisHalftoneFilterConfiguration::KisHalftoneFilterConfiguration(const KisHalftoneFilterConfiguration &rhs)
0022     : KisFilterConfiguration(rhs)
0023 {
0024     QHashIterator<QString, KisFilterConfigurationSP> it(rhs.m_generatorConfigurationsCache);
0025     while (it.hasNext()) {
0026         it.next();
0027         m_generatorConfigurationsCache[it.key()] = it.value()->clone();
0028     }
0029 }
0030 
0031 KisHalftoneFilterConfiguration::~KisHalftoneFilterConfiguration()
0032 {}
0033 
0034 KisFilterConfigurationSP KisHalftoneFilterConfiguration::clone() const
0035 {
0036     return new KisHalftoneFilterConfiguration(*this);
0037 }
0038 
0039 void KisHalftoneFilterConfiguration::setResourcesInterface(KisResourcesInterfaceSP resourcesInterface)
0040 {
0041     KisFilterConfiguration::setResourcesInterface(resourcesInterface);
0042 
0043     if (mode() == HalftoneMode_IndependentChannels) {
0044         const QString prefix = colorModelId() + "_channel";
0045         for (int i = 0; i < 4; ++i) {
0046             const QString fullPrefix = prefix + QString::number(i) + "_";
0047             KisFilterConfigurationSP generatorConfig = generatorConfiguration(fullPrefix);
0048             if (generatorConfig) {
0049                 m_generatorConfigurationsCache[fullPrefix]->setResourcesInterface(resourcesInterface);
0050             }
0051         }
0052     } else {
0053         const QString prefix = mode() + "_";
0054         KisFilterConfigurationSP generatorConfig = generatorConfiguration(prefix);
0055         if (generatorConfig) {
0056             m_generatorConfigurationsCache[prefix]->setResourcesInterface(resourcesInterface);
0057         }
0058     }
0059 }
0060 
0061 QList<KoResourceLoadResult> KisHalftoneFilterConfiguration::linkedResources(KisResourcesInterfaceSP globalResourcesInterface) const
0062 {
0063     QList<KoResourceLoadResult> resourcesList;
0064 
0065     if (mode() == HalftoneMode_IndependentChannels) {
0066         const QString prefix = colorModelId() + "_channel";
0067         for (int i = 0; i < 4; ++i) {
0068             const QString fullPrefix = prefix + QString::number(i) + "_";
0069             KisFilterConfigurationSP generatorConfig = generatorConfiguration(fullPrefix);
0070             if (generatorConfig) {
0071                 resourcesList += generatorConfig->linkedResources(globalResourcesInterface);
0072             }
0073         }
0074     } else {
0075         const QString prefix = mode() + "_";
0076         KisFilterConfigurationSP generatorConfig = generatorConfiguration(prefix);
0077         if (generatorConfig) {
0078             resourcesList += generatorConfig->linkedResources(globalResourcesInterface);
0079         }
0080     }
0081 
0082     return resourcesList;
0083 }
0084 
0085 QList<KoResourceLoadResult> KisHalftoneFilterConfiguration::embeddedResources(KisResourcesInterfaceSP globalResourcesInterface) const
0086 {
0087     QList<KoResourceLoadResult> resourcesList;
0088 
0089     if (mode() == HalftoneMode_IndependentChannels) {
0090         const QString prefix = colorModelId() + "_channel";
0091         for (int i = 0; i < 4; ++i) {
0092             const QString fullPrefix = prefix + QString::number(i) + "_";
0093             KisFilterConfigurationSP generatorConfig = generatorConfiguration(fullPrefix);
0094             if (generatorConfig) {
0095                 resourcesList += generatorConfig->embeddedResources(globalResourcesInterface);
0096             }
0097         }
0098     } else {
0099         const QString prefix = mode() + "_";
0100         KisFilterConfigurationSP generatorConfig = generatorConfiguration(prefix);
0101         if (generatorConfig) {
0102             resourcesList += generatorConfig->embeddedResources(globalResourcesInterface);
0103         }
0104     }
0105 
0106     return resourcesList;
0107 }
0108 
0109 QString KisHalftoneFilterConfiguration::colorModelId() const
0110 {
0111     return getString("color_model_id", "");
0112 }
0113 
0114 QString KisHalftoneFilterConfiguration::mode() const
0115 {
0116     return getString("mode", "");
0117 }
0118 
0119 QString KisHalftoneFilterConfiguration::generatorId(const QString &prefix) const
0120 {
0121     return getString(prefix + "generator", "");
0122 }
0123 
0124 KisFilterConfigurationSP KisHalftoneFilterConfiguration::generatorConfiguration(const QString &prefix) const
0125 {
0126     if (m_generatorConfigurationsCache.contains(prefix)) {
0127         return m_generatorConfigurationsCache[prefix];
0128     } else {
0129         QStringList generatorIds = KisGeneratorRegistry::instance()->keys();
0130         QString generatorId = this->generatorId(prefix);
0131         if (generatorIds.indexOf(generatorId) != -1) {
0132             QString fullGeneratorId = prefix + "generator_" + generatorId;
0133             KisGeneratorSP generator = KisGeneratorRegistry::instance()->get(generatorId);
0134             KisFilterConfigurationSP generatorConfig = generator->defaultConfiguration(resourcesInterface());
0135             getPrefixedProperties(fullGeneratorId + "_", generatorConfig);
0136             m_generatorConfigurationsCache[prefix] = generatorConfig;
0137             return generatorConfig;
0138         }
0139     }
0140     return nullptr;
0141 }
0142 
0143 qreal KisHalftoneFilterConfiguration::hardness(const QString &prefix) const
0144 {
0145     return getDouble(prefix + "hardness", defaultHardness());
0146 }
0147 
0148 bool KisHalftoneFilterConfiguration::invert(const QString &prefix) const
0149 {
0150     return getBool(prefix + "invert", defaultInvert());
0151 }
0152 
0153 KoColor KisHalftoneFilterConfiguration::foregroundColor(const QString &prefix) const
0154 {
0155     return getColor(prefix + "foreground_color", defaultForegroundColor());
0156 }
0157 
0158 int KisHalftoneFilterConfiguration::foregroundOpacity(const QString &prefix) const
0159 {
0160     return getInt(prefix + "foreground_opacity", defaultForegroundOpacity());
0161 }
0162 
0163 KoColor KisHalftoneFilterConfiguration::backgroundColor(const QString &prefix) const
0164 {
0165     return getColor(prefix + "background_color", defaultBackgroundColor());
0166 }
0167 
0168 int KisHalftoneFilterConfiguration::backgroundOpacity(const QString &prefix) const
0169 {
0170     return getInt(prefix + "background_opacity", defaultForegroundOpacity());
0171 }
0172 
0173 void KisHalftoneFilterConfiguration::setColorModelId(const QString &newColorModelId)
0174 {
0175     setProperty("color_model_id", newColorModelId);
0176 }
0177 
0178 void KisHalftoneFilterConfiguration::setMode(const QString &newMode)
0179 {
0180     setProperty("mode", newMode);
0181 }
0182 
0183 void KisHalftoneFilterConfiguration::setGeneratorId(const QString &prefix, const QString &id)
0184 {
0185     setProperty(prefix + "generator", id);
0186 }
0187 
0188 void KisHalftoneFilterConfiguration::setGeneratorConfiguration(const QString &prefix, KisFilterConfigurationSP config)
0189 {
0190     if (!config) {
0191         return;
0192     }
0193 
0194     QString generatorId = this->generatorId(prefix);
0195     QString fullGeneratorId = prefix + "generator_" + generatorId;
0196     setPrefixedProperties(fullGeneratorId + "_", config);
0197     m_generatorConfigurationsCache[prefix] = config;
0198 }
0199 
0200 void KisHalftoneFilterConfiguration::setHardness(const QString & prefix, qreal newHardness)
0201 {
0202     setProperty(prefix + "hardness", newHardness);
0203 }
0204 
0205 void KisHalftoneFilterConfiguration::setInvert(const QString & prefix, bool newInvert)
0206 {
0207     setProperty(prefix + "invert", newInvert);
0208 }
0209 
0210 void KisHalftoneFilterConfiguration::setForegroundColor(const QString & prefix, const KoColor & newForegroundColor)
0211 {
0212     QVariant v;
0213     v.setValue(newForegroundColor);
0214     setProperty(prefix + "foreground_color", v);
0215 }
0216 
0217 void KisHalftoneFilterConfiguration::setForegroundOpacity(const QString & prefix, int newForegroundOpacity)
0218 {
0219     setProperty(prefix + "foreground_opacity", newForegroundOpacity);
0220 }
0221 void KisHalftoneFilterConfiguration::setBackgroundColor(const QString & prefix, const KoColor & newBackgroundColor)
0222 {
0223     QVariant v;
0224     v.setValue(newBackgroundColor);
0225     setProperty(prefix + "background_color", v);
0226 }
0227 
0228 void KisHalftoneFilterConfiguration::setBackgroundOpacity(const QString & prefix, int newBackgroundOpacity)
0229 {
0230     setProperty(prefix + "background_opacity", newBackgroundOpacity);
0231 }
0232 
0233 void KisHalftoneFilterConfiguration::setProperty(const QString &name, const QVariant &value)
0234 {
0235     KisFilterConfiguration::setProperty(name, value);
0236 
0237     // The generator configurations are cached, so we need to check if the
0238     // property name of a property being set represents a property of a
0239     // generator configuration, and in that case we must remove the cache entry
0240     // that property belongs to, so that the configuration can be regenerated
0241     // later. This is an issue mainly when setting the properties directly
0242     // (through python for example) instead of using the high level methods.
0243     const QStringList nameParts = name.split('_');
0244     if (nameParts.size() < 3) {
0245         return;
0246     }
0247     const int generatorKeywordIndex = nameParts[0] == "alpha" || nameParts[0] == "intensity" ? 1 : 2;
0248     if (nameParts[generatorKeywordIndex] != "generator") {
0249         return;
0250     }
0251     if (generatorKeywordIndex == 1) {
0252         m_generatorConfigurationsCache.remove(nameParts[0] + "_");
0253     } else {
0254         m_generatorConfigurationsCache.remove(nameParts[0] + "_" + nameParts[1] + "_");
0255     }
0256 }