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 }