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 }