Qt 6.x
The Qt SDK
Loading...
Searching...
No Matches
qimage_p.h
Go to the documentation of this file.
1// Copyright (C) 2021 The Qt Company Ltd.
2// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
3
4#ifndef QIMAGE_P_H
5#define QIMAGE_P_H
6
7//
8// W A R N I N G
9// -------------
10//
11// This file is not part of the Qt API. It exists purely as an
12// implementation detail. This header file may change from version to
13// version without notice, or even be removed.
14//
15// We mean it.
16//
17
18#include <QtGui/private/qtguiglobal_p.h>
19#include <QtGui/qcolorspace.h>
20#include <QtGui/qimage.h>
21#include <QtCore/private/qnumeric_p.h>
22#include <QtCore/qlist.h>
23#include <QtCore/qmap.h>
24
26
27class QImageWriter;
28
29struct Q_GUI_EXPORT QImageData { // internal image data
30 QImageData();
33 static QImageData *create(uchar *data, int w, int h, qsizetype bpl, QImage::Format format, bool readOnly, QImageCleanupFunction cleanupFunction = nullptr, void *cleanupInfo = nullptr);
34
35 static QImageData *get(QImage &img) noexcept { return img.d; }
36 static const QImageData *get(const QImage &img) noexcept { return img.d; }
37
39
40 int width;
41 int height;
42 int depth;
43 qsizetype nbytes; // number of bytes data
49 int ser_no; // serial number
51
52 qreal dpmx; // dots per meter X (or 0)
53 qreal dpmy; // dots per meter Y (or 0)
54 QPoint offset; // offset in pixels
55
60
63
64 bool checkForAlphaPixels() const;
65
66 // Convert the image in-place, minimizing memory reallocation
67 // Return false if the conversion cannot be done in-place.
68 bool convertInPlace(QImage::Format newFormat, Qt::ImageConversionFlags);
69
71
72 bool doImageIO(const QImage *image, QImageWriter* io, int quality) const;
73
75
77
81 bool isValid() const { return bytesPerLine > 0 && totalSize > 0; }
82 };
83 static ImageSizeParameters calculateImageParameters(qsizetype width, qsizetype height, qsizetype depth);
84};
85
88{
89 ImageSizeParameters invalid = { -1, -1 };
90 if (height <= 0)
91 return invalid;
92
93 // calculate the size, taking care of overflows
96 return invalid;
98 return invalid;
99 // bytes per scanline (must be multiple of 4)
100 bytes_per_line = (bytes_per_line >> 5) << 2; // can't overflow
101
102 qsizetype total_size;
103 if (qMulOverflow(height, bytes_per_line, &total_size))
104 return invalid;
105 qsizetype dummy;
106 if (qMulOverflow(height, qsizetype(sizeof(uchar *)), &dummy))
107 return invalid; // why is this here?
108#if 1 || QT_VERSION < QT_VERSION_CHECK(6,0,0) // ### can only fix this if QImage dimensions are not int anymore
109 // Disallow images where width * depth calculations might overflow
110 if (width > (INT_MAX - 31) / depth)
111 return invalid;
112#endif
113
114 return { bytes_per_line, total_size };
115}
116
117typedef void (*Image_Converter)(QImageData *dest, const QImageData *src, Qt::ImageConversionFlags);
118typedef bool (*InPlace_Image_Converter)(QImageData *data, Qt::ImageConversionFlags);
119
122
123void convert_generic(QImageData *dest, const QImageData *src, Qt::ImageConversionFlags);
124void convert_generic_over_rgb64(QImageData *dest, const QImageData *src, Qt::ImageConversionFlags);
125bool convert_generic_inplace(QImageData *data, QImage::Format dst_format, Qt::ImageConversionFlags);
126bool convert_generic_inplace_over_rgb64(QImageData *data, QImage::Format dst_format, Qt::ImageConversionFlags);
127#if QT_CONFIG(raster_fp)
128void convert_generic_over_rgba32f(QImageData *dest, const QImageData *src, Qt::ImageConversionFlags);
129bool convert_generic_inplace_over_rgba32f(QImageData *data, QImage::Format dst_format, Qt::ImageConversionFlags);
130#endif
131
132void dither_to_Mono(QImageData *dst, const QImageData *src, Qt::ImageConversionFlags flags, bool fromalpha);
133
136
137#if defined(_M_ARM) && defined(_MSC_VER) // QTBUG-42038
138#pragma optimize("", off)
139#endif
141{
142 int depth = 0;
143 switch(format) {
146 Q_UNREACHABLE();
149 depth = 1;
150 break;
154 depth = 8;
155 break;
166 depth = 32;
167 break;
173 depth = 16;
174 break;
181 depth = 24;
182 break;
189 depth = 64;
190 break;
194 depth = 128;
195 break;
196 }
197 return depth;
198}
199
200#if defined(_M_ARM) && defined(_MSC_VER)
201#pragma optimize("", on)
202#endif
203
205{
206 switch (format) {
249 return format;
256 break;
257 }
259}
260
262{
263 switch (format) {
303 return format;
313 break;
314 }
316}
317
318inline bool qt_highColorPrecision(QImage::Format format, bool opaque = false)
319{
320 // Formats with higher color precision than ARGB32_Premultiplied.
321 switch (format) {
324 return !opaque;
339 return true;
340 default:
341 break;
342 }
343 return false;
344}
345
347{
348 switch (format) {
355 return true;
356 default:
357 break;
358 }
359 return false;
360}
361
363{
364 const QImage::Format toFormat = qt_alphaVersion(format);
365 return qt_depthForFormat(format) == qt_depthForFormat(toFormat) ? toFormat : format;
366}
367
369{
371 // If we are switching depth anyway upgrade to RGB32
372 if (qt_depthForFormat(format) != qt_depthForFormat(toFormat) && qt_depthForFormat(toFormat) <= 32)
373 toFormat = QImage::Format_RGB32;
374 return toFormat;
375}
376
378{
380#if defined(__ARM_NEON__) || defined(__SSE2__)
381 // If we are switching depth anyway and we have optimized ARGB32PM routines, upgrade to that.
382 if (qt_depthForFormat(format) != qt_depthForFormat(toFormat) && qt_depthForFormat(toFormat) <= 32)
384#endif
385 return toFormat;
386}
387
388Q_GUI_EXPORT QMap<QString, QString> qt_getImageText(const QImage &image, const QString &description);
389Q_GUI_EXPORT QMap<QString, QString> qt_getImageTextFromDescription(const QString &description);
390
392
393#endif // QIMAGE_P_H
\inmodule QtCore
Definition qatomic.h:112
The QColorSpace class provides a color space abstraction.
Definition qcolorspace.h:21
The QImageWriter class provides a format independent interface for writing images to files or other d...
\inmodule QtGui
Definition qimage.h:37
Format
The following image formats are available in Qt.
Definition qimage.h:41
@ Format_Grayscale16
Definition qimage.h:70
@ Format_Alpha8
Definition qimage.h:65
@ Format_RGBA8888
Definition qimage.h:59
@ Format_RGB30
Definition qimage.h:63
@ Format_RGB888
Definition qimage.h:55
@ Format_RGBA16FPx4
Definition qimage.h:73
@ Format_RGBA32FPx4_Premultiplied
Definition qimage.h:77
@ Format_RGB32
Definition qimage.h:46
@ Format_Invalid
Definition qimage.h:42
@ Format_RGB666
Definition qimage.h:51
@ Format_RGBX32FPx4
Definition qimage.h:75
@ Format_RGBA64_Premultiplied
Definition qimage.h:69
@ Format_ARGB6666_Premultiplied
Definition qimage.h:52
@ Format_ARGB8555_Premultiplied
Definition qimage.h:54
@ Format_RGB444
Definition qimage.h:56
@ Format_MonoLSB
Definition qimage.h:44
@ Format_RGBA8888_Premultiplied
Definition qimage.h:60
@ Format_ARGB8565_Premultiplied
Definition qimage.h:50
@ Format_RGB555
Definition qimage.h:53
@ Format_RGBA64
Definition qimage.h:68
@ Format_RGBA32FPx4
Definition qimage.h:76
@ Format_Mono
Definition qimage.h:43
@ Format_RGBA16FPx4_Premultiplied
Definition qimage.h:74
@ Format_RGBX64
Definition qimage.h:67
@ Format_A2BGR30_Premultiplied
Definition qimage.h:62
@ Format_RGBX16FPx4
Definition qimage.h:72
@ Format_Indexed8
Definition qimage.h:45
@ Format_BGR30
Definition qimage.h:61
@ NImageFormats
Definition qimage.h:79
@ Format_ARGB32_Premultiplied
Definition qimage.h:48
@ Format_A2RGB30_Premultiplied
Definition qimage.h:64
@ Format_ARGB4444_Premultiplied
Definition qimage.h:57
@ Format_RGB16
Definition qimage.h:49
@ Format_BGR888
Definition qimage.h:71
@ Format_ARGB32
Definition qimage.h:47
@ Format_RGBX8888
Definition qimage.h:58
@ Format_Grayscale8
Definition qimage.h:66
Definition qlist.h:74
Definition qmap.h:186
\inmodule QtGui
\inmodule QtCore\reentrant
Definition qpoint.h:23
\inmodule QtCore
Definition qsize.h:25
\macro QT_RESTRICTED_CAST_FROM_ASCII
Definition qstring.h:127
Combined button and popup list for selecting options.
Definition image.cpp:4
DBusConnection const char DBusError DBusBusType DBusError return DBusConnection DBusHandleMessageFunction void DBusFreeFunction return DBusConnection return DBusConnection return const char DBusError return DBusConnection DBusMessage dbus_uint32_t return DBusConnection dbus_bool_t DBusConnection DBusAddWatchFunction DBusRemoveWatchFunction DBusWatchToggledFunction void DBusFreeFunction return DBusConnection DBusDispatchStatusFunction void DBusFreeFunction DBusTimeout return DBusTimeout return DBusWatch return DBusWatch unsigned int return DBusError const DBusError return const DBusMessage return DBusMessage return DBusMessage return DBusMessage return DBusMessage return DBusMessage return DBusMessageIter int const void return DBusMessageIter DBusMessageIter return DBusMessageIter void DBusMessageIter void int return DBusMessage DBusMessageIter return DBusMessageIter return DBusMessageIter DBusMessageIter const char const char const char const char return DBusMessage return DBusMessage const char return DBusMessage dbus_bool_t return DBusMessage dbus_uint32_t return DBusMessage void
void(* QImageCleanupFunction)(void *)
Definition qimage.h:34
bool convert_generic_inplace_over_rgb64(QImageData *data, QImage::Format dst_format, Qt::ImageConversionFlags)
int qt_depthForFormat(QImage::Format format)
Definition qimage_p.h:140
Image_Converter qimage_converter_map[QImage::NImageFormats][QImage::NImageFormats]
void convert_generic(QImageData *dest, const QImageData *src, Qt::ImageConversionFlags)
bool qt_fpColorPrecision(QImage::Format format)
Definition qimage_p.h:346
bool(* InPlace_Image_Converter)(QImageData *data, Qt::ImageConversionFlags)
Definition qimage_p.h:118
Q_GUI_EXPORT QMap< QString, QString > qt_getImageText(const QImage &image, const QString &description)
Definition qimage.cpp:5753
InPlace_Image_Converter qimage_inplace_converter_map[QImage::NImageFormats][QImage::NImageFormats]
QImage::Format qt_alphaVersion(QImage::Format format)
Definition qimage_p.h:261
const uchar * qt_get_bitflip_array()
void dither_to_Mono(QImageData *dst, const QImageData *src, Qt::ImageConversionFlags flags, bool fromalpha)
void convert_generic_over_rgb64(QImageData *dest, const QImageData *src, Qt::ImageConversionFlags)
bool qt_highColorPrecision(QImage::Format format, bool opaque=false)
Definition qimage_p.h:318
QImage::Format qt_opaqueVersionForPainting(QImage::Format format)
Definition qimage_p.h:368
Q_GUI_EXPORT QMap< QString, QString > qt_getImageTextFromDescription(const QString &description)
Definition qimage.cpp:5764
Q_GUI_EXPORT void qGamma_correct_back_to_linear_cs(QImage *image)
QImage::Format qt_opaqueVersion(QImage::Format format)
Definition qimage_p.h:204
void(* Image_Converter)(QImageData *dest, const QImageData *src, Qt::ImageConversionFlags)
Definition qimage_p.h:117
QImage::Format qt_alphaVersionForPainting(QImage::Format format)
Definition qimage_p.h:377
bool convert_generic_inplace(QImageData *data, QImage::Format dst_format, Qt::ImageConversionFlags)
QImage::Format qt_maybeAlphaVersionWithSameDepth(QImage::Format format)
Definition qimage_p.h:362
std::enable_if_t< std::is_unsigned_v< T >, bool > qAddOverflow(T v1, T v2, T *r)
Definition qnumeric.h:113
std::enable_if_t< std::is_unsigned_v< T >||std::is_signed_v< T >, bool > qMulOverflow(T v1, T v2, T *r)
Definition qnumeric.h:182
GLint GLenum GLsizei GLsizei GLsizei depth
GLfloat GLfloat GLfloat w
[0]
GLint GLsizei GLsizei height
GLenum GLuint GLintptr GLsizeiptr size
[1]
GLenum src
GLint GLsizei width
GLenum GLenum dst
GLbitfield flags
GLint GLsizei GLsizei GLenum GLenum GLsizei void * data
GLint GLsizei GLsizei GLenum format
GLfloat GLfloat GLfloat GLfloat h
GLint void * img
Definition qopenglext.h:233
unsigned char uchar
Definition qtypes.h:27
ptrdiff_t qsizetype
Definition qtypes.h:70
unsigned int uint
Definition qtypes.h:29
double qreal
Definition qtypes.h:92
view create()
int detach_no
Definition qimage_p.h:50
qreal dpmx
Definition qimage_p.h:52
static const QImageData * get(const QImage &img) noexcept
Definition qimage_p.h:36
qreal devicePixelRatio
Definition qimage_p.h:44
QAtomicInt ref
Definition qimage_p.h:38
int height
Definition qimage_p.h:41
static QImageData * get(QImage &img) noexcept
Definition qimage_p.h:35
QColorSpace colorSpace
Definition qimage_p.h:76
uchar * data
Definition qimage_p.h:46
static ImageSizeParameters calculateImageParameters(qsizetype width, qsizetype height, qsizetype depth)
Definition qimage_p.h:87
int ser_no
Definition qimage_p.h:49
uint is_cached
Definition qimage_p.h:59
int width
Definition qimage_p.h:40
void * cleanupInfo
Definition qimage_p.h:62
QList< QRgb > colortable
Definition qimage_p.h:45
uint ro_data
Definition qimage_p.h:57
uint own_data
Definition qimage_p.h:56
static QImageData * create(const QSize &size, QImage::Format format)
qsizetype bytes_per_line
Definition qimage_p.h:48
qsizetype nbytes
Definition qimage_p.h:43
qreal dpmy
Definition qimage_p.h:53
int depth
Definition qimage_p.h:42
uint has_alpha_clut
Definition qimage_p.h:58
QPaintEngine * paintEngine
Definition qimage_p.h:74
QImage::Format format
Definition qimage_p.h:47
QMap< QString, QString > text
Definition qimage_p.h:70
QPoint offset
Definition qimage_p.h:54
QImageCleanupFunction cleanupFunction
Definition qimage_p.h:61