1 /* ============================================================
2  *
3  * This file is a part of digiKam project
4  * https://www.digikam.org
5  *
6  * Date        : 2006-01-20
7  * Description : image file IO threaded interface.
8  *
9  * Copyright (C) 2005-2011 by Marcel Wiesweg <marcel dot wiesweg at gmx dot de>
10  * Copyright (C) 2005-2021 by Gilles Caulier <caulier dot gilles at gmail dot com>
11  *
12  * This program is free software; you can redistribute it
13  * and/or modify it under the terms of the GNU General
14  * Public License as published by the Free Software Foundation;
15  * either version 2, or (at your option)
16  * any later version.
17  *
18  * This program is distributed in the hope that it will be useful,
19  * but WITHOUT ANY WARRANTY; without even the implied warranty of
20  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
21  * GNU General Public License for more details.
22  *
23  * ============================================================ */
24 
25 #include "previewloadthread.h"
26 
27 // Local includes
28 
29 #include "iccmanager.h"
30 #include "previewtask.h"
31 
32 namespace Digikam
33 {
34 
PreviewLoadThread(QObject * const parent)35 PreviewLoadThread::PreviewLoadThread(QObject* const parent)
36     : ManagedLoadSaveThread(parent),
37       m_displayingWidget   (nullptr)
38 {
39     m_loadingPolicy = LoadingPolicyFirstRemovePrevious;
40 }
41 
~PreviewLoadThread()42 PreviewLoadThread::~PreviewLoadThread()
43 {
44 }
45 
createLoadingDescription(const QString & filePath,const PreviewSettings & settings,int size)46 LoadingDescription PreviewLoadThread::createLoadingDescription(const QString& filePath, const PreviewSettings& settings, int size)
47 {
48     return createLoadingDescription(filePath, settings, size, IccManager::displayProfile(m_displayingWidget));
49 }
50 
createLoadingDescription(const QString & filePath,const PreviewSettings & previewSettings,int size,const IccProfile & displayProfile)51 LoadingDescription PreviewLoadThread::createLoadingDescription(const QString& filePath,
52                                                                const PreviewSettings& previewSettings,
53                                                                int size,
54                                                                const IccProfile& displayProfile)
55 {
56     LoadingDescription description(filePath, previewSettings, size);
57 
58     if (DImg::fileFormat(filePath) == DImg::RAW)
59     {
60         description.rawDecodingSettings.optimizeTimeLoading();
61         description.rawDecodingSettings.rawPrm.sixteenBitsImage   = false;
62         description.rawDecodingSettings.rawPrm.halfSizeColorImage = true;
63         description.rawDecodingHint                               = LoadingDescription::RawDecodingTimeOptimized;
64     }
65 
66     ICCSettingsContainer settings = IccSettings::instance()->settings();
67 
68     if (settings.enableCM && settings.useManagedPreviews)
69     {
70         description.postProcessingParameters.colorManagement = LoadingDescription::ConvertForDisplay;
71 
72         if (displayProfile.isNull())
73         {
74             description.postProcessingParameters.setProfile(IccProfile::sRGB());
75         }
76         else
77         {
78             description.postProcessingParameters.setProfile(displayProfile);
79         }
80     }
81 
82     return description;
83 }
84 
loadFast(const QString & filePath,int size)85 void PreviewLoadThread::loadFast(const QString& filePath, int size)
86 {
87     PreviewSettings settings(PreviewSettings::FastPreview);
88     load(createLoadingDescription(filePath, settings, size));
89 }
90 
loadFastButLarge(const QString & filePath,int size)91 void PreviewLoadThread::loadFastButLarge(const QString& filePath, int size)
92 {
93     PreviewSettings settings(PreviewSettings::FastButLargePreview);
94     load(createLoadingDescription(filePath, settings, size));
95 }
96 
loadHighQuality(const QString & filePath,PreviewSettings::RawLoading rawLoadingMode)97 void PreviewLoadThread::loadHighQuality(const QString& filePath, PreviewSettings::RawLoading rawLoadingMode)
98 {
99     PreviewSettings settings(PreviewSettings::HighQualityPreview, rawLoadingMode);
100     load(createLoadingDescription(filePath, settings, 0));
101 }
102 
load(const QString & filePath,const PreviewSettings & settings,int size)103 void PreviewLoadThread::load(const QString& filePath, const PreviewSettings& settings, int size)
104 {
105     load(createLoadingDescription(filePath, settings, size));
106 }
107 
load(const LoadingDescription & description)108 void PreviewLoadThread::load(const LoadingDescription& description)
109 {
110     // creates a PreviewLoadingTask, which uses different mechanisms than a normal loading task
111 
112     ManagedLoadSaveThread::loadPreview(description, m_loadingPolicy);
113 }
114 
setDisplayingWidget(QWidget * const widget)115 void PreviewLoadThread::setDisplayingWidget(QWidget* const widget)
116 {
117     m_displayingWidget = widget;
118 }
119 
loadFastSynchronously(const QString & filePath,int size,const IccProfile & profile)120 DImg PreviewLoadThread::loadFastSynchronously(const QString& filePath, int size, const IccProfile& profile)
121 {
122     PreviewSettings settings(PreviewSettings::FastPreview);
123 
124     return loadSynchronously(createLoadingDescription(filePath, settings, size, profile));
125 }
126 
loadFastButLargeSynchronously(const QString & filePath,int minimumSize,const IccProfile & profile)127 DImg PreviewLoadThread::loadFastButLargeSynchronously(const QString& filePath, int minimumSize, const IccProfile& profile)
128 {
129     PreviewSettings settings(PreviewSettings::FastButLargePreview);
130 
131     return loadSynchronously(createLoadingDescription(filePath, settings, minimumSize, profile));
132 }
133 
loadHighQualitySynchronously(const QString & filePath,PreviewSettings::RawLoading rawLoadingMode,const IccProfile & profile)134 DImg PreviewLoadThread::loadHighQualitySynchronously(const QString& filePath,
135                                                      PreviewSettings::RawLoading rawLoadingMode,
136                                                      const IccProfile& profile)
137 {
138     PreviewSettings settings(PreviewSettings::HighQualityPreview, rawLoadingMode);
139 
140     return loadSynchronously(createLoadingDescription(filePath, settings, 0, profile));
141 }
142 
loadSynchronously(const QString & filePath,const PreviewSettings & previewSettings,int size,const IccProfile & profile)143 DImg PreviewLoadThread::loadSynchronously(const QString& filePath, const PreviewSettings& previewSettings, int size, const IccProfile& profile)
144 {
145     return loadSynchronously(createLoadingDescription(filePath, previewSettings, size, profile));
146 }
147 
loadSynchronously(const LoadingDescription & description)148 DImg PreviewLoadThread::loadSynchronously(const LoadingDescription& description)
149 {
150     PreviewLoadingTask task(nullptr, description);
151     task.execute();
152 
153     return task.img();
154 }
155 
156 } // namespace Digikam
157