// Copyright (C) 2021 The Qt Company Ltd. // SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only #include "qquickimagepreviewprovider_p.h" #include #include #include QT_BEGIN_NAMESPACE namespace { struct QQuickImagePreviewProviderPrivate { void clear() { std::lock_guard guard(mutex); records.clear(); } void registerImage(QUuid instance, QString id, QImage preview) { // we only keep the most recent preview for each instances std::lock_guard guard(mutex); records.insert_or_assign(instance, Record{ std::move(id), std::move(preview) }); } QImage getImage(const QString &id, QSize *size, const QSize &requestedSize) { QImage preview = [&] { std::lock_guard guard(mutex); for (const auto &record : records) { if (record.second.id == id) return record.second.image; } return QImage(); }(); if (preview.isNull()) return QImage(); if (requestedSize.isValid()) preview = preview.scaled(requestedSize, Qt::KeepAspectRatio, Qt::SmoothTransformation); if (size) *size = preview.size(); return preview; } void cleanupInstance(QUuid instance) { std::lock_guard guard(mutex); records.erase(instance); } struct Record { QString id; QImage image; }; QMutex mutex; std::map records; }; Q_GLOBAL_STATIC(QQuickImagePreviewProviderPrivate, previewProviderSingleton) } // namespace QQuickImagePreviewProvider::QQuickImagePreviewProvider() : QQuickImageProvider(QQuickImageProvider::Image) { } QQuickImagePreviewProvider::~QQuickImagePreviewProvider() { previewProviderSingleton()->clear(); } QImage QQuickImagePreviewProvider::requestImage(const QString &id, QSize *size, const QSize& requestedSize) { return previewProviderSingleton()->getImage(id, size, requestedSize); } void QQuickImagePreviewProvider::registerPreview(QUuid captureInstance, QString id, QImage preview) { previewProviderSingleton()->registerImage(captureInstance, std::move(id), std::move(preview)); } void QQuickImagePreviewProvider::cleanupInstance(QUuid captureInstance) { previewProviderSingleton()->cleanupInstance(captureInstance); } QT_END_NAMESPACE