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;
1941 Q_ASSERT(src->format == QImage::Format_RGB32 || src->format == QImage::Format_ARGB32);
1942 Q_ASSERT(dst->format == QImage::Format_Indexed8);
1943 Q_ASSERT(src->width == dst->width);
1944 Q_ASSERT(src->height == dst->height);
1946 bool do_quant = (flags & Qt::DitherMode_Mask) == Qt::PreferDither
1947 || src->format == QImage::Format_ARGB32;
1948 uint alpha_mask = src->format == QImage::Format_RGB32 ? 0xff000000 : 0;
1950 const int tablesize = 997;
1954 if (!dst->colortable.isEmpty()) {
1955 QList<QRgb> ctbl = dst->colortable;
1956 dst->colortable.resize(256);
1959 for (
int i = 0; i < dst->colortable.size(); ++i) {
1961 QRgb p = ctbl.at(i) | alpha_mask;
1962 int hash = p % tablesize;
1964 if (table[hash].used) {
1965 if (table[hash].rgb == p) {
1970 if (++hash == tablesize) hash = 0;
1974 Q_ASSERT (pix != 256);
1976 dst->colortable[pix] = p;
1977 table[hash].pix = pix++;
1978 table[hash].rgb = p;
1979 table[hash].used = 1;
1986 if ((flags & Qt::DitherMode_Mask) != Qt::PreferDither) {
1987 dst->colortable.resize(256);
1988 const uchar *src_data = src->data;
1989 uchar *dest_data = dst->data;
1990 for (
int y = 0; y < src->height; y++) {
1991 const QRgb *s = (
const QRgb *)src_data;
1992 uchar *b = dest_data;
1993 for (
int x = 0; x < src->width; ++x) {
1994 QRgb p = s[x] | alpha_mask;
1995 int hash = p % tablesize;
1997 if (table[hash].used) {
1998 if (table[hash].rgb == (p)) {
2003 if (++hash == tablesize) hash = 0;
2014 dst->colortable[pix] = p;
2015 table[hash].pix = pix++;
2016 table[hash].rgb = p;
2017 table[hash].used = 1;
2022 *b++ = table[hash].pix;
2024 src_data += src->bytes_per_line;
2025 dest_data += dst->bytes_per_line;
2028 int numColors = do_quant ? 256 : pix;
2030 dst->colortable.resize(numColors);
2037#define INDEXOF(r,g,b) (((r)*(MAX_G+1
)+(g))*(MAX_B+1
)+(b))
2039 for (
int rc=0; rc<=
MAX_R; rc++)
2040 for (
int gc=0; gc<=
MAX_G; gc++)
2041 for (
int bc=0; bc<=
MAX_B; bc++)
2044 const uchar *src_data = src->data;
2045 uchar *dest_data = dst->data;
2046 if ((flags & Qt::Dither_Mask) == Qt::ThresholdDither) {
2047 for (
int y = 0; y < src->height; y++) {
2048 const QRgb *p = (
const QRgb *)src_data;
2049 const QRgb *end = p + src->width;
2050 uchar *b = dest_data;
2053#define DITHER(p,m) ((uchar) ((p * (m) + 127
) / 255
))
2063 src_data += src->bytes_per_line;
2064 dest_data += dst->bytes_per_line;
2066 }
else if ((flags & Qt::Dither_Mask) == Qt::DiffuseDither) {
2070 QScopedArrayPointer<
int> lineBuffer(
new int[src->width * 9]);
2071 line1[0] = lineBuffer.data();
2072 line2[0] = lineBuffer.data() + src->width;
2073 line1[1] = lineBuffer.data() + src->width * 2;
2074 line2[1] = lineBuffer.data() + src->width * 3;
2075 line1[2] = lineBuffer.data() + src->width * 4;
2076 line2[2] = lineBuffer.data() + src->width * 5;
2077 pv[0] = lineBuffer.data() + src->width * 6;
2078 pv[1] = lineBuffer.data() + src->width * 7;
2079 pv[2] = lineBuffer.data() + src->width * 8;
2081 int endian = (QSysInfo::ByteOrder == QSysInfo::BigEndian);
2082 for (
int y = 0; y < src->height; y++) {
2083 const uchar* q = src_data;
2084 const uchar* q2 = y < src->height - 1 ? q + src->bytes_per_line : src->data;
2085 uchar *b = dest_data;
2086 for (
int chan = 0; chan < 3; chan++) {
2087 int *l1 = (y&1) ? line2[chan] : line1[chan];
2088 int *l2 = (y&1) ? line1[chan] : line2[chan];
2090 for (
int i = 0; i < src->width; i++)
2091 l1[i] = q[i*4+chan+endian];
2093 if (y+1 < src->height) {
2094 for (
int i = 0; i < src->width; i++)
2095 l2[i] = q2[i*4+chan+endian];
2099 for (
int x = 0; x < src->width; x++) {
2100 int pix = qMax(qMin(5, (l1[x] * 5 + 128)/ 255), 0);
2101 int err = l1[x] - pix * 255 / 5;
2105 if (x + 1< src->width) {
2106 l1[x+1] += (err*7)>>4;
2111 l2[x-1]+=(err*3)>>4;
2114 for (
int x = src->width; x-- > 0;) {
2115 int pix = qMax(qMin(5, (l1[x] * 5 + 128)/ 255), 0);
2116 int err = l1[x] - pix * 255 / 5;
2121 l1[x-1] += (err*7)>>4;
2125 if (x + 1 < src->width)
2126 l2[x+1]+=(err*3)>>4;
2131 for (
int x = 0; x < src->width; x++) {
2132 *b++ =
INDEXOF(pv[0][x],pv[1][x],pv[2][x]);
2135 for (
int x = 0; x < src->width; x++) {
2136 *b++ =
INDEXOF(pv[2][x],pv[1][x],pv[0][x]);
2139 src_data += src->bytes_per_line;
2140 dest_data += dst->bytes_per_line;
2143 for (
int y = 0; y < src->height; y++) {
2144 const QRgb *p = (
const QRgb *)src_data;
2145 const QRgb *end = p + src->width;
2146 uchar *b = dest_data;
2150 uint d = qt_bayer_matrix[y & 15][x & 15] << 8;
2152#define DITHER(p, d, m) ((uchar) ((((256
* (m) + (m) + 1
)) * (p) + (d)) >> 16
))
2164 src_data += src->bytes_per_line;
2165 dest_data += dst->bytes_per_line;
2169 if (src->format != QImage::Format_RGB32
2170 && src->format != QImage::Format_RGB16) {
2171 const int trans = 216;
2172 Q_ASSERT(dst->colortable.size() > trans);
2173 dst->colortable[trans] = 0;
2174 QScopedPointer<QImageData> mask(QImageData::create(QSize(src->width, src->height), QImage::Format_Mono));
2175 dither_to_Mono(mask.data(), src, flags,
true);
2176 uchar *dst_data = dst->data;
2177 const uchar *mask_data = mask->data;
2178 for (
int y = 0; y < src->height; y++) {
2179 for (
int x = 0; x < src->width ; x++) {
2180 if (!(mask_data[x>>3] & (0x80 >> (x & 7))))
2181 dst_data[x] = trans;
2183 mask_data += mask->bytes_per_line;
2184 dst_data += dst->bytes_per_line;
2186 dst->has_alpha_clut =
true;
2524 qimage_converter_map[QImage::Format_Mono][QImage::Format_MonoLSB] = swap_bit_order;
2525 qimage_converter_map[QImage::Format_Mono][QImage::Format_Indexed8] = convert_Mono_to_Indexed8;
2526 qimage_converter_map[QImage::Format_Mono][QImage::Format_RGB32] = convert_Mono_to_X32;
2527 qimage_converter_map[QImage::Format_Mono][QImage::Format_ARGB32] = convert_Mono_to_X32;
2528 qimage_converter_map[QImage::Format_Mono][QImage::Format_ARGB32_Premultiplied] = convert_Mono_to_X32;
2530 qimage_converter_map[QImage::Format_MonoLSB][QImage::Format_Mono] = swap_bit_order;
2531 qimage_converter_map[QImage::Format_MonoLSB][QImage::Format_Indexed8] = convert_Mono_to_Indexed8;
2532 qimage_converter_map[QImage::Format_MonoLSB][QImage::Format_RGB32] = convert_Mono_to_X32;
2533 qimage_converter_map[QImage::Format_MonoLSB][QImage::Format_ARGB32] = convert_Mono_to_X32;
2534 qimage_converter_map[QImage::Format_MonoLSB][QImage::Format_ARGB32_Premultiplied] = convert_Mono_to_X32;
2536 qimage_converter_map[QImage::Format_Indexed8][QImage::Format_Mono] = convert_X_to_Mono;
2537 qimage_converter_map[QImage::Format_Indexed8][QImage::Format_MonoLSB] = convert_X_to_Mono;
2538 qimage_converter_map[QImage::Format_Indexed8][QImage::Format_RGB32] = convert_Indexed8_to_X32;
2539 qimage_converter_map[QImage::Format_Indexed8][QImage::Format_ARGB32] = convert_Indexed8_to_X32;
2540 qimage_converter_map[QImage::Format_Indexed8][QImage::Format_ARGB32_Premultiplied] = convert_Indexed8_to_X32;
2542 qimage_converter_map[QImage::Format_Indexed8][QImage::Format_Grayscale8] = convert_Indexed8_to_Grayscale8;
2543 qimage_converter_map[QImage::Format_Indexed8][QImage::Format_Alpha8] = convert_Indexed8_to_Alpha8;
2545 qimage_converter_map[QImage::Format_RGB32][QImage::Format_Mono] = convert_X_to_Mono;
2546 qimage_converter_map[QImage::Format_RGB32][QImage::Format_MonoLSB] = convert_X_to_Mono;
2547 qimage_converter_map[QImage::Format_RGB32][QImage::Format_Indexed8] = convert_RGB_to_Indexed8;
2548 qimage_converter_map[QImage::Format_RGB32][QImage::Format_ARGB32] = mask_alpha_converter;
2549 qimage_converter_map[QImage::Format_RGB32][QImage::Format_ARGB32_Premultiplied] = mask_alpha_converter;
2550 qimage_converter_map[QImage::Format_RGB32][QImage::Format_Grayscale8] = convert_ARGB_to_gray8<
false>;
2551 qimage_converter_map[QImage::Format_RGB32][QImage::Format_Grayscale16] = convert_ARGB_to_gray16<
false>;
2553 qimage_converter_map[QImage::Format_ARGB32][QImage::Format_Mono] = convert_X_to_Mono;
2554 qimage_converter_map[QImage::Format_ARGB32][QImage::Format_MonoLSB] = convert_X_to_Mono;
2555 qimage_converter_map[QImage::Format_ARGB32][QImage::Format_Indexed8] = convert_ARGB_to_Indexed8;
2556 qimage_converter_map[QImage::Format_ARGB32][QImage::Format_RGB32] = mask_alpha_converter;
2557 qimage_converter_map[QImage::Format_ARGB32][QImage::Format_RGBX8888] = convert_ARGB_to_RGBx;
2558 qimage_converter_map[QImage::Format_ARGB32][QImage::Format_RGBA8888] = convert_ARGB_to_RGBA;
2560 qimage_converter_map[QImage::Format_ARGB32][QImage::Format_A2BGR30_Premultiplied] = convert_ARGB_to_A2RGB30<PixelOrderBGR,
false>;
2561 qimage_converter_map[QImage::Format_ARGB32][QImage::Format_A2RGB30_Premultiplied] = convert_ARGB_to_A2RGB30<PixelOrderRGB,
false>;
2562 qimage_converter_map[QImage::Format_ARGB32][QImage::Format_RGBA64] = convert_ARGB32_to_RGBA64<
false>;
2563 qimage_converter_map[QImage::Format_ARGB32][QImage::Format_Grayscale8] = convert_ARGB_to_gray8<
false>;
2564 qimage_converter_map[QImage::Format_ARGB32][QImage::Format_Grayscale16] = convert_ARGB_to_gray16<
false>;
2566 qimage_converter_map[QImage::Format_ARGB32_Premultiplied][QImage::Format_Mono] = convert_ARGB_PM_to_Mono;
2567 qimage_converter_map[QImage::Format_ARGB32_Premultiplied][QImage::Format_MonoLSB] = convert_ARGB_PM_to_Mono;
2568 qimage_converter_map[QImage::Format_ARGB32_Premultiplied][QImage::Format_Indexed8] = convert_ARGB_PM_to_Indexed8;
2569 qimage_converter_map[QImage::Format_ARGB32_Premultiplied][QImage::Format_RGBA8888_Premultiplied] = convert_ARGB_to_RGBA;
2570 qimage_converter_map[QImage::Format_ARGB32_Premultiplied][QImage::Format_Grayscale8] = convert_ARGB_to_gray8<
true>;
2571 qimage_converter_map[QImage::Format_ARGB32_Premultiplied][QImage::Format_Grayscale16] = convert_ARGB_to_gray16<
true>;
2573 qimage_converter_map[QImage::Format_RGB888][QImage::Format_RGB32] = convert_RGB888_to_RGB<
false>;
2574 qimage_converter_map[QImage::Format_RGB888][QImage::Format_ARGB32] = convert_RGB888_to_RGB<
false>;
2575 qimage_converter_map[QImage::Format_RGB888][QImage::Format_ARGB32_Premultiplied] = convert_RGB888_to_RGB<
false>;
2576 qimage_converter_map[QImage::Format_RGB888][QImage::Format_RGBX8888] = convert_RGB888_to_RGB<
true>;
2577 qimage_converter_map[QImage::Format_RGB888][QImage::Format_RGBA8888] = convert_RGB888_to_RGB<
true>;
2578 qimage_converter_map[QImage::Format_RGB888][QImage::Format_RGBA8888_Premultiplied] = convert_RGB888_to_RGB<
true>;
2579 qimage_converter_map[QImage::Format_RGB888][QImage::Format_BGR888] = convert_rgbswap_generic;
2581 qimage_converter_map[QImage::Format_RGBX8888][QImage::Format_RGB32] = convert_RGBA_to_RGB;
2582 qimage_converter_map[QImage::Format_RGBX8888][QImage::Format_ARGB32] = convert_RGBA_to_ARGB;
2583 qimage_converter_map[QImage::Format_RGBX8888][QImage::Format_ARGB32_Premultiplied] = convert_RGBA_to_ARGB;
2584 qimage_converter_map[QImage::Format_RGBX8888][QImage::Format_RGBA8888] = convert_passthrough;
2585 qimage_converter_map[QImage::Format_RGBX8888][QImage::Format_RGBA8888_Premultiplied] = convert_passthrough;
2587 qimage_converter_map[QImage::Format_RGBA8888][QImage::Format_RGB32] = convert_RGBA_to_RGB;
2588 qimage_converter_map[QImage::Format_RGBA8888][QImage::Format_ARGB32] = convert_RGBA_to_ARGB;
2589 qimage_converter_map[QImage::Format_RGBA8888][QImage::Format_RGBX8888] = mask_alpha_converter_RGBx;
2590 qimage_converter_map[QImage::Format_RGBA8888][QImage::Format_A2BGR30_Premultiplied] = convert_ARGB_to_A2RGB30<PixelOrderBGR,
true>;
2591 qimage_converter_map[QImage::Format_RGBA8888][QImage::Format_A2RGB30_Premultiplied] = convert_ARGB_to_A2RGB30<PixelOrderRGB,
true>;
2592 qimage_converter_map[QImage::Format_RGBA8888][QImage::Format_RGBA64] = convert_ARGB32_to_RGBA64<
true>;
2594 qimage_converter_map[QImage::Format_RGBA8888_Premultiplied][QImage::Format_ARGB32_Premultiplied] = convert_RGBA_to_ARGB;
2596 qimage_converter_map[QImage::Format_BGR30][QImage::Format_A2BGR30_Premultiplied] = convert_passthrough;
2597 qimage_converter_map[QImage::Format_BGR30][QImage::Format_RGB30] = convert_rgbswap_generic;
2598 qimage_converter_map[QImage::Format_BGR30][QImage::Format_A2RGB30_Premultiplied] = convert_rgbswap_generic;
2600 qimage_converter_map[QImage::Format_A2BGR30_Premultiplied][QImage::Format_ARGB32] = convert_A2RGB30_PM_to_ARGB<PixelOrderBGR,
false>;
2601 qimage_converter_map[QImage::Format_A2BGR30_Premultiplied][QImage::Format_RGBA8888] = convert_A2RGB30_PM_to_ARGB<PixelOrderBGR,
true>;
2602 qimage_converter_map[QImage::Format_A2BGR30_Premultiplied][QImage::Format_BGR30] = convert_A2RGB30_PM_to_RGB30<
false>;
2603 qimage_converter_map[QImage::Format_A2BGR30_Premultiplied][QImage::Format_RGB30] = convert_A2RGB30_PM_to_RGB30<
true>;
2604 qimage_converter_map[QImage::Format_A2BGR30_Premultiplied][QImage::Format_A2RGB30_Premultiplied] = convert_rgbswap_generic;
2606 qimage_converter_map[QImage::Format_RGB30][QImage::Format_BGR30] = convert_rgbswap_generic;
2607 qimage_converter_map[QImage::Format_RGB30][QImage::Format_A2BGR30_Premultiplied] = convert_rgbswap_generic;
2608 qimage_converter_map[QImage::Format_RGB30][QImage::Format_A2RGB30_Premultiplied] = convert_passthrough;
2610 qimage_converter_map[QImage::Format_A2RGB30_Premultiplied][QImage::Format_ARGB32] = convert_A2RGB30_PM_to_ARGB<PixelOrderRGB,
false>;
2611 qimage_converter_map[QImage::Format_A2RGB30_Premultiplied][QImage::Format_RGBA8888] = convert_A2RGB30_PM_to_ARGB<PixelOrderRGB,
true>;
2612 qimage_converter_map[QImage::Format_A2RGB30_Premultiplied][QImage::Format_BGR30] = convert_A2RGB30_PM_to_RGB30<
true>;
2613 qimage_converter_map[QImage::Format_A2RGB30_Premultiplied][QImage::Format_A2BGR30_Premultiplied] = convert_rgbswap_generic;
2614 qimage_converter_map[QImage::Format_A2RGB30_Premultiplied][QImage::Format_RGB30] = convert_A2RGB30_PM_to_RGB30<
false>;
2616 qimage_converter_map[QImage::Format_Grayscale8][QImage::Format_Indexed8] = convert_Grayscale8_to_Indexed8;
2617 qimage_converter_map[QImage::Format_Alpha8][QImage::Format_Indexed8] = convert_Alpha8_to_Indexed8;
2619 qimage_converter_map[QImage::Format_RGBX64][QImage::Format_RGBA64] = convert_passthrough;
2620 qimage_converter_map[QImage::Format_RGBX64][QImage::Format_RGBA64_Premultiplied] = convert_passthrough;
2621 qimage_converter_map[QImage::Format_RGBX64][QImage::Format_Grayscale8] = convert_RGBA64_to_gray8<
false>;
2622 qimage_converter_map[QImage::Format_RGBX64][QImage::Format_Grayscale16] = convert_RGBA64_to_gray16<
false>;
2624 qimage_converter_map[QImage::Format_RGBA64][QImage::Format_ARGB32] = convert_RGBA64_to_ARGB32<
false>;
2625 qimage_converter_map[QImage::Format_RGBA64][QImage::Format_RGBA8888] = convert_RGBA64_to_ARGB32<
true>;
2626 qimage_converter_map[QImage::Format_RGBA64][QImage::Format_RGBX64] = convert_RGBA64_to_RGBx64;
2627 qimage_converter_map[QImage::Format_RGBA64][QImage::Format_Grayscale8] = convert_RGBA64_to_gray8<
false>;
2628 qimage_converter_map[QImage::Format_RGBA64][QImage::Format_Grayscale16] = convert_RGBA64_to_gray16<
false>;
2630 qimage_converter_map[QImage::Format_RGBA64_Premultiplied][QImage::Format_Grayscale8] = convert_RGBA64_to_gray8<
true>;
2631 qimage_converter_map[QImage::Format_RGBA64_Premultiplied][QImage::Format_Grayscale16] = convert_RGBA64_to_gray16<
true>;
2633 qimage_converter_map[QImage::Format_Grayscale16][QImage::Format_RGBX64] = convert_gray16_to_RGBA64;
2634 qimage_converter_map[QImage::Format_Grayscale16][QImage::Format_RGBA64] = convert_gray16_to_RGBA64;
2635 qimage_converter_map[QImage::Format_Grayscale16][QImage::Format_RGBA64_Premultiplied] = convert_gray16_to_RGBA64;
2637 qimage_converter_map[QImage::Format_BGR888][QImage::Format_RGB888] = convert_rgbswap_generic;
2638#if Q_BYTE_ORDER == Q_LITTLE_ENDIAN
2639 qimage_converter_map[QImage::Format_BGR888][QImage::Format_RGBX8888] = convert_RGB888_to_RGB<
false>;
2640 qimage_converter_map[QImage::Format_BGR888][QImage::Format_RGBA8888] = convert_RGB888_to_RGB<
false>;
2641 qimage_converter_map[QImage::Format_BGR888][QImage::Format_RGBA8888_Premultiplied] = convert_RGB888_to_RGB<
false>;
2644 qimage_converter_map[QImage::Format_RGBX16FPx4][QImage::Format_RGBA16FPx4] = convert_passthrough;
2645 qimage_converter_map[QImage::Format_RGBX16FPx4][QImage::Format_RGBA16FPx4_Premultiplied] = convert_passthrough;
2647 qimage_converter_map[QImage::Format_RGBX32FPx4][QImage::Format_RGBA32FPx4] = convert_passthrough;
2648 qimage_converter_map[QImage::Format_RGBX32FPx4][QImage::Format_RGBA32FPx4_Premultiplied] = convert_passthrough;
2650 qimage_converter_map[QImage::Format_CMYK8888][QImage::Format_CMYK8888] = convert_passthrough;
2651 qimage_converter_map[QImage::Format_RGB32][QImage::Format_CMYK8888] = convert_ARGB32_to_CMYK8888<
false>;
2652 qimage_converter_map[QImage::Format_ARGB32][QImage::Format_CMYK8888] = convert_ARGB32_to_CMYK8888<
false>;
2653 qimage_converter_map[QImage::Format_ARGB32_Premultiplied][QImage::Format_CMYK8888] = convert_ARGB32_to_CMYK8888<
true>;
2656 qimage_inplace_converter_map[QImage::Format_Indexed8][QImage::Format_Grayscale8] =
2657 convert_Indexed8_to_Grayscale8_inplace;
2658 qimage_inplace_converter_map[QImage::Format_Indexed8][QImage::Format_Alpha8] =
2659 convert_Indexed8_to_Alpha8_inplace;
2661 qimage_inplace_converter_map[QImage::Format_RGB32][QImage::Format_ARGB32] =
2662 mask_alpha_converter_inplace<QImage::Format_ARGB32>;
2663 qimage_inplace_converter_map[QImage::Format_RGB32][QImage::Format_ARGB32_Premultiplied] =
2664 mask_alpha_converter_inplace<QImage::Format_ARGB32_Premultiplied>;
2666 qimage_inplace_converter_map[QImage::Format_ARGB32][QImage::Format_RGB32] =
2667 mask_alpha_converter_inplace<QImage::Format_RGB32>;
2668 qimage_inplace_converter_map[QImage::Format_ARGB32][QImage::Format_RGBX8888] =
2669 convert_ARGB_to_RGBA_inplace<QImage::Format_RGBX8888>;
2670 qimage_inplace_converter_map[QImage::Format_ARGB32][QImage::Format_RGBA8888] =
2671 convert_ARGB_to_RGBA_inplace<QImage::Format_RGBA8888>;
2672 qimage_inplace_converter_map[QImage::Format_ARGB32][QImage::Format_A2BGR30_Premultiplied] =
2673 convert_ARGB_to_A2RGB30_inplace<PixelOrderBGR,
false>;
2674 qimage_inplace_converter_map[QImage::Format_ARGB32][QImage::Format_A2RGB30_Premultiplied] =
2675 convert_ARGB_to_A2RGB30_inplace<PixelOrderRGB,
false>;
2677 qimage_inplace_converter_map[QImage::Format_ARGB32_Premultiplied][QImage::Format_RGBA8888_Premultiplied] =
2678 convert_ARGB_to_RGBA_inplace<QImage::Format_RGBA8888_Premultiplied>;
2680 qimage_inplace_converter_map[QImage::Format_RGB888][QImage::Format_BGR888] =
2681 convert_rgbswap_generic_inplace;
2683 qimage_inplace_converter_map[QImage::Format_RGBX8888][QImage::Format_RGB32] =
2684 convert_RGBA_to_ARGB_inplace<QImage::Format_RGB32>;
2685 qimage_inplace_converter_map[QImage::Format_RGBX8888][QImage::Format_ARGB32] =
2686 convert_RGBA_to_ARGB_inplace<QImage::Format_ARGB32>;
2687 qimage_inplace_converter_map[QImage::Format_RGBX8888][QImage::Format_ARGB32_Premultiplied] =
2688 convert_RGBA_to_ARGB_inplace<QImage::Format_ARGB32_Premultiplied>;
2689 qimage_inplace_converter_map[QImage::Format_RGBX8888][QImage::Format_RGBA8888] =
2690 convert_passthrough_inplace<QImage::Format_RGBA8888>;
2691 qimage_inplace_converter_map[QImage::Format_RGBX8888][QImage::Format_RGBA8888_Premultiplied] =
2692 convert_passthrough_inplace<QImage::Format_RGBA8888_Premultiplied>;
2694 qimage_inplace_converter_map[QImage::Format_RGBA8888][QImage::Format_RGB32] =
2695 convert_RGBA_to_ARGB_inplace<QImage::Format_RGB32>;
2696 qimage_inplace_converter_map[QImage::Format_RGBA8888][QImage::Format_ARGB32] =
2697 convert_RGBA_to_ARGB_inplace<QImage::Format_ARGB32>;
2698 qimage_inplace_converter_map[QImage::Format_RGBA8888][QImage::Format_RGBX8888] =
2699 mask_alpha_converter_rgbx_inplace;
2700 qimage_inplace_converter_map[QImage::Format_RGBA8888][QImage::Format_A2BGR30_Premultiplied] =
2701 convert_ARGB_to_A2RGB30_inplace<PixelOrderBGR,
true>;
2702 qimage_inplace_converter_map[QImage::Format_RGBA8888][QImage::Format_A2RGB30_Premultiplied] =
2703 convert_ARGB_to_A2RGB30_inplace<PixelOrderRGB,
true>;
2705 qimage_inplace_converter_map[QImage::Format_RGBA8888_Premultiplied][QImage::Format_ARGB32_Premultiplied] =
2706 convert_RGBA_to_ARGB_inplace<QImage::Format_ARGB32_Premultiplied>;
2708 qimage_inplace_converter_map[QImage::Format_BGR30][QImage::Format_A2BGR30_Premultiplied] =
2709 convert_passthrough_inplace<QImage::Format_A2BGR30_Premultiplied>;
2710 qimage_inplace_converter_map[QImage::Format_BGR30][QImage::Format_RGB30] =
2711 convert_rgbswap_generic_inplace;
2712 qimage_inplace_converter_map[QImage::Format_BGR30][QImage::Format_A2RGB30_Premultiplied] =
2713 convert_BGR30_to_A2RGB30_inplace;
2715 qimage_inplace_converter_map[QImage::Format_A2BGR30_Premultiplied][QImage::Format_ARGB32] =
2716 convert_A2RGB30_PM_to_ARGB_inplace<PixelOrderBGR,
false>;
2717 qimage_inplace_converter_map[QImage::Format_A2BGR30_Premultiplied][QImage::Format_RGBA8888] =
2718 convert_A2RGB30_PM_to_ARGB_inplace<PixelOrderBGR,
true>;
2719 qimage_inplace_converter_map[QImage::Format_A2BGR30_Premultiplied][QImage::Format_BGR30] =
2720 convert_A2RGB30_PM_to_RGB30_inplace<
false>;
2721 qimage_inplace_converter_map[QImage::Format_A2BGR30_Premultiplied][QImage::Format_RGB30] =
2722 convert_A2RGB30_PM_to_RGB30_inplace<
true>;
2723 qimage_inplace_converter_map[QImage::Format_A2BGR30_Premultiplied][QImage::Format_A2RGB30_Premultiplied] =
2724 convert_rgbswap_generic_inplace;
2726 qimage_inplace_converter_map[QImage::Format_RGB30][QImage::Format_BGR30] =
2727 convert_rgbswap_generic_inplace;
2728 qimage_inplace_converter_map[QImage::Format_RGB30][QImage::Format_A2BGR30_Premultiplied] =
2729 convert_BGR30_to_A2RGB30_inplace;
2730 qimage_inplace_converter_map[QImage::Format_RGB30][QImage::Format_A2RGB30_Premultiplied] =
2731 convert_passthrough_inplace<QImage::Format_A2RGB30_Premultiplied>;
2733 qimage_inplace_converter_map[QImage::Format_A2RGB30_Premultiplied][QImage::Format_ARGB32] =
2734 convert_A2RGB30_PM_to_ARGB_inplace<PixelOrderRGB,
false>;
2735 qimage_inplace_converter_map[QImage::Format_A2RGB30_Premultiplied][QImage::Format_RGBA8888] =
2736 convert_A2RGB30_PM_to_ARGB_inplace<PixelOrderRGB,
true>;
2737 qimage_inplace_converter_map[QImage::Format_A2RGB30_Premultiplied][QImage::Format_BGR30] =
2738 convert_A2RGB30_PM_to_RGB30_inplace<
true>;
2739 qimage_inplace_converter_map[QImage::Format_A2RGB30_Premultiplied][QImage::Format_A2BGR30_Premultiplied] =
2740 convert_rgbswap_generic_inplace;
2741 qimage_inplace_converter_map[QImage::Format_A2RGB30_Premultiplied][QImage::Format_RGB30] =
2742 convert_A2RGB30_PM_to_RGB30_inplace<
false>;
2744 qimage_inplace_converter_map[QImage::Format_Grayscale8][QImage::Format_Indexed8] =
2745 convert_Grayscale8_to_Indexed8_inplace;
2746 qimage_inplace_converter_map[QImage::Format_Alpha8][QImage::Format_Indexed8] =
2747 convert_Alpha8_to_Indexed8_inplace;
2749 qimage_inplace_converter_map[QImage::Format_RGBX64][QImage::Format_RGBA64] =
2750 convert_passthrough_inplace<QImage::Format_RGBA64>;
2751 qimage_inplace_converter_map[QImage::Format_RGBX64][QImage::Format_RGBA64_Premultiplied] =
2752 convert_passthrough_inplace<QImage::Format_RGBA64_Premultiplied>;
2754 qimage_inplace_converter_map[QImage::Format_RGBA64][QImage::Format_RGBX64] =
2755 convert_RGBA64_to_RGBx64_inplace;
2757 qimage_inplace_converter_map[QImage::Format_BGR888][QImage::Format_RGB888] =
2758 convert_rgbswap_generic_inplace;
2760 qimage_inplace_converter_map[QImage::Format_RGBX16FPx4][QImage::Format_RGBA16FPx4] =
2761 convert_passthrough_inplace<QImage::Format_RGBA16FPx4>;
2762 qimage_inplace_converter_map[QImage::Format_RGBX16FPx4][QImage::Format_RGBA16FPx4_Premultiplied] =
2763 convert_passthrough_inplace<QImage::Format_RGBA16FPx4_Premultiplied>;
2765 qimage_inplace_converter_map[QImage::Format_RGBX32FPx4][QImage::Format_RGBA32FPx4] =
2766 convert_passthrough_inplace<QImage::Format_RGBA32FPx4>;
2767 qimage_inplace_converter_map[QImage::Format_RGBX32FPx4][QImage::Format_RGBA32FPx4_Premultiplied] =
2768 convert_passthrough_inplace<QImage::Format_RGBA32FPx4_Premultiplied>;
2771#if defined(__SSE2__
) && defined(QT_COMPILER_SUPPORTS_SSSE3)
2772 if (qCpuHasFeature(SSSE3)) {
2773 extern void convert_RGB888_to_RGB32_ssse3(QImageData *dest,
const QImageData *src, Qt::ImageConversionFlags);
2774 qimage_converter_map[QImage::Format_RGB888][QImage::Format_RGB32] = convert_RGB888_to_RGB32_ssse3;
2775 qimage_converter_map[QImage::Format_RGB888][QImage::Format_ARGB32] = convert_RGB888_to_RGB32_ssse3;
2776 qimage_converter_map[QImage::Format_RGB888][QImage::Format_ARGB32_Premultiplied] = convert_RGB888_to_RGB32_ssse3;
2777 qimage_converter_map[QImage::Format_BGR888][QImage::Format_RGBX8888] = convert_RGB888_to_RGB32_ssse3;
2778 qimage_converter_map[QImage::Format_BGR888][QImage::Format_RGBA8888] = convert_RGB888_to_RGB32_ssse3;
2779 qimage_converter_map[QImage::Format_BGR888][QImage::Format_RGBA8888_Premultiplied] = convert_RGB888_to_RGB32_ssse3;
2783#if defined(QT_COMPILER_SUPPORTS_LSX)
2784 if (qCpuHasFeature(LSX)) {
2785 extern void convert_RGB888_to_RGB32_lsx(QImageData *dest,
const QImageData *src, Qt::ImageConversionFlags);
2786 qimage_converter_map[QImage::Format_RGB888][QImage::Format_RGB32] = convert_RGB888_to_RGB32_lsx;
2787 qimage_converter_map[QImage::Format_RGB888][QImage::Format_ARGB32] = convert_RGB888_to_RGB32_lsx;
2788 qimage_converter_map[QImage::Format_RGB888][QImage::Format_ARGB32_Premultiplied] = convert_RGB888_to_RGB32_lsx;
2789 qimage_converter_map[QImage::Format_BGR888][QImage::Format_RGBX8888] = convert_RGB888_to_RGB32_lsx;
2790 qimage_converter_map[QImage::Format_BGR888][QImage::Format_RGBA8888] = convert_RGB888_to_RGB32_lsx;
2791 qimage_converter_map[QImage::Format_BGR888][QImage::Format_RGBA8888_Premultiplied] = convert_RGB888_to_RGB32_lsx;
2795#if defined(QT_COMPILER_SUPPORTS_LASX)
2796 if (qCpuHasFeature(LASX)) {
2797 extern void convert_RGB888_to_RGB32_lasx(QImageData *dest,
const QImageData *src, Qt::ImageConversionFlags);
2798 qimage_converter_map[QImage::Format_RGB888][QImage::Format_RGB32] = convert_RGB888_to_RGB32_lasx;
2799 qimage_converter_map[QImage::Format_RGB888][QImage::Format_ARGB32] = convert_RGB888_to_RGB32_lasx;
2800 qimage_converter_map[QImage::Format_RGB888][QImage::Format_ARGB32_Premultiplied] = convert_RGB888_to_RGB32_lasx;
2801 qimage_converter_map[QImage::Format_BGR888][QImage::Format_RGBX8888] = convert_RGB888_to_RGB32_lasx;
2802 qimage_converter_map[QImage::Format_BGR888][QImage::Format_RGBA8888] = convert_RGB888_to_RGB32_lasx;
2803 qimage_converter_map[QImage::Format_BGR888][QImage::Format_RGBA8888_Premultiplied] = convert_RGB888_to_RGB32_lasx;
2807#if defined(__ARM_NEON__)
2808 extern void convert_RGB888_to_RGB32_neon(QImageData *dest,
const QImageData *src, Qt::ImageConversionFlags);
2809 qimage_converter_map[QImage::Format_RGB888][QImage::Format_RGB32] = convert_RGB888_to_RGB32_neon;
2810 qimage_converter_map[QImage::Format_RGB888][QImage::Format_ARGB32] = convert_RGB888_to_RGB32_neon;
2811 qimage_converter_map[QImage::Format_RGB888][QImage::Format_ARGB32_Premultiplied] = convert_RGB888_to_RGB32_neon;
2814#if defined(__MIPS_DSPR2__)
2815 extern bool convert_ARGB_to_ARGB_PM_inplace_mips_dspr2(QImageData *data, Qt::ImageConversionFlags);
2816 qimage_inplace_converter_map[QImage::Format_ARGB32][QImage::Format_ARGB32_Premultiplied] = convert_ARGB_to_ARGB_PM_inplace_mips_dspr2;
2818 extern void convert_RGB888_to_RGB32_mips_dspr2(QImageData *dest,
const QImageData *src, Qt::ImageConversionFlags);
2819 qimage_converter_map[QImage::Format_RGB888][QImage::Format_RGB32] = convert_RGB888_to_RGB32_mips_dspr2;
2820 qimage_converter_map[QImage::Format_RGB888][QImage::Format_ARGB32] = convert_RGB888_to_RGB32_mips_dspr2;
2821 qimage_converter_map[QImage::Format_RGB888][QImage::Format_ARGB32_Premultiplied] = convert_RGB888_to_RGB32_mips_dspr2;