Coverage Report

Created: 2026-05-31 06:50

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/src/qtbase/src/gui/image/qimage_p.h
Line
Count
Source
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
// Qt-Security score:significant reason:default
4
5
#ifndef QIMAGE_P_H
6
#define QIMAGE_P_H
7
8
//
9
//  W A R N I N G
10
//  -------------
11
//
12
// This file is not part of the Qt API.  It exists purely as an
13
// implementation detail.  This header file may change from version to
14
// version without notice, or even be removed.
15
//
16
// We mean it.
17
//
18
19
#include <QtGui/private/qtguiglobal_p.h>
20
#include <QtGui/qcolorspace.h>
21
#include <QtGui/qimage.h>
22
#include <QtCore/private/qnumeric_p.h>
23
#include <QtCore/qlist.h>
24
#include <QtCore/qloggingcategory.h>
25
#include <QtCore/qmap.h>
26
#include <QtCore/qttypetraits.h>
27
28
29
QT_BEGIN_NAMESPACE
30
31
Q_DECLARE_LOGGING_CATEGORY(lcImageIo)
32
33
class QImageWriter;
34
35
struct Q_GUI_EXPORT QImageData {        // internal image data
36
    QImageData();
37
    ~QImageData();
38
    static QImageData *create(const QSize &size, QImage::Format format);
39
    static QImageData *create(uchar *data, int w, int h,  qsizetype bpl, QImage::Format format, bool readOnly, QImageCleanupFunction cleanupFunction = nullptr, void *cleanupInfo = nullptr);
40
41
20
    static QImageData *get(QImage &img) noexcept { return img.d; }
42
20
    static const QImageData *get(const QImage &img) noexcept { return img.d; }
43
44
    QAtomicInt ref;
45
46
    int width;
47
    int height;
48
    int depth;
49
    qsizetype nbytes;               // number of bytes data
50
    qreal devicePixelRatio;
51
    QList<QRgb> colortable;
52
    uchar *data;
53
    QImage::Format format; // invariants: > Format_Invalid, < NImageFormats
54
    qsizetype bytes_per_line;
55
    int ser_no;               // serial number
56
    int detach_no;
57
58
    qreal  dpmx;                // dots per meter X (or 0)
59
    qreal  dpmy;                // dots per meter Y (or 0)
60
    QPoint  offset;           // offset in pixels
61
62
    uint own_data : 1;
63
    uint ro_data : 1;
64
    uint has_alpha_clut : 1;
65
    uint is_cached : 1;
66
67
    QImageCleanupFunction cleanupFunction;
68
    void* cleanupInfo;
69
70
    bool checkForAlphaPixels() const;
71
72
    // Convert the image in-place, minimizing memory reallocation
73
    // Return false if the conversion cannot be done in-place.
74
    bool convertInPlace(QImage::Format newFormat, Qt::ImageConversionFlags);
75
76
    QMap<QString, QString> text;
77
78
    bool doImageIO(const QImage *image, QImageWriter* io, int quality) const;
79
80
    QPaintEngine *paintEngine;
81
82
    QColorSpace colorSpace;
83
84
    struct ImageSizeParameters {
85
        qsizetype bytesPerLine;
86
        qsizetype totalSize;
87
759k
        bool isValid() const { return bytesPerLine > 0 && totalSize > 0; }
88
    };
89
    static ImageSizeParameters calculateImageParameters(qsizetype width, qsizetype height, qsizetype depth);
90
};
91
92
inline QImageData::ImageSizeParameters
93
QImageData::calculateImageParameters(qsizetype width, qsizetype height, qsizetype depth)
94
759k
{
95
759k
    ImageSizeParameters invalid = { -1, -1 };
96
759k
    if (height <= 0)
97
0
        return invalid;
98
99
    // calculate the size, taking care of overflows
100
759k
    qsizetype bytes_per_line;
101
759k
    if (qMulOverflow(width, depth, &bytes_per_line))
102
0
        return invalid;
103
759k
    if (qAddOverflow(bytes_per_line, qsizetype(31), &bytes_per_line))
104
0
        return invalid;
105
    // bytes per scanline (must be multiple of 4)
106
759k
    bytes_per_line = (bytes_per_line >> 5) << 2;    // can't overflow
107
108
759k
    qsizetype total_size;
109
759k
    if (qMulOverflow(height, bytes_per_line, &total_size))
110
0
        return invalid;
111
759k
    qsizetype dummy;
112
759k
    if (qMulOverflow(height, qsizetype(sizeof(uchar *)), &dummy))
113
0
        return invalid;                                 // why is this here?
114
    // Disallow images where width * depth calculations might overflow
115
759k
    if (width > (INT_MAX - 31) / depth)
116
14
        return invalid;
117
118
759k
    return { bytes_per_line, total_size };
119
759k
}
120
121
typedef void (*Image_Converter)(QImageData *dest, const QImageData *src, Qt::ImageConversionFlags);
122
typedef bool (*InPlace_Image_Converter)(QImageData *data, Qt::ImageConversionFlags);
123
124
extern Image_Converter qimage_converter_map[QImage::NImageFormats][QImage::NImageFormats];
125
extern InPlace_Image_Converter qimage_inplace_converter_map[QImage::NImageFormats][QImage::NImageFormats];
126
127
void convert_generic(QImageData *dest, const QImageData *src, Qt::ImageConversionFlags);
128
void convert_generic_over_rgb64(QImageData *dest, const QImageData *src, Qt::ImageConversionFlags);
129
bool convert_generic_inplace(QImageData *data, QImage::Format dst_format, Qt::ImageConversionFlags);
130
bool convert_generic_inplace_over_rgb64(QImageData *data, QImage::Format dst_format, Qt::ImageConversionFlags);
131
#if QT_CONFIG(raster_fp)
132
void convert_generic_over_rgba32f(QImageData *dest, const QImageData *src, Qt::ImageConversionFlags);
133
bool convert_generic_inplace_over_rgba32f(QImageData *data, QImage::Format dst_format, Qt::ImageConversionFlags);
134
#endif
135
136
void dither_to_Mono(QImageData *dst, const QImageData *src, Qt::ImageConversionFlags flags, bool fromalpha);
137
138
const uchar *qt_get_bitflip_array();
139
Q_GUI_EXPORT void qGamma_correct_back_to_linear_cs(QImage *image);
140
141
#if defined(_M_ARM) && defined(_MSC_VER) // QTBUG-42038
142
#pragma optimize("", off)
143
#endif
144
inline int qt_depthForFormat(QImage::Format format)
145
1.19M
{
146
1.19M
    int depth = 0;
147
1.19M
    switch(format) {
148
0
    case QImage::Format_Invalid:
149
0
    case QImage::NImageFormats:
150
0
        Q_UNREACHABLE();
151
227k
    case QImage::Format_Mono:
152
237k
    case QImage::Format_MonoLSB:
153
237k
        depth = 1;
154
237k
        break;
155
23.3k
    case QImage::Format_Indexed8:
156
172k
    case QImage::Format_Alpha8:
157
366k
    case QImage::Format_Grayscale8:
158
366k
        depth = 8;
159
366k
        break;
160
151k
    case QImage::Format_RGB32:
161
358k
    case QImage::Format_ARGB32:
162
586k
    case QImage::Format_ARGB32_Premultiplied:
163
586k
    case QImage::Format_RGBX8888:
164
586k
    case QImage::Format_RGBA8888:
165
586k
    case QImage::Format_RGBA8888_Premultiplied:
166
586k
    case QImage::Format_BGR30:
167
586k
    case QImage::Format_A2BGR30_Premultiplied:
168
586k
    case QImage::Format_RGB30:
169
586k
    case QImage::Format_A2RGB30_Premultiplied:
170
586k
        depth = 32;
171
586k
        break;
172
0
    case QImage::Format_RGB555:
173
0
    case QImage::Format_RGB16:
174
0
    case QImage::Format_RGB444:
175
0
    case QImage::Format_ARGB4444_Premultiplied:
176
476
    case QImage::Format_Grayscale16:
177
476
        depth = 16;
178
476
        break;
179
0
    case QImage::Format_RGB666:
180
0
    case QImage::Format_ARGB6666_Premultiplied:
181
0
    case QImage::Format_ARGB8565_Premultiplied:
182
0
    case QImage::Format_ARGB8555_Premultiplied:
183
0
    case QImage::Format_RGB888:
184
0
    case QImage::Format_BGR888:
185
0
        depth = 24;
186
0
        break;
187
138
    case QImage::Format_RGBX64:
188
264
    case QImage::Format_RGBA64:
189
264
    case QImage::Format_RGBA64_Premultiplied:
190
264
    case QImage::Format_RGBX16FPx4:
191
264
    case QImage::Format_RGBA16FPx4:
192
264
    case QImage::Format_RGBA16FPx4_Premultiplied:
193
264
        depth = 64;
194
264
        break;
195
0
    case QImage::Format_RGBX32FPx4:
196
0
    case QImage::Format_RGBA32FPx4:
197
0
    case QImage::Format_RGBA32FPx4_Premultiplied:
198
0
        depth = 128;
199
0
        break;
200
2.28k
    case QImage::Format_CMYK8888:
201
2.28k
        depth = 32;
202
2.28k
        break;
203
1.19M
    }
204
1.19M
    return depth;
205
1.19M
}
206
207
#if defined(_M_ARM) && defined(_MSC_VER)
208
#pragma optimize("", on)
209
#endif
210
211
inline QImage::Format qt_opaqueVersion(QImage::Format format)
212
0
{
213
0
    switch (format) {
214
0
    case QImage::Format_ARGB8565_Premultiplied:
215
0
        return  QImage::Format_RGB16;
216
0
    case QImage::Format_ARGB8555_Premultiplied:
217
0
        return QImage::Format_RGB555;
218
0
    case QImage::Format_ARGB6666_Premultiplied:
219
0
        return  QImage::Format_RGB666;
220
0
    case QImage::Format_ARGB4444_Premultiplied:
221
0
        return QImage::Format_RGB444;
222
0
    case QImage::Format_RGBA8888:
223
0
    case QImage::Format_RGBA8888_Premultiplied:
224
0
        return QImage::Format_RGBX8888;
225
0
    case QImage::Format_A2BGR30_Premultiplied:
226
0
        return QImage::Format_BGR30;
227
0
    case QImage::Format_A2RGB30_Premultiplied:
228
0
        return QImage::Format_RGB30;
229
0
    case QImage::Format_RGBA64:
230
0
    case QImage::Format_RGBA64_Premultiplied:
231
0
        return QImage::Format_RGBX64;
232
0
    case QImage::Format_RGBA16FPx4:
233
0
    case QImage::Format_RGBA16FPx4_Premultiplied:
234
0
        return QImage::Format_RGBX16FPx4;
235
0
    case QImage::Format_RGBA32FPx4:
236
0
    case QImage::Format_RGBA32FPx4_Premultiplied:
237
0
        return QImage::Format_RGBX32FPx4;
238
0
    case QImage::Format_ARGB32_Premultiplied:
239
0
    case QImage::Format_ARGB32:
240
0
        return QImage::Format_RGB32;
241
0
    case QImage::Format_RGB16:
242
0
    case QImage::Format_RGB32:
243
0
    case QImage::Format_RGB444:
244
0
    case QImage::Format_RGB555:
245
0
    case QImage::Format_RGB666:
246
0
    case QImage::Format_RGB888:
247
0
    case QImage::Format_BGR888:
248
0
    case QImage::Format_RGBX8888:
249
0
    case QImage::Format_BGR30:
250
0
    case QImage::Format_RGB30:
251
0
    case QImage::Format_RGBX64:
252
0
    case QImage::Format_RGBX16FPx4:
253
0
    case QImage::Format_RGBX32FPx4:
254
0
    case QImage::Format_Grayscale8:
255
0
    case QImage::Format_Grayscale16:
256
0
    case QImage::Format_CMYK8888:
257
0
        return format;
258
0
    case QImage::Format_Mono:
259
0
    case QImage::Format_MonoLSB:
260
0
    case QImage::Format_Indexed8:
261
0
    case QImage::Format_Alpha8:
262
0
    case QImage::Format_Invalid:
263
0
    case QImage::NImageFormats:
264
0
        break;
265
0
    }
266
0
    return QImage::Format_RGB32;
267
0
}
268
269
inline QImage::Format qt_alphaVersion(QImage::Format format)
270
87.6k
{
271
87.6k
    switch (format) {
272
6.87k
    case QImage::Format_RGB32:
273
52.8k
    case QImage::Format_ARGB32:
274
52.8k
        return QImage::Format_ARGB32_Premultiplied;
275
0
    case QImage::Format_RGB16:
276
0
        return QImage::Format_ARGB8565_Premultiplied;
277
0
    case QImage::Format_RGB555:
278
0
        return QImage::Format_ARGB8555_Premultiplied;
279
0
    case QImage::Format_RGB666:
280
0
        return QImage::Format_ARGB6666_Premultiplied;
281
0
    case QImage::Format_RGB444:
282
0
        return QImage::Format_ARGB4444_Premultiplied;
283
0
    case QImage::Format_RGBX8888:
284
0
    case QImage::Format_RGBA8888:
285
0
        return QImage::Format_RGBA8888_Premultiplied;
286
0
    case QImage::Format_BGR30:
287
0
        return QImage::Format_A2BGR30_Premultiplied;
288
0
    case QImage::Format_RGB30:
289
0
        return QImage::Format_A2RGB30_Premultiplied;
290
0
    case QImage::Format_RGBX64:
291
0
    case QImage::Format_RGBA64:
292
0
    case QImage::Format_Grayscale16:
293
0
        return QImage::Format_RGBA64_Premultiplied;
294
0
    case QImage::Format_RGBX16FPx4:
295
0
    case QImage::Format_RGBA16FPx4:
296
0
        return QImage::Format_RGBA16FPx4_Premultiplied;
297
0
    case QImage::Format_RGBX32FPx4:
298
0
    case QImage::Format_RGBA32FPx4:
299
0
        return QImage::Format_RGBA32FPx4_Premultiplied;
300
0
    case QImage::Format_ARGB32_Premultiplied:
301
0
    case QImage::Format_ARGB8565_Premultiplied:
302
0
    case QImage::Format_ARGB8555_Premultiplied:
303
0
    case QImage::Format_ARGB6666_Premultiplied:
304
0
    case QImage::Format_ARGB4444_Premultiplied:
305
0
    case QImage::Format_RGBA8888_Premultiplied:
306
0
    case QImage::Format_A2BGR30_Premultiplied:
307
0
    case QImage::Format_A2RGB30_Premultiplied:
308
0
    case QImage::Format_RGBA64_Premultiplied:
309
0
    case QImage::Format_RGBA16FPx4_Premultiplied:
310
0
    case QImage::Format_RGBA32FPx4_Premultiplied:
311
0
        return format;
312
30.9k
    case QImage::Format_Mono:
313
30.9k
    case QImage::Format_MonoLSB:
314
34.7k
    case QImage::Format_Indexed8:
315
34.7k
    case QImage::Format_RGB888:
316
34.7k
    case QImage::Format_BGR888:
317
34.7k
    case QImage::Format_Alpha8:
318
34.7k
    case QImage::Format_Grayscale8:
319
34.7k
    case QImage::Format_Invalid:
320
34.7k
    case QImage::Format_CMYK8888:
321
34.7k
    case QImage::NImageFormats:
322
34.7k
        break;
323
87.6k
    }
324
34.7k
    return QImage::Format_ARGB32_Premultiplied;
325
87.6k
}
326
327
// Returns an opaque version that is compatible with format
328
inline QImage::Format qt_maybeDataCompatibleOpaqueVersion(QImage::Format format)
329
0
{
330
0
    switch (format) {
331
0
    case QImage::Format_ARGB6666_Premultiplied:
332
0
        return QImage::Format_RGB666;
333
0
    case QImage::Format_ARGB4444_Premultiplied:
334
0
        return QImage::Format_RGB444;
335
0
    case QImage::Format_RGBA8888:
336
0
    case QImage::Format_RGBA8888_Premultiplied:
337
0
        return QImage::Format_RGBX8888;
338
0
    case QImage::Format_A2BGR30_Premultiplied:
339
0
        return QImage::Format_BGR30;
340
0
    case QImage::Format_A2RGB30_Premultiplied:
341
0
        return QImage::Format_RGB30;
342
0
    case QImage::Format_RGBA64:
343
0
    case QImage::Format_RGBA64_Premultiplied:
344
0
        return QImage::Format_RGBX64;
345
0
    case QImage::Format_RGBA16FPx4:
346
0
    case QImage::Format_RGBA16FPx4_Premultiplied:
347
0
        return QImage::Format_RGBX16FPx4;
348
0
    case QImage::Format_RGBA32FPx4:
349
0
    case QImage::Format_RGBA32FPx4_Premultiplied:
350
0
        return QImage::Format_RGBX32FPx4;
351
0
    case QImage::Format_ARGB32_Premultiplied:
352
0
    case QImage::Format_ARGB32:
353
0
        return QImage::Format_RGB32;
354
0
    case QImage::Format_RGB16:
355
0
    case QImage::Format_RGB32:
356
0
    case QImage::Format_RGB444:
357
0
    case QImage::Format_RGB555:
358
0
    case QImage::Format_RGB666:
359
0
    case QImage::Format_RGB888:
360
0
    case QImage::Format_BGR888:
361
0
    case QImage::Format_RGBX8888:
362
0
    case QImage::Format_BGR30:
363
0
    case QImage::Format_RGB30:
364
0
    case QImage::Format_RGBX64:
365
0
    case QImage::Format_RGBX16FPx4:
366
0
    case QImage::Format_RGBX32FPx4:
367
0
    case QImage::Format_Grayscale8:
368
0
    case QImage::Format_Grayscale16:
369
0
    case QImage::Format_CMYK8888:
370
0
        return format; // Already opaque
371
0
    case QImage::Format_Mono:
372
0
    case QImage::Format_MonoLSB:
373
0
    case QImage::Format_Indexed8:
374
0
    case QImage::Format_ARGB8565_Premultiplied:
375
0
    case QImage::Format_ARGB8555_Premultiplied:
376
0
    case QImage::Format_Alpha8:
377
0
    case QImage::Format_Invalid:
378
0
    case QImage::NImageFormats:
379
0
        break;
380
0
    }
381
0
    return format; // No compatible opaque versions
382
0
}
383
384
constexpr QImage::Format qt_toUnpremultipliedFormat(QImage::Format format)
385
0
{
386
0
    // Assumes input is already a premultiplied format with an unpremultiplied counterpart
387
0
    // This abuses the fact unpremultiplied formats are always before their premultiplied counterparts.
388
0
    return static_cast<QImage::Format>(qToUnderlying(format) - 1);
389
0
}
390
391
constexpr QImage::Format qt_toPremultipliedFormat(QImage::Format format)
392
0
{
393
    // Assumes input is already an unpremultiplied format
394
    // This abuses the fact unpremultiplied formats are always before their premultiplied counterparts.
395
0
    return static_cast<QImage::Format>(qToUnderlying(format) + 1);
396
0
}
397
398
inline bool qt_highColorPrecision(QImage::Format format, bool opaque = false)
399
146k
{
400
    // Formats with higher color precision than ARGB32_Premultiplied.
401
146k
    switch (format) {
402
48.3k
    case QImage::Format_ARGB32:
403
48.3k
    case QImage::Format_RGBA8888:
404
48.3k
        return !opaque;
405
0
    case QImage::Format_BGR30:
406
0
    case QImage::Format_RGB30:
407
0
    case QImage::Format_A2BGR30_Premultiplied:
408
0
    case QImage::Format_A2RGB30_Premultiplied:
409
0
    case QImage::Format_RGBX64:
410
0
    case QImage::Format_RGBA64:
411
0
    case QImage::Format_RGBA64_Premultiplied:
412
0
    case QImage::Format_Grayscale16:
413
0
    case QImage::Format_RGBX16FPx4:
414
0
    case QImage::Format_RGBA16FPx4:
415
0
    case QImage::Format_RGBA16FPx4_Premultiplied:
416
0
    case QImage::Format_RGBX32FPx4:
417
0
    case QImage::Format_RGBA32FPx4:
418
0
    case QImage::Format_RGBA32FPx4_Premultiplied:
419
0
        return true;
420
98.1k
    default:
421
98.1k
        break;
422
146k
    }
423
98.1k
    return false;
424
146k
}
425
426
inline bool qt_fpColorPrecision(QImage::Format format)
427
2.02k
{
428
2.02k
    switch (format) {
429
0
    case QImage::Format_RGBX16FPx4:
430
0
    case QImage::Format_RGBA16FPx4:
431
0
    case QImage::Format_RGBA16FPx4_Premultiplied:
432
0
    case QImage::Format_RGBX32FPx4:
433
0
    case QImage::Format_RGBA32FPx4:
434
0
    case QImage::Format_RGBA32FPx4_Premultiplied:
435
0
        return true;
436
2.02k
    default:
437
2.02k
        break;
438
2.02k
    }
439
2.02k
    return false;
440
2.02k
}
441
442
inline QColorSpace::ColorModel qt_csColorData(QPixelFormat::ColorModel format)
443
129
{
444
129
    switch (format) {
445
117
    case QPixelFormat::ColorModel::RGB:
446
117
    case QPixelFormat::ColorModel::BGR:
447
119
    case QPixelFormat::ColorModel::Indexed:
448
119
        return QColorSpace::ColorModel::Rgb;
449
0
    case QPixelFormat::ColorModel::Alpha:
450
0
        return QColorSpace::ColorModel::Undefined; // No valid colors
451
10
    case QPixelFormat::ColorModel::Grayscale:
452
10
        return QColorSpace::ColorModel::Gray;
453
0
    case QPixelFormat::ColorModel::CMYK:
454
0
        return QColorSpace::ColorModel::Cmyk;
455
0
    default:
456
0
        break;
457
129
    }
458
0
    return QColorSpace::ColorModel::Undefined;
459
129
}
460
461
inline bool qt_compatibleColorModelBase(QPixelFormat::ColorModel data, QColorSpace::ColorModel cs)
462
129
{
463
129
    QColorSpace::ColorModel dataCs = qt_csColorData(data);
464
465
129
    if (data == QPixelFormat::ColorModel::Alpha)
466
0
        return true; // Alpha data has no colors and can be handled by any color space
467
468
129
    if (cs == QColorSpace::ColorModel::Undefined || dataCs == QColorSpace::ColorModel::Undefined)
469
0
        return false;
470
471
129
    return (dataCs == cs); // Matching color models
472
129
}
473
474
inline bool qt_compatibleColorModelSource(QPixelFormat::ColorModel data, QColorSpace::ColorModel cs)
475
129
{
476
129
    if (qt_compatibleColorModelBase(data, cs))
477
119
        return true;
478
479
10
    if (data == QPixelFormat::ColorModel::Grayscale && cs == QColorSpace::ColorModel::Rgb)
480
10
        return true; // Can apply Rgb CS to Gray input data
481
482
0
    return false;
483
10
}
484
485
inline bool qt_compatibleColorModelTarget(QPixelFormat::ColorModel data, QColorSpace::ColorModel cs, QColorSpace::TransformModel tm)
486
0
{
487
0
    if (qt_compatibleColorModelBase(data, cs))
488
0
        return true;
489
490
0
    if (data == QPixelFormat::ColorModel::Grayscale && tm == QColorSpace::TransformModel::ThreeComponentMatrix)
491
0
        return true; // Can apply three-component matrix CS to gray output
492
493
0
    return false;
494
0
}
495
496
inline QImage::Format qt_maybeDataCompatibleAlphaVersion(QImage::Format format)
497
0
{
498
0
    switch (format) {
499
0
    case QImage::Format_RGB32:
500
0
        return QImage::Format_ARGB32_Premultiplied;
501
0
    case QImage::Format_RGB666:
502
0
        return QImage::Format_ARGB6666_Premultiplied;
503
0
    case QImage::Format_RGB444:
504
0
        return QImage::Format_ARGB4444_Premultiplied;
505
0
    case QImage::Format_RGBX8888:
506
0
        return QImage::Format_RGBA8888_Premultiplied;
507
0
    case QImage::Format_BGR30:
508
0
        return QImage::Format_A2BGR30_Premultiplied;
509
0
    case QImage::Format_RGB30:
510
0
        return QImage::Format_A2RGB30_Premultiplied;
511
0
    case QImage::Format_RGBX64:
512
0
        return QImage::Format_RGBA64_Premultiplied;
513
0
    case QImage::Format_RGBX16FPx4:
514
0
        return QImage::Format_RGBA16FPx4_Premultiplied;
515
0
    case QImage::Format_RGBX32FPx4:
516
0
        return QImage::Format_RGBA32FPx4_Premultiplied;
517
0
    case QImage::Format_ARGB32:
518
0
    case QImage::Format_ARGB32_Premultiplied:
519
0
    case QImage::Format_ARGB8565_Premultiplied:
520
0
    case QImage::Format_ARGB8555_Premultiplied:
521
0
    case QImage::Format_ARGB6666_Premultiplied:
522
0
    case QImage::Format_ARGB4444_Premultiplied:
523
0
    case QImage::Format_RGBA8888:
524
0
    case QImage::Format_RGBA8888_Premultiplied:
525
0
    case QImage::Format_A2BGR30_Premultiplied:
526
0
    case QImage::Format_A2RGB30_Premultiplied:
527
0
    case QImage::Format_Alpha8:
528
0
    case QImage::Format_RGBA64:
529
0
    case QImage::Format_RGBA64_Premultiplied:
530
0
    case QImage::Format_RGBA16FPx4:
531
0
    case QImage::Format_RGBA16FPx4_Premultiplied:
532
0
    case QImage::Format_RGBA32FPx4:
533
0
    case QImage::Format_RGBA32FPx4_Premultiplied:
534
0
        return format; // Already alpha versions
535
0
    case QImage::Format_Mono:
536
0
    case QImage::Format_MonoLSB:
537
0
    case QImage::Format_Indexed8:
538
0
    case QImage::Format_RGB16:
539
0
    case QImage::Format_RGB555:
540
0
    case QImage::Format_RGB888:
541
0
    case QImage::Format_BGR888:
542
0
    case QImage::Format_Grayscale8:
543
0
    case QImage::Format_Grayscale16:
544
0
    case QImage::Format_CMYK8888:
545
0
    case QImage::Format_Invalid:
546
0
    case QImage::NImageFormats:
547
0
        break;
548
0
    }
549
0
    return format; // No data-compatible alpha version
550
0
}
551
552
inline QImage::Format qt_opaqueVersionForPainting(QImage::Format format)
553
0
{
554
0
    QImage::Format toFormat = qt_opaqueVersion(format);
555
    // If we are switching depth anyway upgrade to RGB32
556
0
    if (qt_depthForFormat(format) != qt_depthForFormat(toFormat) && qt_depthForFormat(toFormat) <= 32)
557
0
        toFormat = QImage::Format_RGB32;
558
0
    return toFormat;
559
0
}
560
561
inline QImage::Format qt_alphaVersionForPainting(QImage::Format format)
562
87.6k
{
563
87.6k
    QImage::Format toFormat = qt_alphaVersion(format);
564
87.6k
#if defined(__ARM_NEON__) || defined(__SSE2__) || defined(QT_COMPILER_SUPPORT_LSX)
565
    // If we are switching depth anyway and we have optimized ARGB32PM routines, upgrade to that.
566
87.6k
    if (qt_depthForFormat(format) != qt_depthForFormat(toFormat) && qt_depthForFormat(toFormat) <= 32)
567
34.7k
        toFormat = QImage::Format_ARGB32_Premultiplied;
568
87.6k
#endif
569
87.6k
    return toFormat;
570
87.6k
}
571
572
Q_GUI_EXPORT QMap<QString, QString> qt_getImageText(const QImage &image, const QString &description);
573
Q_GUI_EXPORT QMap<QString, QString> qt_getImageTextFromDescription(const QString &description);
574
575
Q_GUI_EXPORT bool qt_xForm_helper(const QTransform &trueMat, int xoffset, int type, int depth,
576
                                  uchar *dptr, qsizetype dbpl, int p_inc, int dHeight,
577
                                  const uchar *sptr, qsizetype sbpl, int sWidth, int sHeight);
578
579
QT_END_NAMESPACE
580
581
#endif // QIMAGE_P_H