File indexing completed on 2024-05-12 04:34:49

0001 /* ============================================================
0002 * Date        : 2010-07-02
0003 * Description : Image saver class for libksane image data.
0004 *
0005 * SPDX-FileCopyrightText: 2010-2012 Kåre Särs <kare.sars@iki .fi>
0006 *
0007 * SPDX-License-Identifier: GPL-2.0-only OR GPL-3.0-only OR LicenseRef-KDE-Accepted-GPL
0008 *
0009 * ============================================================ */
0010 
0011 #include "SkanliteImageSaver.h"
0012 
0013 #include <QMutex>
0014 #include <QUrl>
0015 #include <QImage>
0016 #include <QPdfWriter>
0017 #include <QPainter>
0018 
0019 struct SkanliteImageSaver::Private {
0020     bool   m_savedOk;
0021     QMutex m_runMutex;
0022 
0023     QUrl       m_url;
0024     QString    m_name;
0025     QImage     m_image;
0026     QString    m_fileFormat;
0027     int        m_quality;
0028 
0029     SkanliteImageSaver *q;
0030 
0031     bool saveQImage();
0032     bool savePDF();
0033 };
0034 
0035 // ------------------------------------------------------------------------
0036 SkanliteImageSaver::SkanliteImageSaver(QObject *parent) : QThread(parent), d(new Private)
0037 {
0038     d->q = this;
0039 }
0040 
0041 // ------------------------------------------------------------------------
0042 SkanliteImageSaver::~SkanliteImageSaver()
0043 {
0044     delete d;
0045 }
0046 
0047 bool SkanliteImageSaver::saveQImage(const QUrl &url, const QString &name, const QImage &image, const QString& fileFormat, int quality)
0048 {
0049     if (!d->m_runMutex.tryLock()) {
0050         return false;
0051     }
0052 
0053     d->m_url    = url;
0054     d->m_name   = name;
0055     d->m_image  = image;
0056     d->m_fileFormat = fileFormat;
0057     d->m_quality = quality;
0058 
0059     start();
0060     return true;
0061 }
0062 
0063 void SkanliteImageSaver::run()
0064 {
0065     if (d->m_fileFormat == QLatin1String("pdf")) {
0066         d->m_savedOk = d->savePDF();
0067     } else {
0068         d->m_savedOk = d->saveQImage();
0069     }
0070 
0071     Q_EMIT imageSaved(d->m_url, d->m_name, d->m_savedOk);
0072 
0073     d->m_runMutex.unlock();
0074 }
0075 
0076 bool SkanliteImageSaver::Private::saveQImage()
0077 {
0078     return m_image.save(m_name, qPrintable(m_fileFormat), m_quality);
0079 }
0080 
0081 bool SkanliteImageSaver::Private::savePDF()
0082 {
0083     const QPageSize pageSize = QPageSize(QSizeF(m_image.width() * 1000.0 / m_image.dotsPerMeterX() , m_image.height() * 1000.0 / m_image.dotsPerMeterY()), QPageSize::Millimeter);
0084     const int dpi = qRound(m_image.dotsPerMeterX() / 1000.0 * 25.4);
0085 
0086     QPainter painter;
0087     QPdfWriter writer(m_name);
0088     writer.setPageOrientation(QPageLayout::Portrait);
0089     writer.setResolution(dpi);
0090     writer.setPageSize(pageSize);
0091     writer.setPageMargins(QMarginsF(0, 0, 0, 0));
0092     writer.setCreator(QStringLiteral("Skanlite"));
0093     writer.setTitle(m_name);
0094 
0095     QRect paintArea(0, 0, writer.width(), writer.height());
0096     if (!painter.begin(&writer)) {
0097         return false;
0098     }
0099 
0100     painter.drawImage(paintArea, m_image);
0101 
0102     return painter.end();
0103 }
0104 
0105 #include "moc_SkanliteImageSaver.cpp"