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>
31Q_DECLARE_LOGGING_CATEGORY(lcImageIo)
39 static QImageData *
create(uchar *data,
int w,
int h, qsizetype bpl, QImage::Format format,
bool readOnly, QImageCleanupFunction cleanupFunction =
nullptr,
void *cleanupInfo =
nullptr);
42 static const QImageData *
get(
const QImage &img)
noexcept {
return img.d; }
78 bool doImageIO(
const QImage *image, QImageWriter* io,
int quality)
const;
87 bool isValid()
const {
return bytesPerLine > 0 && totalSize > 0; }
92inline QImageData::ImageSizeParameters
93QImageData::calculateImageParameters(qsizetype width, qsizetype height, qsizetype depth)
95 ImageSizeParameters invalid = { -1, -1 };
100 qsizetype bytes_per_line;
101 if (qMulOverflow(width, depth, &bytes_per_line))
103 if (qAddOverflow(bytes_per_line, qsizetype(31), &bytes_per_line))
106 bytes_per_line = (bytes_per_line >> 5) << 2;
108 qsizetype total_size;
109 if (qMulOverflow(height, bytes_per_line, &total_size))
112 if (qMulOverflow(height, qsizetype(
sizeof(uchar *)), &dummy))
115 if (width > (INT_MAX - 31) / depth)
118 return { bytes_per_line, total_size };
127void convert_generic(QImageData *dest,
const QImageData *src, Qt::ImageConversionFlags);
131#if QT_CONFIG(raster_fp)
132void convert_generic_over_rgba32f(QImageData *dest,
const QImageData *src, Qt::ImageConversionFlags);
133bool convert_generic_inplace_over_rgba32f(QImageData *data, QImage::Format dst_format, Qt::ImageConversionFlags);
136void dither_to_Mono(QImageData *dst,
const QImageData *src, Qt::ImageConversionFlags flags,
bool fromalpha);
141#if defined(_M_ARM) && defined(_MSC_VER)
142#pragma optimize("", off)
148 case QImage::Format_Invalid:
149 case QImage::NImageFormats:
151 case QImage::Format_Mono:
152 case QImage::Format_MonoLSB:
155 case QImage::Format_Indexed8:
156 case QImage::Format_Alpha8:
157 case QImage::Format_Grayscale8:
160 case QImage::Format_RGB32:
161 case QImage::Format_ARGB32:
162 case QImage::Format_ARGB32_Premultiplied:
163 case QImage::Format_RGBX8888:
164 case QImage::Format_RGBA8888:
165 case QImage::Format_RGBA8888_Premultiplied:
166 case QImage::Format_BGR30:
167 case QImage::Format_A2BGR30_Premultiplied:
168 case QImage::Format_RGB30:
169 case QImage::Format_A2RGB30_Premultiplied:
172 case QImage::Format_RGB555:
173 case QImage::Format_RGB16:
174 case QImage::Format_RGB444:
175 case QImage::Format_ARGB4444_Premultiplied:
176 case QImage::Format_Grayscale16:
179 case QImage::Format_RGB666:
180 case QImage::Format_ARGB6666_Premultiplied:
181 case QImage::Format_ARGB8565_Premultiplied:
182 case QImage::Format_ARGB8555_Premultiplied:
183 case QImage::Format_RGB888:
184 case QImage::Format_BGR888:
187 case QImage::Format_RGBX64:
188 case QImage::Format_RGBA64:
189 case QImage::Format_RGBA64_Premultiplied:
190 case QImage::Format_RGBX16FPx4:
191 case QImage::Format_RGBA16FPx4:
192 case QImage::Format_RGBA16FPx4_Premultiplied:
195 case QImage::Format_RGBX32FPx4:
196 case QImage::Format_RGBA32FPx4:
197 case QImage::Format_RGBA32FPx4_Premultiplied:
200 case QImage::Format_CMYK8888:
207#if defined(_M_ARM) && defined(_MSC_VER)
208#pragma optimize("", on)
214 case QImage::Format_ARGB8565_Premultiplied:
215 return QImage::Format_RGB16;
216 case QImage::Format_ARGB8555_Premultiplied:
217 return QImage::Format_RGB555;
218 case QImage::Format_ARGB6666_Premultiplied:
219 return QImage::Format_RGB666;
220 case QImage::Format_ARGB4444_Premultiplied:
221 return QImage::Format_RGB444;
222 case QImage::Format_RGBA8888:
223 case QImage::Format_RGBA8888_Premultiplied:
224 return QImage::Format_RGBX8888;
225 case QImage::Format_A2BGR30_Premultiplied:
226 return QImage::Format_BGR30;
227 case QImage::Format_A2RGB30_Premultiplied:
228 return QImage::Format_RGB30;
229 case QImage::Format_RGBA64:
230 case QImage::Format_RGBA64_Premultiplied:
231 return QImage::Format_RGBX64;
232 case QImage::Format_RGBA16FPx4:
233 case QImage::Format_RGBA16FPx4_Premultiplied:
234 return QImage::Format_RGBX16FPx4;
235 case QImage::Format_RGBA32FPx4:
236 case QImage::Format_RGBA32FPx4_Premultiplied:
237 return QImage::Format_RGBX32FPx4;
238 case QImage::Format_ARGB32_Premultiplied:
239 case QImage::Format_ARGB32:
240 return QImage::Format_RGB32;
241 case QImage::Format_RGB16:
242 case QImage::Format_RGB32:
243 case QImage::Format_RGB444:
244 case QImage::Format_RGB555:
245 case QImage::Format_RGB666:
246 case QImage::Format_RGB888:
247 case QImage::Format_BGR888:
248 case QImage::Format_RGBX8888:
249 case QImage::Format_BGR30:
250 case QImage::Format_RGB30:
251 case QImage::Format_RGBX64:
252 case QImage::Format_RGBX16FPx4:
253 case QImage::Format_RGBX32FPx4:
254 case QImage::Format_Grayscale8:
255 case QImage::Format_Grayscale16:
256 case QImage::Format_CMYK8888:
258 case QImage::Format_Mono:
259 case QImage::Format_MonoLSB:
260 case QImage::Format_Indexed8:
261 case QImage::Format_Alpha8:
262 case QImage::Format_Invalid:
263 case QImage::NImageFormats:
266 return QImage::Format_RGB32;
272 case QImage::Format_RGB32:
273 case QImage::Format_ARGB32:
274 return QImage::Format_ARGB32_Premultiplied;
275 case QImage::Format_RGB16:
276 return QImage::Format_ARGB8565_Premultiplied;
277 case QImage::Format_RGB555:
278 return QImage::Format_ARGB8555_Premultiplied;
279 case QImage::Format_RGB666:
280 return QImage::Format_ARGB6666_Premultiplied;
281 case QImage::Format_RGB444:
282 return QImage::Format_ARGB4444_Premultiplied;
283 case QImage::Format_RGBX8888:
284 case QImage::Format_RGBA8888:
285 return QImage::Format_RGBA8888_Premultiplied;
286 case QImage::Format_BGR30:
287 return QImage::Format_A2BGR30_Premultiplied;
288 case QImage::Format_RGB30:
289 return QImage::Format_A2RGB30_Premultiplied;
290 case QImage::Format_RGBX64:
291 case QImage::Format_RGBA64:
292 case QImage::Format_Grayscale16:
293 return QImage::Format_RGBA64_Premultiplied;
294 case QImage::Format_RGBX16FPx4:
295 case QImage::Format_RGBA16FPx4:
296 return QImage::Format_RGBA16FPx4_Premultiplied;
297 case QImage::Format_RGBX32FPx4:
298 case QImage::Format_RGBA32FPx4:
299 return QImage::Format_RGBA32FPx4_Premultiplied;
300 case QImage::Format_ARGB32_Premultiplied:
301 case QImage::Format_ARGB8565_Premultiplied:
302 case QImage::Format_ARGB8555_Premultiplied:
303 case QImage::Format_ARGB6666_Premultiplied:
304 case QImage::Format_ARGB4444_Premultiplied:
305 case QImage::Format_RGBA8888_Premultiplied:
306 case QImage::Format_A2BGR30_Premultiplied:
307 case QImage::Format_A2RGB30_Premultiplied:
308 case QImage::Format_RGBA64_Premultiplied:
309 case QImage::Format_RGBA16FPx4_Premultiplied:
310 case QImage::Format_RGBA32FPx4_Premultiplied:
312 case QImage::Format_Mono:
313 case QImage::Format_MonoLSB:
314 case QImage::Format_Indexed8:
315 case QImage::Format_RGB888:
316 case QImage::Format_BGR888:
317 case QImage::Format_Alpha8:
318 case QImage::Format_Grayscale8:
319 case QImage::Format_Invalid:
320 case QImage::Format_CMYK8888:
321 case QImage::NImageFormats:
324 return QImage::Format_ARGB32_Premultiplied;
331 case QImage::Format_ARGB6666_Premultiplied:
332 return QImage::Format_RGB666;
333 case QImage::Format_ARGB4444_Premultiplied:
334 return QImage::Format_RGB444;
335 case QImage::Format_RGBA8888:
336 case QImage::Format_RGBA8888_Premultiplied:
337 return QImage::Format_RGBX8888;
338 case QImage::Format_A2BGR30_Premultiplied:
339 return QImage::Format_BGR30;
340 case QImage::Format_A2RGB30_Premultiplied:
341 return QImage::Format_RGB30;
342 case QImage::Format_RGBA64:
343 case QImage::Format_RGBA64_Premultiplied:
344 return QImage::Format_RGBX64;
345 case QImage::Format_RGBA16FPx4:
346 case QImage::Format_RGBA16FPx4_Premultiplied:
347 return QImage::Format_RGBX16FPx4;
348 case QImage::Format_RGBA32FPx4:
349 case QImage::Format_RGBA32FPx4_Premultiplied:
350 return QImage::Format_RGBX32FPx4;
351 case QImage::Format_ARGB32_Premultiplied:
352 case QImage::Format_ARGB32:
353 return QImage::Format_RGB32;
354 case QImage::Format_RGB16:
355 case QImage::Format_RGB32:
356 case QImage::Format_RGB444:
357 case QImage::Format_RGB555:
358 case QImage::Format_RGB666:
359 case QImage::Format_RGB888:
360 case QImage::Format_BGR888:
361 case QImage::Format_RGBX8888:
362 case QImage::Format_BGR30:
363 case QImage::Format_RGB30:
364 case QImage::Format_RGBX64:
365 case QImage::Format_RGBX16FPx4:
366 case QImage::Format_RGBX32FPx4:
367 case QImage::Format_Grayscale8:
368 case QImage::Format_Grayscale16:
369 case QImage::Format_CMYK8888:
371 case QImage::Format_Mono:
372 case QImage::Format_MonoLSB:
373 case QImage::Format_Indexed8:
374 case QImage::Format_ARGB8565_Premultiplied:
375 case QImage::Format_ARGB8555_Premultiplied:
376 case QImage::Format_Alpha8:
377 case QImage::Format_Invalid:
378 case QImage::NImageFormats:
388 return static_cast<QImage::Format>(qToUnderlying(format) - 1);
395 return static_cast<QImage::Format>(qToUnderlying(format) + 1);
402 case QImage::Format_ARGB32:
403 case QImage::Format_RGBA8888:
405 case QImage::Format_BGR30:
406 case QImage::Format_RGB30:
407 case QImage::Format_A2BGR30_Premultiplied:
408 case QImage::Format_A2RGB30_Premultiplied:
409 case QImage::Format_RGBX64:
410 case QImage::Format_RGBA64:
411 case QImage::Format_RGBA64_Premultiplied:
412 case QImage::Format_Grayscale16:
413 case QImage::Format_RGBX16FPx4:
414 case QImage::Format_RGBA16FPx4:
415 case QImage::Format_RGBA16FPx4_Premultiplied:
416 case QImage::Format_RGBX32FPx4:
417 case QImage::Format_RGBA32FPx4:
418 case QImage::Format_RGBA32FPx4_Premultiplied:
429 case QImage::Format_RGBX16FPx4:
430 case QImage::Format_RGBA16FPx4:
431 case QImage::Format_RGBA16FPx4_Premultiplied:
432 case QImage::Format_RGBX32FPx4:
433 case QImage::Format_RGBA32FPx4:
434 case QImage::Format_RGBA32FPx4_Premultiplied:
445 case QPixelFormat::ColorModel::RGB:
446 case QPixelFormat::ColorModel::BGR:
447 case QPixelFormat::ColorModel::Indexed:
448 return QColorSpace::ColorModel::Rgb;
449 case QPixelFormat::ColorModel::Alpha:
450 return QColorSpace::ColorModel::Undefined;
451 case QPixelFormat::ColorModel::Grayscale:
452 return QColorSpace::ColorModel::Gray;
453 case QPixelFormat::ColorModel::CMYK:
454 return QColorSpace::ColorModel::Cmyk;
458 return QColorSpace::ColorModel::Undefined;
463 QColorSpace::ColorModel dataCs = qt_csColorData(data);
465 if (data == QPixelFormat::ColorModel::Alpha)
468 if (cs == QColorSpace::ColorModel::Undefined || dataCs == QColorSpace::ColorModel::Undefined)
471 return (dataCs == cs);
476 if (qt_compatibleColorModelBase(data, cs))
479 if (data == QPixelFormat::ColorModel::Grayscale && cs == QColorSpace::ColorModel::Rgb)
487 if (qt_compatibleColorModelBase(data, cs))
490 if (data == QPixelFormat::ColorModel::Grayscale && tm == QColorSpace::TransformModel::ThreeComponentMatrix)
499 case QImage::Format_RGB32:
500 return QImage::Format_ARGB32_Premultiplied;
501 case QImage::Format_RGB666:
502 return QImage::Format_ARGB6666_Premultiplied;
503 case QImage::Format_RGB444:
504 return QImage::Format_ARGB4444_Premultiplied;
505 case QImage::Format_RGBX8888:
506 return QImage::Format_RGBA8888_Premultiplied;
507 case QImage::Format_BGR30:
508 return QImage::Format_A2BGR30_Premultiplied;
509 case QImage::Format_RGB30:
510 return QImage::Format_A2RGB30_Premultiplied;
511 case QImage::Format_RGBX64:
512 return QImage::Format_RGBA64_Premultiplied;
513 case QImage::Format_RGBX16FPx4:
514 return QImage::Format_RGBA16FPx4_Premultiplied;
515 case QImage::Format_RGBX32FPx4:
516 return QImage::Format_RGBA32FPx4_Premultiplied;
517 case QImage::Format_ARGB32:
518 case QImage::Format_ARGB32_Premultiplied:
519 case QImage::Format_ARGB8565_Premultiplied:
520 case QImage::Format_ARGB8555_Premultiplied:
521 case QImage::Format_ARGB6666_Premultiplied:
522 case QImage::Format_ARGB4444_Premultiplied:
523 case QImage::Format_RGBA8888:
524 case QImage::Format_RGBA8888_Premultiplied:
525 case QImage::Format_A2BGR30_Premultiplied:
526 case QImage::Format_A2RGB30_Premultiplied:
527 case QImage::Format_Alpha8:
528 case QImage::Format_RGBA64:
529 case QImage::Format_RGBA64_Premultiplied:
530 case QImage::Format_RGBA16FPx4:
531 case QImage::Format_RGBA16FPx4_Premultiplied:
532 case QImage::Format_RGBA32FPx4:
533 case QImage::Format_RGBA32FPx4_Premultiplied:
535 case QImage::Format_Mono:
536 case QImage::Format_MonoLSB:
537 case QImage::Format_Indexed8:
538 case QImage::Format_RGB16:
539 case QImage::Format_RGB555:
540 case QImage::Format_RGB888:
541 case QImage::Format_BGR888:
542 case QImage::Format_Grayscale8:
543 case QImage::Format_Grayscale16:
544 case QImage::Format_CMYK8888:
545 case QImage::Format_Invalid:
546 case QImage::NImageFormats:
554 QImage::Format toFormat = qt_opaqueVersion(format);
556 if (qt_depthForFormat(format) != qt_depthForFormat(toFormat) && qt_depthForFormat(toFormat) <= 32)
557 toFormat = QImage::Format_RGB32;
563 QImage::Format toFormat = qt_alphaVersion(format);
564#if defined(__ARM_NEON__) || defined(__SSE2__
) || defined(QT_COMPILER_SUPPORT_LSX)
566 if (qt_depthForFormat(format) != qt_depthForFormat(toFormat) && qt_depthForFormat(toFormat) <= 32)
567 toFormat = QImage::Format_ARGB32_Premultiplied;
572Q_GUI_EXPORT QMap<QString, QString> qt_getImageText(
const QImage &image,
const QString &description);
573Q_GUI_EXPORT QMap<QString, QString> qt_getImageTextFromDescription(
const QString &description);
virtual ~QImageIOHandlerPrivate()
Combined button and popup list for selecting options.
const uchar * qt_get_bitflip_array()
Image_Converter qimage_converter_map[QImage::NImageFormats][QImage::NImageFormats]
InPlace_Image_Converter qimage_inplace_converter_map[QImage::NImageFormats][QImage::NImageFormats]
bool convert_generic_inplace_over_rgb64(QImageData *data, QImage::Format dst_format, Qt::ImageConversionFlags)
constexpr QImage::Format qt_toUnpremultipliedFormat(QImage::Format format)
QImage::Format qt_maybeDataCompatibleOpaqueVersion(QImage::Format format)
int qt_depthForFormat(QImage::Format format)
void convert_generic(QImageData *dest, const QImageData *src, Qt::ImageConversionFlags)
QColorSpace::ColorModel qt_csColorData(QPixelFormat::ColorModel format)
bool qt_fpColorPrecision(QImage::Format format)
bool(* InPlace_Image_Converter)(QImageData *data, Qt::ImageConversionFlags)
QImage::Format qt_alphaVersion(QImage::Format format)
bool qt_compatibleColorModelTarget(QPixelFormat::ColorModel data, QColorSpace::ColorModel cs, QColorSpace::TransformModel tm)
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)
QImage::Format qt_opaqueVersionForPainting(QImage::Format format)
bool qt_compatibleColorModelBase(QPixelFormat::ColorModel data, QColorSpace::ColorModel cs)
QImage::Format qt_maybeDataCompatibleAlphaVersion(QImage::Format format)
Q_GUI_EXPORT void qGamma_correct_back_to_linear_cs(QImage *image)
QImage::Format qt_opaqueVersion(QImage::Format format)
void(* Image_Converter)(QImageData *dest, const QImageData *src, Qt::ImageConversionFlags)
constexpr QImage::Format qt_toPremultipliedFormat(QImage::Format format)
QImage::Format qt_alphaVersionForPainting(QImage::Format format)
bool convert_generic_inplace(QImageData *data, QImage::Format dst_format, Qt::ImageConversionFlags)
bool qt_compatibleColorModelSource(QPixelFormat::ColorModel data, QColorSpace::ColorModel cs)
#define Q_LOGGING_CATEGORY(name,...)
#define qCWarning(category,...)
static QImageData * create(const QSize &size, QImage::Format format)
bool checkForAlphaPixels() const
static const QImageData * get(const QImage &img) noexcept
bool doImageIO(const QImage *image, QImageWriter *io, int quality) const
static QImageData * get(QImage &img) noexcept
static ImageSizeParameters calculateImageParameters(qsizetype width, qsizetype height, qsizetype depth)
static QImageData * create(uchar *data, int w, int h, qsizetype bpl, QImage::Format format, bool readOnly, QImageCleanupFunction cleanupFunction=nullptr, void *cleanupInfo=nullptr)
bool convertInPlace(QImage::Format newFormat, Qt::ImageConversionFlags)
QPaintEngine * paintEngine
QMap< QString, QString > text
QImageCleanupFunction cleanupFunction