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 }