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/qloggingcategory.h>
24#include <QtCore/qmap.h>
25#include <QtCore/qttypetraits.h>
30Q_DECLARE_LOGGING_CATEGORY(lcImageIo)
38 static QImageData *
create(uchar *data,
int w,
int h, qsizetype bpl, QImage::Format format,
bool readOnly, QImageCleanupFunction cleanupFunction =
nullptr,
void *cleanupInfo =
nullptr);
41 static const QImageData *
get(
const QImage &img)
noexcept {
return img.d; }
77 bool doImageIO(
const QImage *image, QImageWriter* io,
int quality)
const;
86 bool isValid()
const {
return bytesPerLine > 0 && totalSize > 0; }
91inline QImageData::ImageSizeParameters
92QImageData::calculateImageParameters(qsizetype width, qsizetype height, qsizetype depth)
94 ImageSizeParameters invalid = { -1, -1 };
99 qsizetype bytes_per_line;
100 if (qMulOverflow(width, depth, &bytes_per_line))
102 if (qAddOverflow(bytes_per_line, qsizetype(31), &bytes_per_line))
105 bytes_per_line = (bytes_per_line >> 5) << 2;
107 qsizetype total_size;
108 if (qMulOverflow(height, bytes_per_line, &total_size))
111 if (qMulOverflow(height, qsizetype(
sizeof(uchar *)), &dummy))
114 if (width > (INT_MAX - 31) / depth)
117 return { bytes_per_line, total_size };
126void convert_generic(QImageData *dest,
const QImageData *src, Qt::ImageConversionFlags);
130#if QT_CONFIG(raster_fp)
131void convert_generic_over_rgba32f(QImageData *dest,
const QImageData *src, Qt::ImageConversionFlags);
132bool convert_generic_inplace_over_rgba32f(QImageData *data, QImage::Format dst_format, Qt::ImageConversionFlags);
135void dither_to_Mono(QImageData *dst,
const QImageData *src, Qt::ImageConversionFlags flags,
bool fromalpha);
140#if defined(_M_ARM) && defined(_MSC_VER)
141#pragma optimize("", off)
147 case QImage::Format_Invalid:
148 case QImage::NImageFormats:
150 case QImage::Format_Mono:
151 case QImage::Format_MonoLSB:
154 case QImage::Format_Indexed8:
155 case QImage::Format_Alpha8:
156 case QImage::Format_Grayscale8:
159 case QImage::Format_RGB32:
160 case QImage::Format_ARGB32:
161 case QImage::Format_ARGB32_Premultiplied:
162 case QImage::Format_RGBX8888:
163 case QImage::Format_RGBA8888:
164 case QImage::Format_RGBA8888_Premultiplied:
165 case QImage::Format_BGR30:
166 case QImage::Format_A2BGR30_Premultiplied:
167 case QImage::Format_RGB30:
168 case QImage::Format_A2RGB30_Premultiplied:
171 case QImage::Format_RGB555:
172 case QImage::Format_RGB16:
173 case QImage::Format_RGB444:
174 case QImage::Format_ARGB4444_Premultiplied:
175 case QImage::Format_Grayscale16:
178 case QImage::Format_RGB666:
179 case QImage::Format_ARGB6666_Premultiplied:
180 case QImage::Format_ARGB8565_Premultiplied:
181 case QImage::Format_ARGB8555_Premultiplied:
182 case QImage::Format_RGB888:
183 case QImage::Format_BGR888:
186 case QImage::Format_RGBX64:
187 case QImage::Format_RGBA64:
188 case QImage::Format_RGBA64_Premultiplied:
189 case QImage::Format_RGBX16FPx4:
190 case QImage::Format_RGBA16FPx4:
191 case QImage::Format_RGBA16FPx4_Premultiplied:
194 case QImage::Format_RGBX32FPx4:
195 case QImage::Format_RGBA32FPx4:
196 case QImage::Format_RGBA32FPx4_Premultiplied:
199 case QImage::Format_CMYK8888:
206#if defined(_M_ARM) && defined(_MSC_VER)
207#pragma optimize("", on)
213 case QImage::Format_ARGB8565_Premultiplied:
214 return QImage::Format_RGB16;
215 case QImage::Format_ARGB8555_Premultiplied:
216 return QImage::Format_RGB555;
217 case QImage::Format_ARGB6666_Premultiplied:
218 return QImage::Format_RGB666;
219 case QImage::Format_ARGB4444_Premultiplied:
220 return QImage::Format_RGB444;
221 case QImage::Format_RGBA8888:
222 case QImage::Format_RGBA8888_Premultiplied:
223 return QImage::Format_RGBX8888;
224 case QImage::Format_A2BGR30_Premultiplied:
225 return QImage::Format_BGR30;
226 case QImage::Format_A2RGB30_Premultiplied:
227 return QImage::Format_RGB30;
228 case QImage::Format_RGBA64:
229 case QImage::Format_RGBA64_Premultiplied:
230 return QImage::Format_RGBX64;
231 case QImage::Format_RGBA16FPx4:
232 case QImage::Format_RGBA16FPx4_Premultiplied:
233 return QImage::Format_RGBX16FPx4;
234 case QImage::Format_RGBA32FPx4:
235 case QImage::Format_RGBA32FPx4_Premultiplied:
236 return QImage::Format_RGBX32FPx4;
237 case QImage::Format_ARGB32_Premultiplied:
238 case QImage::Format_ARGB32:
239 return QImage::Format_RGB32;
240 case QImage::Format_RGB16:
241 case QImage::Format_RGB32:
242 case QImage::Format_RGB444:
243 case QImage::Format_RGB555:
244 case QImage::Format_RGB666:
245 case QImage::Format_RGB888:
246 case QImage::Format_BGR888:
247 case QImage::Format_RGBX8888:
248 case QImage::Format_BGR30:
249 case QImage::Format_RGB30:
250 case QImage::Format_RGBX64:
251 case QImage::Format_RGBX16FPx4:
252 case QImage::Format_RGBX32FPx4:
253 case QImage::Format_Grayscale8:
254 case QImage::Format_Grayscale16:
255 case QImage::Format_CMYK8888:
257 case QImage::Format_Mono:
258 case QImage::Format_MonoLSB:
259 case QImage::Format_Indexed8:
260 case QImage::Format_Alpha8:
261 case QImage::Format_Invalid:
262 case QImage::NImageFormats:
265 return QImage::Format_RGB32;
271 case QImage::Format_RGB32:
272 case QImage::Format_ARGB32:
273 return QImage::Format_ARGB32_Premultiplied;
274 case QImage::Format_RGB16:
275 return QImage::Format_ARGB8565_Premultiplied;
276 case QImage::Format_RGB555:
277 return QImage::Format_ARGB8555_Premultiplied;
278 case QImage::Format_RGB666:
279 return QImage::Format_ARGB6666_Premultiplied;
280 case QImage::Format_RGB444:
281 return QImage::Format_ARGB4444_Premultiplied;
282 case QImage::Format_RGBX8888:
283 case QImage::Format_RGBA8888:
284 return QImage::Format_RGBA8888_Premultiplied;
285 case QImage::Format_BGR30:
286 return QImage::Format_A2BGR30_Premultiplied;
287 case QImage::Format_RGB30:
288 return QImage::Format_A2RGB30_Premultiplied;
289 case QImage::Format_RGBX64:
290 case QImage::Format_RGBA64:
291 case QImage::Format_Grayscale16:
292 return QImage::Format_RGBA64_Premultiplied;
293 case QImage::Format_RGBX16FPx4:
294 case QImage::Format_RGBA16FPx4:
295 return QImage::Format_RGBA16FPx4_Premultiplied;
296 case QImage::Format_RGBX32FPx4:
297 case QImage::Format_RGBA32FPx4:
298 return QImage::Format_RGBA32FPx4_Premultiplied;
299 case QImage::Format_ARGB32_Premultiplied:
300 case QImage::Format_ARGB8565_Premultiplied:
301 case QImage::Format_ARGB8555_Premultiplied:
302 case QImage::Format_ARGB6666_Premultiplied:
303 case QImage::Format_ARGB4444_Premultiplied:
304 case QImage::Format_RGBA8888_Premultiplied:
305 case QImage::Format_A2BGR30_Premultiplied:
306 case QImage::Format_A2RGB30_Premultiplied:
307 case QImage::Format_RGBA64_Premultiplied:
308 case QImage::Format_RGBA16FPx4_Premultiplied:
309 case QImage::Format_RGBA32FPx4_Premultiplied:
311 case QImage::Format_Mono:
312 case QImage::Format_MonoLSB:
313 case QImage::Format_Indexed8:
314 case QImage::Format_RGB888:
315 case QImage::Format_BGR888:
316 case QImage::Format_Alpha8:
317 case QImage::Format_Grayscale8:
318 case QImage::Format_Invalid:
319 case QImage::Format_CMYK8888:
320 case QImage::NImageFormats:
323 return QImage::Format_ARGB32_Premultiplied;
330 case QImage::Format_ARGB6666_Premultiplied:
331 return QImage::Format_RGB666;
332 case QImage::Format_ARGB4444_Premultiplied:
333 return QImage::Format_RGB444;
334 case QImage::Format_RGBA8888:
335 case QImage::Format_RGBA8888_Premultiplied:
336 return QImage::Format_RGBX8888;
337 case QImage::Format_A2BGR30_Premultiplied:
338 return QImage::Format_BGR30;
339 case QImage::Format_A2RGB30_Premultiplied:
340 return QImage::Format_RGB30;
341 case QImage::Format_RGBA64:
342 case QImage::Format_RGBA64_Premultiplied:
343 return QImage::Format_RGBX64;
344 case QImage::Format_RGBA16FPx4:
345 case QImage::Format_RGBA16FPx4_Premultiplied:
346 return QImage::Format_RGBX16FPx4;
347 case QImage::Format_RGBA32FPx4:
348 case QImage::Format_RGBA32FPx4_Premultiplied:
349 return QImage::Format_RGBX32FPx4;
350 case QImage::Format_ARGB32_Premultiplied:
351 case QImage::Format_ARGB32:
352 return QImage::Format_RGB32;
353 case QImage::Format_RGB16:
354 case QImage::Format_RGB32:
355 case QImage::Format_RGB444:
356 case QImage::Format_RGB555:
357 case QImage::Format_RGB666:
358 case QImage::Format_RGB888:
359 case QImage::Format_BGR888:
360 case QImage::Format_RGBX8888:
361 case QImage::Format_BGR30:
362 case QImage::Format_RGB30:
363 case QImage::Format_RGBX64:
364 case QImage::Format_RGBX16FPx4:
365 case QImage::Format_RGBX32FPx4:
366 case QImage::Format_Grayscale8:
367 case QImage::Format_Grayscale16:
368 case QImage::Format_CMYK8888:
370 case QImage::Format_Mono:
371 case QImage::Format_MonoLSB:
372 case QImage::Format_Indexed8:
373 case QImage::Format_ARGB8565_Premultiplied:
374 case QImage::Format_ARGB8555_Premultiplied:
375 case QImage::Format_Alpha8:
376 case QImage::Format_Invalid:
377 case QImage::NImageFormats:
387 return static_cast<QImage::Format>(qToUnderlying(format) - 1);
394 return static_cast<QImage::Format>(qToUnderlying(format) + 1);
401 case QImage::Format_ARGB32:
402 case QImage::Format_RGBA8888:
404 case QImage::Format_BGR30:
405 case QImage::Format_RGB30:
406 case QImage::Format_A2BGR30_Premultiplied:
407 case QImage::Format_A2RGB30_Premultiplied:
408 case QImage::Format_RGBX64:
409 case QImage::Format_RGBA64:
410 case QImage::Format_RGBA64_Premultiplied:
411 case QImage::Format_Grayscale16:
412 case QImage::Format_RGBX16FPx4:
413 case QImage::Format_RGBA16FPx4:
414 case QImage::Format_RGBA16FPx4_Premultiplied:
415 case QImage::Format_RGBX32FPx4:
416 case QImage::Format_RGBA32FPx4:
417 case QImage::Format_RGBA32FPx4_Premultiplied:
428 case QImage::Format_RGBX16FPx4:
429 case QImage::Format_RGBA16FPx4:
430 case QImage::Format_RGBA16FPx4_Premultiplied:
431 case QImage::Format_RGBX32FPx4:
432 case QImage::Format_RGBA32FPx4:
433 case QImage::Format_RGBA32FPx4_Premultiplied:
444 case QPixelFormat::ColorModel::RGB:
445 case QPixelFormat::ColorModel::BGR:
446 case QPixelFormat::ColorModel::Indexed:
447 return QColorSpace::ColorModel::Rgb;
448 case QPixelFormat::ColorModel::Alpha:
449 return QColorSpace::ColorModel::Undefined;
450 case QPixelFormat::ColorModel::Grayscale:
451 return QColorSpace::ColorModel::Gray;
452 case QPixelFormat::ColorModel::CMYK:
453 return QColorSpace::ColorModel::Cmyk;
457 return QColorSpace::ColorModel::Undefined;
462 QColorSpace::ColorModel dataCs = qt_csColorData(data);
464 if (data == QPixelFormat::ColorModel::Alpha)
467 if (cs == QColorSpace::ColorModel::Undefined || dataCs == QColorSpace::ColorModel::Undefined)
470 return (dataCs == cs);
475 if (qt_compatibleColorModelBase(data, cs))
478 if (data == QPixelFormat::ColorModel::Grayscale && cs == QColorSpace::ColorModel::Rgb)
486 if (qt_compatibleColorModelBase(data, cs))
489 if (data == QPixelFormat::ColorModel::Grayscale && tm == QColorSpace::TransformModel::ThreeComponentMatrix)
498 case QImage::Format_RGB32:
499 return QImage::Format_ARGB32_Premultiplied;
500 case QImage::Format_RGB666:
501 return QImage::Format_ARGB6666_Premultiplied;
502 case QImage::Format_RGB444:
503 return QImage::Format_ARGB4444_Premultiplied;
504 case QImage::Format_RGBX8888:
505 return QImage::Format_RGBA8888_Premultiplied;
506 case QImage::Format_BGR30:
507 return QImage::Format_A2BGR30_Premultiplied;
508 case QImage::Format_RGB30:
509 return QImage::Format_A2RGB30_Premultiplied;
510 case QImage::Format_RGBX64:
511 return QImage::Format_RGBA64_Premultiplied;
512 case QImage::Format_RGBX16FPx4:
513 return QImage::Format_RGBA16FPx4_Premultiplied;
514 case QImage::Format_RGBX32FPx4:
515 return QImage::Format_RGBA32FPx4_Premultiplied;
516 case QImage::Format_ARGB32:
517 case QImage::Format_ARGB32_Premultiplied:
518 case QImage::Format_ARGB8565_Premultiplied:
519 case QImage::Format_ARGB8555_Premultiplied:
520 case QImage::Format_ARGB6666_Premultiplied:
521 case QImage::Format_ARGB4444_Premultiplied:
522 case QImage::Format_RGBA8888:
523 case QImage::Format_RGBA8888_Premultiplied:
524 case QImage::Format_A2BGR30_Premultiplied:
525 case QImage::Format_A2RGB30_Premultiplied:
526 case QImage::Format_Alpha8:
527 case QImage::Format_RGBA64:
528 case QImage::Format_RGBA64_Premultiplied:
529 case QImage::Format_RGBA16FPx4:
530 case QImage::Format_RGBA16FPx4_Premultiplied:
531 case QImage::Format_RGBA32FPx4:
532 case QImage::Format_RGBA32FPx4_Premultiplied:
534 case QImage::Format_Mono:
535 case QImage::Format_MonoLSB:
536 case QImage::Format_Indexed8:
537 case QImage::Format_RGB16:
538 case QImage::Format_RGB555:
539 case QImage::Format_RGB888:
540 case QImage::Format_BGR888:
541 case QImage::Format_Grayscale8:
542 case QImage::Format_Grayscale16:
543 case QImage::Format_CMYK8888:
544 case QImage::Format_Invalid:
545 case QImage::NImageFormats:
553 QImage::Format toFormat = qt_opaqueVersion(format);
555 if (qt_depthForFormat(format) != qt_depthForFormat(toFormat) && qt_depthForFormat(toFormat) <= 32)
556 toFormat = QImage::Format_RGB32;
562 QImage::Format toFormat = qt_alphaVersion(format);
563#if defined(__ARM_NEON__) || defined(__SSE2__
) || defined(QT_COMPILER_SUPPORT_LSX)
565 if (qt_depthForFormat(format) != qt_depthForFormat(toFormat) && qt_depthForFormat(toFormat) <= 32)
566 toFormat = QImage::Format_ARGB32_Premultiplied;
571Q_GUI_EXPORT QMap<QString, QString> qt_getImageText(
const QImage &image,
const QString &description);
572Q_GUI_EXPORT QMap<QString, QString> qt_getImageTextFromDescription(
const QString &description);
virtual ~QImageIOHandlerPrivate()
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