45
46
47
48
49
50
51
52
53
54 0, 128, 64, 192, 32, 160, 96, 224, 16, 144, 80, 208, 48, 176, 112, 240,
55 8, 136, 72, 200, 40, 168, 104, 232, 24, 152, 88, 216, 56, 184, 120, 248,
56 4, 132, 68, 196, 36, 164, 100, 228, 20, 148, 84, 212, 52, 180, 116, 244,
57 12, 140, 76, 204, 44, 172, 108, 236, 28, 156, 92, 220, 60, 188, 124, 252,
58 2, 130, 66, 194, 34, 162, 98, 226, 18, 146, 82, 210, 50, 178, 114, 242,
59 10, 138, 74, 202, 42, 170, 106, 234, 26, 154, 90, 218, 58, 186, 122, 250,
60 6, 134, 70, 198, 38, 166, 102, 230, 22, 150, 86, 214, 54, 182, 118, 246,
61 14, 142, 78, 206, 46, 174, 110, 238, 30, 158, 94, 222, 62, 190, 126, 254,
62 1, 129, 65, 193, 33, 161, 97, 225, 17, 145, 81, 209, 49, 177, 113, 241,
63 9, 137, 73, 201, 41, 169, 105, 233, 25, 153, 89, 217, 57, 185, 121, 249,
64 5, 133, 69, 197, 37, 165, 101, 229, 21, 149, 85, 213, 53, 181, 117, 245,
65 13, 141, 77, 205, 45, 173, 109, 237, 29, 157, 93, 221, 61, 189, 125, 253,
66 3, 131, 67, 195, 35, 163, 99, 227, 19, 147, 83, 211, 51, 179, 115, 243,
67 11, 139, 75, 203, 43, 171, 107, 235, 27, 155, 91, 219, 59, 187, 123, 251,
68 7, 135, 71, 199, 39, 167, 103, 231, 23, 151, 87, 215, 55, 183, 119, 247,
69 15, 143, 79, 207, 47, 175, 111, 239, 31, 159, 95, 223, 63, 191, 127, 255
347 Q_ASSERT(dst_format > QImage::Format_Indexed8);
348 Q_ASSERT(dst_format < QImage::NImageFormats);
349 Q_ASSERT(data->format > QImage::Format_Indexed8);
350 const int destDepth = qt_depthForFormat(dst_format);
351 if (data->depth < destDepth)
354 const QPixelLayout *srcLayout = &qPixelLayouts[data->format];
355 const QPixelLayout *destLayout = &qPixelLayouts[dst_format];
359 Q_ASSERT(!qt_highColorPrecision(data->format, !destLayout->hasAlphaChannel)
360 || !qt_highColorPrecision(dst_format, !srcLayout->hasAlphaChannel));
362 QImageData::ImageSizeParameters params = { data->bytes_per_line, data->nbytes };
363 if (data->depth != destDepth) {
364 params = QImageData::calculateImageParameters(data->width, data->height, destDepth);
365 if (!params.isValid())
369 Q_ASSERT(destLayout->bpp < QPixelLayout::BPP64);
370 FetchAndConvertPixelsFunc fetch = srcLayout->fetchToARGB32PM;
371 ConvertAndStorePixelsFunc store = destLayout->storeFromARGB32PM;
372 if (!srcLayout->hasAlphaChannel && destLayout->storeFromRGB32) {
374 store = destLayout->storeFromRGB32;
376 if (data->format == QImage::Format_RGB32)
377 fetch = fetchRGB32ToARGB32PM;
378 if (dst_format == QImage::Format_RGB32) {
379#ifdef QT_COMPILER_SUPPORTS_SSE4_1
380 if (qCpuHasFeature(SSE4_1))
381 store = storeRGB32FromARGB32PM_sse4;
383 store = storeRGB32FromARGB32PM;
384#elif defined QT_COMPILER_SUPPORTS_LSX
385 if (qCpuHasFeature(LSX))
386 store = storeRGB32FromARGB32PM_lsx;
388 store = storeRGB32FromARGB32PM;
389#elif defined(__ARM_NEON__) && (Q_BYTE_ORDER == Q_LITTLE_ENDIAN)
390 store = storeRGB32FromARGB32PM_neon;
392 store = storeRGB32FromARGB32PM;
396 if (srcLayout->hasAlphaChannel && !srcLayout->premultiplied &&
397 !destLayout->hasAlphaChannel && destLayout->storeFromRGB32) {
399 fetch = qPixelLayouts[qt_toPremultipliedFormat(data->format)].fetchToARGB32PM;
400 if (dst_format == QImage::Format_RGB32)
401 store = storeRGB32FromARGB32;
403 store = destLayout->storeFromRGB32;
406 auto convertSegment = [=](
int yStart,
int yEnd) {
407 Q_DECL_UNINITIALIZED uint buf[BufferSize];
409 uchar *srcData = data->data + data->bytes_per_line * yStart;
410 uchar *destData = srcData;
412 QDitherInfo *ditherPtr =
nullptr;
413 if ((flags & Qt::PreferDither) && (flags & Qt::Dither_Mask) != Qt::ThresholdDither)
415 for (
int y = yStart; y < yEnd; ++y) {
418 while (x < data->width) {
420 int l = data->width - x;
421 if (srcLayout->bpp == QPixelLayout::BPP32)
422 buffer =
reinterpret_cast<uint *>(srcData) + x;
424 l = qMin(l, BufferSize);
425 const uint *ptr = fetch(buffer, srcData, x, l,
nullptr, ditherPtr);
426 store(destData, ptr, x, l,
nullptr, ditherPtr);
429 srcData += data->bytes_per_line;
430 destData += params.bytesPerLine;
433#if QT_CONFIG(qtgui_threadpool)
434 int segments = (qsizetype(data->width) * data->height) >> 16;
435 segments = std::min(segments, data->height);
436 QThreadPool *threadPool = QGuiApplicationPrivate::qtGuiThreadPool();
437 if (segments > 1 && threadPool && !threadPool->contains(QThread::currentThread())) {
438 QLatch latch(segments);
440 for (
int i = 0; i < segments; ++i) {
441 int yn = (data->height - y) / (segments - i);
442 threadPool->start([&, y, yn]() {
443 convertSegment(y, y + yn);
449 if (data->bytes_per_line != params.bytesPerLine) {
452 for (
int i = 0; i < segments; ++i) {
453 int yn = (data->height - y) / (segments - i);
454 uchar *srcData = data->data + data->bytes_per_line * y;
455 uchar *destData = data->data + params.bytesPerLine * y;
456 if (srcData != destData)
457 memmove(destData, srcData, params.bytesPerLine * yn);
463 convertSegment(0, data->height);
464 if (params.totalSize != data->nbytes) {
465 Q_ASSERT(params.totalSize < data->nbytes);
466 void *newData = realloc(data->data, params.totalSize);
468 data->data = (uchar *)newData;
469 data->nbytes = params.totalSize;
471 data->bytes_per_line = params.bytesPerLine;
473 data->depth = destDepth;
474 data->format = dst_format;
480 Q_ASSERT(data->format > QImage::Format_Indexed8);
481 Q_ASSERT(dst_format > QImage::Format_Indexed8);
482 Q_ASSERT(dst_format < QImage::NImageFormats);
483 const int destDepth = qt_depthForFormat(dst_format);
484 if (data->depth < destDepth)
487 const QPixelLayout *srcLayout = &qPixelLayouts[data->format];
488 const QPixelLayout *destLayout = &qPixelLayouts[dst_format];
490 QImageData::ImageSizeParameters params = { data->bytes_per_line, data->nbytes };
491 if (data->depth != destDepth) {
492 params = QImageData::calculateImageParameters(data->width, data->height, destDepth);
493 if (!params.isValid())
497 FetchAndConvertPixelsFunc64 fetch = srcLayout->fetchToRGBA64PM;
498 ConvertAndStorePixelsFunc64 store = qStoreFromRGBA64PM[dst_format];
499 if (srcLayout->hasAlphaChannel && !srcLayout->premultiplied &&
500 destLayout->hasAlphaChannel && !destLayout->premultiplied) {
502 fetch = qPixelLayouts[qt_toPremultipliedFormat(data->format)].fetchToRGBA64PM;
503 store = qStoreFromRGBA64PM[qt_toPremultipliedFormat(dst_format)];
506 auto convertSegment = [=](
int yStart,
int yEnd) {
507 Q_DECL_UNINITIALIZED QRgba64 buf[BufferSize];
508 QRgba64 *buffer = buf;
509 uchar *srcData = data->data + yStart * data->bytes_per_line;
510 uchar *destData = srcData;
511 for (
int y = yStart; y < yEnd; ++y) {
513 while (x < data->width) {
514 int l = data->width - x;
515 if (srcLayout->bpp == QPixelLayout::BPP64)
516 buffer =
reinterpret_cast<QRgba64 *>(srcData) + x;
518 l = qMin(l, BufferSize);
519 const QRgba64 *ptr = fetch(buffer, srcData, x, l,
nullptr,
nullptr);
520 store(destData, ptr, x, l,
nullptr,
nullptr);
523 srcData += data->bytes_per_line;
524 destData += params.bytesPerLine;
527#if QT_CONFIG(qtgui_threadpool)
528 int segments = (qsizetype(data->width) * data->height) >> 16;
529 segments = std::min(segments, data->height);
530 QThreadPool *threadPool = QGuiApplicationPrivate::qtGuiThreadPool();
531 if (segments > 1 && threadPool && !threadPool->contains(QThread::currentThread())) {
532 QLatch latch(segments);
534 for (
int i = 0; i < segments; ++i) {
535 int yn = (data->height - y) / (segments - i);
536 threadPool->start([&, y, yn]() {
537 convertSegment(y, y + yn);
543 if (data->bytes_per_line != params.bytesPerLine) {
546 for (
int i = 0; i < segments; ++i) {
547 int yn = (data->height - y) / (segments - i);
548 uchar *srcData = data->data + data->bytes_per_line * y;
549 uchar *destData = data->data + params.bytesPerLine * y;
550 if (srcData != destData)
551 memmove(destData, srcData, params.bytesPerLine * yn);
557 convertSegment(0, data->height);
558 if (params.totalSize != data->nbytes) {
559 Q_ASSERT(params.totalSize < data->nbytes);
560 void *newData = realloc(data->data, params.totalSize);
562 data->data = (uchar *)newData;
563 data->nbytes = params.totalSize;
565 data->bytes_per_line = params.bytesPerLine;
567 data->depth = destDepth;
568 data->format = dst_format;
1935 Q_ASSERT(src->format == QImage::Format_RGB32 || src->format == QImage::Format_ARGB32);
1936 Q_ASSERT(dst->format == QImage::Format_Indexed8);
1937 Q_ASSERT(src->width == dst->width);
1938 Q_ASSERT(src->height == dst->height);
1940 bool do_quant = (flags & Qt::DitherMode_Mask) == Qt::PreferDither
1941 || src->format == QImage::Format_ARGB32;
1942 uint alpha_mask = src->format == QImage::Format_RGB32 ? 0xff000000 : 0;
1944 const int tablesize = 997;
1948 if (!dst->colortable.isEmpty()) {
1949 QList<QRgb> ctbl = dst->colortable;
1950 dst->colortable.resize(256);
1953 for (
int i = 0; i < dst->colortable.size(); ++i) {
1955 QRgb p = ctbl.at(i) | alpha_mask;
1956 int hash = p % tablesize;
1958 if (table[hash].used) {
1959 if (table[hash].rgb == p) {
1964 if (++hash == tablesize) hash = 0;
1968 Q_ASSERT (pix != 256);
1970 dst->colortable[pix] = p;
1971 table[hash].pix = pix++;
1972 table[hash].rgb = p;
1973 table[hash].used = 1;
1980 if ((flags & Qt::DitherMode_Mask) != Qt::PreferDither) {
1981 dst->colortable.resize(256);
1982 const uchar *src_data = src->data;
1983 uchar *dest_data = dst->data;
1984 for (
int y = 0; y < src->height; y++) {
1985 const QRgb *s = (
const QRgb *)src_data;
1986 uchar *b = dest_data;
1987 for (
int x = 0; x < src->width; ++x) {
1988 QRgb p = s[x] | alpha_mask;
1989 int hash = p % tablesize;
1991 if (table[hash].used) {
1992 if (table[hash].rgb == (p)) {
1997 if (++hash == tablesize) hash = 0;
2008 dst->colortable[pix] = p;
2009 table[hash].pix = pix++;
2010 table[hash].rgb = p;
2011 table[hash].used = 1;
2016 *b++ = table[hash].pix;
2018 src_data += src->bytes_per_line;
2019 dest_data += dst->bytes_per_line;
2022 int numColors = do_quant ? 256 : pix;
2024 dst->colortable.resize(numColors);
2031#define INDEXOF(r,g,b) (((r)*(MAX_G+1
)+(g))*(MAX_B+1
)+(b))
2033 for (
int rc=0; rc<=
MAX_R; rc++)
2034 for (
int gc=0; gc<=
MAX_G; gc++)
2035 for (
int bc=0; bc<=
MAX_B; bc++)
2038 const uchar *src_data = src->data;
2039 uchar *dest_data = dst->data;
2040 if ((flags & Qt::Dither_Mask) == Qt::ThresholdDither) {
2041 for (
int y = 0; y < src->height; y++) {
2042 const QRgb *p = (
const QRgb *)src_data;
2043 const QRgb *end = p + src->width;
2044 uchar *b = dest_data;
2047#define DITHER(p,m) ((uchar) ((p * (m) + 127
) / 255
))
2057 src_data += src->bytes_per_line;
2058 dest_data += dst->bytes_per_line;
2060 }
else if ((flags & Qt::Dither_Mask) == Qt::DiffuseDither) {
2064 QScopedArrayPointer<
int> lineBuffer(
new int[src->width * 9]);
2065 line1[0] = lineBuffer.data();
2066 line2[0] = lineBuffer.data() + src->width;
2067 line1[1] = lineBuffer.data() + src->width * 2;
2068 line2[1] = lineBuffer.data() + src->width * 3;
2069 line1[2] = lineBuffer.data() + src->width * 4;
2070 line2[2] = lineBuffer.data() + src->width * 5;
2071 pv[0] = lineBuffer.data() + src->width * 6;
2072 pv[1] = lineBuffer.data() + src->width * 7;
2073 pv[2] = lineBuffer.data() + src->width * 8;
2075 int endian = (QSysInfo::ByteOrder == QSysInfo::BigEndian);
2076 for (
int y = 0; y < src->height; y++) {
2077 const uchar* q = src_data;
2078 const uchar* q2 = y < src->height - 1 ? q + src->bytes_per_line : src->data;
2079 uchar *b = dest_data;
2080 for (
int chan = 0; chan < 3; chan++) {
2081 int *l1 = (y&1) ? line2[chan] : line1[chan];
2082 int *l2 = (y&1) ? line1[chan] : line2[chan];
2084 for (
int i = 0; i < src->width; i++)
2085 l1[i] = q[i*4+chan+endian];
2087 if (y+1 < src->height) {
2088 for (
int i = 0; i < src->width; i++)
2089 l2[i] = q2[i*4+chan+endian];
2093 for (
int x = 0; x < src->width; x++) {
2094 int pix = qMax(qMin(5, (l1[x] * 5 + 128)/ 255), 0);
2095 int err = l1[x] - pix * 255 / 5;
2099 if (x + 1< src->width) {
2100 l1[x+1] += (err*7)>>4;
2105 l2[x-1]+=(err*3)>>4;
2108 for (
int x = src->width; x-- > 0;) {
2109 int pix = qMax(qMin(5, (l1[x] * 5 + 128)/ 255), 0);
2110 int err = l1[x] - pix * 255 / 5;
2115 l1[x-1] += (err*7)>>4;
2119 if (x + 1 < src->width)
2120 l2[x+1]+=(err*3)>>4;
2125 for (
int x = 0; x < src->width; x++) {
2126 *b++ =
INDEXOF(pv[0][x],pv[1][x],pv[2][x]);
2129 for (
int x = 0; x < src->width; x++) {
2130 *b++ =
INDEXOF(pv[2][x],pv[1][x],pv[0][x]);
2133 src_data += src->bytes_per_line;
2134 dest_data += dst->bytes_per_line;
2137 for (
int y = 0; y < src->height; y++) {
2138 const QRgb *p = (
const QRgb *)src_data;
2139 const QRgb *end = p + src->width;
2140 uchar *b = dest_data;
2144 uint d = qt_bayer_matrix[y & 15][x & 15] << 8;
2146#define DITHER(p, d, m) ((uchar) ((((256
* (m) + (m) + 1
)) * (p) + (d)) >> 16
))
2158 src_data += src->bytes_per_line;
2159 dest_data += dst->bytes_per_line;
2163 if (src->format != QImage::Format_RGB32
2164 && src->format != QImage::Format_RGB16) {
2165 const int trans = 216;
2166 Q_ASSERT(dst->colortable.size() > trans);
2167 dst->colortable[trans] = 0;
2168 QScopedPointer<QImageData> mask(QImageData::create(QSize(src->width, src->height), QImage::Format_Mono));
2169 dither_to_Mono(mask.data(), src, flags,
true);
2170 uchar *dst_data = dst->data;
2171 const uchar *mask_data = mask->data;
2172 for (
int y = 0; y < src->height; y++) {
2173 for (
int x = 0; x < src->width ; x++) {
2174 if (!(mask_data[x>>3] & (0x80 >> (x & 7))))
2175 dst_data[x] = trans;
2177 mask_data += mask->bytes_per_line;
2178 dst_data += dst->bytes_per_line;
2180 dst->has_alpha_clut =
true;
2518 qimage_converter_map[QImage::Format_Mono][QImage::Format_MonoLSB] = swap_bit_order;
2519 qimage_converter_map[QImage::Format_Mono][QImage::Format_Indexed8] = convert_Mono_to_Indexed8;
2520 qimage_converter_map[QImage::Format_Mono][QImage::Format_RGB32] = convert_Mono_to_X32;
2521 qimage_converter_map[QImage::Format_Mono][QImage::Format_ARGB32] = convert_Mono_to_X32;
2522 qimage_converter_map[QImage::Format_Mono][QImage::Format_ARGB32_Premultiplied] = convert_Mono_to_X32;
2524 qimage_converter_map[QImage::Format_MonoLSB][QImage::Format_Mono] = swap_bit_order;
2525 qimage_converter_map[QImage::Format_MonoLSB][QImage::Format_Indexed8] = convert_Mono_to_Indexed8;
2526 qimage_converter_map[QImage::Format_MonoLSB][QImage::Format_RGB32] = convert_Mono_to_X32;
2527 qimage_converter_map[QImage::Format_MonoLSB][QImage::Format_ARGB32] = convert_Mono_to_X32;
2528 qimage_converter_map[QImage::Format_MonoLSB][QImage::Format_ARGB32_Premultiplied] = convert_Mono_to_X32;
2530 qimage_converter_map[QImage::Format_Indexed8][QImage::Format_Mono] = convert_X_to_Mono;
2531 qimage_converter_map[QImage::Format_Indexed8][QImage::Format_MonoLSB] = convert_X_to_Mono;
2532 qimage_converter_map[QImage::Format_Indexed8][QImage::Format_RGB32] = convert_Indexed8_to_X32;
2533 qimage_converter_map[QImage::Format_Indexed8][QImage::Format_ARGB32] = convert_Indexed8_to_X32;
2534 qimage_converter_map[QImage::Format_Indexed8][QImage::Format_ARGB32_Premultiplied] = convert_Indexed8_to_X32;
2536 qimage_converter_map[QImage::Format_Indexed8][QImage::Format_Grayscale8] = convert_Indexed8_to_Grayscale8;
2537 qimage_converter_map[QImage::Format_Indexed8][QImage::Format_Alpha8] = convert_Indexed8_to_Alpha8;
2539 qimage_converter_map[QImage::Format_RGB32][QImage::Format_Mono] = convert_X_to_Mono;
2540 qimage_converter_map[QImage::Format_RGB32][QImage::Format_MonoLSB] = convert_X_to_Mono;
2541 qimage_converter_map[QImage::Format_RGB32][QImage::Format_Indexed8] = convert_RGB_to_Indexed8;
2542 qimage_converter_map[QImage::Format_RGB32][QImage::Format_ARGB32] = mask_alpha_converter;
2543 qimage_converter_map[QImage::Format_RGB32][QImage::Format_ARGB32_Premultiplied] = mask_alpha_converter;
2544 qimage_converter_map[QImage::Format_RGB32][QImage::Format_Grayscale8] = convert_ARGB_to_gray8<
false>;
2545 qimage_converter_map[QImage::Format_RGB32][QImage::Format_Grayscale16] = convert_ARGB_to_gray16<
false>;
2547 qimage_converter_map[QImage::Format_ARGB32][QImage::Format_Mono] = convert_X_to_Mono;
2548 qimage_converter_map[QImage::Format_ARGB32][QImage::Format_MonoLSB] = convert_X_to_Mono;
2549 qimage_converter_map[QImage::Format_ARGB32][QImage::Format_Indexed8] = convert_ARGB_to_Indexed8;
2550 qimage_converter_map[QImage::Format_ARGB32][QImage::Format_RGB32] = mask_alpha_converter;
2551 qimage_converter_map[QImage::Format_ARGB32][QImage::Format_RGBX8888] = convert_ARGB_to_RGBx;
2552 qimage_converter_map[QImage::Format_ARGB32][QImage::Format_RGBA8888] = convert_ARGB_to_RGBA;
2554 qimage_converter_map[QImage::Format_ARGB32][QImage::Format_A2BGR30_Premultiplied] = convert_ARGB_to_A2RGB30<PixelOrderBGR,
false>;
2555 qimage_converter_map[QImage::Format_ARGB32][QImage::Format_A2RGB30_Premultiplied] = convert_ARGB_to_A2RGB30<PixelOrderRGB,
false>;
2556 qimage_converter_map[QImage::Format_ARGB32][QImage::Format_RGBA64] = convert_ARGB32_to_RGBA64<
false>;
2557 qimage_converter_map[QImage::Format_ARGB32][QImage::Format_Grayscale8] = convert_ARGB_to_gray8<
false>;
2558 qimage_converter_map[QImage::Format_ARGB32][QImage::Format_Grayscale16] = convert_ARGB_to_gray16<
false>;
2560 qimage_converter_map[QImage::Format_ARGB32_Premultiplied][QImage::Format_Mono] = convert_ARGB_PM_to_Mono;
2561 qimage_converter_map[QImage::Format_ARGB32_Premultiplied][QImage::Format_MonoLSB] = convert_ARGB_PM_to_Mono;
2562 qimage_converter_map[QImage::Format_ARGB32_Premultiplied][QImage::Format_Indexed8] = convert_ARGB_PM_to_Indexed8;
2563 qimage_converter_map[QImage::Format_ARGB32_Premultiplied][QImage::Format_RGBA8888_Premultiplied] = convert_ARGB_to_RGBA;
2564 qimage_converter_map[QImage::Format_ARGB32_Premultiplied][QImage::Format_Grayscale8] = convert_ARGB_to_gray8<
true>;
2565 qimage_converter_map[QImage::Format_ARGB32_Premultiplied][QImage::Format_Grayscale16] = convert_ARGB_to_gray16<
true>;
2567 qimage_converter_map[QImage::Format_RGB888][QImage::Format_RGB32] = convert_RGB888_to_RGB<
false>;
2568 qimage_converter_map[QImage::Format_RGB888][QImage::Format_ARGB32] = convert_RGB888_to_RGB<
false>;
2569 qimage_converter_map[QImage::Format_RGB888][QImage::Format_ARGB32_Premultiplied] = convert_RGB888_to_RGB<
false>;
2570 qimage_converter_map[QImage::Format_RGB888][QImage::Format_RGBX8888] = convert_RGB888_to_RGB<
true>;
2571 qimage_converter_map[QImage::Format_RGB888][QImage::Format_RGBA8888] = convert_RGB888_to_RGB<
true>;
2572 qimage_converter_map[QImage::Format_RGB888][QImage::Format_RGBA8888_Premultiplied] = convert_RGB888_to_RGB<
true>;
2573 qimage_converter_map[QImage::Format_RGB888][QImage::Format_BGR888] = convert_rgbswap_generic;
2575 qimage_converter_map[QImage::Format_RGBX8888][QImage::Format_RGB32] = convert_RGBA_to_RGB;
2576 qimage_converter_map[QImage::Format_RGBX8888][QImage::Format_ARGB32] = convert_RGBA_to_ARGB;
2577 qimage_converter_map[QImage::Format_RGBX8888][QImage::Format_ARGB32_Premultiplied] = convert_RGBA_to_ARGB;
2578 qimage_converter_map[QImage::Format_RGBX8888][QImage::Format_RGBA8888] = convert_passthrough;
2579 qimage_converter_map[QImage::Format_RGBX8888][QImage::Format_RGBA8888_Premultiplied] = convert_passthrough;
2581 qimage_converter_map[QImage::Format_RGBA8888][QImage::Format_RGB32] = convert_RGBA_to_RGB;
2582 qimage_converter_map[QImage::Format_RGBA8888][QImage::Format_ARGB32] = convert_RGBA_to_ARGB;
2583 qimage_converter_map[QImage::Format_RGBA8888][QImage::Format_RGBX8888] = mask_alpha_converter_RGBx;
2584 qimage_converter_map[QImage::Format_RGBA8888][QImage::Format_A2BGR30_Premultiplied] = convert_ARGB_to_A2RGB30<PixelOrderBGR,
true>;
2585 qimage_converter_map[QImage::Format_RGBA8888][QImage::Format_A2RGB30_Premultiplied] = convert_ARGB_to_A2RGB30<PixelOrderRGB,
true>;
2586 qimage_converter_map[QImage::Format_RGBA8888][QImage::Format_RGBA64] = convert_ARGB32_to_RGBA64<
true>;
2588 qimage_converter_map[QImage::Format_RGBA8888_Premultiplied][QImage::Format_ARGB32_Premultiplied] = convert_RGBA_to_ARGB;
2590 qimage_converter_map[QImage::Format_BGR30][QImage::Format_A2BGR30_Premultiplied] = convert_passthrough;
2591 qimage_converter_map[QImage::Format_BGR30][QImage::Format_RGB30] = convert_rgbswap_generic;
2592 qimage_converter_map[QImage::Format_BGR30][QImage::Format_A2RGB30_Premultiplied] = convert_rgbswap_generic;
2594 qimage_converter_map[QImage::Format_A2BGR30_Premultiplied][QImage::Format_ARGB32] = convert_A2RGB30_PM_to_ARGB<PixelOrderBGR,
false>;
2595 qimage_converter_map[QImage::Format_A2BGR30_Premultiplied][QImage::Format_RGBA8888] = convert_A2RGB30_PM_to_ARGB<PixelOrderBGR,
true>;
2596 qimage_converter_map[QImage::Format_A2BGR30_Premultiplied][QImage::Format_BGR30] = convert_A2RGB30_PM_to_RGB30<
false>;
2597 qimage_converter_map[QImage::Format_A2BGR30_Premultiplied][QImage::Format_RGB30] = convert_A2RGB30_PM_to_RGB30<
true>;
2598 qimage_converter_map[QImage::Format_A2BGR30_Premultiplied][QImage::Format_A2RGB30_Premultiplied] = convert_rgbswap_generic;
2600 qimage_converter_map[QImage::Format_RGB30][QImage::Format_BGR30] = convert_rgbswap_generic;
2601 qimage_converter_map[QImage::Format_RGB30][QImage::Format_A2BGR30_Premultiplied] = convert_rgbswap_generic;
2602 qimage_converter_map[QImage::Format_RGB30][QImage::Format_A2RGB30_Premultiplied] = convert_passthrough;
2604 qimage_converter_map[QImage::Format_A2RGB30_Premultiplied][QImage::Format_ARGB32] = convert_A2RGB30_PM_to_ARGB<PixelOrderRGB,
false>;
2605 qimage_converter_map[QImage::Format_A2RGB30_Premultiplied][QImage::Format_RGBA8888] = convert_A2RGB30_PM_to_ARGB<PixelOrderRGB,
true>;
2606 qimage_converter_map[QImage::Format_A2RGB30_Premultiplied][QImage::Format_BGR30] = convert_A2RGB30_PM_to_RGB30<
true>;
2607 qimage_converter_map[QImage::Format_A2RGB30_Premultiplied][QImage::Format_A2BGR30_Premultiplied] = convert_rgbswap_generic;
2608 qimage_converter_map[QImage::Format_A2RGB30_Premultiplied][QImage::Format_RGB30] = convert_A2RGB30_PM_to_RGB30<
false>;
2610 qimage_converter_map[QImage::Format_Grayscale8][QImage::Format_Indexed8] = convert_Grayscale8_to_Indexed8;
2611 qimage_converter_map[QImage::Format_Alpha8][QImage::Format_Indexed8] = convert_Alpha8_to_Indexed8;
2613 qimage_converter_map[QImage::Format_RGBX64][QImage::Format_RGBA64] = convert_passthrough;
2614 qimage_converter_map[QImage::Format_RGBX64][QImage::Format_RGBA64_Premultiplied] = convert_passthrough;
2615 qimage_converter_map[QImage::Format_RGBX64][QImage::Format_Grayscale8] = convert_RGBA64_to_gray8<
false>;
2616 qimage_converter_map[QImage::Format_RGBX64][QImage::Format_Grayscale16] = convert_RGBA64_to_gray16<
false>;
2618 qimage_converter_map[QImage::Format_RGBA64][QImage::Format_ARGB32] = convert_RGBA64_to_ARGB32<
false>;
2619 qimage_converter_map[QImage::Format_RGBA64][QImage::Format_RGBA8888] = convert_RGBA64_to_ARGB32<
true>;
2620 qimage_converter_map[QImage::Format_RGBA64][QImage::Format_RGBX64] = convert_RGBA64_to_RGBx64;
2621 qimage_converter_map[QImage::Format_RGBA64][QImage::Format_Grayscale8] = convert_RGBA64_to_gray8<
false>;
2622 qimage_converter_map[QImage::Format_RGBA64][QImage::Format_Grayscale16] = convert_RGBA64_to_gray16<
false>;
2624 qimage_converter_map[QImage::Format_RGBA64_Premultiplied][QImage::Format_Grayscale8] = convert_RGBA64_to_gray8<
true>;
2625 qimage_converter_map[QImage::Format_RGBA64_Premultiplied][QImage::Format_Grayscale16] = convert_RGBA64_to_gray16<
true>;
2627 qimage_converter_map[QImage::Format_Grayscale16][QImage::Format_RGBX64] = convert_gray16_to_RGBA64;
2628 qimage_converter_map[QImage::Format_Grayscale16][QImage::Format_RGBA64] = convert_gray16_to_RGBA64;
2629 qimage_converter_map[QImage::Format_Grayscale16][QImage::Format_RGBA64_Premultiplied] = convert_gray16_to_RGBA64;
2631 qimage_converter_map[QImage::Format_BGR888][QImage::Format_RGB888] = convert_rgbswap_generic;
2632#if Q_BYTE_ORDER == Q_LITTLE_ENDIAN
2633 qimage_converter_map[QImage::Format_BGR888][QImage::Format_RGBX8888] = convert_RGB888_to_RGB<
false>;
2634 qimage_converter_map[QImage::Format_BGR888][QImage::Format_RGBA8888] = convert_RGB888_to_RGB<
false>;
2635 qimage_converter_map[QImage::Format_BGR888][QImage::Format_RGBA8888_Premultiplied] = convert_RGB888_to_RGB<
false>;
2638 qimage_converter_map[QImage::Format_RGBX16FPx4][QImage::Format_RGBA16FPx4] = convert_passthrough;
2639 qimage_converter_map[QImage::Format_RGBX16FPx4][QImage::Format_RGBA16FPx4_Premultiplied] = convert_passthrough;
2641 qimage_converter_map[QImage::Format_RGBX32FPx4][QImage::Format_RGBA32FPx4] = convert_passthrough;
2642 qimage_converter_map[QImage::Format_RGBX32FPx4][QImage::Format_RGBA32FPx4_Premultiplied] = convert_passthrough;
2644 qimage_converter_map[QImage::Format_CMYK8888][QImage::Format_CMYK8888] = convert_passthrough;
2645 qimage_converter_map[QImage::Format_RGB32][QImage::Format_CMYK8888] = convert_ARGB32_to_CMYK8888<
false>;
2646 qimage_converter_map[QImage::Format_ARGB32][QImage::Format_CMYK8888] = convert_ARGB32_to_CMYK8888<
false>;
2647 qimage_converter_map[QImage::Format_ARGB32_Premultiplied][QImage::Format_CMYK8888] = convert_ARGB32_to_CMYK8888<
true>;
2650 qimage_inplace_converter_map[QImage::Format_Indexed8][QImage::Format_Grayscale8] =
2651 convert_Indexed8_to_Grayscale8_inplace;
2652 qimage_inplace_converter_map[QImage::Format_Indexed8][QImage::Format_Alpha8] =
2653 convert_Indexed8_to_Alpha8_inplace;
2655 qimage_inplace_converter_map[QImage::Format_RGB32][QImage::Format_ARGB32] =
2656 mask_alpha_converter_inplace<QImage::Format_ARGB32>;
2657 qimage_inplace_converter_map[QImage::Format_RGB32][QImage::Format_ARGB32_Premultiplied] =
2658 mask_alpha_converter_inplace<QImage::Format_ARGB32_Premultiplied>;
2660 qimage_inplace_converter_map[QImage::Format_ARGB32][QImage::Format_RGB32] =
2661 mask_alpha_converter_inplace<QImage::Format_RGB32>;
2662 qimage_inplace_converter_map[QImage::Format_ARGB32][QImage::Format_RGBX8888] =
2663 convert_ARGB_to_RGBA_inplace<QImage::Format_RGBX8888>;
2664 qimage_inplace_converter_map[QImage::Format_ARGB32][QImage::Format_RGBA8888] =
2665 convert_ARGB_to_RGBA_inplace<QImage::Format_RGBA8888>;
2666 qimage_inplace_converter_map[QImage::Format_ARGB32][QImage::Format_A2BGR30_Premultiplied] =
2667 convert_ARGB_to_A2RGB30_inplace<PixelOrderBGR,
false>;
2668 qimage_inplace_converter_map[QImage::Format_ARGB32][QImage::Format_A2RGB30_Premultiplied] =
2669 convert_ARGB_to_A2RGB30_inplace<PixelOrderRGB,
false>;
2671 qimage_inplace_converter_map[QImage::Format_ARGB32_Premultiplied][QImage::Format_RGBA8888_Premultiplied] =
2672 convert_ARGB_to_RGBA_inplace<QImage::Format_RGBA8888_Premultiplied>;
2674 qimage_inplace_converter_map[QImage::Format_RGB888][QImage::Format_BGR888] =
2675 convert_rgbswap_generic_inplace;
2677 qimage_inplace_converter_map[QImage::Format_RGBX8888][QImage::Format_RGB32] =
2678 convert_RGBA_to_ARGB_inplace<QImage::Format_RGB32>;
2679 qimage_inplace_converter_map[QImage::Format_RGBX8888][QImage::Format_ARGB32] =
2680 convert_RGBA_to_ARGB_inplace<QImage::Format_ARGB32>;
2681 qimage_inplace_converter_map[QImage::Format_RGBX8888][QImage::Format_ARGB32_Premultiplied] =
2682 convert_RGBA_to_ARGB_inplace<QImage::Format_ARGB32_Premultiplied>;
2683 qimage_inplace_converter_map[QImage::Format_RGBX8888][QImage::Format_RGBA8888] =
2684 convert_passthrough_inplace<QImage::Format_RGBA8888>;
2685 qimage_inplace_converter_map[QImage::Format_RGBX8888][QImage::Format_RGBA8888_Premultiplied] =
2686 convert_passthrough_inplace<QImage::Format_RGBA8888_Premultiplied>;
2688 qimage_inplace_converter_map[QImage::Format_RGBA8888][QImage::Format_RGB32] =
2689 convert_RGBA_to_ARGB_inplace<QImage::Format_RGB32>;
2690 qimage_inplace_converter_map[QImage::Format_RGBA8888][QImage::Format_ARGB32] =
2691 convert_RGBA_to_ARGB_inplace<QImage::Format_ARGB32>;
2692 qimage_inplace_converter_map[QImage::Format_RGBA8888][QImage::Format_RGBX8888] =
2693 mask_alpha_converter_rgbx_inplace;
2694 qimage_inplace_converter_map[QImage::Format_RGBA8888][QImage::Format_A2BGR30_Premultiplied] =
2695 convert_ARGB_to_A2RGB30_inplace<PixelOrderBGR,
true>;
2696 qimage_inplace_converter_map[QImage::Format_RGBA8888][QImage::Format_A2RGB30_Premultiplied] =
2697 convert_ARGB_to_A2RGB30_inplace<PixelOrderRGB,
true>;
2699 qimage_inplace_converter_map[QImage::Format_RGBA8888_Premultiplied][QImage::Format_ARGB32_Premultiplied] =
2700 convert_RGBA_to_ARGB_inplace<QImage::Format_ARGB32_Premultiplied>;
2702 qimage_inplace_converter_map[QImage::Format_BGR30][QImage::Format_A2BGR30_Premultiplied] =
2703 convert_passthrough_inplace<QImage::Format_A2BGR30_Premultiplied>;
2704 qimage_inplace_converter_map[QImage::Format_BGR30][QImage::Format_RGB30] =
2705 convert_rgbswap_generic_inplace;
2706 qimage_inplace_converter_map[QImage::Format_BGR30][QImage::Format_A2RGB30_Premultiplied] =
2707 convert_BGR30_to_A2RGB30_inplace;
2709 qimage_inplace_converter_map[QImage::Format_A2BGR30_Premultiplied][QImage::Format_ARGB32] =
2710 convert_A2RGB30_PM_to_ARGB_inplace<PixelOrderBGR,
false>;
2711 qimage_inplace_converter_map[QImage::Format_A2BGR30_Premultiplied][QImage::Format_RGBA8888] =
2712 convert_A2RGB30_PM_to_ARGB_inplace<PixelOrderBGR,
true>;
2713 qimage_inplace_converter_map[QImage::Format_A2BGR30_Premultiplied][QImage::Format_BGR30] =
2714 convert_A2RGB30_PM_to_RGB30_inplace<
false>;
2715 qimage_inplace_converter_map[QImage::Format_A2BGR30_Premultiplied][QImage::Format_RGB30] =
2716 convert_A2RGB30_PM_to_RGB30_inplace<
true>;
2717 qimage_inplace_converter_map[QImage::Format_A2BGR30_Premultiplied][QImage::Format_A2RGB30_Premultiplied] =
2718 convert_rgbswap_generic_inplace;
2720 qimage_inplace_converter_map[QImage::Format_RGB30][QImage::Format_BGR30] =
2721 convert_rgbswap_generic_inplace;
2722 qimage_inplace_converter_map[QImage::Format_RGB30][QImage::Format_A2BGR30_Premultiplied] =
2723 convert_BGR30_to_A2RGB30_inplace;
2724 qimage_inplace_converter_map[QImage::Format_RGB30][QImage::Format_A2RGB30_Premultiplied] =
2725 convert_passthrough_inplace<QImage::Format_A2RGB30_Premultiplied>;
2727 qimage_inplace_converter_map[QImage::Format_A2RGB30_Premultiplied][QImage::Format_ARGB32] =
2728 convert_A2RGB30_PM_to_ARGB_inplace<PixelOrderRGB,
false>;
2729 qimage_inplace_converter_map[QImage::Format_A2RGB30_Premultiplied][QImage::Format_RGBA8888] =
2730 convert_A2RGB30_PM_to_ARGB_inplace<PixelOrderRGB,
true>;
2731 qimage_inplace_converter_map[QImage::Format_A2RGB30_Premultiplied][QImage::Format_BGR30] =
2732 convert_A2RGB30_PM_to_RGB30_inplace<
true>;
2733 qimage_inplace_converter_map[QImage::Format_A2RGB30_Premultiplied][QImage::Format_A2BGR30_Premultiplied] =
2734 convert_rgbswap_generic_inplace;
2735 qimage_inplace_converter_map[QImage::Format_A2RGB30_Premultiplied][QImage::Format_RGB30] =
2736 convert_A2RGB30_PM_to_RGB30_inplace<
false>;
2738 qimage_inplace_converter_map[QImage::Format_Grayscale8][QImage::Format_Indexed8] =
2739 convert_Grayscale8_to_Indexed8_inplace;
2740 qimage_inplace_converter_map[QImage::Format_Alpha8][QImage::Format_Indexed8] =
2741 convert_Alpha8_to_Indexed8_inplace;
2743 qimage_inplace_converter_map[QImage::Format_RGBX64][QImage::Format_RGBA64] =
2744 convert_passthrough_inplace<QImage::Format_RGBA64>;
2745 qimage_inplace_converter_map[QImage::Format_RGBX64][QImage::Format_RGBA64_Premultiplied] =
2746 convert_passthrough_inplace<QImage::Format_RGBA64_Premultiplied>;
2748 qimage_inplace_converter_map[QImage::Format_RGBA64][QImage::Format_RGBX64] =
2749 convert_RGBA64_to_RGBx64_inplace;
2751 qimage_inplace_converter_map[QImage::Format_BGR888][QImage::Format_RGB888] =
2752 convert_rgbswap_generic_inplace;
2754 qimage_inplace_converter_map[QImage::Format_RGBX16FPx4][QImage::Format_RGBA16FPx4] =
2755 convert_passthrough_inplace<QImage::Format_RGBA16FPx4>;
2756 qimage_inplace_converter_map[QImage::Format_RGBX16FPx4][QImage::Format_RGBA16FPx4_Premultiplied] =
2757 convert_passthrough_inplace<QImage::Format_RGBA16FPx4_Premultiplied>;
2759 qimage_inplace_converter_map[QImage::Format_RGBX32FPx4][QImage::Format_RGBA32FPx4] =
2760 convert_passthrough_inplace<QImage::Format_RGBA32FPx4>;
2761 qimage_inplace_converter_map[QImage::Format_RGBX32FPx4][QImage::Format_RGBA32FPx4_Premultiplied] =
2762 convert_passthrough_inplace<QImage::Format_RGBA32FPx4_Premultiplied>;
2765#if defined(__SSE2__
) && defined(QT_COMPILER_SUPPORTS_SSSE3)
2766 if (qCpuHasFeature(SSSE3)) {
2767 extern void convert_RGB888_to_RGB32_ssse3(QImageData *dest,
const QImageData *src, Qt::ImageConversionFlags);
2768 qimage_converter_map[QImage::Format_RGB888][QImage::Format_RGB32] = convert_RGB888_to_RGB32_ssse3;
2769 qimage_converter_map[QImage::Format_RGB888][QImage::Format_ARGB32] = convert_RGB888_to_RGB32_ssse3;
2770 qimage_converter_map[QImage::Format_RGB888][QImage::Format_ARGB32_Premultiplied] = convert_RGB888_to_RGB32_ssse3;
2771 qimage_converter_map[QImage::Format_BGR888][QImage::Format_RGBX8888] = convert_RGB888_to_RGB32_ssse3;
2772 qimage_converter_map[QImage::Format_BGR888][QImage::Format_RGBA8888] = convert_RGB888_to_RGB32_ssse3;
2773 qimage_converter_map[QImage::Format_BGR888][QImage::Format_RGBA8888_Premultiplied] = convert_RGB888_to_RGB32_ssse3;
2777#if defined(QT_COMPILER_SUPPORTS_LSX)
2778 if (qCpuHasFeature(LSX)) {
2779 extern void convert_RGB888_to_RGB32_lsx(QImageData *dest,
const QImageData *src, Qt::ImageConversionFlags);
2780 qimage_converter_map[QImage::Format_RGB888][QImage::Format_RGB32] = convert_RGB888_to_RGB32_lsx;
2781 qimage_converter_map[QImage::Format_RGB888][QImage::Format_ARGB32] = convert_RGB888_to_RGB32_lsx;
2782 qimage_converter_map[QImage::Format_RGB888][QImage::Format_ARGB32_Premultiplied] = convert_RGB888_to_RGB32_lsx;
2783 qimage_converter_map[QImage::Format_BGR888][QImage::Format_RGBX8888] = convert_RGB888_to_RGB32_lsx;
2784 qimage_converter_map[QImage::Format_BGR888][QImage::Format_RGBA8888] = convert_RGB888_to_RGB32_lsx;
2785 qimage_converter_map[QImage::Format_BGR888][QImage::Format_RGBA8888_Premultiplied] = convert_RGB888_to_RGB32_lsx;
2789#if defined(QT_COMPILER_SUPPORTS_LASX)
2790 if (qCpuHasFeature(LASX)) {
2791 extern void convert_RGB888_to_RGB32_lasx(QImageData *dest,
const QImageData *src, Qt::ImageConversionFlags);
2792 qimage_converter_map[QImage::Format_RGB888][QImage::Format_RGB32] = convert_RGB888_to_RGB32_lasx;
2793 qimage_converter_map[QImage::Format_RGB888][QImage::Format_ARGB32] = convert_RGB888_to_RGB32_lasx;
2794 qimage_converter_map[QImage::Format_RGB888][QImage::Format_ARGB32_Premultiplied] = convert_RGB888_to_RGB32_lasx;
2795 qimage_converter_map[QImage::Format_BGR888][QImage::Format_RGBX8888] = convert_RGB888_to_RGB32_lasx;
2796 qimage_converter_map[QImage::Format_BGR888][QImage::Format_RGBA8888] = convert_RGB888_to_RGB32_lasx;
2797 qimage_converter_map[QImage::Format_BGR888][QImage::Format_RGBA8888_Premultiplied] = convert_RGB888_to_RGB32_lasx;
2801#if defined(__ARM_NEON__)
2802 extern void convert_RGB888_to_RGB32_neon(QImageData *dest,
const QImageData *src, Qt::ImageConversionFlags);
2803 qimage_converter_map[QImage::Format_RGB888][QImage::Format_RGB32] = convert_RGB888_to_RGB32_neon;
2804 qimage_converter_map[QImage::Format_RGB888][QImage::Format_ARGB32] = convert_RGB888_to_RGB32_neon;
2805 qimage_converter_map[QImage::Format_RGB888][QImage::Format_ARGB32_Premultiplied] = convert_RGB888_to_RGB32_neon;
2808#if defined(__MIPS_DSPR2__)
2809 extern bool convert_ARGB_to_ARGB_PM_inplace_mips_dspr2(QImageData *data, Qt::ImageConversionFlags);
2810 qimage_inplace_converter_map[QImage::Format_ARGB32][QImage::Format_ARGB32_Premultiplied] = convert_ARGB_to_ARGB_PM_inplace_mips_dspr2;
2812 extern void convert_RGB888_to_RGB32_mips_dspr2(QImageData *dest,
const QImageData *src, Qt::ImageConversionFlags);
2813 qimage_converter_map[QImage::Format_RGB888][QImage::Format_RGB32] = convert_RGB888_to_RGB32_mips_dspr2;
2814 qimage_converter_map[QImage::Format_RGB888][QImage::Format_ARGB32] = convert_RGB888_to_RGB32_mips_dspr2;
2815 qimage_converter_map[QImage::Format_RGB888][QImage::Format_ARGB32_Premultiplied] = convert_RGB888_to_RGB32_mips_dspr2;