46
47
48
49
50
51
52
53
54
55 0, 128, 64, 192, 32, 160, 96, 224, 16, 144, 80, 208, 48, 176, 112, 240,
56 8, 136, 72, 200, 40, 168, 104, 232, 24, 152, 88, 216, 56, 184, 120, 248,
57 4, 132, 68, 196, 36, 164, 100, 228, 20, 148, 84, 212, 52, 180, 116, 244,
58 12, 140, 76, 204, 44, 172, 108, 236, 28, 156, 92, 220, 60, 188, 124, 252,
59 2, 130, 66, 194, 34, 162, 98, 226, 18, 146, 82, 210, 50, 178, 114, 242,
60 10, 138, 74, 202, 42, 170, 106, 234, 26, 154, 90, 218, 58, 186, 122, 250,
61 6, 134, 70, 198, 38, 166, 102, 230, 22, 150, 86, 214, 54, 182, 118, 246,
62 14, 142, 78, 206, 46, 174, 110, 238, 30, 158, 94, 222, 62, 190, 126, 254,
63 1, 129, 65, 193, 33, 161, 97, 225, 17, 145, 81, 209, 49, 177, 113, 241,
64 9, 137, 73, 201, 41, 169, 105, 233, 25, 153, 89, 217, 57, 185, 121, 249,
65 5, 133, 69, 197, 37, 165, 101, 229, 21, 149, 85, 213, 53, 181, 117, 245,
66 13, 141, 77, 205, 45, 173, 109, 237, 29, 157, 93, 221, 61, 189, 125, 253,
67 3, 131, 67, 195, 35, 163, 99, 227, 19, 147, 83, 211, 51, 179, 115, 243,
68 11, 139, 75, 203, 43, 171, 107, 235, 27, 155, 91, 219, 59, 187, 123, 251,
69 7, 135, 71, 199, 39, 167, 103, 231, 23, 151, 87, 215, 55, 183, 119, 247,
70 15, 143, 79, 207, 47, 175, 111, 239, 31, 159, 95, 223, 63, 191, 127, 255
348 Q_ASSERT(dst_format > QImage::Format_Indexed8);
349 Q_ASSERT(dst_format < QImage::NImageFormats);
350 Q_ASSERT(data->format > QImage::Format_Indexed8);
351 const int destDepth = qt_depthForFormat(dst_format);
352 if (data->depth < destDepth)
355 const QPixelLayout *srcLayout = &qPixelLayouts[data->format];
356 const QPixelLayout *destLayout = &qPixelLayouts[dst_format];
360 Q_ASSERT(!qt_highColorPrecision(data->format, !destLayout->hasAlphaChannel)
361 || !qt_highColorPrecision(dst_format, !srcLayout->hasAlphaChannel));
363 QImageData::ImageSizeParameters params = { data->bytes_per_line, data->nbytes };
364 if (data->depth != destDepth) {
365 params = QImageData::calculateImageParameters(data->width, data->height, destDepth);
366 if (!params.isValid())
370 Q_ASSERT(destLayout->bpp < QPixelLayout::BPP64);
371 FetchAndConvertPixelsFunc fetch = srcLayout->fetchToARGB32PM;
372 ConvertAndStorePixelsFunc store = destLayout->storeFromARGB32PM;
373 if (!srcLayout->hasAlphaChannel && destLayout->storeFromRGB32) {
375 store = destLayout->storeFromRGB32;
377 if (data->format == QImage::Format_RGB32)
378 fetch = fetchRGB32ToARGB32PM;
379 if (dst_format == QImage::Format_RGB32) {
380#ifdef QT_COMPILER_SUPPORTS_SSE4_1
381 if (qCpuHasFeature(SSE4_1))
382 store = storeRGB32FromARGB32PM_sse4;
384 store = storeRGB32FromARGB32PM;
385#elif defined QT_COMPILER_SUPPORTS_LSX
386 if (qCpuHasFeature(LSX))
387 store = storeRGB32FromARGB32PM_lsx;
389 store = storeRGB32FromARGB32PM;
390#elif defined(__ARM_NEON__) && (Q_BYTE_ORDER == Q_LITTLE_ENDIAN)
391 store = storeRGB32FromARGB32PM_neon;
393 store = storeRGB32FromARGB32PM;
397 if (srcLayout->hasAlphaChannel && !srcLayout->premultiplied &&
398 !destLayout->hasAlphaChannel && destLayout->storeFromRGB32) {
400 fetch = qPixelLayouts[qt_toPremultipliedFormat(data->format)].fetchToARGB32PM;
401 if (dst_format == QImage::Format_RGB32)
402 store = storeRGB32FromARGB32;
404 store = destLayout->storeFromRGB32;
407 auto convertSegment = [=](
int yStart,
int yEnd) {
408 Q_DECL_UNINITIALIZED uint buf[BufferSize];
410 uchar *srcData = data->data + data->bytes_per_line * yStart;
411 uchar *destData = srcData;
413 QDitherInfo *ditherPtr =
nullptr;
414 if ((flags & Qt::PreferDither) && (flags & Qt::Dither_Mask) != Qt::ThresholdDither)
416 for (
int y = yStart; y < yEnd; ++y) {
419 while (x < data->width) {
421 int l = data->width - x;
422 if (srcLayout->bpp == QPixelLayout::BPP32)
423 buffer =
reinterpret_cast<uint *>(srcData) + x;
425 l = qMin(l, BufferSize);
426 const uint *ptr = fetch(buffer, srcData, x, l,
nullptr, ditherPtr);
427 store(destData, ptr, x, l,
nullptr, ditherPtr);
430 srcData += data->bytes_per_line;
431 destData += params.bytesPerLine;
434#if QT_CONFIG(qtgui_threadpool)
435 int segments = (qsizetype(data->width) * data->height) >> 16;
436 segments = std::min(segments, data->height);
437 QThreadPool *threadPool = QGuiApplicationPrivate::qtGuiThreadPool();
438 if (segments > 1 && threadPool && !threadPool->contains(QThread::currentThread())) {
439 QLatch latch(segments);
441 for (
int i = 0; i < segments; ++i) {
442 int yn = (data->height - y) / (segments - i);
443 threadPool->start([&, y, yn]() {
444 convertSegment(y, y + yn);
450 if (data->bytes_per_line != params.bytesPerLine) {
453 for (
int i = 0; i < segments; ++i) {
454 int yn = (data->height - y) / (segments - i);
455 uchar *srcData = data->data + data->bytes_per_line * y;
456 uchar *destData = data->data + params.bytesPerLine * y;
457 if (srcData != destData)
458 memmove(destData, srcData, params.bytesPerLine * yn);
464 convertSegment(0, data->height);
465 if (params.totalSize != data->nbytes) {
466 Q_ASSERT(params.totalSize < data->nbytes);
467 void *newData = realloc(data->data, params.totalSize);
469 data->data = (uchar *)newData;
470 data->nbytes = params.totalSize;
472 data->bytes_per_line = params.bytesPerLine;
474 data->depth = destDepth;
475 data->format = dst_format;
481 Q_ASSERT(data->format > QImage::Format_Indexed8);
482 Q_ASSERT(dst_format > QImage::Format_Indexed8);
483 Q_ASSERT(dst_format < QImage::NImageFormats);
484 const int destDepth = qt_depthForFormat(dst_format);
485 if (data->depth < destDepth)
488 const QPixelLayout *srcLayout = &qPixelLayouts[data->format];
489 const QPixelLayout *destLayout = &qPixelLayouts[dst_format];
491 QImageData::ImageSizeParameters params = { data->bytes_per_line, data->nbytes };
492 if (data->depth != destDepth) {
493 params = QImageData::calculateImageParameters(data->width, data->height, destDepth);
494 if (!params.isValid())
498 FetchAndConvertPixelsFunc64 fetch = srcLayout->fetchToRGBA64PM;
499 ConvertAndStorePixelsFunc64 store = qStoreFromRGBA64PM[dst_format];
500 if (srcLayout->hasAlphaChannel && !srcLayout->premultiplied &&
501 destLayout->hasAlphaChannel && !destLayout->premultiplied) {
503 fetch = qPixelLayouts[qt_toPremultipliedFormat(data->format)].fetchToRGBA64PM;
504 store = qStoreFromRGBA64PM[qt_toPremultipliedFormat(dst_format)];
507 auto convertSegment = [=](
int yStart,
int yEnd) {
508 Q_DECL_UNINITIALIZED QRgba64 buf[BufferSize];
509 QRgba64 *buffer = buf;
510 uchar *srcData = data->data + yStart * data->bytes_per_line;
511 uchar *destData = srcData;
512 for (
int y = yStart; y < yEnd; ++y) {
514 while (x < data->width) {
515 int l = data->width - x;
516 if (srcLayout->bpp == QPixelLayout::BPP64)
517 buffer =
reinterpret_cast<QRgba64 *>(srcData) + x;
519 l = qMin(l, BufferSize);
520 const QRgba64 *ptr = fetch(buffer, srcData, x, l,
nullptr,
nullptr);
521 store(destData, ptr, x, l,
nullptr,
nullptr);
524 srcData += data->bytes_per_line;
525 destData += params.bytesPerLine;
528#if QT_CONFIG(qtgui_threadpool)
529 int segments = (qsizetype(data->width) * data->height) >> 16;
530 segments = std::min(segments, data->height);
531 QThreadPool *threadPool = QGuiApplicationPrivate::qtGuiThreadPool();
532 if (segments > 1 && threadPool && !threadPool->contains(QThread::currentThread())) {
533 QLatch latch(segments);
535 for (
int i = 0; i < segments; ++i) {
536 int yn = (data->height - y) / (segments - i);
537 threadPool->start([&, y, yn]() {
538 convertSegment(y, y + yn);
544 if (data->bytes_per_line != params.bytesPerLine) {
547 for (
int i = 0; i < segments; ++i) {
548 int yn = (data->height - y) / (segments - i);
549 uchar *srcData = data->data + data->bytes_per_line * y;
550 uchar *destData = data->data + params.bytesPerLine * y;
551 if (srcData != destData)
552 memmove(destData, srcData, params.bytesPerLine * yn);
558 convertSegment(0, data->height);
559 if (params.totalSize != data->nbytes) {
560 Q_ASSERT(params.totalSize < data->nbytes);
561 void *newData = realloc(data->data, params.totalSize);
563 data->data = (uchar *)newData;
564 data->nbytes = params.totalSize;
566 data->bytes_per_line = params.bytesPerLine;
568 data->depth = destDepth;
569 data->format = dst_format;
1936 Q_ASSERT(src->format == QImage::Format_RGB32 || src->format == QImage::Format_ARGB32);
1937 Q_ASSERT(dst->format == QImage::Format_Indexed8);
1938 Q_ASSERT(src->width == dst->width);
1939 Q_ASSERT(src->height == dst->height);
1941 bool do_quant = (flags & Qt::DitherMode_Mask) == Qt::PreferDither
1942 || src->format == QImage::Format_ARGB32;
1943 uint alpha_mask = src->format == QImage::Format_RGB32 ? 0xff000000 : 0;
1945 const int tablesize = 997;
1949 if (!dst->colortable.isEmpty()) {
1950 QList<QRgb> ctbl = dst->colortable;
1951 dst->colortable.resize(256);
1954 for (
int i = 0; i < dst->colortable.size(); ++i) {
1956 QRgb p = ctbl.at(i) | alpha_mask;
1957 int hash = p % tablesize;
1959 if (table[hash].used) {
1960 if (table[hash].rgb == p) {
1965 if (++hash == tablesize) hash = 0;
1969 Q_ASSERT (pix != 256);
1971 dst->colortable[pix] = p;
1972 table[hash].pix = pix++;
1973 table[hash].rgb = p;
1974 table[hash].used = 1;
1981 if ((flags & Qt::DitherMode_Mask) != Qt::PreferDither) {
1982 dst->colortable.resize(256);
1983 const uchar *src_data = src->data;
1984 uchar *dest_data = dst->data;
1985 for (
int y = 0; y < src->height; y++) {
1986 const QRgb *s = (
const QRgb *)src_data;
1987 uchar *b = dest_data;
1988 for (
int x = 0; x < src->width; ++x) {
1989 QRgb p = s[x] | alpha_mask;
1990 int hash = p % tablesize;
1992 if (table[hash].used) {
1993 if (table[hash].rgb == (p)) {
1998 if (++hash == tablesize) hash = 0;
2009 dst->colortable[pix] = p;
2010 table[hash].pix = pix++;
2011 table[hash].rgb = p;
2012 table[hash].used = 1;
2017 *b++ = table[hash].pix;
2019 src_data += src->bytes_per_line;
2020 dest_data += dst->bytes_per_line;
2023 int numColors = do_quant ? 256 : pix;
2025 dst->colortable.resize(numColors);
2032#define INDEXOF(r,g,b) (((r)*(MAX_G+1
)+(g))*(MAX_B+1
)+(b))
2034 for (
int rc=0; rc<=
MAX_R; rc++)
2035 for (
int gc=0; gc<=
MAX_G; gc++)
2036 for (
int bc=0; bc<=
MAX_B; bc++)
2039 const uchar *src_data = src->data;
2040 uchar *dest_data = dst->data;
2041 if ((flags & Qt::Dither_Mask) == Qt::ThresholdDither) {
2042 for (
int y = 0; y < src->height; y++) {
2043 const QRgb *p = (
const QRgb *)src_data;
2044 const QRgb *end = p + src->width;
2045 uchar *b = dest_data;
2048#define DITHER(p,m) ((uchar) ((p * (m) + 127
) / 255
))
2058 src_data += src->bytes_per_line;
2059 dest_data += dst->bytes_per_line;
2061 }
else if ((flags & Qt::Dither_Mask) == Qt::DiffuseDither) {
2065 QScopedArrayPointer<
int> lineBuffer(
new int[src->width * 9]);
2066 line1[0] = lineBuffer.data();
2067 line2[0] = lineBuffer.data() + src->width;
2068 line1[1] = lineBuffer.data() + src->width * 2;
2069 line2[1] = lineBuffer.data() + src->width * 3;
2070 line1[2] = lineBuffer.data() + src->width * 4;
2071 line2[2] = lineBuffer.data() + src->width * 5;
2072 pv[0] = lineBuffer.data() + src->width * 6;
2073 pv[1] = lineBuffer.data() + src->width * 7;
2074 pv[2] = lineBuffer.data() + src->width * 8;
2076 int endian = (QSysInfo::ByteOrder == QSysInfo::BigEndian);
2077 for (
int y = 0; y < src->height; y++) {
2078 const uchar* q = src_data;
2079 const uchar* q2 = y < src->height - 1 ? q + src->bytes_per_line : src->data;
2080 uchar *b = dest_data;
2081 for (
int chan = 0; chan < 3; chan++) {
2082 int *l1 = (y&1) ? line2[chan] : line1[chan];
2083 int *l2 = (y&1) ? line1[chan] : line2[chan];
2085 for (
int i = 0; i < src->width; i++)
2086 l1[i] = q[i*4+chan+endian];
2088 if (y+1 < src->height) {
2089 for (
int i = 0; i < src->width; i++)
2090 l2[i] = q2[i*4+chan+endian];
2094 for (
int x = 0; x < src->width; x++) {
2095 int pix = qMax(qMin(5, (l1[x] * 5 + 128)/ 255), 0);
2096 int err = l1[x] - pix * 255 / 5;
2100 if (x + 1< src->width) {
2101 l1[x+1] += (err*7)>>4;
2106 l2[x-1]+=(err*3)>>4;
2109 for (
int x = src->width; x-- > 0;) {
2110 int pix = qMax(qMin(5, (l1[x] * 5 + 128)/ 255), 0);
2111 int err = l1[x] - pix * 255 / 5;
2116 l1[x-1] += (err*7)>>4;
2120 if (x + 1 < src->width)
2121 l2[x+1]+=(err*3)>>4;
2126 for (
int x = 0; x < src->width; x++) {
2127 *b++ =
INDEXOF(pv[0][x],pv[1][x],pv[2][x]);
2130 for (
int x = 0; x < src->width; x++) {
2131 *b++ =
INDEXOF(pv[2][x],pv[1][x],pv[0][x]);
2134 src_data += src->bytes_per_line;
2135 dest_data += dst->bytes_per_line;
2138 for (
int y = 0; y < src->height; y++) {
2139 const QRgb *p = (
const QRgb *)src_data;
2140 const QRgb *end = p + src->width;
2141 uchar *b = dest_data;
2145 uint d = qt_bayer_matrix[y & 15][x & 15] << 8;
2147#define DITHER(p, d, m) ((uchar) ((((256
* (m) + (m) + 1
)) * (p) + (d)) >> 16
))
2159 src_data += src->bytes_per_line;
2160 dest_data += dst->bytes_per_line;
2164 if (src->format != QImage::Format_RGB32
2165 && src->format != QImage::Format_RGB16) {
2166 const int trans = 216;
2167 Q_ASSERT(dst->colortable.size() > trans);
2168 dst->colortable[trans] = 0;
2169 QScopedPointer<QImageData> mask(QImageData::create(QSize(src->width, src->height), QImage::Format_Mono));
2170 dither_to_Mono(mask.data(), src, flags,
true);
2171 uchar *dst_data = dst->data;
2172 const uchar *mask_data = mask->data;
2173 for (
int y = 0; y < src->height; y++) {
2174 for (
int x = 0; x < src->width ; x++) {
2175 if (!(mask_data[x>>3] & (0x80 >> (x & 7))))
2176 dst_data[x] = trans;
2178 mask_data += mask->bytes_per_line;
2179 dst_data += dst->bytes_per_line;
2181 dst->has_alpha_clut =
true;
2519 qimage_converter_map[QImage::Format_Mono][QImage::Format_MonoLSB] = swap_bit_order;
2520 qimage_converter_map[QImage::Format_Mono][QImage::Format_Indexed8] = convert_Mono_to_Indexed8;
2521 qimage_converter_map[QImage::Format_Mono][QImage::Format_RGB32] = convert_Mono_to_X32;
2522 qimage_converter_map[QImage::Format_Mono][QImage::Format_ARGB32] = convert_Mono_to_X32;
2523 qimage_converter_map[QImage::Format_Mono][QImage::Format_ARGB32_Premultiplied] = convert_Mono_to_X32;
2525 qimage_converter_map[QImage::Format_MonoLSB][QImage::Format_Mono] = swap_bit_order;
2526 qimage_converter_map[QImage::Format_MonoLSB][QImage::Format_Indexed8] = convert_Mono_to_Indexed8;
2527 qimage_converter_map[QImage::Format_MonoLSB][QImage::Format_RGB32] = convert_Mono_to_X32;
2528 qimage_converter_map[QImage::Format_MonoLSB][QImage::Format_ARGB32] = convert_Mono_to_X32;
2529 qimage_converter_map[QImage::Format_MonoLSB][QImage::Format_ARGB32_Premultiplied] = convert_Mono_to_X32;
2531 qimage_converter_map[QImage::Format_Indexed8][QImage::Format_Mono] = convert_X_to_Mono;
2532 qimage_converter_map[QImage::Format_Indexed8][QImage::Format_MonoLSB] = convert_X_to_Mono;
2533 qimage_converter_map[QImage::Format_Indexed8][QImage::Format_RGB32] = convert_Indexed8_to_X32;
2534 qimage_converter_map[QImage::Format_Indexed8][QImage::Format_ARGB32] = convert_Indexed8_to_X32;
2535 qimage_converter_map[QImage::Format_Indexed8][QImage::Format_ARGB32_Premultiplied] = convert_Indexed8_to_X32;
2537 qimage_converter_map[QImage::Format_Indexed8][QImage::Format_Grayscale8] = convert_Indexed8_to_Grayscale8;
2538 qimage_converter_map[QImage::Format_Indexed8][QImage::Format_Alpha8] = convert_Indexed8_to_Alpha8;
2540 qimage_converter_map[QImage::Format_RGB32][QImage::Format_Mono] = convert_X_to_Mono;
2541 qimage_converter_map[QImage::Format_RGB32][QImage::Format_MonoLSB] = convert_X_to_Mono;
2542 qimage_converter_map[QImage::Format_RGB32][QImage::Format_Indexed8] = convert_RGB_to_Indexed8;
2543 qimage_converter_map[QImage::Format_RGB32][QImage::Format_ARGB32] = mask_alpha_converter;
2544 qimage_converter_map[QImage::Format_RGB32][QImage::Format_ARGB32_Premultiplied] = mask_alpha_converter;
2545 qimage_converter_map[QImage::Format_RGB32][QImage::Format_Grayscale8] = convert_ARGB_to_gray8<
false>;
2546 qimage_converter_map[QImage::Format_RGB32][QImage::Format_Grayscale16] = convert_ARGB_to_gray16<
false>;
2548 qimage_converter_map[QImage::Format_ARGB32][QImage::Format_Mono] = convert_X_to_Mono;
2549 qimage_converter_map[QImage::Format_ARGB32][QImage::Format_MonoLSB] = convert_X_to_Mono;
2550 qimage_converter_map[QImage::Format_ARGB32][QImage::Format_Indexed8] = convert_ARGB_to_Indexed8;
2551 qimage_converter_map[QImage::Format_ARGB32][QImage::Format_RGB32] = mask_alpha_converter;
2552 qimage_converter_map[QImage::Format_ARGB32][QImage::Format_RGBX8888] = convert_ARGB_to_RGBx;
2553 qimage_converter_map[QImage::Format_ARGB32][QImage::Format_RGBA8888] = convert_ARGB_to_RGBA;
2555 qimage_converter_map[QImage::Format_ARGB32][QImage::Format_A2BGR30_Premultiplied] = convert_ARGB_to_A2RGB30<PixelOrderBGR,
false>;
2556 qimage_converter_map[QImage::Format_ARGB32][QImage::Format_A2RGB30_Premultiplied] = convert_ARGB_to_A2RGB30<PixelOrderRGB,
false>;
2557 qimage_converter_map[QImage::Format_ARGB32][QImage::Format_RGBA64] = convert_ARGB32_to_RGBA64<
false>;
2558 qimage_converter_map[QImage::Format_ARGB32][QImage::Format_Grayscale8] = convert_ARGB_to_gray8<
false>;
2559 qimage_converter_map[QImage::Format_ARGB32][QImage::Format_Grayscale16] = convert_ARGB_to_gray16<
false>;
2561 qimage_converter_map[QImage::Format_ARGB32_Premultiplied][QImage::Format_Mono] = convert_ARGB_PM_to_Mono;
2562 qimage_converter_map[QImage::Format_ARGB32_Premultiplied][QImage::Format_MonoLSB] = convert_ARGB_PM_to_Mono;
2563 qimage_converter_map[QImage::Format_ARGB32_Premultiplied][QImage::Format_Indexed8] = convert_ARGB_PM_to_Indexed8;
2564 qimage_converter_map[QImage::Format_ARGB32_Premultiplied][QImage::Format_RGBA8888_Premultiplied] = convert_ARGB_to_RGBA;
2565 qimage_converter_map[QImage::Format_ARGB32_Premultiplied][QImage::Format_Grayscale8] = convert_ARGB_to_gray8<
true>;
2566 qimage_converter_map[QImage::Format_ARGB32_Premultiplied][QImage::Format_Grayscale16] = convert_ARGB_to_gray16<
true>;
2568 qimage_converter_map[QImage::Format_RGB888][QImage::Format_RGB32] = convert_RGB888_to_RGB<
false>;
2569 qimage_converter_map[QImage::Format_RGB888][QImage::Format_ARGB32] = convert_RGB888_to_RGB<
false>;
2570 qimage_converter_map[QImage::Format_RGB888][QImage::Format_ARGB32_Premultiplied] = convert_RGB888_to_RGB<
false>;
2571 qimage_converter_map[QImage::Format_RGB888][QImage::Format_RGBX8888] = convert_RGB888_to_RGB<
true>;
2572 qimage_converter_map[QImage::Format_RGB888][QImage::Format_RGBA8888] = convert_RGB888_to_RGB<
true>;
2573 qimage_converter_map[QImage::Format_RGB888][QImage::Format_RGBA8888_Premultiplied] = convert_RGB888_to_RGB<
true>;
2574 qimage_converter_map[QImage::Format_RGB888][QImage::Format_BGR888] = convert_rgbswap_generic;
2576 qimage_converter_map[QImage::Format_RGBX8888][QImage::Format_RGB32] = convert_RGBA_to_RGB;
2577 qimage_converter_map[QImage::Format_RGBX8888][QImage::Format_ARGB32] = convert_RGBA_to_ARGB;
2578 qimage_converter_map[QImage::Format_RGBX8888][QImage::Format_ARGB32_Premultiplied] = convert_RGBA_to_ARGB;
2579 qimage_converter_map[QImage::Format_RGBX8888][QImage::Format_RGBA8888] = convert_passthrough;
2580 qimage_converter_map[QImage::Format_RGBX8888][QImage::Format_RGBA8888_Premultiplied] = convert_passthrough;
2582 qimage_converter_map[QImage::Format_RGBA8888][QImage::Format_RGB32] = convert_RGBA_to_RGB;
2583 qimage_converter_map[QImage::Format_RGBA8888][QImage::Format_ARGB32] = convert_RGBA_to_ARGB;
2584 qimage_converter_map[QImage::Format_RGBA8888][QImage::Format_RGBX8888] = mask_alpha_converter_RGBx;
2585 qimage_converter_map[QImage::Format_RGBA8888][QImage::Format_A2BGR30_Premultiplied] = convert_ARGB_to_A2RGB30<PixelOrderBGR,
true>;
2586 qimage_converter_map[QImage::Format_RGBA8888][QImage::Format_A2RGB30_Premultiplied] = convert_ARGB_to_A2RGB30<PixelOrderRGB,
true>;
2587 qimage_converter_map[QImage::Format_RGBA8888][QImage::Format_RGBA64] = convert_ARGB32_to_RGBA64<
true>;
2589 qimage_converter_map[QImage::Format_RGBA8888_Premultiplied][QImage::Format_ARGB32_Premultiplied] = convert_RGBA_to_ARGB;
2591 qimage_converter_map[QImage::Format_BGR30][QImage::Format_A2BGR30_Premultiplied] = convert_passthrough;
2592 qimage_converter_map[QImage::Format_BGR30][QImage::Format_RGB30] = convert_rgbswap_generic;
2593 qimage_converter_map[QImage::Format_BGR30][QImage::Format_A2RGB30_Premultiplied] = convert_rgbswap_generic;
2595 qimage_converter_map[QImage::Format_A2BGR30_Premultiplied][QImage::Format_ARGB32] = convert_A2RGB30_PM_to_ARGB<PixelOrderBGR,
false>;
2596 qimage_converter_map[QImage::Format_A2BGR30_Premultiplied][QImage::Format_RGBA8888] = convert_A2RGB30_PM_to_ARGB<PixelOrderBGR,
true>;
2597 qimage_converter_map[QImage::Format_A2BGR30_Premultiplied][QImage::Format_BGR30] = convert_A2RGB30_PM_to_RGB30<
false>;
2598 qimage_converter_map[QImage::Format_A2BGR30_Premultiplied][QImage::Format_RGB30] = convert_A2RGB30_PM_to_RGB30<
true>;
2599 qimage_converter_map[QImage::Format_A2BGR30_Premultiplied][QImage::Format_A2RGB30_Premultiplied] = convert_rgbswap_generic;
2601 qimage_converter_map[QImage::Format_RGB30][QImage::Format_BGR30] = convert_rgbswap_generic;
2602 qimage_converter_map[QImage::Format_RGB30][QImage::Format_A2BGR30_Premultiplied] = convert_rgbswap_generic;
2603 qimage_converter_map[QImage::Format_RGB30][QImage::Format_A2RGB30_Premultiplied] = convert_passthrough;
2605 qimage_converter_map[QImage::Format_A2RGB30_Premultiplied][QImage::Format_ARGB32] = convert_A2RGB30_PM_to_ARGB<PixelOrderRGB,
false>;
2606 qimage_converter_map[QImage::Format_A2RGB30_Premultiplied][QImage::Format_RGBA8888] = convert_A2RGB30_PM_to_ARGB<PixelOrderRGB,
true>;
2607 qimage_converter_map[QImage::Format_A2RGB30_Premultiplied][QImage::Format_BGR30] = convert_A2RGB30_PM_to_RGB30<
true>;
2608 qimage_converter_map[QImage::Format_A2RGB30_Premultiplied][QImage::Format_A2BGR30_Premultiplied] = convert_rgbswap_generic;
2609 qimage_converter_map[QImage::Format_A2RGB30_Premultiplied][QImage::Format_RGB30] = convert_A2RGB30_PM_to_RGB30<
false>;
2611 qimage_converter_map[QImage::Format_Grayscale8][QImage::Format_Indexed8] = convert_Grayscale8_to_Indexed8;
2612 qimage_converter_map[QImage::Format_Alpha8][QImage::Format_Indexed8] = convert_Alpha8_to_Indexed8;
2614 qimage_converter_map[QImage::Format_RGBX64][QImage::Format_RGBA64] = convert_passthrough;
2615 qimage_converter_map[QImage::Format_RGBX64][QImage::Format_RGBA64_Premultiplied] = convert_passthrough;
2616 qimage_converter_map[QImage::Format_RGBX64][QImage::Format_Grayscale8] = convert_RGBA64_to_gray8<
false>;
2617 qimage_converter_map[QImage::Format_RGBX64][QImage::Format_Grayscale16] = convert_RGBA64_to_gray16<
false>;
2619 qimage_converter_map[QImage::Format_RGBA64][QImage::Format_ARGB32] = convert_RGBA64_to_ARGB32<
false>;
2620 qimage_converter_map[QImage::Format_RGBA64][QImage::Format_RGBA8888] = convert_RGBA64_to_ARGB32<
true>;
2621 qimage_converter_map[QImage::Format_RGBA64][QImage::Format_RGBX64] = convert_RGBA64_to_RGBx64;
2622 qimage_converter_map[QImage::Format_RGBA64][QImage::Format_Grayscale8] = convert_RGBA64_to_gray8<
false>;
2623 qimage_converter_map[QImage::Format_RGBA64][QImage::Format_Grayscale16] = convert_RGBA64_to_gray16<
false>;
2625 qimage_converter_map[QImage::Format_RGBA64_Premultiplied][QImage::Format_Grayscale8] = convert_RGBA64_to_gray8<
true>;
2626 qimage_converter_map[QImage::Format_RGBA64_Premultiplied][QImage::Format_Grayscale16] = convert_RGBA64_to_gray16<
true>;
2628 qimage_converter_map[QImage::Format_Grayscale16][QImage::Format_RGBX64] = convert_gray16_to_RGBA64;
2629 qimage_converter_map[QImage::Format_Grayscale16][QImage::Format_RGBA64] = convert_gray16_to_RGBA64;
2630 qimage_converter_map[QImage::Format_Grayscale16][QImage::Format_RGBA64_Premultiplied] = convert_gray16_to_RGBA64;
2632 qimage_converter_map[QImage::Format_BGR888][QImage::Format_RGB888] = convert_rgbswap_generic;
2633#if Q_BYTE_ORDER == Q_LITTLE_ENDIAN
2634 qimage_converter_map[QImage::Format_BGR888][QImage::Format_RGBX8888] = convert_RGB888_to_RGB<
false>;
2635 qimage_converter_map[QImage::Format_BGR888][QImage::Format_RGBA8888] = convert_RGB888_to_RGB<
false>;
2636 qimage_converter_map[QImage::Format_BGR888][QImage::Format_RGBA8888_Premultiplied] = convert_RGB888_to_RGB<
false>;
2639 qimage_converter_map[QImage::Format_RGBX16FPx4][QImage::Format_RGBA16FPx4] = convert_passthrough;
2640 qimage_converter_map[QImage::Format_RGBX16FPx4][QImage::Format_RGBA16FPx4_Premultiplied] = convert_passthrough;
2642 qimage_converter_map[QImage::Format_RGBX32FPx4][QImage::Format_RGBA32FPx4] = convert_passthrough;
2643 qimage_converter_map[QImage::Format_RGBX32FPx4][QImage::Format_RGBA32FPx4_Premultiplied] = convert_passthrough;
2645 qimage_converter_map[QImage::Format_CMYK8888][QImage::Format_CMYK8888] = convert_passthrough;
2646 qimage_converter_map[QImage::Format_RGB32][QImage::Format_CMYK8888] = convert_ARGB32_to_CMYK8888<
false>;
2647 qimage_converter_map[QImage::Format_ARGB32][QImage::Format_CMYK8888] = convert_ARGB32_to_CMYK8888<
false>;
2648 qimage_converter_map[QImage::Format_ARGB32_Premultiplied][QImage::Format_CMYK8888] = convert_ARGB32_to_CMYK8888<
true>;
2651 qimage_inplace_converter_map[QImage::Format_Indexed8][QImage::Format_Grayscale8] =
2652 convert_Indexed8_to_Grayscale8_inplace;
2653 qimage_inplace_converter_map[QImage::Format_Indexed8][QImage::Format_Alpha8] =
2654 convert_Indexed8_to_Alpha8_inplace;
2656 qimage_inplace_converter_map[QImage::Format_RGB32][QImage::Format_ARGB32] =
2657 mask_alpha_converter_inplace<QImage::Format_ARGB32>;
2658 qimage_inplace_converter_map[QImage::Format_RGB32][QImage::Format_ARGB32_Premultiplied] =
2659 mask_alpha_converter_inplace<QImage::Format_ARGB32_Premultiplied>;
2661 qimage_inplace_converter_map[QImage::Format_ARGB32][QImage::Format_RGB32] =
2662 mask_alpha_converter_inplace<QImage::Format_RGB32>;
2663 qimage_inplace_converter_map[QImage::Format_ARGB32][QImage::Format_RGBX8888] =
2664 convert_ARGB_to_RGBA_inplace<QImage::Format_RGBX8888>;
2665 qimage_inplace_converter_map[QImage::Format_ARGB32][QImage::Format_RGBA8888] =
2666 convert_ARGB_to_RGBA_inplace<QImage::Format_RGBA8888>;
2667 qimage_inplace_converter_map[QImage::Format_ARGB32][QImage::Format_A2BGR30_Premultiplied] =
2668 convert_ARGB_to_A2RGB30_inplace<PixelOrderBGR,
false>;
2669 qimage_inplace_converter_map[QImage::Format_ARGB32][QImage::Format_A2RGB30_Premultiplied] =
2670 convert_ARGB_to_A2RGB30_inplace<PixelOrderRGB,
false>;
2672 qimage_inplace_converter_map[QImage::Format_ARGB32_Premultiplied][QImage::Format_RGBA8888_Premultiplied] =
2673 convert_ARGB_to_RGBA_inplace<QImage::Format_RGBA8888_Premultiplied>;
2675 qimage_inplace_converter_map[QImage::Format_RGB888][QImage::Format_BGR888] =
2676 convert_rgbswap_generic_inplace;
2678 qimage_inplace_converter_map[QImage::Format_RGBX8888][QImage::Format_RGB32] =
2679 convert_RGBA_to_ARGB_inplace<QImage::Format_RGB32>;
2680 qimage_inplace_converter_map[QImage::Format_RGBX8888][QImage::Format_ARGB32] =
2681 convert_RGBA_to_ARGB_inplace<QImage::Format_ARGB32>;
2682 qimage_inplace_converter_map[QImage::Format_RGBX8888][QImage::Format_ARGB32_Premultiplied] =
2683 convert_RGBA_to_ARGB_inplace<QImage::Format_ARGB32_Premultiplied>;
2684 qimage_inplace_converter_map[QImage::Format_RGBX8888][QImage::Format_RGBA8888] =
2685 convert_passthrough_inplace<QImage::Format_RGBA8888>;
2686 qimage_inplace_converter_map[QImage::Format_RGBX8888][QImage::Format_RGBA8888_Premultiplied] =
2687 convert_passthrough_inplace<QImage::Format_RGBA8888_Premultiplied>;
2689 qimage_inplace_converter_map[QImage::Format_RGBA8888][QImage::Format_RGB32] =
2690 convert_RGBA_to_ARGB_inplace<QImage::Format_RGB32>;
2691 qimage_inplace_converter_map[QImage::Format_RGBA8888][QImage::Format_ARGB32] =
2692 convert_RGBA_to_ARGB_inplace<QImage::Format_ARGB32>;
2693 qimage_inplace_converter_map[QImage::Format_RGBA8888][QImage::Format_RGBX8888] =
2694 mask_alpha_converter_rgbx_inplace;
2695 qimage_inplace_converter_map[QImage::Format_RGBA8888][QImage::Format_A2BGR30_Premultiplied] =
2696 convert_ARGB_to_A2RGB30_inplace<PixelOrderBGR,
true>;
2697 qimage_inplace_converter_map[QImage::Format_RGBA8888][QImage::Format_A2RGB30_Premultiplied] =
2698 convert_ARGB_to_A2RGB30_inplace<PixelOrderRGB,
true>;
2700 qimage_inplace_converter_map[QImage::Format_RGBA8888_Premultiplied][QImage::Format_ARGB32_Premultiplied] =
2701 convert_RGBA_to_ARGB_inplace<QImage::Format_ARGB32_Premultiplied>;
2703 qimage_inplace_converter_map[QImage::Format_BGR30][QImage::Format_A2BGR30_Premultiplied] =
2704 convert_passthrough_inplace<QImage::Format_A2BGR30_Premultiplied>;
2705 qimage_inplace_converter_map[QImage::Format_BGR30][QImage::Format_RGB30] =
2706 convert_rgbswap_generic_inplace;
2707 qimage_inplace_converter_map[QImage::Format_BGR30][QImage::Format_A2RGB30_Premultiplied] =
2708 convert_BGR30_to_A2RGB30_inplace;
2710 qimage_inplace_converter_map[QImage::Format_A2BGR30_Premultiplied][QImage::Format_ARGB32] =
2711 convert_A2RGB30_PM_to_ARGB_inplace<PixelOrderBGR,
false>;
2712 qimage_inplace_converter_map[QImage::Format_A2BGR30_Premultiplied][QImage::Format_RGBA8888] =
2713 convert_A2RGB30_PM_to_ARGB_inplace<PixelOrderBGR,
true>;
2714 qimage_inplace_converter_map[QImage::Format_A2BGR30_Premultiplied][QImage::Format_BGR30] =
2715 convert_A2RGB30_PM_to_RGB30_inplace<
false>;
2716 qimage_inplace_converter_map[QImage::Format_A2BGR30_Premultiplied][QImage::Format_RGB30] =
2717 convert_A2RGB30_PM_to_RGB30_inplace<
true>;
2718 qimage_inplace_converter_map[QImage::Format_A2BGR30_Premultiplied][QImage::Format_A2RGB30_Premultiplied] =
2719 convert_rgbswap_generic_inplace;
2721 qimage_inplace_converter_map[QImage::Format_RGB30][QImage::Format_BGR30] =
2722 convert_rgbswap_generic_inplace;
2723 qimage_inplace_converter_map[QImage::Format_RGB30][QImage::Format_A2BGR30_Premultiplied] =
2724 convert_BGR30_to_A2RGB30_inplace;
2725 qimage_inplace_converter_map[QImage::Format_RGB30][QImage::Format_A2RGB30_Premultiplied] =
2726 convert_passthrough_inplace<QImage::Format_A2RGB30_Premultiplied>;
2728 qimage_inplace_converter_map[QImage::Format_A2RGB30_Premultiplied][QImage::Format_ARGB32] =
2729 convert_A2RGB30_PM_to_ARGB_inplace<PixelOrderRGB,
false>;
2730 qimage_inplace_converter_map[QImage::Format_A2RGB30_Premultiplied][QImage::Format_RGBA8888] =
2731 convert_A2RGB30_PM_to_ARGB_inplace<PixelOrderRGB,
true>;
2732 qimage_inplace_converter_map[QImage::Format_A2RGB30_Premultiplied][QImage::Format_BGR30] =
2733 convert_A2RGB30_PM_to_RGB30_inplace<
true>;
2734 qimage_inplace_converter_map[QImage::Format_A2RGB30_Premultiplied][QImage::Format_A2BGR30_Premultiplied] =
2735 convert_rgbswap_generic_inplace;
2736 qimage_inplace_converter_map[QImage::Format_A2RGB30_Premultiplied][QImage::Format_RGB30] =
2737 convert_A2RGB30_PM_to_RGB30_inplace<
false>;
2739 qimage_inplace_converter_map[QImage::Format_Grayscale8][QImage::Format_Indexed8] =
2740 convert_Grayscale8_to_Indexed8_inplace;
2741 qimage_inplace_converter_map[QImage::Format_Alpha8][QImage::Format_Indexed8] =
2742 convert_Alpha8_to_Indexed8_inplace;
2744 qimage_inplace_converter_map[QImage::Format_RGBX64][QImage::Format_RGBA64] =
2745 convert_passthrough_inplace<QImage::Format_RGBA64>;
2746 qimage_inplace_converter_map[QImage::Format_RGBX64][QImage::Format_RGBA64_Premultiplied] =
2747 convert_passthrough_inplace<QImage::Format_RGBA64_Premultiplied>;
2749 qimage_inplace_converter_map[QImage::Format_RGBA64][QImage::Format_RGBX64] =
2750 convert_RGBA64_to_RGBx64_inplace;
2752 qimage_inplace_converter_map[QImage::Format_BGR888][QImage::Format_RGB888] =
2753 convert_rgbswap_generic_inplace;
2755 qimage_inplace_converter_map[QImage::Format_RGBX16FPx4][QImage::Format_RGBA16FPx4] =
2756 convert_passthrough_inplace<QImage::Format_RGBA16FPx4>;
2757 qimage_inplace_converter_map[QImage::Format_RGBX16FPx4][QImage::Format_RGBA16FPx4_Premultiplied] =
2758 convert_passthrough_inplace<QImage::Format_RGBA16FPx4_Premultiplied>;
2760 qimage_inplace_converter_map[QImage::Format_RGBX32FPx4][QImage::Format_RGBA32FPx4] =
2761 convert_passthrough_inplace<QImage::Format_RGBA32FPx4>;
2762 qimage_inplace_converter_map[QImage::Format_RGBX32FPx4][QImage::Format_RGBA32FPx4_Premultiplied] =
2763 convert_passthrough_inplace<QImage::Format_RGBA32FPx4_Premultiplied>;
2766#if defined(__SSE2__
) && defined(QT_COMPILER_SUPPORTS_SSSE3)
2767 if (qCpuHasFeature(SSSE3)) {
2768 extern void convert_RGB888_to_RGB32_ssse3(QImageData *dest,
const QImageData *src, Qt::ImageConversionFlags);
2769 qimage_converter_map[QImage::Format_RGB888][QImage::Format_RGB32] = convert_RGB888_to_RGB32_ssse3;
2770 qimage_converter_map[QImage::Format_RGB888][QImage::Format_ARGB32] = convert_RGB888_to_RGB32_ssse3;
2771 qimage_converter_map[QImage::Format_RGB888][QImage::Format_ARGB32_Premultiplied] = convert_RGB888_to_RGB32_ssse3;
2772 qimage_converter_map[QImage::Format_BGR888][QImage::Format_RGBX8888] = convert_RGB888_to_RGB32_ssse3;
2773 qimage_converter_map[QImage::Format_BGR888][QImage::Format_RGBA8888] = convert_RGB888_to_RGB32_ssse3;
2774 qimage_converter_map[QImage::Format_BGR888][QImage::Format_RGBA8888_Premultiplied] = convert_RGB888_to_RGB32_ssse3;
2778#if defined(QT_COMPILER_SUPPORTS_LSX)
2779 if (qCpuHasFeature(LSX)) {
2780 extern void convert_RGB888_to_RGB32_lsx(QImageData *dest,
const QImageData *src, Qt::ImageConversionFlags);
2781 qimage_converter_map[QImage::Format_RGB888][QImage::Format_RGB32] = convert_RGB888_to_RGB32_lsx;
2782 qimage_converter_map[QImage::Format_RGB888][QImage::Format_ARGB32] = convert_RGB888_to_RGB32_lsx;
2783 qimage_converter_map[QImage::Format_RGB888][QImage::Format_ARGB32_Premultiplied] = convert_RGB888_to_RGB32_lsx;
2784 qimage_converter_map[QImage::Format_BGR888][QImage::Format_RGBX8888] = convert_RGB888_to_RGB32_lsx;
2785 qimage_converter_map[QImage::Format_BGR888][QImage::Format_RGBA8888] = convert_RGB888_to_RGB32_lsx;
2786 qimage_converter_map[QImage::Format_BGR888][QImage::Format_RGBA8888_Premultiplied] = convert_RGB888_to_RGB32_lsx;
2790#if defined(QT_COMPILER_SUPPORTS_LASX)
2791 if (qCpuHasFeature(LASX)) {
2792 extern void convert_RGB888_to_RGB32_lasx(QImageData *dest,
const QImageData *src, Qt::ImageConversionFlags);
2793 qimage_converter_map[QImage::Format_RGB888][QImage::Format_RGB32] = convert_RGB888_to_RGB32_lasx;
2794 qimage_converter_map[QImage::Format_RGB888][QImage::Format_ARGB32] = convert_RGB888_to_RGB32_lasx;
2795 qimage_converter_map[QImage::Format_RGB888][QImage::Format_ARGB32_Premultiplied] = convert_RGB888_to_RGB32_lasx;
2796 qimage_converter_map[QImage::Format_BGR888][QImage::Format_RGBX8888] = convert_RGB888_to_RGB32_lasx;
2797 qimage_converter_map[QImage::Format_BGR888][QImage::Format_RGBA8888] = convert_RGB888_to_RGB32_lasx;
2798 qimage_converter_map[QImage::Format_BGR888][QImage::Format_RGBA8888_Premultiplied] = convert_RGB888_to_RGB32_lasx;
2802#if defined(__ARM_NEON__)
2803 extern void convert_RGB888_to_RGB32_neon(QImageData *dest,
const QImageData *src, Qt::ImageConversionFlags);
2804 qimage_converter_map[QImage::Format_RGB888][QImage::Format_RGB32] = convert_RGB888_to_RGB32_neon;
2805 qimage_converter_map[QImage::Format_RGB888][QImage::Format_ARGB32] = convert_RGB888_to_RGB32_neon;
2806 qimage_converter_map[QImage::Format_RGB888][QImage::Format_ARGB32_Premultiplied] = convert_RGB888_to_RGB32_neon;
2809#if defined(__MIPS_DSPR2__)
2810 extern bool convert_ARGB_to_ARGB_PM_inplace_mips_dspr2(QImageData *data, Qt::ImageConversionFlags);
2811 qimage_inplace_converter_map[QImage::Format_ARGB32][QImage::Format_ARGB32_Premultiplied] = convert_ARGB_to_ARGB_PM_inplace_mips_dspr2;
2813 extern void convert_RGB888_to_RGB32_mips_dspr2(QImageData *dest,
const QImageData *src, Qt::ImageConversionFlags);
2814 qimage_converter_map[QImage::Format_RGB888][QImage::Format_RGB32] = convert_RGB888_to_RGB32_mips_dspr2;
2815 qimage_converter_map[QImage::Format_RGB888][QImage::Format_ARGB32] = convert_RGB888_to_RGB32_mips_dspr2;
2816 qimage_converter_map[QImage::Format_RGB888][QImage::Format_ARGB32_Premultiplied] = convert_RGB888_to_RGB32_mips_dspr2;