File indexing completed on 2024-04-28 15:28:57

0001 /*
0002     This file is part of KNewStuff2.
0003     SPDX-FileCopyrightText: 2006, 2007 Josef Spillner <spillner@kde.org>
0004 
0005     SPDX-License-Identifier: LGPL-2.1-or-later
0006 */
0007 
0008 #include "imageloader_p.h"
0009 
0010 using namespace KNSCore;
0011 
0012 ImageLoader::ImageLoader(const EntryInternal &entry, EntryInternal::PreviewType type, QObject *parent)
0013     : QObject(parent)
0014     , m_entry(entry)
0015     , m_previewType(type)
0016 {
0017 }
0018 
0019 void ImageLoader::start()
0020 {
0021     QUrl url(m_entry.previewUrl(m_previewType));
0022     if (!url.isEmpty()) {
0023         m_job = HTTPJob::get(url, NoReload, JobFlag::HideProgressInfo, this);
0024         connect(m_job, &KJob::result, this, &ImageLoader::slotDownload);
0025         connect(m_job, &HTTPJob::data, this, &ImageLoader::slotData);
0026     } else {
0027         Q_EMIT signalError(m_entry, m_previewType, QStringLiteral("Empty url"));
0028         deleteLater();
0029     }
0030 }
0031 
0032 KJob *ImageLoader::job()
0033 {
0034     return m_job;
0035 }
0036 
0037 void ImageLoader::slotData(KJob *job, const QByteArray &buf)
0038 {
0039     Q_UNUSED(job)
0040     m_buffer.append(buf);
0041 }
0042 
0043 void ImageLoader::slotDownload(KJob *job)
0044 {
0045     if (job->error()) {
0046         m_buffer.clear();
0047         Q_EMIT signalError(m_entry, m_previewType, job->errorText());
0048         deleteLater();
0049         return;
0050     }
0051     QImage image;
0052     image.loadFromData(std::move(m_buffer));
0053 
0054     if (m_previewType == EntryInternal::PreviewSmall1 || m_previewType == EntryInternal::PreviewSmall2 || m_previewType == EntryInternal::PreviewSmall3) {
0055         if (image.width() > PreviewWidth || image.height() > PreviewHeight) {
0056             // if the preview is really big, first scale fast to a smaller size, then smooth to desired size
0057             if (image.width() > 4 * PreviewWidth || image.height() > 4 * PreviewHeight) {
0058                 image = image.scaled(2 * PreviewWidth, 2 * PreviewHeight, Qt::KeepAspectRatio, Qt::FastTransformation);
0059             }
0060             image = image.scaled(PreviewWidth, PreviewHeight, Qt::KeepAspectRatio, Qt::SmoothTransformation);
0061         } else if (image.width() <= PreviewWidth / 2 && image.height() <= PreviewHeight / 2) {
0062             // upscale tiny previews to double size
0063             image = image.scaled(2 * image.width(), 2 * image.height());
0064         }
0065     }
0066 
0067     m_entry.setPreviewImage(image, m_previewType);
0068     Q_EMIT signalPreviewLoaded(m_entry, m_previewType);
0069     deleteLater();
0070 }
0071 
0072 #include "moc_imageloader_p.cpp"