File indexing completed on 2024-04-28 15:52:32

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 }