File indexing completed on 2024-05-12 15:56:12

0001 /*
0002  *  SPDX-FileCopyrightText: 2010 Cyrille Berger <cberger@cberger.net>
0003  *
0004  *  SPDX-License-Identifier: GPL-2.0-or-later
0005  */
0006 
0007 #include "kis_svg_brush.h"
0008 
0009 #include <QDomElement>
0010 #include <QFileInfo>
0011 #include <QPainter>
0012 #include <QImageReader>
0013 #include <QSvgRenderer>
0014 
0015 KisSvgBrush::KisSvgBrush(const QString& filename)
0016     : KisScalingSizeBrush(filename)
0017 {
0018     setBrushType(INVALID);
0019     setSpacing(0.25);
0020 }
0021 
0022 KisSvgBrush::KisSvgBrush(const KisSvgBrush& rhs)
0023     : KisScalingSizeBrush(rhs)
0024     , m_svg(rhs.m_svg)
0025 {
0026 }
0027 
0028 KoResourceSP KisSvgBrush::clone() const
0029 {
0030     return KoResourceSP(new KisSvgBrush(*this));
0031 }
0032 
0033 bool KisSvgBrush::loadFromDevice(QIODevice *dev, KisResourcesInterfaceSP resourcesInterface)
0034 {
0035     Q_UNUSED(resourcesInterface);
0036 
0037     m_svg = dev->readAll();
0038 
0039     QSvgRenderer renderer(m_svg);
0040 
0041     QRect box = renderer.viewBox();
0042     if (box.isEmpty()) return false;
0043 
0044     QImage image_(1000, (1000 * box.height()) / box.width(), QImage::Format_ARGB32);
0045     {
0046         QPainter p(&image_);
0047         p.fillRect(0, 0, image_.width(), image_.height(), Qt::white);
0048         renderer.render(&p);
0049     }
0050 
0051     QVector<QRgb> table;
0052     for (int i = 0; i < 256; ++i) table.push_back(qRgb(i, i, i));
0053     image_ = image_.convertToFormat(QImage::Format_Indexed8, table);
0054 
0055     setBrushTipImage(image_);
0056 
0057     setValid(true);
0058 
0059     setBrushType(MASK);
0060 
0061     setWidth(brushTipImage().width());
0062     setHeight(brushTipImage().height());
0063 
0064     QFileInfo fi(filename());
0065     setName(fi.completeBaseName());
0066 
0067     return !brushTipImage().isNull() && valid();
0068 }
0069 
0070 bool KisSvgBrush::saveToDevice(QIODevice *dev) const
0071 {
0072     return dev->write(m_svg.constData(), m_svg.size()) == m_svg.size();
0073 }
0074 
0075 QString KisSvgBrush::defaultFileExtension() const
0076 {
0077     return QString(".svg");
0078 }
0079 
0080 void KisSvgBrush::toXML(QDomDocument& d, QDomElement& e) const
0081 {
0082     predefinedBrushToXML("svg_brush", e);
0083     KisBrush::toXML(d, e);
0084 }