File indexing completed on 2024-05-05 08:44:05
0001 // This file is part of Washi Pad 0002 // SPDX-FileCopyrightText: 2018 Kevin Ottens <ervin@kde.org> 0003 // SPDX-License-Identifier: GPL-2.0-only OR GPL-3.0-only OR LicenseRef-KDE-Accepted-GPL 0004 0005 #include "sketchserializer.h" 0006 0007 #include <functional> 0008 #include <memory> 0009 0010 #include <QImageWriter> 0011 #include <QPainter> 0012 #include <QUrl> 0013 #include <QSvgGenerator> 0014 0015 #include "sketchmodel.h" 0016 #include "strokepainter.h" 0017 0018 class Serializer 0019 { 0020 public: 0021 Serializer(std::unique_ptr<QPaintDevice> &&device, 0022 const std::function<void(QPaintDevice*)> writer = {}) 0023 : m_device(std::move(device)), 0024 m_writer(writer) 0025 { 0026 } 0027 0028 ~Serializer() 0029 { 0030 if (m_writer) 0031 m_writer(m_device.get()); 0032 } 0033 0034 QPaintDevice *device() const 0035 { 0036 return m_device.get(); 0037 } 0038 0039 private: 0040 std::unique_ptr<QPaintDevice> m_device; 0041 std::function<void(QPaintDevice *)> m_writer; 0042 }; 0043 0044 0045 std::unique_ptr<Serializer> createSerializer(const QSize &size, const QString &fileName) 0046 { 0047 if (fileName.endsWith(".svg")) { 0048 auto generator = std::make_unique<QSvgGenerator>(); 0049 generator->setFileName(fileName); 0050 generator->setViewBox(QRect{{0, 0}, size}); 0051 return std::make_unique<Serializer>(std::move(generator)); 0052 } else { 0053 auto image = std::make_unique<QImage>(size, QImage::Format_RGB32); 0054 image->fill(Qt::white); 0055 0056 auto writeImage = [fileName](QPaintDevice *image) { 0057 QImageWriter writer(fileName); 0058 writer.write(*static_cast<QImage*>(image)); 0059 }; 0060 0061 return std::make_unique<Serializer>(std::move(image), writeImage); 0062 } 0063 } 0064 0065 void SketchSerializer::serialize(SketchModel *model, const QSize &size, const QUrl &fileUrl) 0066 { 0067 Q_ASSERT(fileUrl.isLocalFile()); 0068 0069 auto strokes = model->strokes(); 0070 auto serializer = createSerializer(size, fileUrl.toLocalFile()); 0071 auto painter = std::make_unique<QPainter>(serializer->device()); 0072 painter->setRenderHint(QPainter::Antialiasing); 0073 0074 for (const auto &stroke : qAsConst(strokes)) { 0075 StrokePainter::render(stroke, painter.get()); 0076 } 0077 }