47
48
49
50
51
52
53
54
55
56 0, 128, 64, 192, 32, 160, 96, 224, 16, 144, 80, 208, 48, 176, 112, 240,
57 8, 136, 72, 200, 40, 168, 104, 232, 24, 152, 88, 216, 56, 184, 120, 248,
58 4, 132, 68, 196, 36, 164, 100, 228, 20, 148, 84, 212, 52, 180, 116, 244,
59 12, 140, 76, 204, 44, 172, 108, 236, 28, 156, 92, 220, 60, 188, 124, 252,
60 2, 130, 66, 194, 34, 162, 98, 226, 18, 146, 82, 210, 50, 178, 114, 242,
61 10, 138, 74, 202, 42, 170, 106, 234, 26, 154, 90, 218, 58, 186, 122, 250,
62 6, 134, 70, 198, 38, 166, 102, 230, 22, 150, 86, 214, 54, 182, 118, 246,
63 14, 142, 78, 206, 46, 174, 110, 238, 30, 158, 94, 222, 62, 190, 126, 254,
64 1, 129, 65, 193, 33, 161, 97, 225, 17, 145, 81, 209, 49, 177, 113, 241,
65 9, 137, 73, 201, 41, 169, 105, 233, 25, 153, 89, 217, 57, 185, 121, 249,
66 5, 133, 69, 197, 37, 165, 101, 229, 21, 149, 85, 213, 53, 181, 117, 245,
67 13, 141, 77, 205, 45, 173, 109, 237, 29, 157, 93, 221, 61, 189, 125, 253,
68 3, 131, 67, 195, 35, 163, 99, 227, 19, 147, 83, 211, 51, 179, 115, 243,
69 11, 139, 75, 203, 43, 171, 107, 235, 27, 155, 91, 219, 59, 187, 123, 251,
70 7, 135, 71, 199, 39, 167, 103, 231, 23, 151, 87, 215, 55, 183, 119, 247,
71 15, 143, 79, 207, 47, 175, 111, 239, 31, 159, 95, 223, 63, 191, 127, 255
349 Q_ASSERT(dst_format > QImage::Format_Indexed8);
350 Q_ASSERT(dst_format < QImage::NImageFormats);
351 Q_ASSERT(data->format > QImage::Format_Indexed8);
352 const int destDepth = qt_depthForFormat(dst_format);
353 if (data->depth < destDepth)
356 const QPixelLayout *srcLayout = &qPixelLayouts[data->format];
357 const QPixelLayout *destLayout = &qPixelLayouts[dst_format];
361 Q_ASSERT(!qt_highColorPrecision(data->format, !destLayout->hasAlphaChannel)
362 || !qt_highColorPrecision(dst_format, !srcLayout->hasAlphaChannel));
364 QImageData::ImageSizeParameters params = { data->bytes_per_line, data->nbytes };
365 if (data->depth != destDepth) {
366 params = QImageData::calculateImageParameters(data->width, data->height, destDepth);
367 if (!params.isValid())
371 Q_ASSERT(destLayout->bpp < QPixelLayout::BPP64);
372 FetchAndConvertPixelsFunc fetch = srcLayout->fetchToARGB32PM;
373 ConvertAndStorePixelsFunc store = destLayout->storeFromARGB32PM;
374 if (!srcLayout->hasAlphaChannel && destLayout->storeFromRGB32) {
376 store = destLayout->storeFromRGB32;
378 if (data->format == QImage::Format_RGB32)
379 fetch = fetchRGB32ToARGB32PM;
380 if (dst_format == QImage::Format_RGB32) {
381#ifdef QT_COMPILER_SUPPORTS_SSE4_1
382 if (qCpuHasFeature(SSE4_1))
383 store = storeRGB32FromARGB32PM_sse4;
385 store = storeRGB32FromARGB32PM;
386#elif defined QT_COMPILER_SUPPORTS_LSX
387 if (qCpuHasFeature(LSX))
388 store = storeRGB32FromARGB32PM_lsx;
390 store = storeRGB32FromARGB32PM;
391#elif defined(__ARM_NEON__) && (Q_BYTE_ORDER == Q_LITTLE_ENDIAN)
392 store = storeRGB32FromARGB32PM_neon;
394 store = storeRGB32FromARGB32PM;
398 if (srcLayout->hasAlphaChannel && !srcLayout->premultiplied &&
399 !destLayout->hasAlphaChannel && destLayout->storeFromRGB32) {
401 fetch = qPixelLayouts[qt_toPremultipliedFormat(data->format)].fetchToARGB32PM;
402 if (dst_format == QImage::Format_RGB32)
403 store = storeRGB32FromARGB32;
405 store = destLayout->storeFromRGB32;
408 auto convertSegment = [=](
int yStart,
int yEnd) {
409 Q_DECL_UNINITIALIZED uint buf[BufferSize];
411 uchar *srcData = data->data + data->bytes_per_line * yStart;
412 uchar *destData = srcData;
414 QDitherInfo *ditherPtr =
nullptr;
415 if ((flags & Qt::PreferDither) && (flags & Qt::Dither_Mask) != Qt::ThresholdDither)
417 for (
int y = yStart; y < yEnd; ++y) {
420 while (x < data->width) {
422 int l = data->width - x;
423 if (srcLayout->bpp == QPixelLayout::BPP32)
424 buffer =
reinterpret_cast<uint *>(srcData) + x;
426 l = qMin(l, BufferSize);
427 const uint *ptr = fetch(buffer, srcData, x, l,
nullptr, ditherPtr);
428 store(destData, ptr, x, l,
nullptr, ditherPtr);
431 srcData += data->bytes_per_line;
432 destData += params.bytesPerLine;
435#if QT_CONFIG(qtgui_threadpool)
436 int segments = (qsizetype(data->width) * data->height) >> 16;
437 segments = std::min(segments, data->height);
438 QThreadPool *threadPool = QGuiApplicationPrivate::qtGuiThreadPool();
439 if (segments > 1 && threadPool && !threadPool->contains(QThread::currentThread())) {
440 QLatch latch(segments);
442 for (
int i = 0; i < segments; ++i) {
443 int yn = (data->height - y) / (segments - i);
444 threadPool->start([&, y, yn]() {
445 convertSegment(y, y + yn);
451 if (data->bytes_per_line != params.bytesPerLine) {
454 for (
int i = 0; i < segments; ++i) {
455 int yn = (data->height - y) / (segments - i);
456 uchar *srcData = data->data + data->bytes_per_line * y;
457 uchar *destData = data->data + params.bytesPerLine * y;
458 if (srcData != destData)
459 memmove(destData, srcData, params.bytesPerLine * yn);
465 convertSegment(0, data->height);
466 if (params.totalSize != data->nbytes) {
467 Q_ASSERT(params.totalSize < data->nbytes);
468 void *newData = realloc(data->data, params.totalSize);
470 data->data = (uchar *)newData;
471 data->nbytes = params.totalSize;
473 data->bytes_per_line = params.bytesPerLine;
475 data->depth = destDepth;
476 data->format = dst_format;
482 Q_ASSERT(data->format > QImage::Format_Indexed8);
483 Q_ASSERT(dst_format > QImage::Format_Indexed8);
484 Q_ASSERT(dst_format < QImage::NImageFormats);
485 const int destDepth = qt_depthForFormat(dst_format);
486 if (data->depth < destDepth)
489 const QPixelLayout *srcLayout = &qPixelLayouts[data->format];
490 const QPixelLayout *destLayout = &qPixelLayouts[dst_format];
492 QImageData::ImageSizeParameters params = { data->bytes_per_line, data->nbytes };
493 if (data->depth != destDepth) {
494 params = QImageData::calculateImageParameters(data->width, data->height, destDepth);
495 if (!params.isValid())
499 FetchAndConvertPixelsFunc64 fetch = srcLayout->fetchToRGBA64PM;
500 ConvertAndStorePixelsFunc64 store = qStoreFromRGBA64PM[dst_format];
501 if (srcLayout->hasAlphaChannel && !srcLayout->premultiplied &&
502 destLayout->hasAlphaChannel && !destLayout->premultiplied) {
504 fetch = qPixelLayouts[qt_toPremultipliedFormat(data->format)].fetchToRGBA64PM;
505 store = qStoreFromRGBA64PM[qt_toPremultipliedFormat(dst_format)];
508 auto convertSegment = [=](
int yStart,
int yEnd) {
509 Q_DECL_UNINITIALIZED QRgba64 buf[BufferSize];
510 QRgba64 *buffer = buf;
511 uchar *srcData = data->data + yStart * data->bytes_per_line;
512 uchar *destData = srcData;
513 for (
int y = yStart; y < yEnd; ++y) {
515 while (x < data->width) {
516 int l = data->width - x;
517 if (srcLayout->bpp == QPixelLayout::BPP64)
518 buffer =
reinterpret_cast<QRgba64 *>(srcData) + x;
520 l = qMin(l, BufferSize);
521 const QRgba64 *ptr = fetch(buffer, srcData, x, l,
nullptr,
nullptr);
522 store(destData, ptr, x, l,
nullptr,
nullptr);
525 srcData += data->bytes_per_line;
526 destData += params.bytesPerLine;
529#if QT_CONFIG(qtgui_threadpool)
530 int segments = (qsizetype(data->width) * data->height) >> 16;
531 segments = std::min(segments, data->height);
532 QThreadPool *threadPool = QGuiApplicationPrivate::qtGuiThreadPool();
533 if (segments > 1 && threadPool && !threadPool->contains(QThread::currentThread())) {
534 QLatch latch(segments);
536 for (
int i = 0; i < segments; ++i) {
537 int yn = (data->height - y) / (segments - i);
538 threadPool->start([&, y, yn]() {
539 convertSegment(y, y + yn);
545 if (data->bytes_per_line != params.bytesPerLine) {
548 for (
int i = 0; i < segments; ++i) {
549 int yn = (data->height - y) / (segments - i);
550 uchar *srcData = data->data + data->bytes_per_line * y;
551 uchar *destData = data->data + params.bytesPerLine * y;
552 if (srcData != destData)
553 memmove(destData, srcData, params.bytesPerLine * yn);
559 convertSegment(0, data->height);
560 if (params.totalSize != data->nbytes) {
561 Q_ASSERT(params.totalSize < data->nbytes);
562 void *newData = realloc(data->data, params.totalSize);
564 data->data = (uchar *)newData;
565 data->nbytes = params.totalSize;
567 data->bytes_per_line = params.bytesPerLine;
569 data->depth = destDepth;
570 data->format = dst_format;
1937 Q_ASSERT(src->format == QImage::Format_RGB32 || src->format == QImage::Format_ARGB32);
1938 Q_ASSERT(dst->format == QImage::Format_Indexed8);
1939 Q_ASSERT(src->width == dst->width);
1940 Q_ASSERT(src->height == dst->height);
1942 bool do_quant = (flags & Qt::DitherMode_Mask) == Qt::PreferDither
1943 || src->format == QImage::Format_ARGB32;
1944 uint alpha_mask = src->format == QImage::Format_RGB32 ? 0xff000000 : 0;
1946 const int tablesize = 997;
1950 if (!dst->colortable.isEmpty()) {
1951 QList<QRgb> ctbl = dst->colortable;
1952 dst->colortable.resize(256);
1955 for (
int i = 0; i < dst->colortable.size(); ++i) {
1957 QRgb p = ctbl.at(i) | alpha_mask;
1958 int hash = p % tablesize;
1960 if (table[hash].used) {
1961 if (table[hash].rgb == p) {
1966 if (++hash == tablesize) hash = 0;
1970 Q_ASSERT (pix != 256);
1972 dst->colortable[pix] = p;
1973 table[hash].pix = pix++;
1974 table[hash].rgb = p;
1975 table[hash].used = 1;
1982 if ((flags & Qt::DitherMode_Mask) != Qt::PreferDither) {
1983 dst->colortable.resize(256);
1984 const uchar *src_data = src->data;
1985 uchar *dest_data = dst->data;
1986 for (
int y = 0; y < src->height; y++) {
1987 const QRgb *s = (
const QRgb *)src_data;
1988 uchar *b = dest_data;
1989 for (
int x = 0; x < src->width; ++x) {
1990 QRgb p = s[x] | alpha_mask;
1991 int hash = p % tablesize;
1993 if (table[hash].used) {
1994 if (table[hash].rgb == (p)) {
1999 if (++hash == tablesize) hash = 0;
2010 dst->colortable[pix] = p;
2011 table[hash].pix = pix++;
2012 table[hash].rgb = p;
2013 table[hash].used = 1;
2018 *b++ = table[hash].pix;
2020 src_data += src->bytes_per_line;
2021 dest_data += dst->bytes_per_line;
2024 int numColors = do_quant ? 256 : pix;
2026 dst->colortable.resize(numColors);
2033#define INDEXOF(r,g,b) (((r)*(MAX_G+1
)+(g))*(MAX_B+1
)+(b))
2035 for (
int rc=0; rc<=
MAX_R; rc++)
2036 for (
int gc=0; gc<=
MAX_G; gc++)
2037 for (
int bc=0; bc<=
MAX_B; bc++)
2040 const uchar *src_data = src->data;
2041 uchar *dest_data = dst->data;
2042 if ((flags & Qt::Dither_Mask) == Qt::ThresholdDither) {
2043 for (
int y = 0; y < src->height; y++) {
2044 const QRgb *p = (
const QRgb *)src_data;
2045 const QRgb *end = p + src->width;
2046 uchar *b = dest_data;
2049#define DITHER(p,m) ((uchar) ((p * (m) + 127
) / 255
))
2059 src_data += src->bytes_per_line;
2060 dest_data += dst->bytes_per_line;
2062 }
else if ((flags & Qt::Dither_Mask) == Qt::DiffuseDither) {
2066 QScopedArrayPointer<
int> lineBuffer(
new int[src->width * 9]);
2067 line1[0] = lineBuffer.data();
2068 line2[0] = lineBuffer.data() + src->width;
2069 line1[1] = lineBuffer.data() + src->width * 2;
2070 line2[1] = lineBuffer.data() + src->width * 3;
2071 line1[2] = lineBuffer.data() + src->width * 4;
2072 line2[2] = lineBuffer.data() + src->width * 5;
2073 pv[0] = lineBuffer.data() + src->width * 6;
2074 pv[1] = lineBuffer.data() + src->width * 7;
2075 pv[2] = lineBuffer.data() + src->width * 8;
2077 int endian = (QSysInfo::ByteOrder == QSysInfo::BigEndian);
2078 for (
int y = 0; y < src->height; y++) {
2079 const uchar* q = src_data;
2080 const uchar* q2 = y < src->height - 1 ? q + src->bytes_per_line : src->data;
2081 uchar *b = dest_data;
2082 for (
int chan = 0; chan < 3; chan++) {
2083 int *l1 = (y&1) ? line2[chan] : line1[chan];
2084 int *l2 = (y&1) ? line1[chan] : line2[chan];
2086 for (
int i = 0; i < src->width; i++)
2087 l1[i] = q[i*4+chan+endian];
2089 if (y+1 < src->height) {
2090 for (
int i = 0; i < src->width; i++)
2091 l2[i] = q2[i*4+chan+endian];
2095 for (
int x = 0; x < src->width; x++) {
2096 int pix = qMax(qMin(5, (l1[x] * 5 + 128)/ 255), 0);
2097 int err = l1[x] - pix * 255 / 5;
2101 if (x + 1< src->width) {
2102 l1[x+1] += (err*7)>>4;
2107 l2[x-1]+=(err*3)>>4;
2110 for (
int x = src->width; x-- > 0;) {
2111 int pix = qMax(qMin(5, (l1[x] * 5 + 128)/ 255), 0);
2112 int err = l1[x] - pix * 255 / 5;
2117 l1[x-1] += (err*7)>>4;
2121 if (x + 1 < src->width)
2122 l2[x+1]+=(err*3)>>4;
2127 for (
int x = 0; x < src->width; x++) {
2128 *b++ =
INDEXOF(pv[0][x],pv[1][x],pv[2][x]);
2131 for (
int x = 0; x < src->width; x++) {
2132 *b++ =
INDEXOF(pv[2][x],pv[1][x],pv[0][x]);
2135 src_data += src->bytes_per_line;
2136 dest_data += dst->bytes_per_line;
2139 for (
int y = 0; y < src->height; y++) {
2140 const QRgb *p = (
const QRgb *)src_data;
2141 const QRgb *end = p + src->width;
2142 uchar *b = dest_data;
2146 uint d = qt_bayer_matrix[y & 15][x & 15] << 8;
2148#define DITHER(p, d, m) ((uchar) ((((256
* (m) + (m) + 1
)) * (p) + (d)) >> 16
))
2160 src_data += src->bytes_per_line;
2161 dest_data += dst->bytes_per_line;
2165 if (src->format != QImage::Format_RGB32
2166 && src->format != QImage::Format_RGB16) {
2167 const int trans = 216;
2168 Q_ASSERT(dst->colortable.size() > trans);
2169 dst->colortable[trans] = 0;
2170 QScopedPointer<QImageData> mask(QImageData::create(QSize(src->width, src->height), QImage::Format_Mono));
2171 dither_to_Mono(mask.data(), src, flags,
true);
2172 uchar *dst_data = dst->data;
2173 const uchar *mask_data = mask->data;
2174 for (
int y = 0; y < src->height; y++) {
2175 for (
int x = 0; x < src->width ; x++) {
2176 if (!(mask_data[x>>3] & (0x80 >> (x & 7))))
2177 dst_data[x] = trans;
2179 mask_data += mask->bytes_per_line;
2180 dst_data += dst->bytes_per_line;
2182 dst->has_alpha_clut =
true;
2520 qimage_converter_map[QImage::Format_Mono][QImage::Format_MonoLSB] = swap_bit_order;
2521 qimage_converter_map[QImage::Format_Mono][QImage::Format_Indexed8] = convert_Mono_to_Indexed8;
2522 qimage_converter_map[QImage::Format_Mono][QImage::Format_RGB32] = convert_Mono_to_X32;
2523 qimage_converter_map[QImage::Format_Mono][QImage::Format_ARGB32] = convert_Mono_to_X32;
2524 qimage_converter_map[QImage::Format_Mono][QImage::Format_ARGB32_Premultiplied] = convert_Mono_to_X32;
2526 qimage_converter_map[QImage::Format_MonoLSB][QImage::Format_Mono] = swap_bit_order;
2527 qimage_converter_map[QImage::Format_MonoLSB][QImage::Format_Indexed8] = convert_Mono_to_Indexed8;
2528 qimage_converter_map[QImage::Format_MonoLSB][QImage::Format_RGB32] = convert_Mono_to_X32;
2529 qimage_converter_map[QImage::Format_MonoLSB][QImage::Format_ARGB32] = convert_Mono_to_X32;
2530 qimage_converter_map[QImage::Format_MonoLSB][QImage::Format_ARGB32_Premultiplied] = convert_Mono_to_X32;
2532 qimage_converter_map[QImage::Format_Indexed8][QImage::Format_Mono] = convert_X_to_Mono;
2533 qimage_converter_map[QImage::Format_Indexed8][QImage::Format_MonoLSB] = convert_X_to_Mono;
2534 qimage_converter_map[QImage::Format_Indexed8][QImage::Format_RGB32] = convert_Indexed8_to_X32;
2535 qimage_converter_map[QImage::Format_Indexed8][QImage::Format_ARGB32] = convert_Indexed8_to_X32;
2536 qimage_converter_map[QImage::Format_Indexed8][QImage::Format_ARGB32_Premultiplied] = convert_Indexed8_to_X32;
2538 qimage_converter_map[QImage::Format_Indexed8][QImage::Format_Grayscale8] = convert_Indexed8_to_Grayscale8;
2539 qimage_converter_map[QImage::Format_Indexed8][QImage::Format_Alpha8] = convert_Indexed8_to_Alpha8;
2541 qimage_converter_map[QImage::Format_RGB32][QImage::Format_Mono] = convert_X_to_Mono;
2542 qimage_converter_map[QImage::Format_RGB32][QImage::Format_MonoLSB] = convert_X_to_Mono;
2543 qimage_converter_map[QImage::Format_RGB32][QImage::Format_Indexed8] = convert_RGB_to_Indexed8;
2544 qimage_converter_map[QImage::Format_RGB32][QImage::Format_ARGB32] = mask_alpha_converter;
2545 qimage_converter_map[QImage::Format_RGB32][QImage::Format_ARGB32_Premultiplied] = mask_alpha_converter;
2546 qimage_converter_map[QImage::Format_RGB32][QImage::Format_Grayscale8] = convert_ARGB_to_gray8<
false>;
2547 qimage_converter_map[QImage::Format_RGB32][QImage::Format_Grayscale16] = convert_ARGB_to_gray16<
false>;
2549 qimage_converter_map[QImage::Format_ARGB32][QImage::Format_Mono] = convert_X_to_Mono;
2550 qimage_converter_map[QImage::Format_ARGB32][QImage::Format_MonoLSB] = convert_X_to_Mono;
2551 qimage_converter_map[QImage::Format_ARGB32][QImage::Format_Indexed8] = convert_ARGB_to_Indexed8;
2552 qimage_converter_map[QImage::Format_ARGB32][QImage::Format_RGB32] = mask_alpha_converter;
2553 qimage_converter_map[QImage::Format_ARGB32][QImage::Format_RGBX8888] = convert_ARGB_to_RGBx;
2554 qimage_converter_map[QImage::Format_ARGB32][QImage::Format_RGBA8888] = convert_ARGB_to_RGBA;
2556 qimage_converter_map[QImage::Format_ARGB32][QImage::Format_A2BGR30_Premultiplied] = convert_ARGB_to_A2RGB30<PixelOrderBGR,
false>;
2557 qimage_converter_map[QImage::Format_ARGB32][QImage::Format_A2RGB30_Premultiplied] = convert_ARGB_to_A2RGB30<PixelOrderRGB,
false>;
2558 qimage_converter_map[QImage::Format_ARGB32][QImage::Format_RGBA64] = convert_ARGB32_to_RGBA64<
false>;
2559 qimage_converter_map[QImage::Format_ARGB32][QImage::Format_Grayscale8] = convert_ARGB_to_gray8<
false>;
2560 qimage_converter_map[QImage::Format_ARGB32][QImage::Format_Grayscale16] = convert_ARGB_to_gray16<
false>;
2562 qimage_converter_map[QImage::Format_ARGB32_Premultiplied][QImage::Format_Mono] = convert_ARGB_PM_to_Mono;
2563 qimage_converter_map[QImage::Format_ARGB32_Premultiplied][QImage::Format_MonoLSB] = convert_ARGB_PM_to_Mono;
2564 qimage_converter_map[QImage::Format_ARGB32_Premultiplied][QImage::Format_Indexed8] = convert_ARGB_PM_to_Indexed8;
2565 qimage_converter_map[QImage::Format_ARGB32_Premultiplied][QImage::Format_RGBA8888_Premultiplied] = convert_ARGB_to_RGBA;
2566 qimage_converter_map[QImage::Format_ARGB32_Premultiplied][QImage::Format_Grayscale8] = convert_ARGB_to_gray8<
true>;
2567 qimage_converter_map[QImage::Format_ARGB32_Premultiplied][QImage::Format_Grayscale16] = convert_ARGB_to_gray16<
true>;
2569 qimage_converter_map[QImage::Format_RGB888][QImage::Format_RGB32] = convert_RGB888_to_RGB<
false>;
2570 qimage_converter_map[QImage::Format_RGB888][QImage::Format_ARGB32] = convert_RGB888_to_RGB<
false>;
2571 qimage_converter_map[QImage::Format_RGB888][QImage::Format_ARGB32_Premultiplied] = convert_RGB888_to_RGB<
false>;
2572 qimage_converter_map[QImage::Format_RGB888][QImage::Format_RGBX8888] = convert_RGB888_to_RGB<
true>;
2573 qimage_converter_map[QImage::Format_RGB888][QImage::Format_RGBA8888] = convert_RGB888_to_RGB<
true>;
2574 qimage_converter_map[QImage::Format_RGB888][QImage::Format_RGBA8888_Premultiplied] = convert_RGB888_to_RGB<
true>;
2575 qimage_converter_map[QImage::Format_RGB888][QImage::Format_BGR888] = convert_rgbswap_generic;
2577 qimage_converter_map[QImage::Format_RGBX8888][QImage::Format_RGB32] = convert_RGBA_to_RGB;
2578 qimage_converter_map[QImage::Format_RGBX8888][QImage::Format_ARGB32] = convert_RGBA_to_ARGB;
2579 qimage_converter_map[QImage::Format_RGBX8888][QImage::Format_ARGB32_Premultiplied] = convert_RGBA_to_ARGB;
2580 qimage_converter_map[QImage::Format_RGBX8888][QImage::Format_RGBA8888] = convert_passthrough;
2581 qimage_converter_map[QImage::Format_RGBX8888][QImage::Format_RGBA8888_Premultiplied] = convert_passthrough;
2583 qimage_converter_map[QImage::Format_RGBA8888][QImage::Format_RGB32] = convert_RGBA_to_RGB;
2584 qimage_converter_map[QImage::Format_RGBA8888][QImage::Format_ARGB32] = convert_RGBA_to_ARGB;
2585 qimage_converter_map[QImage::Format_RGBA8888][QImage::Format_RGBX8888] = mask_alpha_converter_RGBx;
2586 qimage_converter_map[QImage::Format_RGBA8888][QImage::Format_A2BGR30_Premultiplied] = convert_ARGB_to_A2RGB30<PixelOrderBGR,
true>;
2587 qimage_converter_map[QImage::Format_RGBA8888][QImage::Format_A2RGB30_Premultiplied] = convert_ARGB_to_A2RGB30<PixelOrderRGB,
true>;
2588 qimage_converter_map[QImage::Format_RGBA8888][QImage::Format_RGBA64] = convert_ARGB32_to_RGBA64<
true>;
2590 qimage_converter_map[QImage::Format_RGBA8888_Premultiplied][QImage::Format_ARGB32_Premultiplied] = convert_RGBA_to_ARGB;
2592 qimage_converter_map[QImage::Format_BGR30][QImage::Format_A2BGR30_Premultiplied] = convert_passthrough;
2593 qimage_converter_map[QImage::Format_BGR30][QImage::Format_RGB30] = convert_rgbswap_generic;
2594 qimage_converter_map[QImage::Format_BGR30][QImage::Format_A2RGB30_Premultiplied] = convert_rgbswap_generic;
2596 qimage_converter_map[QImage::Format_A2BGR30_Premultiplied][QImage::Format_ARGB32] = convert_A2RGB30_PM_to_ARGB<PixelOrderBGR,
false>;
2597 qimage_converter_map[QImage::Format_A2BGR30_Premultiplied][QImage::Format_RGBA8888] = convert_A2RGB30_PM_to_ARGB<PixelOrderBGR,
true>;
2598 qimage_converter_map[QImage::Format_A2BGR30_Premultiplied][QImage::Format_BGR30] = convert_A2RGB30_PM_to_RGB30<
false>;
2599 qimage_converter_map[QImage::Format_A2BGR30_Premultiplied][QImage::Format_RGB30] = convert_A2RGB30_PM_to_RGB30<
true>;
2600 qimage_converter_map[QImage::Format_A2BGR30_Premultiplied][QImage::Format_A2RGB30_Premultiplied] = convert_rgbswap_generic;
2602 qimage_converter_map[QImage::Format_RGB30][QImage::Format_BGR30] = convert_rgbswap_generic;
2603 qimage_converter_map[QImage::Format_RGB30][QImage::Format_A2BGR30_Premultiplied] = convert_rgbswap_generic;
2604 qimage_converter_map[QImage::Format_RGB30][QImage::Format_A2RGB30_Premultiplied] = convert_passthrough;
2606 qimage_converter_map[QImage::Format_A2RGB30_Premultiplied][QImage::Format_ARGB32] = convert_A2RGB30_PM_to_ARGB<PixelOrderRGB,
false>;
2607 qimage_converter_map[QImage::Format_A2RGB30_Premultiplied][QImage::Format_RGBA8888] = convert_A2RGB30_PM_to_ARGB<PixelOrderRGB,
true>;
2608 qimage_converter_map[QImage::Format_A2RGB30_Premultiplied][QImage::Format_BGR30] = convert_A2RGB30_PM_to_RGB30<
true>;
2609 qimage_converter_map[QImage::Format_A2RGB30_Premultiplied][QImage::Format_A2BGR30_Premultiplied] = convert_rgbswap_generic;
2610 qimage_converter_map[QImage::Format_A2RGB30_Premultiplied][QImage::Format_RGB30] = convert_A2RGB30_PM_to_RGB30<
false>;
2612 qimage_converter_map[QImage::Format_Grayscale8][QImage::Format_Indexed8] = convert_Grayscale8_to_Indexed8;
2613 qimage_converter_map[QImage::Format_Alpha8][QImage::Format_Indexed8] = convert_Alpha8_to_Indexed8;
2615 qimage_converter_map[QImage::Format_RGBX64][QImage::Format_RGBA64] = convert_passthrough;
2616 qimage_converter_map[QImage::Format_RGBX64][QImage::Format_RGBA64_Premultiplied] = convert_passthrough;
2617 qimage_converter_map[QImage::Format_RGBX64][QImage::Format_Grayscale8] = convert_RGBA64_to_gray8<
false>;
2618 qimage_converter_map[QImage::Format_RGBX64][QImage::Format_Grayscale16] = convert_RGBA64_to_gray16<
false>;
2620 qimage_converter_map[QImage::Format_RGBA64][QImage::Format_ARGB32] = convert_RGBA64_to_ARGB32<
false>;
2621 qimage_converter_map[QImage::Format_RGBA64][QImage::Format_RGBA8888] = convert_RGBA64_to_ARGB32<
true>;
2622 qimage_converter_map[QImage::Format_RGBA64][QImage::Format_RGBX64] = convert_RGBA64_to_RGBx64;
2623 qimage_converter_map[QImage::Format_RGBA64][QImage::Format_Grayscale8] = convert_RGBA64_to_gray8<
false>;
2624 qimage_converter_map[QImage::Format_RGBA64][QImage::Format_Grayscale16] = convert_RGBA64_to_gray16<
false>;
2626 qimage_converter_map[QImage::Format_RGBA64_Premultiplied][QImage::Format_Grayscale8] = convert_RGBA64_to_gray8<
true>;
2627 qimage_converter_map[QImage::Format_RGBA64_Premultiplied][QImage::Format_Grayscale16] = convert_RGBA64_to_gray16<
true>;
2629 qimage_converter_map[QImage::Format_Grayscale16][QImage::Format_RGBX64] = convert_gray16_to_RGBA64;
2630 qimage_converter_map[QImage::Format_Grayscale16][QImage::Format_RGBA64] = convert_gray16_to_RGBA64;
2631 qimage_converter_map[QImage::Format_Grayscale16][QImage::Format_RGBA64_Premultiplied] = convert_gray16_to_RGBA64;
2633 qimage_converter_map[QImage::Format_BGR888][QImage::Format_RGB888] = convert_rgbswap_generic;
2634#if Q_BYTE_ORDER == Q_LITTLE_ENDIAN
2635 qimage_converter_map[QImage::Format_BGR888][QImage::Format_RGBX8888] = convert_RGB888_to_RGB<
false>;
2636 qimage_converter_map[QImage::Format_BGR888][QImage::Format_RGBA8888] = convert_RGB888_to_RGB<
false>;
2637 qimage_converter_map[QImage::Format_BGR888][QImage::Format_RGBA8888_Premultiplied] = convert_RGB888_to_RGB<
false>;
2640 qimage_converter_map[QImage::Format_RGBX16FPx4][QImage::Format_RGBA16FPx4] = convert_passthrough;
2641 qimage_converter_map[QImage::Format_RGBX16FPx4][QImage::Format_RGBA16FPx4_Premultiplied] = convert_passthrough;
2643 qimage_converter_map[QImage::Format_RGBX32FPx4][QImage::Format_RGBA32FPx4] = convert_passthrough;
2644 qimage_converter_map[QImage::Format_RGBX32FPx4][QImage::Format_RGBA32FPx4_Premultiplied] = convert_passthrough;
2646 qimage_converter_map[QImage::Format_CMYK8888][QImage::Format_CMYK8888] = convert_passthrough;
2647 qimage_converter_map[QImage::Format_RGB32][QImage::Format_CMYK8888] = convert_ARGB32_to_CMYK8888<
false>;
2648 qimage_converter_map[QImage::Format_ARGB32][QImage::Format_CMYK8888] = convert_ARGB32_to_CMYK8888<
false>;
2649 qimage_converter_map[QImage::Format_ARGB32_Premultiplied][QImage::Format_CMYK8888] = convert_ARGB32_to_CMYK8888<
true>;
2652 qimage_inplace_converter_map[QImage::Format_Indexed8][QImage::Format_Grayscale8] =
2653 convert_Indexed8_to_Grayscale8_inplace;
2654 qimage_inplace_converter_map[QImage::Format_Indexed8][QImage::Format_Alpha8] =
2655 convert_Indexed8_to_Alpha8_inplace;
2657 qimage_inplace_converter_map[QImage::Format_RGB32][QImage::Format_ARGB32] =
2658 mask_alpha_converter_inplace<QImage::Format_ARGB32>;
2659 qimage_inplace_converter_map[QImage::Format_RGB32][QImage::Format_ARGB32_Premultiplied] =
2660 mask_alpha_converter_inplace<QImage::Format_ARGB32_Premultiplied>;
2662 qimage_inplace_converter_map[QImage::Format_ARGB32][QImage::Format_RGB32] =
2663 mask_alpha_converter_inplace<QImage::Format_RGB32>;
2664 qimage_inplace_converter_map[QImage::Format_ARGB32][QImage::Format_RGBX8888] =
2665 convert_ARGB_to_RGBA_inplace<QImage::Format_RGBX8888>;
2666 qimage_inplace_converter_map[QImage::Format_ARGB32][QImage::Format_RGBA8888] =
2667 convert_ARGB_to_RGBA_inplace<QImage::Format_RGBA8888>;
2668 qimage_inplace_converter_map[QImage::Format_ARGB32][QImage::Format_A2BGR30_Premultiplied] =
2669 convert_ARGB_to_A2RGB30_inplace<PixelOrderBGR,
false>;
2670 qimage_inplace_converter_map[QImage::Format_ARGB32][QImage::Format_A2RGB30_Premultiplied] =
2671 convert_ARGB_to_A2RGB30_inplace<PixelOrderRGB,
false>;
2673 qimage_inplace_converter_map[QImage::Format_ARGB32_Premultiplied][QImage::Format_RGBA8888_Premultiplied] =
2674 convert_ARGB_to_RGBA_inplace<QImage::Format_RGBA8888_Premultiplied>;
2676 qimage_inplace_converter_map[QImage::Format_RGB888][QImage::Format_BGR888] =
2677 convert_rgbswap_generic_inplace;
2679 qimage_inplace_converter_map[QImage::Format_RGBX8888][QImage::Format_RGB32] =
2680 convert_RGBA_to_ARGB_inplace<QImage::Format_RGB32>;
2681 qimage_inplace_converter_map[QImage::Format_RGBX8888][QImage::Format_ARGB32] =
2682 convert_RGBA_to_ARGB_inplace<QImage::Format_ARGB32>;
2683 qimage_inplace_converter_map[QImage::Format_RGBX8888][QImage::Format_ARGB32_Premultiplied] =
2684 convert_RGBA_to_ARGB_inplace<QImage::Format_ARGB32_Premultiplied>;
2685 qimage_inplace_converter_map[QImage::Format_RGBX8888][QImage::Format_RGBA8888] =
2686 convert_passthrough_inplace<QImage::Format_RGBA8888>;
2687 qimage_inplace_converter_map[QImage::Format_RGBX8888][QImage::Format_RGBA8888_Premultiplied] =
2688 convert_passthrough_inplace<QImage::Format_RGBA8888_Premultiplied>;
2690 qimage_inplace_converter_map[QImage::Format_RGBA8888][QImage::Format_RGB32] =
2691 convert_RGBA_to_ARGB_inplace<QImage::Format_RGB32>;
2692 qimage_inplace_converter_map[QImage::Format_RGBA8888][QImage::Format_ARGB32] =
2693 convert_RGBA_to_ARGB_inplace<QImage::Format_ARGB32>;
2694 qimage_inplace_converter_map[QImage::Format_RGBA8888][QImage::Format_RGBX8888] =
2695 mask_alpha_converter_rgbx_inplace;
2696 qimage_inplace_converter_map[QImage::Format_RGBA8888][QImage::Format_A2BGR30_Premultiplied] =
2697 convert_ARGB_to_A2RGB30_inplace<PixelOrderBGR,
true>;
2698 qimage_inplace_converter_map[QImage::Format_RGBA8888][QImage::Format_A2RGB30_Premultiplied] =
2699 convert_ARGB_to_A2RGB30_inplace<PixelOrderRGB,
true>;
2701 qimage_inplace_converter_map[QImage::Format_RGBA8888_Premultiplied][QImage::Format_ARGB32_Premultiplied] =
2702 convert_RGBA_to_ARGB_inplace<QImage::Format_ARGB32_Premultiplied>;
2704 qimage_inplace_converter_map[QImage::Format_BGR30][QImage::Format_A2BGR30_Premultiplied] =
2705 convert_passthrough_inplace<QImage::Format_A2BGR30_Premultiplied>;
2706 qimage_inplace_converter_map[QImage::Format_BGR30][QImage::Format_RGB30] =
2707 convert_rgbswap_generic_inplace;
2708 qimage_inplace_converter_map[QImage::Format_BGR30][QImage::Format_A2RGB30_Premultiplied] =
2709 convert_BGR30_to_A2RGB30_inplace;
2711 qimage_inplace_converter_map[QImage::Format_A2BGR30_Premultiplied][QImage::Format_ARGB32] =
2712 convert_A2RGB30_PM_to_ARGB_inplace<PixelOrderBGR,
false>;
2713 qimage_inplace_converter_map[QImage::Format_A2BGR30_Premultiplied][QImage::Format_RGBA8888] =
2714 convert_A2RGB30_PM_to_ARGB_inplace<PixelOrderBGR,
true>;
2715 qimage_inplace_converter_map[QImage::Format_A2BGR30_Premultiplied][QImage::Format_BGR30] =
2716 convert_A2RGB30_PM_to_RGB30_inplace<
false>;
2717 qimage_inplace_converter_map[QImage::Format_A2BGR30_Premultiplied][QImage::Format_RGB30] =
2718 convert_A2RGB30_PM_to_RGB30_inplace<
true>;
2719 qimage_inplace_converter_map[QImage::Format_A2BGR30_Premultiplied][QImage::Format_A2RGB30_Premultiplied] =
2720 convert_rgbswap_generic_inplace;
2722 qimage_inplace_converter_map[QImage::Format_RGB30][QImage::Format_BGR30] =
2723 convert_rgbswap_generic_inplace;
2724 qimage_inplace_converter_map[QImage::Format_RGB30][QImage::Format_A2BGR30_Premultiplied] =
2725 convert_BGR30_to_A2RGB30_inplace;
2726 qimage_inplace_converter_map[QImage::Format_RGB30][QImage::Format_A2RGB30_Premultiplied] =
2727 convert_passthrough_inplace<QImage::Format_A2RGB30_Premultiplied>;
2729 qimage_inplace_converter_map[QImage::Format_A2RGB30_Premultiplied][QImage::Format_ARGB32] =
2730 convert_A2RGB30_PM_to_ARGB_inplace<PixelOrderRGB,
false>;
2731 qimage_inplace_converter_map[QImage::Format_A2RGB30_Premultiplied][QImage::Format_RGBA8888] =
2732 convert_A2RGB30_PM_to_ARGB_inplace<PixelOrderRGB,
true>;
2733 qimage_inplace_converter_map[QImage::Format_A2RGB30_Premultiplied][QImage::Format_BGR30] =
2734 convert_A2RGB30_PM_to_RGB30_inplace<
true>;
2735 qimage_inplace_converter_map[QImage::Format_A2RGB30_Premultiplied][QImage::Format_A2BGR30_Premultiplied] =
2736 convert_rgbswap_generic_inplace;
2737 qimage_inplace_converter_map[QImage::Format_A2RGB30_Premultiplied][QImage::Format_RGB30] =
2738 convert_A2RGB30_PM_to_RGB30_inplace<
false>;
2740 qimage_inplace_converter_map[QImage::Format_Grayscale8][QImage::Format_Indexed8] =
2741 convert_Grayscale8_to_Indexed8_inplace;
2742 qimage_inplace_converter_map[QImage::Format_Alpha8][QImage::Format_Indexed8] =
2743 convert_Alpha8_to_Indexed8_inplace;
2745 qimage_inplace_converter_map[QImage::Format_RGBX64][QImage::Format_RGBA64] =
2746 convert_passthrough_inplace<QImage::Format_RGBA64>;
2747 qimage_inplace_converter_map[QImage::Format_RGBX64][QImage::Format_RGBA64_Premultiplied] =
2748 convert_passthrough_inplace<QImage::Format_RGBA64_Premultiplied>;
2750 qimage_inplace_converter_map[QImage::Format_RGBA64][QImage::Format_RGBX64] =
2751 convert_RGBA64_to_RGBx64_inplace;
2753 qimage_inplace_converter_map[QImage::Format_BGR888][QImage::Format_RGB888] =
2754 convert_rgbswap_generic_inplace;
2756 qimage_inplace_converter_map[QImage::Format_RGBX16FPx4][QImage::Format_RGBA16FPx4] =
2757 convert_passthrough_inplace<QImage::Format_RGBA16FPx4>;
2758 qimage_inplace_converter_map[QImage::Format_RGBX16FPx4][QImage::Format_RGBA16FPx4_Premultiplied] =
2759 convert_passthrough_inplace<QImage::Format_RGBA16FPx4_Premultiplied>;
2761 qimage_inplace_converter_map[QImage::Format_RGBX32FPx4][QImage::Format_RGBA32FPx4] =
2762 convert_passthrough_inplace<QImage::Format_RGBA32FPx4>;
2763 qimage_inplace_converter_map[QImage::Format_RGBX32FPx4][QImage::Format_RGBA32FPx4_Premultiplied] =
2764 convert_passthrough_inplace<QImage::Format_RGBA32FPx4_Premultiplied>;
2767#if defined(__SSE2__
) && defined(QT_COMPILER_SUPPORTS_SSSE3)
2768 if (qCpuHasFeature(SSSE3)) {
2769 extern void convert_RGB888_to_RGB32_ssse3(QImageData *dest,
const QImageData *src, Qt::ImageConversionFlags);
2770 qimage_converter_map[QImage::Format_RGB888][QImage::Format_RGB32] = convert_RGB888_to_RGB32_ssse3;
2771 qimage_converter_map[QImage::Format_RGB888][QImage::Format_ARGB32] = convert_RGB888_to_RGB32_ssse3;
2772 qimage_converter_map[QImage::Format_RGB888][QImage::Format_ARGB32_Premultiplied] = convert_RGB888_to_RGB32_ssse3;
2773 qimage_converter_map[QImage::Format_BGR888][QImage::Format_RGBX8888] = convert_RGB888_to_RGB32_ssse3;
2774 qimage_converter_map[QImage::Format_BGR888][QImage::Format_RGBA8888] = convert_RGB888_to_RGB32_ssse3;
2775 qimage_converter_map[QImage::Format_BGR888][QImage::Format_RGBA8888_Premultiplied] = convert_RGB888_to_RGB32_ssse3;
2779#if defined(QT_COMPILER_SUPPORTS_LSX)
2780 if (qCpuHasFeature(LSX)) {
2781 extern void convert_RGB888_to_RGB32_lsx(QImageData *dest,
const QImageData *src, Qt::ImageConversionFlags);
2782 qimage_converter_map[QImage::Format_RGB888][QImage::Format_RGB32] = convert_RGB888_to_RGB32_lsx;
2783 qimage_converter_map[QImage::Format_RGB888][QImage::Format_ARGB32] = convert_RGB888_to_RGB32_lsx;
2784 qimage_converter_map[QImage::Format_RGB888][QImage::Format_ARGB32_Premultiplied] = convert_RGB888_to_RGB32_lsx;
2785 qimage_converter_map[QImage::Format_BGR888][QImage::Format_RGBX8888] = convert_RGB888_to_RGB32_lsx;
2786 qimage_converter_map[QImage::Format_BGR888][QImage::Format_RGBA8888] = convert_RGB888_to_RGB32_lsx;
2787 qimage_converter_map[QImage::Format_BGR888][QImage::Format_RGBA8888_Premultiplied] = convert_RGB888_to_RGB32_lsx;
2791#if defined(QT_COMPILER_SUPPORTS_LASX)
2792 if (qCpuHasFeature(LASX)) {
2793 extern void convert_RGB888_to_RGB32_lasx(QImageData *dest,
const QImageData *src, Qt::ImageConversionFlags);
2794 qimage_converter_map[QImage::Format_RGB888][QImage::Format_RGB32] = convert_RGB888_to_RGB32_lasx;
2795 qimage_converter_map[QImage::Format_RGB888][QImage::Format_ARGB32] = convert_RGB888_to_RGB32_lasx;
2796 qimage_converter_map[QImage::Format_RGB888][QImage::Format_ARGB32_Premultiplied] = convert_RGB888_to_RGB32_lasx;
2797 qimage_converter_map[QImage::Format_BGR888][QImage::Format_RGBX8888] = convert_RGB888_to_RGB32_lasx;
2798 qimage_converter_map[QImage::Format_BGR888][QImage::Format_RGBA8888] = convert_RGB888_to_RGB32_lasx;
2799 qimage_converter_map[QImage::Format_BGR888][QImage::Format_RGBA8888_Premultiplied] = convert_RGB888_to_RGB32_lasx;
2803#if defined(__ARM_NEON__)
2804 extern void convert_RGB888_to_RGB32_neon(QImageData *dest,
const QImageData *src, Qt::ImageConversionFlags);
2805 qimage_converter_map[QImage::Format_RGB888][QImage::Format_RGB32] = convert_RGB888_to_RGB32_neon;
2806 qimage_converter_map[QImage::Format_RGB888][QImage::Format_ARGB32] = convert_RGB888_to_RGB32_neon;
2807 qimage_converter_map[QImage::Format_RGB888][QImage::Format_ARGB32_Premultiplied] = convert_RGB888_to_RGB32_neon;
2810#if defined(__MIPS_DSPR2__)
2811 extern bool convert_ARGB_to_ARGB_PM_inplace_mips_dspr2(QImageData *data, Qt::ImageConversionFlags);
2812 qimage_inplace_converter_map[QImage::Format_ARGB32][QImage::Format_ARGB32_Premultiplied] = convert_ARGB_to_ARGB_PM_inplace_mips_dspr2;
2814 extern void convert_RGB888_to_RGB32_mips_dspr2(QImageData *dest,
const QImageData *src, Qt::ImageConversionFlags);
2815 qimage_converter_map[QImage::Format_RGB888][QImage::Format_RGB32] = convert_RGB888_to_RGB32_mips_dspr2;
2816 qimage_converter_map[QImage::Format_RGB888][QImage::Format_ARGB32] = convert_RGB888_to_RGB32_mips_dspr2;
2817 qimage_converter_map[QImage::Format_RGB888][QImage::Format_ARGB32_Premultiplied] = convert_RGB888_to_RGB32_mips_dspr2;