File indexing completed on 2024-06-23 05:18:30

0001 /*
0002    SPDX-FileCopyrightText: 2012-2024 Laurent Montel <montel@kde.org>
0003 
0004    SPDX-License-Identifier: GPL-2.0-or-later
0005 */
0006 
0007 #include "imagescaling.h"
0008 #include "settings/messagecomposersettings.h"
0009 #include <QBuffer>
0010 #include <QImage>
0011 using namespace MessageComposer;
0012 
0013 class MessageComposer::ImageScalingPrivate
0014 {
0015 public:
0016     ImageScalingPrivate() = default;
0017 
0018     QImage mImage;
0019     QBuffer mBuffer;
0020     QString mName;
0021     QByteArray mMimeType;
0022 };
0023 
0024 ImageScaling::ImageScaling()
0025     : d(new MessageComposer::ImageScalingPrivate)
0026 {
0027 }
0028 
0029 ImageScaling::~ImageScaling() = default;
0030 
0031 bool ImageScaling::loadImageFromData(const QByteArray &data)
0032 {
0033     if (!d->mImage.loadFromData(data)) {
0034         return false;
0035     }
0036     return true;
0037 }
0038 
0039 bool ImageScaling::resizeImage()
0040 {
0041     if (d->mImage.isNull()) {
0042         return false;
0043     }
0044     const int width = d->mImage.width();
0045     const int height = d->mImage.height();
0046     int newWidth = -1;
0047     int newHeight = -1;
0048     if (MessageComposer::MessageComposerSettings::self()->reduceImageToMaximum()) {
0049         int maximumWidth = MessageComposer::MessageComposerSettings::self()->maximumWidth();
0050         if (maximumWidth == -1) {
0051             maximumWidth = MessageComposer::MessageComposerSettings::self()->customMaximumWidth();
0052         }
0053         int maximumHeight = MessageComposer::MessageComposerSettings::self()->maximumHeight();
0054         if (maximumHeight == -1) {
0055             maximumHeight = MessageComposer::MessageComposerSettings::self()->customMaximumHeight();
0056         }
0057         if (width > maximumWidth) {
0058             newWidth = maximumWidth;
0059         } else {
0060             newWidth = width;
0061         }
0062         if (height > maximumHeight) {
0063             newHeight = maximumHeight;
0064         } else {
0065             newHeight = height;
0066         }
0067     } else {
0068         newHeight = height;
0069         newWidth = width;
0070     }
0071     if (MessageComposer::MessageComposerSettings::self()->enlargeImageToMinimum()) {
0072         int minimumWidth = MessageComposer::MessageComposerSettings::self()->minimumWidth();
0073         if (minimumWidth == -1) {
0074             minimumWidth = MessageComposer::MessageComposerSettings::self()->customMinimumWidth();
0075         }
0076 
0077         int minimumHeight = MessageComposer::MessageComposerSettings::self()->minimumHeight();
0078         if (minimumHeight == -1) {
0079             minimumHeight = MessageComposer::MessageComposerSettings::self()->customMinimumHeight();
0080         }
0081         if (newWidth < minimumWidth) {
0082             newWidth = minimumWidth;
0083         }
0084         if (newHeight < minimumHeight) {
0085             newHeight = minimumHeight;
0086         }
0087     }
0088     if ((newHeight != height) || (newWidth != width)) {
0089         d->mBuffer.open(QIODevice::WriteOnly);
0090         d->mImage = d->mImage.scaled(newWidth,
0091                                      newHeight,
0092                                      MessageComposer::MessageComposerSettings::self()->keepImageRatio() ? Qt::KeepAspectRatio : Qt::IgnoreAspectRatio);
0093 
0094         QByteArray format;
0095         if (d->mMimeType == QByteArrayLiteral("image/jpeg")) {
0096             format = QByteArrayLiteral("JPG");
0097         } else if (d->mMimeType == QByteArrayLiteral("image/png")) {
0098             format = QByteArrayLiteral("PNG");
0099         } else {
0100             format = MessageComposer::MessageComposerSettings::self()->writeFormat().toLocal8Bit();
0101             if (format.isEmpty()) {
0102                 format = QByteArrayLiteral("PNG");
0103             }
0104         }
0105         const bool result = d->mImage.save(&d->mBuffer, format.constData());
0106         d->mBuffer.close();
0107         return result;
0108     } else {
0109         return false;
0110     }
0111     return true;
0112 }
0113 
0114 QByteArray ImageScaling::mimetype() const
0115 {
0116     if (d->mMimeType.isEmpty()) {
0117         return {};
0118     }
0119     if ((d->mMimeType == QByteArrayLiteral("image/jpeg")) || (d->mMimeType == QByteArrayLiteral("image/png"))) {
0120         return d->mMimeType;
0121     } else {
0122         // Add more mimetype if a day we add more saving format.
0123         const QString type = MessageComposer::MessageComposerSettings::self()->writeFormat();
0124         if (type == QLatin1StringView("JPG")) {
0125             return QByteArrayLiteral("image/jpeg");
0126         } else {
0127             return QByteArrayLiteral("image/png");
0128         }
0129     }
0130 }
0131 
0132 void ImageScaling::setMimetype(const QByteArray &mimetype)
0133 {
0134     d->mMimeType = mimetype;
0135 }
0136 
0137 void ImageScaling::setName(const QString &name)
0138 {
0139     d->mName = name;
0140 }
0141 
0142 QByteArray ImageScaling::imageArray() const
0143 {
0144     return d->mBuffer.data();
0145 }
0146 
0147 QString ImageScaling::generateNewName()
0148 {
0149     if (d->mName.isEmpty()) {
0150         return {};
0151     }
0152 
0153     // Don't rename it.
0154     if ((d->mMimeType == QByteArrayLiteral("image/jpeg")) || (d->mMimeType == QByteArrayLiteral("image/png"))) {
0155         return d->mName;
0156     }
0157     QString type = MessageComposer::MessageComposerSettings::self()->writeFormat();
0158     if (type.isEmpty()) {
0159         type = QStringLiteral("PNG");
0160     }
0161     if (d->mName.endsWith(QLatin1StringView(".png"))) {
0162         if (type != QLatin1StringView("PNG")) {
0163             d->mName.replace(QLatin1StringView(".png"), QLatin1StringView(".jpg"));
0164         }
0165     } else if (d->mName.endsWith(QLatin1StringView(".jpg"))) {
0166         if (type != QLatin1StringView("JPG")) {
0167             d->mName.replace(QLatin1StringView(".jpg"), QLatin1StringView(".png"));
0168         }
0169     } else {
0170         if (type == QLatin1StringView("PNG")) {
0171             d->mName += QLatin1StringView(".png");
0172         } else {
0173             d->mName += QLatin1StringView(".jpg");
0174         }
0175     }
0176     return d->mName;
0177 }