Qt
Internal/Contributor docs for the Qt SDK. <b>Note:</b> These are NOT official API docs; those are found <a href='https://doc.qt.io/'>here</a>.
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#include <QtCore/qttypetraits.h>
25
26
28
29class QImageWriter;
30
31struct Q_GUI_EXPORT QImageData { // internal image data
32 QImageData();
35 static QImageData *create(uchar *data, int w, int h, qsizetype bpl, QImage::Format format, bool readOnly, QImageCleanupFunction cleanupFunction = nullptr, void *cleanupInfo = nullptr);
36
37 static QImageData *get(QImage &img) noexcept { return img.d; }
38 static const QImageData *get(const QImage &img) noexcept { return img.d; }
39
41
42 int width;
43 int height;
44 int depth;
45 qsizetype nbytes; // number of bytes data
47 QList<QRgb> colortable;
51 int ser_no; // serial number
53
54 qreal dpmx; // dots per meter X (or 0)
55 qreal dpmy; // dots per meter Y (or 0)
56 QPoint offset; // offset in pixels
57
62
65
66 bool checkForAlphaPixels() const;
67
68 // Convert the image in-place, minimizing memory reallocation
69 // Return false if the conversion cannot be done in-place.
70 bool convertInPlace(QImage::Format newFormat, Qt::ImageConversionFlags);
71
72 QMap<QString, QString> text;
73
74 bool doImageIO(const QImage *image, QImageWriter* io, int quality) const;
75
77
79
83 bool isValid() const { return bytesPerLine > 0 && totalSize > 0; }
84 };
85 static ImageSizeParameters calculateImageParameters(qsizetype width, qsizetype height, qsizetype depth);
86};
87
90{
91 ImageSizeParameters invalid = { -1, -1 };
92 if (height <= 0)
93 return invalid;
94
95 // calculate the size, taking care of overflows
98 return invalid;
100 return invalid;
101 // bytes per scanline (must be multiple of 4)
102 bytes_per_line = (bytes_per_line >> 5) << 2; // can't overflow
103
104 qsizetype total_size;
105 if (qMulOverflow(height, bytes_per_line, &total_size))
106 return invalid;
107 qsizetype dummy;
108 if (qMulOverflow(height, qsizetype(sizeof(uchar *)), &dummy))
109 return invalid; // why is this here?
110#if 1 || QT_VERSION < QT_VERSION_CHECK(6,0,0) // ### can only fix this if QImage dimensions are not int anymore
111 // Disallow images where width * depth calculations might overflow
112 if (width > (INT_MAX - 31) / depth)
113 return invalid;
114#endif
115
116 return { bytes_per_line, total_size };
117}
118
119typedef void (*Image_Converter)(QImageData *dest, const QImageData *src, Qt::ImageConversionFlags);
120typedef bool (*InPlace_Image_Converter)(QImageData *data, Qt::ImageConversionFlags);
121
124
125void convert_generic(QImageData *dest, const QImageData *src, Qt::ImageConversionFlags);
126void convert_generic_over_rgb64(QImageData *dest, const QImageData *src, Qt::ImageConversionFlags);
127bool convert_generic_inplace(QImageData *data, QImage::Format dst_format, Qt::ImageConversionFlags);
128bool convert_generic_inplace_over_rgb64(QImageData *data, QImage::Format dst_format, Qt::ImageConversionFlags);
129#if QT_CONFIG(raster_fp)
130void convert_generic_over_rgba32f(QImageData *dest, const QImageData *src, Qt::ImageConversionFlags);
131bool convert_generic_inplace_over_rgba32f(QImageData *data, QImage::Format dst_format, Qt::ImageConversionFlags);
132#endif
133
134void dither_to_Mono(QImageData *dst, const QImageData *src, Qt::ImageConversionFlags flags, bool fromalpha);
135
138
139#if defined(_M_ARM) && defined(_MSC_VER) // QTBUG-42038
140#pragma optimize("", off)
141#endif
143{
144 int depth = 0;
145 switch(format) {
148 Q_UNREACHABLE();
151 depth = 1;
152 break;
156 depth = 8;
157 break;
168 depth = 32;
169 break;
175 depth = 16;
176 break;
183 depth = 24;
184 break;
191 depth = 64;
192 break;
196 depth = 128;
197 break;
199 depth = 32;
200 break;
201 }
202 return depth;
203}
204
205#if defined(_M_ARM) && defined(_MSC_VER)
206#pragma optimize("", on)
207#endif
208
210{
211 switch (format) {
255 return format;
262 break;
263 }
265}
266
268{
269 switch (format) {
309 return format;
320 break;
321 }
323}
324
325// Returns an opaque version that is compatible with format
327{
328 switch (format) {
368 return format; // Already opaque
377 break;
378 }
379 return format; // No compatible opaque versions
380}
381
383{
384 // Assumes input is already a premultiplied format with an unpremultiplied counterpart
385 // This abuses the fact unpremultiplied formats are always before their premultiplied counterparts.
386 return static_cast<QImage::Format>(qToUnderlying(format) - 1);
387}
388
390{
391 // Assumes input is already an unpremultiplied format
392 // This abuses the fact unpremultiplied formats are always before their premultiplied counterparts.
393 return static_cast<QImage::Format>(qToUnderlying(format) + 1);
394}
395
396inline bool qt_highColorPrecision(QImage::Format format, bool opaque = false)
397{
398 // Formats with higher color precision than ARGB32_Premultiplied.
399 switch (format) {
402 return !opaque;
417 return true;
418 default:
419 break;
420 }
421 return false;
422}
423
425{
426 switch (format) {
433 return true;
434 default:
435 break;
436 }
437 return false;
438}
439
458
460{
462
464 return true; // Alpha data has no colors and can be handled by any color space
465
467 return false;
468
469 if (dataCs == cs)
470 return true; // Matching color models
471
472 if (dataCs == QColorSpace::ColorModel::Gray)
473 return true; // Can apply any CS with white point to Gray data
474
475 return false;
476}
477
479{
480 switch (format) {
516 return format; // Already alpha versions
529 break;
530 }
531 return format; // No data-compatible alpha version
532}
533
535{
537 // If we are switching depth anyway upgrade to RGB32
538 if (qt_depthForFormat(format) != qt_depthForFormat(toFormat) && qt_depthForFormat(toFormat) <= 32)
539 toFormat = QImage::Format_RGB32;
540 return toFormat;
541}
542
544{
546#if defined(__ARM_NEON__) || defined(__SSE2__)
547 // If we are switching depth anyway and we have optimized ARGB32PM routines, upgrade to that.
548 if (qt_depthForFormat(format) != qt_depthForFormat(toFormat) && qt_depthForFormat(toFormat) <= 32)
550#endif
551 return toFormat;
552}
553
554Q_GUI_EXPORT QMap<QString, QString> qt_getImageText(const QImage &image, const QString &description);
555Q_GUI_EXPORT QMap<QString, QString> qt_getImageTextFromDescription(const QString &description);
556
558
559#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_CMYK8888
Definition qimage.h:78
@ 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:80
@ 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
\inmodule QtGui
ColorModel
This enum type is used to describe the color model of the pixelformat.
\inmodule QtCore\reentrant
Definition qpoint.h:25
\inmodule QtCore
Definition qsize.h:25
\macro QT_RESTRICTED_CAST_FROM_ASCII
Definition qstring.h:129
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)
constexpr QImage::Format qt_toUnpremultipliedFormat(QImage::Format format)
Definition qimage_p.h:382
QImage::Format qt_maybeDataCompatibleOpaqueVersion(QImage::Format format)
Definition qimage_p.h:326
int qt_depthForFormat(QImage::Format format)
Definition qimage_p.h:142
Image_Converter qimage_converter_map[QImage::NImageFormats][QImage::NImageFormats]
void convert_generic(QImageData *dest, const QImageData *src, Qt::ImageConversionFlags)
QColorSpace::ColorModel qt_csColorData(QPixelFormat::ColorModel format)
Definition qimage_p.h:440
bool qt_fpColorPrecision(QImage::Format format)
Definition qimage_p.h:424
bool(* InPlace_Image_Converter)(QImageData *data, Qt::ImageConversionFlags)
Definition qimage_p.h:120
Q_GUI_EXPORT QMap< QString, QString > qt_getImageText(const QImage &image, const QString &description)
Definition qimage.cpp:6424
bool qt_compatibleColorModel(QPixelFormat::ColorModel data, QColorSpace::ColorModel cs)
Definition qimage_p.h:459
InPlace_Image_Converter qimage_inplace_converter_map[QImage::NImageFormats][QImage::NImageFormats]
QImage::Format qt_alphaVersion(QImage::Format format)
Definition qimage_p.h:267
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:396
QImage::Format qt_opaqueVersionForPainting(QImage::Format format)
Definition qimage_p.h:534
QImage::Format qt_maybeDataCompatibleAlphaVersion(QImage::Format format)
Definition qimage_p.h:478
Q_GUI_EXPORT QMap< QString, QString > qt_getImageTextFromDescription(const QString &description)
Definition qimage.cpp:6435
Q_GUI_EXPORT void qGamma_correct_back_to_linear_cs(QImage *image)
QImage::Format qt_opaqueVersion(QImage::Format format)
Definition qimage_p.h:209
void(* Image_Converter)(QImageData *dest, const QImageData *src, Qt::ImageConversionFlags)
Definition qimage_p.h:119
constexpr QImage::Format qt_toPremultipliedFormat(QImage::Format format)
Definition qimage_p.h:389
QImage::Format qt_alphaVersionForPainting(QImage::Format format)
Definition qimage_p.h:543
bool convert_generic_inplace(QImageData *data, QImage::Format dst_format, Qt::ImageConversionFlags)
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]
GLint GLsizei GLsizei GLenum GLenum GLsizei void * data
GLenum src
GLint GLsizei width
GLenum GLenum dst
GLbitfield flags
GLint GLsizei GLsizei GLenum format
GLfloat GLfloat GLfloat GLfloat h
GLint void * img
Definition qopenglext.h:233
QT_BEGIN_NAMESPACE constexpr std::underlying_type_t< Enum > qToUnderlying(Enum e) noexcept
unsigned char uchar
Definition qtypes.h:32
ptrdiff_t qsizetype
Definition qtypes.h:165
unsigned int uint
Definition qtypes.h:34
double qreal
Definition qtypes.h:187
view create()
int detach_no
Definition qimage_p.h:52
qreal dpmx
Definition qimage_p.h:54
static const QImageData * get(const QImage &img) noexcept
Definition qimage_p.h:38
qreal devicePixelRatio
Definition qimage_p.h:46
QAtomicInt ref
Definition qimage_p.h:40
int height
Definition qimage_p.h:43
static QImageData * get(QImage &img) noexcept
Definition qimage_p.h:37
QColorSpace colorSpace
Definition qimage_p.h:78
uchar * data
Definition qimage_p.h:48
static ImageSizeParameters calculateImageParameters(qsizetype width, qsizetype height, qsizetype depth)
Definition qimage_p.h:89
int ser_no
Definition qimage_p.h:51
uint is_cached
Definition qimage_p.h:61
int width
Definition qimage_p.h:42
void * cleanupInfo
Definition qimage_p.h:64
QList< QRgb > colortable
Definition qimage_p.h:47
uint ro_data
Definition qimage_p.h:59
uint own_data
Definition qimage_p.h:58
static QImageData * create(const QSize &size, QImage::Format format)
qsizetype bytes_per_line
Definition qimage_p.h:50
qsizetype nbytes
Definition qimage_p.h:45
qreal dpmy
Definition qimage_p.h:55
int depth
Definition qimage_p.h:44
uint has_alpha_clut
Definition qimage_p.h:60
QPaintEngine * paintEngine
Definition qimage_p.h:76
QImage::Format format
Definition qimage_p.h:49
QMap< QString, QString > text
Definition qimage_p.h:72
QPoint offset
Definition qimage_p.h:56
QImageCleanupFunction cleanupFunction
Definition qimage_p.h:63