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