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 }