File indexing completed on 2025-02-02 04:22:09

0001 /* This file is part of the KDE project
0002  * SPDX-FileCopyrightText: 2008 Boudewijn Rempt <boud@valdyas.org>
0003  * SPDX-FileCopyrightText: 2008 Sven Langkamp <sven.langkamp@gmail.com>
0004  *
0005  * SPDX-License-Identifier: LGPL-2.0-or-later
0006  */
0007 
0008 #include "kis_brush_option.h"
0009 
0010 #include <QDomDocument>
0011 #include <QDomElement>
0012 
0013 #include "kis_properties_configuration.h"
0014 #include <KisPaintopSettingsIds.h>
0015 #include <kis_brush.h>
0016 
0017 #include <KoCanvasResourcesInterface.h>
0018 #include <KoCanvasResourcesIds.h>
0019 #include <KoAbstractGradient.h>
0020 #include <KoResourceLoadResult.h>
0021 
0022 void KisBrushOptionProperties::writeOptionSettingImpl(KisPropertiesConfiguration *setting) const
0023 {
0024     if (!m_brush) return;
0025 
0026     QDomDocument d;
0027     QDomElement e = d.createElement("Brush");
0028     m_brush->toXML(d, e);
0029     d.appendChild(e);
0030     setting->setProperty("brush_definition", d.toString());
0031 }
0032 
0033 QDomElement getBrushXMLElement(const KisPropertiesConfiguration *setting)
0034 {
0035     QDomElement element;
0036 
0037     QString brushDefinition = setting->getString("brush_definition");
0038 
0039     if (!brushDefinition.isEmpty()) {
0040         QDomDocument d;
0041         d.setContent(brushDefinition, false);
0042         element = d.firstChildElement("Brush");
0043     }
0044 
0045     return element;
0046 }
0047 
0048 void KisBrushOptionProperties::readOptionSettingResourceImpl(const KisPropertiesConfiguration *setting, KisResourcesInterfaceSP resourcesInterface, KoCanvasResourcesInterfaceSP canvasResourcesInterface)
0049 {
0050     QDomElement element = getBrushXMLElement(setting);
0051     if (!element.isNull()) {
0052         m_brush = KisBrush::fromXML(element, resourcesInterface);
0053         if (m_brush && m_brush->applyingGradient() && canvasResourcesInterface) {
0054             KoAbstractGradientSP gradient = canvasResourcesInterface->resource(KoCanvasResource::CurrentGradient).value<KoAbstractGradientSP>()->cloneAndBakeVariableColors(canvasResourcesInterface);
0055             m_brush->setGradient(gradient);
0056         }
0057     }
0058 }
0059 
0060 QList<KoResourceLoadResult> KisBrushOptionProperties::prepareLinkedResourcesImpl(const KisPropertiesConfiguration *settings, KisResourcesInterfaceSP resourcesInterface) const
0061 {
0062     QList<KoResourceLoadResult> resources;
0063     QDomElement element = getBrushXMLElement(settings);
0064     if (element.isNull()) return resources;
0065 
0066     KoResourceLoadResult result = KisBrush::fromXMLLoadResult(element, resourcesInterface);
0067 
0068     KoResourceSP resource = result.resource();
0069     if (!resource || !resource->isEphemeral()) {
0070         resources << result;
0071     }
0072 
0073     return resources;
0074 }
0075 
0076 QList<KoResourceLoadResult> KisBrushOptionProperties::prepareEmbeddedResourcesImpl(const KisPropertiesConfiguration *settings, KisResourcesInterfaceSP resourcesInterface) const
0077 {
0078     Q_UNUSED(settings);
0079     Q_UNUSED(resourcesInterface);
0080     return {};
0081 }
0082 
0083 enumBrushApplication KisBrushOptionProperties::brushApplication(const KisPropertiesConfiguration *settings, KisResourcesInterfaceSP resourcesInterface)
0084 {
0085     QList<KoResourceSP> resources;
0086 
0087     QDomElement element = getBrushXMLElement(settings);
0088     if (element.isNull()) return ALPHAMASK;
0089 
0090     KisBrushSP brush = KisBrush::fromXML(element, resourcesInterface);
0091 
0092     return brush ? brush->brushApplication() : ALPHAMASK;
0093 }
0094 
0095 #ifdef HAVE_THREADED_TEXT_RENDERING_WORKAROUND
0096 
0097 #include "kis_text_brush_factory.h"
0098 
0099 bool KisBrushOptionProperties::isTextBrush(const KisPropertiesConfiguration *setting)
0100 {
0101     static QString textBrushId = KisTextBrushFactory().id();
0102 
0103     QDomElement element = getBrushXMLElement(setting);
0104     QString brushType = element.attribute("type");
0105 
0106     return brushType == textBrushId;
0107 }
0108 
0109 #endif /* HAVE_THREADED_TEXT_RENDERING_WORKAROUND */
0110 
0111 KisBrushSP KisBrushOptionProperties::brush() const
0112 {
0113     return m_brush;
0114 }
0115 
0116 void KisBrushOptionProperties::setBrush(KisBrushSP brush)
0117 {
0118     m_brush = brush;
0119 }