File indexing completed on 2025-04-27 03:58:08

0001 /* ============================================================
0002  *
0003  * This file is a part of digiKam project
0004  * https://www.digikam.org
0005  *
0006  * Date        : 2006-01-20
0007  * Description : image file IO threaded interface.
0008  *
0009  * SPDX-FileCopyrightText: 2005-2011 by Marcel Wiesweg <marcel dot wiesweg at gmx dot de>
0010  * SPDX-FileCopyrightText: 2005-2024 by Gilles Caulier <caulier dot gilles at gmail dot com>
0011  *
0012  * SPDX-License-Identifier: GPL-2.0-or-later
0013  *
0014  * ============================================================ */
0015 
0016 #include "previewloadthread.h"
0017 
0018 // Local includes
0019 
0020 #include "iccmanager.h"
0021 #include "previewtask.h"
0022 
0023 namespace Digikam
0024 {
0025 
0026 PreviewLoadThread::PreviewLoadThread(QObject* const parent)
0027     : ManagedLoadSaveThread(parent),
0028       m_displayingWidget   (nullptr)
0029 {
0030     m_loadingPolicy = LoadingPolicyFirstRemovePrevious;
0031 }
0032 
0033 PreviewLoadThread::~PreviewLoadThread()
0034 {
0035 }
0036 
0037 LoadingDescription PreviewLoadThread::createLoadingDescription(const QString& filePath, const PreviewSettings& settings, int size)
0038 {
0039     return createLoadingDescription(filePath, settings, size, IccManager::displayProfile(m_displayingWidget));
0040 }
0041 
0042 LoadingDescription PreviewLoadThread::createLoadingDescription(const QString& filePath,
0043                                                                const PreviewSettings& previewSettings,
0044                                                                int size,
0045                                                                const IccProfile& displayProfile)
0046 {
0047     LoadingDescription description(filePath, previewSettings, size);
0048 
0049     if (DImg::fileFormat(filePath) == DImg::RAW)
0050     {
0051         description.rawDecodingSettings.optimizeTimeLoading();
0052         description.rawDecodingSettings.rawPrm.sixteenBitsImage   = false;
0053         description.rawDecodingSettings.rawPrm.halfSizeColorImage = true;
0054         description.rawDecodingHint                               = LoadingDescription::RawDecodingTimeOptimized;
0055     }
0056 
0057     ICCSettingsContainer settings = IccSettings::instance()->settings();
0058 
0059     if (settings.enableCM && settings.useManagedPreviews)
0060     {
0061         description.postProcessingParameters.colorManagement = LoadingDescription::ConvertForDisplay;
0062 
0063         if (displayProfile.isNull())
0064         {
0065             description.postProcessingParameters.setProfile(IccProfile::sRGB());
0066         }
0067         else
0068         {
0069             description.postProcessingParameters.setProfile(displayProfile);
0070         }
0071     }
0072 
0073     return description;
0074 }
0075 
0076 void PreviewLoadThread::loadFast(const QString& filePath, int size)
0077 {
0078     PreviewSettings settings(PreviewSettings::FastPreview);
0079     load(createLoadingDescription(filePath, settings, size));
0080 }
0081 
0082 void PreviewLoadThread::loadFastButLarge(const QString& filePath, int size)
0083 {
0084     PreviewSettings settings(PreviewSettings::FastButLargePreview);
0085     load(createLoadingDescription(filePath, settings, size));
0086 }
0087 
0088 void PreviewLoadThread::loadHighQuality(const QString& filePath, PreviewSettings::RawLoading rawLoadingMode)
0089 {
0090     PreviewSettings settings(PreviewSettings::HighQualityPreview, rawLoadingMode);
0091     load(createLoadingDescription(filePath, settings, 0));
0092 }
0093 
0094 void PreviewLoadThread::load(const QString& filePath, const PreviewSettings& settings, int size)
0095 {
0096     load(createLoadingDescription(filePath, settings, size));
0097 }
0098 
0099 void PreviewLoadThread::load(const LoadingDescription& description)
0100 {
0101     // creates a PreviewLoadingTask, which uses different mechanisms than a normal loading task
0102 
0103     ManagedLoadSaveThread::loadPreview(description, m_loadingPolicy);
0104 }
0105 
0106 void PreviewLoadThread::setDisplayingWidget(QWidget* const widget)
0107 {
0108     m_displayingWidget = widget;
0109 }
0110 
0111 DImg PreviewLoadThread::loadFastSynchronously(const QString& filePath, int size, const IccProfile& profile)
0112 {
0113     PreviewSettings settings(PreviewSettings::FastPreview);
0114 
0115     return loadSynchronously(createLoadingDescription(filePath, settings, size, profile));
0116 }
0117 
0118 DImg PreviewLoadThread::loadFastButLargeSynchronously(const QString& filePath, int minimumSize, const IccProfile& profile)
0119 {
0120     PreviewSettings settings(PreviewSettings::FastButLargePreview);
0121 
0122     return loadSynchronously(createLoadingDescription(filePath, settings, minimumSize, profile));
0123 }
0124 
0125 DImg PreviewLoadThread::loadHighQualitySynchronously(const QString& filePath,
0126                                                      PreviewSettings::RawLoading rawLoadingMode,
0127                                                      const IccProfile& profile)
0128 {
0129     PreviewSettings settings(PreviewSettings::HighQualityPreview, rawLoadingMode);
0130 
0131     return loadSynchronously(createLoadingDescription(filePath, settings, 0, profile));
0132 }
0133 
0134 DImg PreviewLoadThread::loadSynchronously(const QString& filePath, const PreviewSettings& previewSettings, int size, const IccProfile& profile)
0135 {
0136     return loadSynchronously(createLoadingDescription(filePath, previewSettings, size, profile));
0137 }
0138 
0139 DImg PreviewLoadThread::loadSynchronously(const LoadingDescription& description)
0140 {
0141     PreviewLoadingTask task(nullptr, description);
0142     task.execute();
0143 
0144     return task.img();
0145 }
0146 
0147 } // namespace Digikam
0148 
0149 #include "moc_previewloadthread.cpp"