void QRasterPlatformPixmap::createPixmapForImage(QImage &sourceImage, Qt::ImageConversionFlags flags, bool inPlace) { QImage::Format format; if (flags & Qt::NoFormatConversion) format = sourceImage.format(); else if (pixelType() == BitmapType) { format = QImage::Format_MonoLSB; } else { if (sourceImage.depth() == 1) { format = sourceImage.hasAlphaChannel() ? QImage::Format_ARGB32_Premultiplied : QImage::Format_RGB32; } else { QImage::Format opaqueFormat = QNativeImage::systemFormat(); QImage::Format alphaFormat = QImage::Format_ARGB32_Premultiplied; #if !defined(__ARM_NEON__) && !defined(__SSE2__) switch (opaqueFormat) { case QImage::Format_RGB16: alphaFormat = QImage::Format_ARGB8565_Premultiplied; break; default: // We don't care about the others... break; } #endif if (!sourceImage.hasAlphaChannel()) { format = opaqueFormat; } else if ((flags & Qt::NoOpaqueDetection) == 0 && !const_cast<QImage &>(sourceImage).data_ptr()->checkForAlphaPixels()) { format = opaqueFormat; } else { format = alphaFormat; } } } // image has alpha format but is really opaque, so try to do a // more efficient conversion if (format == QImage::Format_RGB32 && (sourceImage.format() == QImage::Format_ARGB32 || sourceImage.format() == QImage::Format_ARGB32_Premultiplied)) { inPlace = inPlace && sourceImage.isDetached(); image = sourceImage; if (!inPlace) image.detach(); if (image.d) image.d->format = QImage::Format_RGB32; } else if (inPlace && sourceImage.d->convertInPlace(format, flags)) { image = sourceImage; } else { image = sourceImage.convertToFormat(format); } if (image.d) { w = image.d->width; h = image.d->height; d = image.d->depth; } else { w = h = d = 0; } is_null = (w <= 0 || h <= 0); if (image.d) image.d->devicePixelRatio = sourceImage.devicePixelRatio(); //ensure the pixmap and the image resulting from toImage() have the same cacheKey(); setSerialNumber(image.cacheKey() >> 32); if (image.d) setDetachNumber(image.d->detach_no); }