Coverage Report

Created: 2026-03-12 07:14

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/src/kio-extras/thumbnail/jpegcreator.cpp
Line
Count
Source
1
/*  This file is part of the KDE libraries
2
    SPDX-FileCopyrightText: 2008 Andre Gemünd <scroogie@gmail.com>
3
    SPDX-FileCopyrightText: 2016 Alexander Volkov <a.volkov@rusbitech.ru>
4
    SPDX-FileCopyrightText: 2022 Kai Uwe Broulik <kde@broulik.de>
5
6
    SPDX-License-Identifier: LGPL-2.0-or-later
7
*/
8
9
#include "config-thumbnail.h"
10
11
#include "jpegcreator.h"
12
#include "jpegcreatorsettings5.h"
13
14
#include <QImage>
15
#include <QImageReader>
16
17
#include <KPluginFactory>
18
19
#if HAVE_KEXIV2
20
#include <KExiv2/KExiv2>
21
#endif
22
23
0
K_PLUGIN_CLASS_WITH_JSON(JpegCreator, "jpegthumbnail.json")
Unexecuted instantiation: jpegthumbnail_factory::tr(char const*, char const*, int)
Unexecuted instantiation: jpegthumbnail_factory::~jpegthumbnail_factory()
24
0
25
0
JpegCreator::JpegCreator(QObject *parent, const QVariantList &args)
26
38.8k
    : KIO::ThumbnailCreator(parent, args)
27
38.8k
{
28
38.8k
}
29
30
KIO::ThumbnailResult JpegCreator::exifThumbnail(const KIO::ThumbnailRequest &request) const
31
38.8k
{
32
38.8k
#if HAVE_KEXIV2
33
38.8k
    KExiv2Iface::KExiv2 exiv2Image(request.url().toLocalFile());
34
38.8k
    QImage image = exiv2Image.getExifThumbnail(JpegCreatorSettings::self()->rotate());
35
36
38.8k
    if (image.isNull()) {
37
38.7k
        return KIO::ThumbnailResult::fail();
38
38.7k
    }
39
40
    // skip embedded thumbnail if strictly smaller
41
65
    if (image.size().width() < request.targetSize().width() && image.size().height() < request.targetSize().height()) {
42
0
        return KIO::ThumbnailResult::fail();
43
0
    }
44
45
65
    return KIO::ThumbnailResult::pass(image);
46
#else
47
    Q_UNUSED(request)
48
    return KIO::ThumbnailResult::fail();
49
#endif // HAVE_KEXIV2
50
65
}
51
52
KIO::ThumbnailResult JpegCreator::imageReaderThumbnail(const KIO::ThumbnailRequest &request) const
53
38.7k
{
54
38.7k
    QImageReader imageReader(request.url().toLocalFile(), "jpeg");
55
38.7k
    const QSize imageSize = imageReader.size();
56
38.7k
    if (imageSize.isValid() && (imageSize.width() > request.targetSize().width() || imageSize.height() > request.targetSize().height())) {
57
7.47k
        const QSize thumbnailSize = imageSize.scaled(request.targetSize(), Qt::KeepAspectRatio);
58
7.47k
        imageReader.setScaledSize(thumbnailSize); // fast downscaling
59
7.47k
    }
60
38.7k
    imageReader.setQuality(75); // set quality so that the jpeg handler will use a high quality downscaler
61
62
38.7k
    imageReader.setAutoTransform(JpegCreatorSettings::self()->rotate());
63
64
38.7k
    QImage image = imageReader.read();
65
66
38.7k
    if (image.isNull()) {
67
35.2k
        return KIO::ThumbnailResult::fail();
68
35.2k
    }
69
70
3.53k
    return KIO::ThumbnailResult::pass(image);
71
38.7k
}
72
73
KIO::ThumbnailResult JpegCreator::create(const KIO::ThumbnailRequest &request)
74
38.8k
{
75
38.8k
    JpegCreatorSettings::self()->load();
76
77
38.8k
    if (auto result = exifThumbnail(request); result.isValid()) {
78
65
        return result;
79
65
    }
80
81
38.7k
    if (auto result = imageReaderThumbnail(request); result.isValid()) {
82
3.53k
        return result;
83
3.53k
    }
84
85
35.2k
    return KIO::ThumbnailResult::fail();
86
38.7k
}
87
88
#include "jpegcreator.moc"
89
#include "moc_jpegcreator.cpp"