File indexing completed on 2024-04-21 03:56:23
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 Entry &entry, Entry::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 m_buffer.append(buf); 0040 } 0041 0042 void ImageLoader::slotDownload(KJob *job) 0043 { 0044 if (job->error()) { 0045 m_buffer.clear(); 0046 Q_EMIT signalError(m_entry, m_previewType, job->errorText()); 0047 deleteLater(); 0048 return; 0049 } 0050 QImage image; 0051 image.loadFromData(std::move(m_buffer)); 0052 0053 if (m_previewType == Entry::PreviewSmall1 || m_previewType == Entry::PreviewSmall2 || m_previewType == Entry::PreviewSmall3) { 0054 if (image.width() > PreviewWidth || image.height() > PreviewHeight) { 0055 // if the preview is really big, first scale fast to a smaller size, then smooth to desired size 0056 if (image.width() > 4 * PreviewWidth || image.height() > 4 * PreviewHeight) { 0057 image = image.scaled(2 * PreviewWidth, 2 * PreviewHeight, Qt::KeepAspectRatio, Qt::FastTransformation); 0058 } 0059 image = image.scaled(PreviewWidth, PreviewHeight, Qt::KeepAspectRatio, Qt::SmoothTransformation); 0060 } else if (image.width() <= PreviewWidth / 2 && image.height() <= PreviewHeight / 2) { 0061 // upscale tiny previews to double size 0062 image = image.scaled(2 * image.width(), 2 * image.height()); 0063 } 0064 } 0065 0066 m_entry.setPreviewImage(image, m_previewType); 0067 Q_EMIT signalPreviewLoaded(m_entry, m_previewType); 0068 deleteLater(); 0069 } 0070 0071 #include "moc_imageloader_p.cpp"