| cec3b5da |
Poul Sander |
2026-02-19 19:17 |
1 |
#include "thumbnailworker.h" |
| ac476ca8 |
Poul Sander |
2026-05-18 16:47 |
2 |
|
| ac476ca8 |
Poul Sander |
2026-05-18 16:47 |
3 |
#include "thumbnailcache.h" |
| ac476ca8 |
Poul Sander |
2026-05-18 16:47 |
4 |
|
| cec3b5da |
Poul Sander |
2026-02-19 19:17 |
5 |
#include <QImageReader> |
| ac476ca8 |
Poul Sander |
2026-05-18 16:47 |
6 |
|
| ac476ca8 |
Poul Sander |
2026-05-18 16:47 |
7 |
namespace |
| ac476ca8 |
Poul Sander |
2026-05-18 16:47 |
8 |
{ |
| ac476ca8 |
Poul Sander |
2026-05-18 16:47 |
9 |
constexpr int kDisplaySize = 128; |
| ac476ca8 |
Poul Sander |
2026-05-18 16:47 |
10 |
|
| ac476ca8 |
Poul Sander |
2026-05-18 16:47 |
11 |
QImage downscaleForDisplay(const QImage &src) |
| ac476ca8 |
Poul Sander |
2026-05-18 16:47 |
12 |
{ |
| ac476ca8 |
Poul Sander |
2026-05-18 16:47 |
13 |
if (src.isNull()) |
| ac476ca8 |
Poul Sander |
2026-05-18 16:47 |
14 |
return src; |
| ac476ca8 |
Poul Sander |
2026-05-18 16:47 |
15 |
if (src.width() <= kDisplaySize && src.height() <= kDisplaySize) |
| ac476ca8 |
Poul Sander |
2026-05-18 16:47 |
16 |
return src; |
| ac476ca8 |
Poul Sander |
2026-05-18 16:47 |
17 |
return src.scaled(kDisplaySize, kDisplaySize, |
| ac476ca8 |
Poul Sander |
2026-05-18 16:47 |
18 |
Qt::KeepAspectRatio, |
| ac476ca8 |
Poul Sander |
2026-05-18 16:47 |
19 |
Qt::SmoothTransformation); |
| ac476ca8 |
Poul Sander |
2026-05-18 16:47 |
20 |
} |
| ac476ca8 |
Poul Sander |
2026-05-18 16:47 |
21 |
} // namespace |
| cec3b5da |
Poul Sander |
2026-02-19 19:17 |
22 |
|
| 6fcd6c90 |
Poul Sander |
2026-02-19 21:12 |
23 |
ThumbnailWorker::ThumbnailWorker(const QString &path, |
| 6fcd6c90 |
Poul Sander |
2026-02-19 21:12 |
24 |
int row, |
| ac476ca8 |
Poul Sander |
2026-05-18 16:47 |
25 |
ThumbnailCache::Size size, |
| 6fcd6c90 |
Poul Sander |
2026-02-19 21:12 |
26 |
std::atomic_bool *cancelFlag) |
| 6fcd6c90 |
Poul Sander |
2026-02-19 21:12 |
27 |
: m_path(path), |
| 6fcd6c90 |
Poul Sander |
2026-02-19 21:12 |
28 |
m_row(row), |
| ac476ca8 |
Poul Sander |
2026-05-18 16:47 |
29 |
m_size(size), |
| 6fcd6c90 |
Poul Sander |
2026-02-19 21:12 |
30 |
m_cancelFlag(cancelFlag) |
| cec3b5da |
Poul Sander |
2026-02-19 19:17 |
31 |
{ |
| cec3b5da |
Poul Sander |
2026-02-19 19:17 |
32 |
setAutoDelete(true); |
| cec3b5da |
Poul Sander |
2026-02-19 19:17 |
33 |
} |
| cec3b5da |
Poul Sander |
2026-02-19 19:17 |
34 |
|
| cec3b5da |
Poul Sander |
2026-02-19 19:17 |
35 |
void ThumbnailWorker::run() |
| cec3b5da |
Poul Sander |
2026-02-19 19:17 |
36 |
{ |
| 6fcd6c90 |
Poul Sander |
2026-02-19 21:12 |
37 |
if (*m_cancelFlag) |
| 6fcd6c90 |
Poul Sander |
2026-02-19 21:12 |
38 |
return; |
| 6fcd6c90 |
Poul Sander |
2026-02-19 21:12 |
39 |
|
| ac476ca8 |
Poul Sander |
2026-05-18 16:47 |
40 |
// Per the spec, never thumbnail files that live inside the cache itself. |
| ac476ca8 |
Poul Sander |
2026-05-18 16:47 |
41 |
if (ThumbnailCache::isInsideCache(m_path)) |
| ac476ca8 |
Poul Sander |
2026-05-18 16:47 |
42 |
return; |
| ac476ca8 |
Poul Sander |
2026-05-18 16:47 |
43 |
|
| ac476ca8 |
Poul Sander |
2026-05-18 16:47 |
44 |
const int target = static_cast<int>(m_size); |
| ac476ca8 |
Poul Sander |
2026-05-18 16:47 |
45 |
|
| ac476ca8 |
Poul Sander |
2026-05-18 16:47 |
46 |
QImage cached = ThumbnailCache::load(m_path, m_size); |
| ac476ca8 |
Poul Sander |
2026-05-18 16:47 |
47 |
if (*m_cancelFlag) |
| ac476ca8 |
Poul Sander |
2026-05-18 16:47 |
48 |
return; |
| ac476ca8 |
Poul Sander |
2026-05-18 16:47 |
49 |
|
| ac476ca8 |
Poul Sander |
2026-05-18 16:47 |
50 |
if (!cached.isNull()) |
| ac476ca8 |
Poul Sander |
2026-05-18 16:47 |
51 |
{ |
| ac476ca8 |
Poul Sander |
2026-05-18 16:47 |
52 |
emit finished(m_row, downscaleForDisplay(cached)); |
| ac476ca8 |
Poul Sander |
2026-05-18 16:47 |
53 |
return; |
| ac476ca8 |
Poul Sander |
2026-05-18 16:47 |
54 |
} |
| ac476ca8 |
Poul Sander |
2026-05-18 16:47 |
55 |
|
| cec3b5da |
Poul Sander |
2026-02-19 19:17 |
56 |
QImageReader reader(m_path); |
| cec3b5da |
Poul Sander |
2026-02-19 19:17 |
57 |
reader.setAutoTransform(true); |
| cec3b5da |
Poul Sander |
2026-02-19 19:17 |
58 |
|
| 7889168c |
Poul Sander |
2026-02-26 18:27 |
59 |
// Scale during decoding to avoid hitting the allocation limit |
| 7889168c |
Poul Sander |
2026-02-26 18:27 |
60 |
// on very large images (Qt 6 defaults to 128 MB). |
| 7889168c |
Poul Sander |
2026-02-26 18:27 |
61 |
QSize fullSize = reader.size(); |
| ac476ca8 |
Poul Sander |
2026-05-18 16:47 |
62 |
if (fullSize.isValid()) |
| ac476ca8 |
Poul Sander |
2026-05-18 16:47 |
63 |
{ |
| ac476ca8 |
Poul Sander |
2026-05-18 16:47 |
64 |
QSize scaled = fullSize.scaled(target, target, Qt::KeepAspectRatio); |
| ac476ca8 |
Poul Sander |
2026-05-18 16:47 |
65 |
reader.setScaledSize(scaled); |
| 7889168c |
Poul Sander |
2026-02-26 18:27 |
66 |
} |
| 7889168c |
Poul Sander |
2026-02-26 18:27 |
67 |
|
| cec3b5da |
Poul Sander |
2026-02-19 19:17 |
68 |
QImage image = reader.read(); |
| 6fcd6c90 |
Poul Sander |
2026-02-19 21:12 |
69 |
|
| 6fcd6c90 |
Poul Sander |
2026-02-19 21:12 |
70 |
if (*m_cancelFlag) |
| 6fcd6c90 |
Poul Sander |
2026-02-19 21:12 |
71 |
return; |
| cec3b5da |
Poul Sander |
2026-02-19 19:17 |
72 |
|
| ac476ca8 |
Poul Sander |
2026-05-18 16:47 |
73 |
if (image.isNull()) |
| ac476ca8 |
Poul Sander |
2026-05-18 16:47 |
74 |
return; |
| ac476ca8 |
Poul Sander |
2026-05-18 16:47 |
75 |
|
| ac476ca8 |
Poul Sander |
2026-05-18 16:47 |
76 |
// Ensure the longest side is exactly the target (the decoder hint may have |
| ac476ca8 |
Poul Sander |
2026-05-18 16:47 |
77 |
// been ignored for some formats). Aspect ratio preserved, no padding canvas. |
| ac476ca8 |
Poul Sander |
2026-05-18 16:47 |
78 |
QImage thumb; |
| ac476ca8 |
Poul Sander |
2026-05-18 16:47 |
79 |
if (image.width() > target || image.height() > target) |
| ac476ca8 |
Poul Sander |
2026-05-18 16:47 |
80 |
thumb = image.scaled(target, target, |
| ac476ca8 |
Poul Sander |
2026-05-18 16:47 |
81 |
Qt::KeepAspectRatio, |
| ac476ca8 |
Poul Sander |
2026-05-18 16:47 |
82 |
Qt::SmoothTransformation); |
| ac476ca8 |
Poul Sander |
2026-05-18 16:47 |
83 |
else |
| ac476ca8 |
Poul Sander |
2026-05-18 16:47 |
84 |
thumb = image; |
| ac476ca8 |
Poul Sander |
2026-05-18 16:47 |
85 |
|
| ac476ca8 |
Poul Sander |
2026-05-18 16:47 |
86 |
ThumbnailCache::save(m_path, m_size, thumb); |
| ac476ca8 |
Poul Sander |
2026-05-18 16:47 |
87 |
|
| ac476ca8 |
Poul Sander |
2026-05-18 16:47 |
88 |
if (*m_cancelFlag) |
| ac476ca8 |
Poul Sander |
2026-05-18 16:47 |
89 |
return; |
| ac476ca8 |
Poul Sander |
2026-05-18 16:47 |
90 |
|
| ac476ca8 |
Poul Sander |
2026-05-18 16:47 |
91 |
emit finished(m_row, downscaleForDisplay(thumb)); |
| cec3b5da |
Poul Sander |
2026-02-19 19:17 |
92 |
} |
|
|
1970-01-01 00:00 |
93 |
|