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

0001 /*
0002  *  SPDX-FileCopyrightText: 2008 Boudewijn Rempt <boud@valdyas.org>
0003  *
0004  *  SPDX-License-Identifier: GPL-2.0-or-later
0005  */
0006 #include "kis_text_brush_factory.h"
0007 
0008 #include <QString>
0009 #include <QFont>
0010 #include <kis_dom_utils.h>
0011 #include "kis_text_brush.h"
0012 #include <KoResourceLoadResult.h>
0013 
0014 
0015 KoResourceLoadResult KisTextBrushFactory::createBrush(const QDomElement& brushDefinition, KisResourcesInterfaceSP resourcesInterface)
0016 {
0017     std::optional<KisBrushModel::BrushData> data =
0018         createBrushModel(brushDefinition, resourcesInterface);
0019 
0020     if (data) {
0021         return createBrush(*data, resourcesInterface);
0022     }
0023 
0024     // fallback, should never reach!
0025     return KoResourceSignature(ResourceType::Brushes, "", "", "");
0026 }
0027 
0028 KoResourceLoadResult KisTextBrushFactory::createBrush(const KisBrushModel::BrushData& data, KisResourcesInterfaceSP resourcesInterface)
0029 {
0030     Q_UNUSED(resourcesInterface);
0031 
0032     KisTextBrushSP brush = KisTextBrushSP(new KisTextBrush());
0033 
0034     QFont font;
0035     font.fromString(data.textBrush.font);
0036 
0037     brush->setText(data.textBrush.text);
0038     brush->setFont(font);
0039     brush->setPipeMode(data.textBrush.usePipeMode);
0040     brush->setSpacing(data.common.spacing);
0041     brush->updateBrush();
0042 
0043     return brush;
0044 }
0045 
0046 
0047 std::optional<KisBrushModel::BrushData> KisTextBrushFactory::createBrushModel(const QDomElement &element, KisResourcesInterfaceSP resourcesInterface)
0048 {
0049     Q_UNUSED(resourcesInterface);
0050 
0051     KisBrushModel::BrushData brush;
0052 
0053     brush.type = KisBrushModel::Text;
0054 
0055     brush.common.spacing = KisDomUtils::toDouble(element.attribute("spacing", "1.0"));
0056 
0057     // TODO: these options are not yet present in the file format for the text brush!
0058     //brush.common.angle = KisDomUtils::toDouble(brushDefinition.attribute("angle", "0.0"));
0059     //brush.common.useAutoSpacing = KisDomUtils::toInt(brushDefinition.attribute("useAutoSpacing", "0"));
0060     //brush.common.autoSpacingCoeff = KisDomUtils::toDouble(brushDefinition.attribute("autoSpacingCoeff", "1.0"));
0061 
0062     brush.textBrush.text = element.attribute("text", "The quick brown fox ate your text");
0063     brush.textBrush.font = element.attribute("font");
0064     brush.textBrush.usePipeMode = element.attribute("pipe", "false") == "true";
0065 
0066     // TODO: how to get the size of the brush without its creation? lazy evaluation?
0067     // brush.textBrush.baseSize = {66, 77};
0068 
0069     brush.textBrush.scale = 1.0;
0070 
0071     return {brush};
0072 }
0073 
0074 void KisTextBrushFactory::toXML(QDomDocument &doc, QDomElement &e, const KisBrushModel::BrushData &model)
0075 {
0076     Q_UNUSED(doc);
0077 
0078     e.setAttribute("type", id());
0079     e.setAttribute("BrushVersion", "2");
0080 
0081     e.setAttribute("spacing", KisDomUtils::toString(model.common.spacing));
0082     e.setAttribute("text", model.textBrush.text);
0083     e.setAttribute("font", model.textBrush.font);
0084     e.setAttribute("pipe", model.textBrush.usePipeMode ? "true" : "false");
0085     // TODO: scale is not saved
0086 }