git repos / SagoImageBrowser

blame: src/thumbnailworker.cpp

normal view · raw

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