File indexing completed on 2024-05-19 04:24:15

0001 /*
0002  *  SPDX-FileCopyrightText: 2008 Boudewijn Rempt <boud@valdyas.org>
0003  *
0004  *  SPDX-License-Identifier: GPL-2.0-or-later
0005  */
0006 #include "kis_brush_registry.h"
0007 
0008 #include <QString>
0009 
0010 #include <QGlobalStatic>
0011 #include <klocalizedstring.h>
0012 
0013 #include <KoPluginLoader.h>
0014 
0015 #include <kis_debug.h>
0016 
0017 #include "KoResourceServer.h"
0018 #include "kis_auto_brush_factory.h"
0019 #include "kis_text_brush_factory.h"
0020 #include "kis_predefined_brush_factory.h"
0021 
0022 Q_GLOBAL_STATIC(KisBrushRegistry, s_instance)
0023 
0024 
0025 KisBrushRegistry::KisBrushRegistry()
0026 {
0027 }
0028 
0029 KisBrushRegistry::~KisBrushRegistry()
0030 {
0031     Q_FOREACH (const QString & id, keys()) {
0032         delete get(id);
0033     }
0034     dbgRegistry << "deleting KisBrushRegistry";
0035 }
0036 
0037 KisBrushRegistry* KisBrushRegistry::instance()
0038 {
0039     if (!s_instance.exists()) {
0040         s_instance->add(new KisAutoBrushFactory());
0041         s_instance->add(new KisPredefinedBrushFactory("gbr_brush"));
0042         s_instance->add(new KisPredefinedBrushFactory("abr_brush"));
0043         s_instance->add(new KisTextBrushFactory());
0044         s_instance->add(new KisPredefinedBrushFactory("png_brush"));
0045         s_instance->add(new KisPredefinedBrushFactory("svg_brush"));
0046     }
0047     return s_instance;
0048 }
0049 
0050 
0051 KoResourceLoadResult KisBrushRegistry::createBrush(const QDomElement& element, KisResourcesInterfaceSP resourcesInterface)
0052 {
0053     QString brushType = element.attribute("type");
0054 
0055     if (brushType.isEmpty()) {
0056         return KoResourceSignature(ResourceType::Brushes, "", "unknown", "unknown");
0057     }
0058 
0059     KisBrushFactory *factory = get(brushType);
0060     if (!factory) {
0061         return KoResourceSignature(ResourceType::Brushes, "", "unknown", "unknown");
0062     }
0063 
0064     return factory->createBrush(element, resourcesInterface);
0065 }
0066 
0067 KoResourceLoadResult KisBrushRegistry::createBrush(const KisBrushModel::BrushData &data, KisResourcesInterfaceSP resourcesInterface)
0068 {
0069     QDomDocument doc;
0070     QDomElement element = doc.createElement("brush_definition");
0071     toXML(doc, element, data);
0072     return createBrush(element, resourcesInterface);
0073 }
0074 
0075 std::optional<KisBrushModel::BrushData> KisBrushRegistry::createBrushModel(const QDomElement& element, KisResourcesInterfaceSP resourcesInterface)
0076 {
0077     QString brushType = element.attribute("type");
0078 
0079     if (brushType.isEmpty()) {
0080         return std::nullopt;
0081     }
0082 
0083     KisBrushFactory *factory = get(brushType);
0084 
0085     if (!factory) {
0086         return std::nullopt;
0087     }
0088 
0089     return factory->createBrushModel(element, resourcesInterface);
0090 }
0091 
0092 void KisBrushRegistry::toXML(QDomDocument &doc, QDomElement &element, const KisBrushModel::BrushData &model)
0093 {
0094     QString brushType;
0095 
0096     if (model.type == KisBrushModel::Auto) {
0097         brushType = "auto_brush";
0098     } else if (model.type == KisBrushModel::Text) {
0099         brushType = "kis_text_brush";
0100     } else {
0101         brushType = model.predefinedBrush.subtype;
0102     }
0103 
0104     KIS_SAFE_ASSERT_RECOVER_RETURN(!brushType.isEmpty());
0105 
0106     KisBrushFactory *factory = get(brushType);
0107     KIS_SAFE_ASSERT_RECOVER_RETURN(factory);
0108 
0109     factory->toXML(doc, element, model);
0110 }