File indexing completed on 2024-06-16 04:16:39
0001 /* 0002 * This file is part of the KDE project 0003 * 0004 * SPDX-FileCopyrightText: 2016 Spencer Brown <sbrown655@gmail.com> 0005 * SPDX-FileCopyrightText: 2020 Deif Lou <ginoba@gmail.com> 0006 * 0007 * SPDX-License-Identifier: GPL-2.0-or-later 0008 */ 0009 0010 #include <QDomDocument> 0011 0012 #include <KoResourceLoadResult.h> 0013 #include <KoStopGradient.h> 0014 #include <KoAbstractGradient.h> 0015 #include <KisDitherWidget.h> 0016 #include <QBuffer> 0017 #include <KoMD5Generator.h> 0018 0019 #include "KisGradientMapFilterConfiguration.h" 0020 0021 KisGradientMapFilterConfiguration::KisGradientMapFilterConfiguration(KisResourcesInterfaceSP resourcesInterface) 0022 : KisFilterConfiguration(defaultName(), defaultVersion(), resourcesInterface) 0023 {} 0024 0025 KisGradientMapFilterConfiguration::KisGradientMapFilterConfiguration(qint32 version, KisResourcesInterfaceSP resourcesInterface) 0026 : KisFilterConfiguration(defaultName(), version, resourcesInterface) 0027 {} 0028 0029 KisGradientMapFilterConfiguration::KisGradientMapFilterConfiguration(const KisGradientMapFilterConfiguration &rhs) 0030 : KisFilterConfiguration(rhs) 0031 {} 0032 0033 KisFilterConfigurationSP KisGradientMapFilterConfiguration::clone() const 0034 { 0035 return new KisGradientMapFilterConfiguration(*this); 0036 } 0037 0038 QList<KoResourceLoadResult> KisGradientMapFilterConfiguration::linkedResources(KisResourcesInterfaceSP globalResourcesInterface) const 0039 { 0040 QList<KoResourceLoadResult> resources; 0041 0042 // only the first version of the filter loaded the gradient by name 0043 if (version() == 1) { 0044 KoAbstractGradientSP gradient = this->gradient(); 0045 if (gradient) { 0046 resources << gradient; 0047 } else { 0048 QString md5sum = this->getString("md5sum"); 0049 QString gradientName = this->getString("gradientName"); 0050 0051 resources << KoResourceSignature(ResourceType::Gradients, md5sum, "", gradientName); 0052 } 0053 } 0054 0055 resources << KisDitherWidget::prepareLinkedResources(*this, "dither/", globalResourcesInterface); 0056 0057 return resources; 0058 } 0059 0060 QList<KoResourceLoadResult> KisGradientMapFilterConfiguration::embeddedResources(KisResourcesInterfaceSP) const 0061 { 0062 QList<KoResourceLoadResult> resources; 0063 0064 // the second version of the filter embeds the gradient 0065 if (version() > 1) { 0066 KoAbstractGradientSP gradient = this->gradient(); 0067 0068 // TODO: check if it is okay to resave the gradient on loading 0069 QBuffer buffer; 0070 buffer.open(QBuffer::WriteOnly); 0071 gradient->saveToDevice(&buffer); 0072 0073 resources << KoEmbeddedResource(KoResourceSignature(ResourceType::Gradients, KoMD5Generator::generateHash(buffer.data()), gradient->filename(), gradient->name()), buffer.data()); 0074 } 0075 0076 return resources; 0077 } 0078 0079 KoAbstractGradientSP KisGradientMapFilterConfiguration::gradient(KoAbstractGradientSP fallbackGradient) const 0080 { 0081 if (version() == 1) { 0082 0083 QString md5sum = this->getString("md5sum"); 0084 QString gradientName = this->getString("gradientName"); 0085 auto source = resourcesInterface()->source<KoAbstractGradient>(ResourceType::Gradients); 0086 0087 KoAbstractGradientSP resourceGradient = source.bestMatch(md5sum, "", gradientName); 0088 0089 if (resourceGradient) { 0090 KoStopGradientSP gradient = KisGradientConversion::toStopGradient(resourceGradient); 0091 gradient->setValid(true); 0092 return gradient; 0093 } else { 0094 qWarning() << "Could not find gradient" << getString("md5sum") << getString("gradientName"); 0095 } 0096 } else if (version() == 2) { 0097 QDomDocument document; 0098 if (document.setContent(getString("gradientXML", ""))) { 0099 const QDomElement gradientElement = document.firstChildElement(); 0100 if (!gradientElement.isNull()) { 0101 const QString gradientType = gradientElement.attribute("type"); 0102 KoAbstractGradientSP gradient = nullptr; 0103 if (gradientType == "stop") { 0104 gradient = KoStopGradient::fromXML(gradientElement).clone().dynamicCast<KoAbstractGradient>(); 0105 } else if (gradientType == "segment") { 0106 gradient = KoSegmentGradient::fromXML(gradientElement).clone().dynamicCast<KoAbstractGradient>(); 0107 } 0108 if (gradient) { 0109 gradient->setName(gradientElement.attribute("name", "")); 0110 gradient->setFilename(gradient->name() + gradient->defaultFileExtension()); 0111 gradient->setValid(true); 0112 return gradient; 0113 } 0114 } 0115 } 0116 } 0117 return fallbackGradient ? fallbackGradient : defaultGradient(resourcesInterface()); 0118 } 0119 0120 int KisGradientMapFilterConfiguration::colorMode() const 0121 { 0122 return getInt("colorMode", defaultColorMode()); 0123 } 0124 0125 void KisGradientMapFilterConfiguration::setGradient(KoAbstractGradientSP newGradient) 0126 { 0127 if (!newGradient) { 0128 setProperty("gradientXML", ""); 0129 return; 0130 } 0131 0132 QDomDocument document; 0133 QDomElement gradientElement = document.createElement("gradient"); 0134 gradientElement.setAttribute("name", newGradient->name()); 0135 gradientElement.setAttribute("md5sum", newGradient->md5Sum()); 0136 0137 if (newGradient.dynamicCast<KoStopGradient>()) { 0138 KoStopGradient *gradient = static_cast<KoStopGradient*>(newGradient.data()); 0139 gradient->toXML(document, gradientElement); 0140 } else if (newGradient.dynamicCast<KoSegmentGradient>()) { 0141 KoSegmentGradient *gradient = static_cast<KoSegmentGradient*>(newGradient.data()); 0142 gradient->toXML(document, gradientElement); 0143 } 0144 0145 document.appendChild(gradientElement); 0146 setProperty("gradientXML", document.toString()); 0147 } 0148 0149 void KisGradientMapFilterConfiguration::setColorMode(int newColorMode) 0150 { 0151 setProperty("colorMode", newColorMode); 0152 } 0153 0154 void KisGradientMapFilterConfiguration::setDefaults() 0155 { 0156 setGradient(nullptr); 0157 setColorMode(defaultColorMode()); 0158 KisDitherWidget::factoryConfiguration(*this, "dither/"); 0159 }