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

0001 /*
0002  *  SPDX-FileCopyrightText: 2017 Dmitry Kazakov <dimula73@gmail.com>
0003  *
0004  *  SPDX-License-Identifier: GPL-2.0-or-later
0005  */
0006 
0007 #include "KoSvgPaste.h"
0008 
0009 #include <QApplication>
0010 #include <QClipboard>
0011 #include <QMimeData>
0012 
0013 #include <SvgParser.h>
0014 #include <KoDocumentResourceManager.h>
0015 #include <FlakeDebug.h>
0016 #include <QRectF>
0017 #include <KoMarker.h>
0018 
0019 class KoSvgPaste::Private
0020 {
0021 public:
0022     Private()
0023         : mimeData(QApplication::clipboard()->mimeData())
0024         {
0025 
0026         }
0027 
0028     const QMimeData *mimeData;
0029 };
0030 
0031 KoSvgPaste::KoSvgPaste()
0032     : d(new Private)
0033 {
0034 }
0035 
0036 KoSvgPaste::~KoSvgPaste()
0037 {
0038     delete(d);
0039 }
0040 
0041 bool KoSvgPaste::hasShapes()
0042 {
0043     bool hasSvg = false;
0044     if (d->mimeData) {
0045         Q_FOREACH(const QString &format, d->mimeData->formats()) {
0046             if (format.toLower().contains("svg")) {
0047                 hasSvg = true;
0048                 break;
0049             }
0050         }
0051     }
0052 
0053     return hasSvg;
0054 }
0055 
0056 QList<KoShape*> KoSvgPaste::fetchShapes(const QRectF viewportInPx, qreal resolutionPPI, QSizeF *fragmentSize)
0057 {
0058     QList<KoShape*> shapes;
0059 
0060     if (!d->mimeData) return shapes;
0061 
0062     QByteArray data;
0063 
0064     Q_FOREACH(const QString &format, d->mimeData->formats()) {
0065         if (format.toLower().contains("svg")) {
0066             data = d->mimeData->data(format);
0067             break;
0068         }
0069     }
0070 
0071     if (data.isEmpty()) {
0072         return shapes;
0073     }
0074 
0075     return fetchShapesFromData(data, viewportInPx, resolutionPPI, fragmentSize);
0076 
0077 }
0078 
0079 QList<KoShape*> KoSvgPaste::fetchShapesFromData(const QByteArray &data, const QRectF viewportInPx, qreal resolutionPPI, QSizeF *fragmentSize)
0080 {
0081     QList<KoShape*> shapes;
0082 
0083     if (data.isEmpty()) {
0084         return shapes;
0085     }
0086 
0087 
0088 
0089     QString errorMsg;
0090     int errorLine = 0;
0091     int errorColumn = 0;
0092 
0093     QDomDocument doc = SvgParser::createDocumentFromSvg(data, &errorMsg, &errorLine, &errorColumn);
0094     if (doc.isNull()) {
0095         qWarning() << "Failed to process an SVG file at"
0096                    << errorLine << ":" << errorColumn << "->" << errorMsg;
0097         return shapes;
0098     }
0099 
0100     KoDocumentResourceManager resourceManager;
0101     SvgParser parser(&resourceManager);
0102     parser.setResolution(viewportInPx, resolutionPPI);
0103 
0104     shapes = parser.parseSvg(doc.documentElement(), fragmentSize);
0105 
0106     return shapes;
0107 }