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; }
91 const char *context =
nullptr);
94inline QImageData::ImageSizeParameters
95QImageData::calculateImageParameters(qsizetype width, qsizetype height, qsizetype depth)
97 ImageSizeParameters invalid = { -1, -1 };
102 qsizetype bytes_per_line;
103 if (qMulOverflow(width, depth, &bytes_per_line))
105 if (qAddOverflow(bytes_per_line, qsizetype(31), &bytes_per_line))
108 bytes_per_line = (bytes_per_line >> 5) << 2;
110 qsizetype total_size;
111 if (qMulOverflow(height, bytes_per_line, &total_size))
114 if (qMulOverflow(height, qsizetype(
sizeof(uchar *)), &dummy))
117 if (width > (INT_MAX - 31) / depth)
120 return { bytes_per_line, total_size };
129void convert_generic(QImageData *dest,
const QImageData *src, Qt::ImageConversionFlags);
133#if QT_CONFIG(raster_fp)
134void convert_generic_over_rgba32f(QImageData *dest,
const QImageData *src, Qt::ImageConversionFlags);
135bool convert_generic_inplace_over_rgba32f(QImageData *data, QImage::Format dst_format, Qt::ImageConversionFlags);
138void dither_to_Mono(QImageData *dst,
const QImageData *src, Qt::ImageConversionFlags flags,
bool fromalpha);
143#if defined(_M_ARM) && defined(_MSC_VER)
144#pragma optimize("", off)
150 case QImage::Format_Invalid:
151 case QImage::NImageFormats:
153 case QImage::Format_Mono:
154 case QImage::Format_MonoLSB:
157 case QImage::Format_Indexed8:
158 case QImage::Format_Alpha8:
159 case QImage::Format_Grayscale8:
162 case QImage::Format_RGB32:
163 case QImage::Format_ARGB32:
164 case QImage::Format_ARGB32_Premultiplied:
165 case QImage::Format_RGBX8888:
166 case QImage::Format_RGBA8888:
167 case QImage::Format_RGBA8888_Premultiplied:
168 case QImage::Format_BGR30:
169 case QImage::Format_A2BGR30_Premultiplied:
170 case QImage::Format_RGB30:
171 case QImage::Format_A2RGB30_Premultiplied:
174 case QImage::Format_RGB555:
175 case QImage::Format_RGB16:
176 case QImage::Format_RGB444:
177 case QImage::Format_ARGB4444_Premultiplied:
178 case QImage::Format_Grayscale16:
181 case QImage::Format_RGB666:
182 case QImage::Format_ARGB6666_Premultiplied:
183 case QImage::Format_ARGB8565_Premultiplied:
184 case QImage::Format_ARGB8555_Premultiplied:
185 case QImage::Format_RGB888:
186 case QImage::Format_BGR888:
189 case QImage::Format_RGBX64:
190 case QImage::Format_RGBA64:
191 case QImage::Format_RGBA64_Premultiplied:
192 case QImage::Format_RGBX16FPx4:
193 case QImage::Format_RGBA16FPx4:
194 case QImage::Format_RGBA16FPx4_Premultiplied:
197 case QImage::Format_RGBX32FPx4:
198 case QImage::Format_RGBA32FPx4:
199 case QImage::Format_RGBA32FPx4_Premultiplied:
202 case QImage::Format_CMYK8888:
209#if defined(_M_ARM) && defined(_MSC_VER)
210#pragma optimize("", on)
216 case QImage::Format_ARGB8565_Premultiplied:
217 return QImage::Format_RGB16;
218 case QImage::Format_ARGB8555_Premultiplied:
219 return QImage::Format_RGB555;
220 case QImage::Format_ARGB6666_Premultiplied:
221 return QImage::Format_RGB666;
222 case QImage::Format_ARGB4444_Premultiplied:
223 return QImage::Format_RGB444;
224 case QImage::Format_RGBA8888:
225 case QImage::Format_RGBA8888_Premultiplied:
226 return QImage::Format_RGBX8888;
227 case QImage::Format_A2BGR30_Premultiplied:
228 return QImage::Format_BGR30;
229 case QImage::Format_A2RGB30_Premultiplied:
230 return QImage::Format_RGB30;
231 case QImage::Format_RGBA64:
232 case QImage::Format_RGBA64_Premultiplied:
233 return QImage::Format_RGBX64;
234 case QImage::Format_RGBA16FPx4:
235 case QImage::Format_RGBA16FPx4_Premultiplied:
236 return QImage::Format_RGBX16FPx4;
237 case QImage::Format_RGBA32FPx4:
238 case QImage::Format_RGBA32FPx4_Premultiplied:
239 return QImage::Format_RGBX32FPx4;
240 case QImage::Format_ARGB32_Premultiplied:
241 case QImage::Format_ARGB32:
242 return QImage::Format_RGB32;
243 case QImage::Format_RGB16:
244 case QImage::Format_RGB32:
245 case QImage::Format_RGB444:
246 case QImage::Format_RGB555:
247 case QImage::Format_RGB666:
248 case QImage::Format_RGB888:
249 case QImage::Format_BGR888:
250 case QImage::Format_RGBX8888:
251 case QImage::Format_BGR30:
252 case QImage::Format_RGB30:
253 case QImage::Format_RGBX64:
254 case QImage::Format_RGBX16FPx4:
255 case QImage::Format_RGBX32FPx4:
256 case QImage::Format_Grayscale8:
257 case QImage::Format_Grayscale16:
258 case QImage::Format_CMYK8888:
260 case QImage::Format_Mono:
261 case QImage::Format_MonoLSB:
262 case QImage::Format_Indexed8:
263 case QImage::Format_Alpha8:
264 case QImage::Format_Invalid:
265 case QImage::NImageFormats:
268 return QImage::Format_RGB32;
274 case QImage::Format_RGB32:
275 case QImage::Format_ARGB32:
276 return QImage::Format_ARGB32_Premultiplied;
277 case QImage::Format_RGB16:
278 return QImage::Format_ARGB8565_Premultiplied;
279 case QImage::Format_RGB555:
280 return QImage::Format_ARGB8555_Premultiplied;
281 case QImage::Format_RGB666:
282 return QImage::Format_ARGB6666_Premultiplied;
283 case QImage::Format_RGB444:
284 return QImage::Format_ARGB4444_Premultiplied;
285 case QImage::Format_RGBX8888:
286 case QImage::Format_RGBA8888:
287 return QImage::Format_RGBA8888_Premultiplied;
288 case QImage::Format_BGR30:
289 return QImage::Format_A2BGR30_Premultiplied;
290 case QImage::Format_RGB30:
291 return QImage::Format_A2RGB30_Premultiplied;
292 case QImage::Format_RGBX64:
293 case QImage::Format_RGBA64:
294 case QImage::Format_Grayscale16:
295 return QImage::Format_RGBA64_Premultiplied;
296 case QImage::Format_RGBX16FPx4:
297 case QImage::Format_RGBA16FPx4:
298 return QImage::Format_RGBA16FPx4_Premultiplied;
299 case QImage::Format_RGBX32FPx4:
300 case QImage::Format_RGBA32FPx4:
301 return QImage::Format_RGBA32FPx4_Premultiplied;
302 case QImage::Format_ARGB32_Premultiplied:
303 case QImage::Format_ARGB8565_Premultiplied:
304 case QImage::Format_ARGB8555_Premultiplied:
305 case QImage::Format_ARGB6666_Premultiplied:
306 case QImage::Format_ARGB4444_Premultiplied:
307 case QImage::Format_RGBA8888_Premultiplied:
308 case QImage::Format_A2BGR30_Premultiplied:
309 case QImage::Format_A2RGB30_Premultiplied:
310 case QImage::Format_RGBA64_Premultiplied:
311 case QImage::Format_RGBA16FPx4_Premultiplied:
312 case QImage::Format_RGBA32FPx4_Premultiplied:
314 case QImage::Format_Mono:
315 case QImage::Format_MonoLSB:
316 case QImage::Format_Indexed8:
317 case QImage::Format_RGB888:
318 case QImage::Format_BGR888:
319 case QImage::Format_Alpha8:
320 case QImage::Format_Grayscale8:
321 case QImage::Format_Invalid:
322 case QImage::Format_CMYK8888:
323 case QImage::NImageFormats:
326 return QImage::Format_ARGB32_Premultiplied;
333 case QImage::Format_ARGB6666_Premultiplied:
334 return QImage::Format_RGB666;
335 case QImage::Format_ARGB4444_Premultiplied:
336 return QImage::Format_RGB444;
337 case QImage::Format_RGBA8888:
338 case QImage::Format_RGBA8888_Premultiplied:
339 return QImage::Format_RGBX8888;
340 case QImage::Format_A2BGR30_Premultiplied:
341 return QImage::Format_BGR30;
342 case QImage::Format_A2RGB30_Premultiplied:
343 return QImage::Format_RGB30;
344 case QImage::Format_RGBA64:
345 case QImage::Format_RGBA64_Premultiplied:
346 return QImage::Format_RGBX64;
347 case QImage::Format_RGBA16FPx4:
348 case QImage::Format_RGBA16FPx4_Premultiplied:
349 return QImage::Format_RGBX16FPx4;
350 case QImage::Format_RGBA32FPx4:
351 case QImage::Format_RGBA32FPx4_Premultiplied:
352 return QImage::Format_RGBX32FPx4;
353 case QImage::Format_ARGB32_Premultiplied:
354 case QImage::Format_ARGB32:
355 return QImage::Format_RGB32;
356 case QImage::Format_RGB16:
357 case QImage::Format_RGB32:
358 case QImage::Format_RGB444:
359 case QImage::Format_RGB555:
360 case QImage::Format_RGB666:
361 case QImage::Format_RGB888:
362 case QImage::Format_BGR888:
363 case QImage::Format_RGBX8888:
364 case QImage::Format_BGR30:
365 case QImage::Format_RGB30:
366 case QImage::Format_RGBX64:
367 case QImage::Format_RGBX16FPx4:
368 case QImage::Format_RGBX32FPx4:
369 case QImage::Format_Grayscale8:
370 case QImage::Format_Grayscale16:
371 case QImage::Format_CMYK8888:
373 case QImage::Format_Mono:
374 case QImage::Format_MonoLSB:
375 case QImage::Format_Indexed8:
376 case QImage::Format_ARGB8565_Premultiplied:
377 case QImage::Format_ARGB8555_Premultiplied:
378 case QImage::Format_Alpha8:
379 case QImage::Format_Invalid:
380 case QImage::NImageFormats:
390 return static_cast<QImage::Format>(qToUnderlying(format) - 1);
397 return static_cast<QImage::Format>(qToUnderlying(format) + 1);
404 case QImage::Format_ARGB32:
405 case QImage::Format_RGBA8888:
407 case QImage::Format_BGR30:
408 case QImage::Format_RGB30:
409 case QImage::Format_A2BGR30_Premultiplied:
410 case QImage::Format_A2RGB30_Premultiplied:
411 case QImage::Format_RGBX64:
412 case QImage::Format_RGBA64:
413 case QImage::Format_RGBA64_Premultiplied:
414 case QImage::Format_Grayscale16:
415 case QImage::Format_RGBX16FPx4:
416 case QImage::Format_RGBA16FPx4:
417 case QImage::Format_RGBA16FPx4_Premultiplied:
418 case QImage::Format_RGBX32FPx4:
419 case QImage::Format_RGBA32FPx4:
420 case QImage::Format_RGBA32FPx4_Premultiplied:
431 case QImage::Format_RGBX16FPx4:
432 case QImage::Format_RGBA16FPx4:
433 case QImage::Format_RGBA16FPx4_Premultiplied:
434 case QImage::Format_RGBX32FPx4:
435 case QImage::Format_RGBA32FPx4:
436 case QImage::Format_RGBA32FPx4_Premultiplied:
447 case QPixelFormat::ColorModel::RGB:
448 case QPixelFormat::ColorModel::BGR:
449 case QPixelFormat::ColorModel::Indexed:
450 return QColorSpace::ColorModel::Rgb;
451 case QPixelFormat::ColorModel::Alpha:
452 return QColorSpace::ColorModel::Undefined;
453 case QPixelFormat::ColorModel::Grayscale:
454 return QColorSpace::ColorModel::Gray;
455 case QPixelFormat::ColorModel::CMYK:
456 return QColorSpace::ColorModel::Cmyk;
460 return QColorSpace::ColorModel::Undefined;
465 QColorSpace::ColorModel dataCs = qt_csColorData(data);
467 if (data == QPixelFormat::ColorModel::Alpha)
470 if (cs == QColorSpace::ColorModel::Undefined || dataCs == QColorSpace::ColorModel::Undefined)
473 return (dataCs == cs);
478 if (qt_compatibleColorModelBase(data, cs))
481 if (data == QPixelFormat::ColorModel::Grayscale && cs == QColorSpace::ColorModel::Rgb)
489 if (qt_compatibleColorModelBase(data, cs))
492 if (data == QPixelFormat::ColorModel::Grayscale && tm == QColorSpace::TransformModel::ThreeComponentMatrix)
501 case QImage::Format_RGB32:
502 return QImage::Format_ARGB32_Premultiplied;
503 case QImage::Format_RGB666:
504 return QImage::Format_ARGB6666_Premultiplied;
505 case QImage::Format_RGB444:
506 return QImage::Format_ARGB4444_Premultiplied;
507 case QImage::Format_RGBX8888:
508 return QImage::Format_RGBA8888_Premultiplied;
509 case QImage::Format_BGR30:
510 return QImage::Format_A2BGR30_Premultiplied;
511 case QImage::Format_RGB30:
512 return QImage::Format_A2RGB30_Premultiplied;
513 case QImage::Format_RGBX64:
514 return QImage::Format_RGBA64_Premultiplied;
515 case QImage::Format_RGBX16FPx4:
516 return QImage::Format_RGBA16FPx4_Premultiplied;
517 case QImage::Format_RGBX32FPx4:
518 return QImage::Format_RGBA32FPx4_Premultiplied;
519 case QImage::Format_ARGB32:
520 case QImage::Format_ARGB32_Premultiplied:
521 case QImage::Format_ARGB8565_Premultiplied:
522 case QImage::Format_ARGB8555_Premultiplied:
523 case QImage::Format_ARGB6666_Premultiplied:
524 case QImage::Format_ARGB4444_Premultiplied:
525 case QImage::Format_RGBA8888:
526 case QImage::Format_RGBA8888_Premultiplied:
527 case QImage::Format_A2BGR30_Premultiplied:
528 case QImage::Format_A2RGB30_Premultiplied:
529 case QImage::Format_Alpha8:
530 case QImage::Format_RGBA64:
531 case QImage::Format_RGBA64_Premultiplied:
532 case QImage::Format_RGBA16FPx4:
533 case QImage::Format_RGBA16FPx4_Premultiplied:
534 case QImage::Format_RGBA32FPx4:
535 case QImage::Format_RGBA32FPx4_Premultiplied:
537 case QImage::Format_Mono:
538 case QImage::Format_MonoLSB:
539 case QImage::Format_Indexed8:
540 case QImage::Format_RGB16:
541 case QImage::Format_RGB555:
542 case QImage::Format_RGB888:
543 case QImage::Format_BGR888:
544 case QImage::Format_Grayscale8:
545 case QImage::Format_Grayscale16:
546 case QImage::Format_CMYK8888:
547 case QImage::Format_Invalid:
548 case QImage::NImageFormats:
556 QImage::Format toFormat = qt_opaqueVersion(format);
558 if (qt_depthForFormat(format) != qt_depthForFormat(toFormat) && qt_depthForFormat(toFormat) <= 32)
559 toFormat = QImage::Format_RGB32;
565 QImage::Format toFormat = qt_alphaVersion(format);
566#if defined(__ARM_NEON__) || defined(__SSE2__
) || defined(QT_COMPILER_SUPPORT_LSX)
568 if (qt_depthForFormat(format) != qt_depthForFormat(toFormat) && qt_depthForFormat(toFormat) <= 32)
569 toFormat = QImage::Format_ARGB32_Premultiplied;
574Q_GUI_EXPORT QMap<QString, QString> qt_getImageText(
const QImage &image,
const QString &description);
575Q_GUI_EXPORT QMap<QString, QString> qt_getImageTextFromDescription(
const QString &description);
577Q_GUI_EXPORT
bool qt_xForm_helper(
const QTransform &trueMat,
int xoffset,
int type,
int depth,
578 uchar *dptr, qsizetype dbpl,
int p_inc,
int dHeight,
579 const uchar *sptr, qsizetype sbpl,
int sWidth,
int sHeight);
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)
QImage::Format qt_alphaVersion(QImage::Format format)
bool qt_compatibleColorModelTarget(QPixelFormat::ColorModel data, QColorSpace::ColorModel cs, QColorSpace::TransformModel tm)
void(*) Image_Converter(QImageData *dest, const QImageData *src, Qt::ImageConversionFlags)
Q_GUI_EXPORT bool qt_xForm_helper(const QTransform &trueMat, int xoffset, int type, int depth, uchar *dptr, qsizetype dbpl, int p_inc, int dHeight, const uchar *sptr, qsizetype sbpl, int sWidth, int sHeight)
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)
bool(*) InPlace_Image_Converter(QImageData *data, Qt::ImageConversionFlags)
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)
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,...)
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 bool isWithinIOAllocationLimit(int width, int height, QImage::Format format, const char *context=nullptr)
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