| 1 | /* |
| 2 | This file is part of KNewStuff2. |
| 3 | SPDX-FileCopyrightText: 2006, 2007 Josef Spillner <spillner@kde.org> |
| 4 | |
| 5 | SPDX-License-Identifier: LGPL-2.1-or-later |
| 6 | */ |
| 7 | |
| 8 | #include "imageloader_p.h" |
| 9 | |
| 10 | using namespace KNSCore; |
| 11 | |
| 12 | ImageLoader::ImageLoader(const Entry &entry, Entry::PreviewType type, QObject *parent) |
| 13 | : QObject(parent) |
| 14 | , m_entry(entry) |
| 15 | , m_previewType(type) |
| 16 | { |
| 17 | } |
| 18 | |
| 19 | void ImageLoader::start() |
| 20 | { |
| 21 | QUrl url(m_entry.previewUrl(type: m_previewType)); |
| 22 | if (!url.isEmpty()) { |
| 23 | m_job = HTTPJob::get(source: url, loadType: NoReload, flags: JobFlag::HideProgressInfo, parent: this); |
| 24 | connect(sender: m_job, signal: &KJob::result, context: this, slot: &ImageLoader::slotDownload); |
| 25 | connect(sender: m_job, signal: &HTTPJob::data, context: this, slot: &ImageLoader::slotData); |
| 26 | } else { |
| 27 | Q_EMIT signalError(m_entry, m_previewType, QStringLiteral("Empty url" )); |
| 28 | deleteLater(); |
| 29 | } |
| 30 | } |
| 31 | |
| 32 | KJob *ImageLoader::job() |
| 33 | { |
| 34 | return m_job; |
| 35 | } |
| 36 | |
| 37 | void ImageLoader::slotData(KJob * /*job*/, const QByteArray &buf) |
| 38 | { |
| 39 | m_buffer.append(a: buf); |
| 40 | } |
| 41 | |
| 42 | void ImageLoader::slotDownload(KJob *job) |
| 43 | { |
| 44 | if (job->error()) { |
| 45 | m_buffer.clear(); |
| 46 | Q_EMIT signalError(m_entry, m_previewType, job->errorText()); |
| 47 | deleteLater(); |
| 48 | return; |
| 49 | } |
| 50 | QImage image; |
| 51 | image.loadFromData(data: std::move(m_buffer)); |
| 52 | |
| 53 | if (m_previewType == Entry::PreviewSmall1 || m_previewType == Entry::PreviewSmall2 || m_previewType == Entry::PreviewSmall3) { |
| 54 | if (image.width() > PreviewWidth || image.height() > PreviewHeight) { |
| 55 | // if the preview is really big, first scale fast to a smaller size, then smooth to desired size |
| 56 | if (image.width() > 4 * PreviewWidth || image.height() > 4 * PreviewHeight) { |
| 57 | image = image.scaled(w: 2 * PreviewWidth, h: 2 * PreviewHeight, aspectMode: Qt::KeepAspectRatio, mode: Qt::FastTransformation); |
| 58 | } |
| 59 | image = image.scaled(w: PreviewWidth, h: PreviewHeight, aspectMode: Qt::KeepAspectRatio, mode: Qt::SmoothTransformation); |
| 60 | } else if (image.width() <= PreviewWidth / 2 && image.height() <= PreviewHeight / 2) { |
| 61 | // upscale tiny previews to double size |
| 62 | image = image.scaled(w: 2 * image.width(), h: 2 * image.height()); |
| 63 | } |
| 64 | } |
| 65 | |
| 66 | m_entry.setPreviewImage(image, type: m_previewType); |
| 67 | Q_EMIT signalPreviewLoaded(m_entry, m_previewType); |
| 68 | deleteLater(); |
| 69 | } |
| 70 | |
| 71 | #include "moc_imageloader_p.cpp" |
| 72 | |