digiKam
Loading...
Searching...
No Matches
dimg_p.h
Go to the documentation of this file.
1/* ============================================================
2 *
3 * This file is a part of digiKam project
4 * https://www.digikam.org
5 *
6 * Date : 2005-06-15
7 * Description : digiKam 8/16 bits image management API.
8 * Private data container.
9 *
10 * SPDX-FileCopyrightText: 2005 by Renchi Raju <renchi dot raju at gmail dot com>
11 * SPDX-FileCopyrightText: 2005-2024 by Gilles Caulier <caulier dot gilles at gmail dot com>
12 *
13 * SPDX-License-Identifier: GPL-2.0-or-later
14 *
15 * ============================================================ */
16
17#pragma once
18
19#include "digikam_config.h"
20
21// C ANSI includes
22
23#ifndef Q_OS_WIN
24extern "C"
25{
26#endif
27
28#include <stdint.h>
29
30#ifndef Q_OS_WIN
31#include <math.h>
32}
33#endif
34
35// C++ includes
36
37#include <cstdio>
38
39// Qt includes
40
41#include <QCryptographicHash>
42#include <QSharedData>
43#include <QString>
44#include <QByteArray>
45#include <QVariant>
46#include <QMap>
47#include <QFile>
48#include <QImage>
49#include <QImageReader>
50#include <QPaintEngine>
51#include <QPainter>
52#include <QPixmap>
53#include <QSysInfo>
54#include <QUuid>
55#include <QScopedPointer>
56#include <QColorSpace>
57
58// KDE includes
59
60#include <klocalizedstring.h>
61
62// Local includes
63
64#include "digikam_globals.h"
65#include "dimg.h"
66#include "dplugindimg.h"
67#include "digikam_export.h"
68#include "digikam_debug.h"
69#include "dmetadata.h"
70#include "dimagehistory.h"
71#include "iccprofile.h"
72#include "metaengine_rotation.h"
73#include "drawdecoder.h"
74#include "loadsavethread.h"
75#include "filereadwritelock.h"
76#include "iccmanager.h"
77#include "icctransform.h"
78#include "exposurecontainer.h"
79#include "dimgloaderobserver.h"
81
86#define LANCZOS_TABLE_RES 256
87
92#define LANCZOS_SUPPORT 2
93
100//#define LANCZOS_DATA_FLOAT
101
102#ifdef LANCZOS_DATA_FLOAT
103# define LANCZOS_DATA_TYPE float
104# define LANCZOS_DATA_ONE 1.0
105#else
106# define LANCZOS_DATA_TYPE int
107# define LANCZOS_DATA_ONE 4096
108#endif
109
110typedef uint64_t ullong; // krazy:exclude=typedefs
111typedef int64_t llong; // krazy:exclude=typedefs
112
113namespace Digikam
114{
115
116class DIGIKAM_EXPORT DImg::Private : public QSharedData
117{
118public:
119
120 Private() = default;
121
123 {
124 delete [] data;
125 delete [] lanczos_func;
126 }
127
128public:
129
130 bool null = true;
131 bool alpha = false;
132 bool sixteenBit = false;
133
134 unsigned int width = 0;
135 unsigned int height = 0;
136
137 unsigned char* data = nullptr;
138 LANCZOS_DATA_TYPE* lanczos_func = nullptr;
139
141 QMap<QString, QVariant> attributes;
142 QMap<QString, QString> embeddedText;
145};
146
147// ----------------------------------------------------------------------------
148
149class DIGIKAM_EXPORT DImgStaticPriv
150{
151public:
152
153 static DPluginDImg* pluginForFile(const QFileInfo& fileInfo, bool magic)
154 {
155 QMultiMap<int, DPluginDImg*> pluginMap;
156 const auto plugins = DPluginLoader::instance()->allPlugins();
157
158 for (DPlugin* const p : plugins)
159 {
160 int prio;
161 DPluginDImg* const plug = dynamic_cast<DPluginDImg*>(p);
162
163 if (plug && ((prio = plug->canRead(fileInfo, magic)) > 0))
164 {
165 /*
166 qCDebug(DIGIKAM_DIMG_LOG) << "File path:" << filePath
167 << "Priority:" << prio
168 << "Loader:" << plug->loaderName();
169 */
170 pluginMap.insert(prio, plug);
171 }
172 }
173
174 if (pluginMap.isEmpty())
175 {
176 return nullptr;
177 }
178
179 return pluginMap.first();
180 }
181
182 static DPluginDImg* pluginForFormat(const QString& format)
183 {
184 QMultiMap<int, DPluginDImg*> pluginMap;
185
186 if (!format.isNull())
187 {
188 const auto plugins = DPluginLoader::instance()->allPlugins();
189
190 for (DPlugin* const p : plugins)
191 {
192 int prio;
193 DPluginDImg* const plug = dynamic_cast<DPluginDImg*>(p);
194
195 if (plug && ((prio = plug->canWrite(format)) > 0))
196 {
197 pluginMap.insert(prio, plug);
198 }
199 }
200 }
201
202 if (pluginMap.isEmpty())
203 {
204 return nullptr;
205 }
206
207 return pluginMap.first();
208 }
209
210 static DImg::FORMAT loaderNameToFormat(const QString& name)
211 {
212 if (name.isNull())
213 {
214 return DImg::NONE;
215 }
216 else if (name == QLatin1String("JPEG"))
217 {
218 return DImg::JPEG;
219 }
220 else if (name == QLatin1String("PNG"))
221 {
222 return DImg::PNG;
223 }
224 else if (name == QLatin1String("TIFF"))
225 {
226 return DImg::TIFF;
227 }
228 else if (name == QLatin1String("RAW"))
229 {
230 return DImg::RAW;
231 }
232 else if (name == QLatin1String("JPEG2000"))
233 {
234 return DImg::JP2K;
235 }
236 else if (name == QLatin1String("PGF"))
237 {
238 return DImg::PGF;
239 }
240 else if (name == QLatin1String("HEIF"))
241 {
242 return DImg::HEIF;
243 }
244
245 // In others cases, ImageMagick or QImage will be used to try to open file.
246
247 return DImg::QIMAGE;
248 }
249
250 static QStringList fileOriginAttributes()
251 {
252 QStringList list;
253 list << QLatin1String("format")
254 << QLatin1String("isReadOnly")
255 << QLatin1String("originalFilePath")
256 << QLatin1String("originalSize")
257 << QLatin1String("originalImageHistory")
258 << QLatin1String("rawDecodingSettings")
259 << QLatin1String("rawDecodingFilterAction")
260 << QLatin1String("uniqueHash")
261 << QLatin1String("uniqueHashV2")
262 << QLatin1String("uniqueHashV3");
263
264 return list;
265 }
266};
267
268} // namespace Digikam
Definition dimagehistory.h:39
Definition dimg_p.h:150
static DPluginDImg * pluginForFile(const QFileInfo &fileInfo, bool magic)
Definition dimg_p.h:153
static DPluginDImg * pluginForFormat(const QString &format)
Definition dimg_p.h:182
static QStringList fileOriginAttributes()
Definition dimg_p.h:250
static DImg::FORMAT loaderNameToFormat(const QString &name)
Definition dimg_p.h:210
QMap< QString, QString > embeddedText
Definition dimg_p.h:142
~Private()
Definition dimg_p.h:122
DImageHistory imageHistory
Definition dimg_p.h:144
MetaEngineData metaData
Definition dimg_p.h:140
FORMAT
Definition dimg.h:56
Private()=default
IccProfile iccProfile
Definition dimg_p.h:143
QMap< QString, QVariant > attributes
Definition dimg_p.h:141
Definition dplugindimg.h:35
virtual int canWrite(const QString &format) const =0
virtual int canRead(const QFileInfo &fileInfo, bool magic) const =0
Definition dplugin.h:51
Definition iccprofile.h:33
Definition metaengine_data.h:31
uint64_t ullong
Definition dimg_p.h:110
int64_t llong
Definition dimg_p.h:111
#define LANCZOS_DATA_TYPE
Definition dimg_p.h:106
Definition datefolderview.cpp:34