Add generic rb swap for RGB64 formats
Will also be needed by half-float formats. Change-Id: Ia735b29b65287c63da5f1b5ec25428562d743800 Reviewed-by: Lars Knoll <lars.knoll@qt.io>
This commit is contained in:
parent
a3e5efa8a2
commit
2b9a8b8d69
@ -3408,25 +3408,9 @@ QImage QImage::rgbSwapped_helper() const
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case Format_RGBX64:
|
|
||||||
case Format_RGBA64:
|
|
||||||
case Format_RGBA64_Premultiplied:
|
|
||||||
res = QImage(d->width, d->height, d->format);
|
|
||||||
QIMAGE_SANITYCHECK_MEMORY(res);
|
|
||||||
for (int i = 0; i < d->height; i++) {
|
|
||||||
QRgba64 *q = reinterpret_cast<QRgba64 *>(res.scanLine(i));
|
|
||||||
const QRgba64 *p = reinterpret_cast<const QRgba64 *>(constScanLine(i));
|
|
||||||
const QRgba64 *end = p + d->width;
|
|
||||||
while (p < end) {
|
|
||||||
QRgba64 c = *p;
|
|
||||||
*q = QRgba64::fromRgba64(c.blue(), c.green(), c.red(), c.alpha());
|
|
||||||
p++;
|
|
||||||
q++;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
default:
|
default:
|
||||||
res = QImage(d->width, d->height, d->format);
|
res = QImage(d->width, d->height, d->format);
|
||||||
|
QIMAGE_SANITYCHECK_MEMORY(res);
|
||||||
rgbSwapped_generic(d->width, d->height, this, &res, &qPixelLayouts[d->format]);
|
rgbSwapped_generic(d->width, d->height, this, &res, &qPixelLayouts[d->format]);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
@ -3520,19 +3504,6 @@ void QImage::rgbSwapped_inplace()
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case Format_RGBX64:
|
|
||||||
case Format_RGBA64:
|
|
||||||
case Format_RGBA64_Premultiplied:
|
|
||||||
for (int i = 0; i < d->height; i++) {
|
|
||||||
QRgba64 *p = reinterpret_cast<QRgba64 *>(scanLine(i));
|
|
||||||
QRgba64 *end = p + d->width;
|
|
||||||
while (p < end) {
|
|
||||||
QRgba64 c = *p;
|
|
||||||
*p = QRgba64::fromRgba64(c.blue(), c.green(), c.red(), c.alpha());
|
|
||||||
p++;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
default:
|
default:
|
||||||
rgbSwapped_generic(d->width, d->height, this, this, &qPixelLayouts[d->format]);
|
rgbSwapped_generic(d->width, d->height, this, this, &qPixelLayouts[d->format]);
|
||||||
break;
|
break;
|
||||||
|
@ -568,6 +568,27 @@ static void QT_FASTCALL rbSwap_rgb30(uchar *d, const uchar *s, int count)
|
|||||||
UNALIASED_CONVERSION_LOOP(dest, src, count, qRgbSwapRgb30);
|
UNALIASED_CONVERSION_LOOP(dest, src, count, qRgbSwapRgb30);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void QT_FASTCALL rbSwap_4x16(uchar *d, const uchar *s, int count)
|
||||||
|
{
|
||||||
|
const ushort *src = reinterpret_cast<const ushort *>(s);
|
||||||
|
ushort *dest = reinterpret_cast<ushort *>(d);
|
||||||
|
if (src != dest) {
|
||||||
|
for (int i = 0; i < count; ++i) {
|
||||||
|
dest[i * 4 + 0] = src[i * 4 + 2];
|
||||||
|
dest[i * 4 + 1] = src[i * 4 + 1];
|
||||||
|
dest[i * 4 + 2] = src[i * 4 + 0];
|
||||||
|
dest[i * 4 + 3] = src[i * 4 + 3];
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
for (int i = 0; i < count; ++i) {
|
||||||
|
const ushort r = src[i * 4 + 0];
|
||||||
|
const ushort b = src[i * 4 + 2];
|
||||||
|
dest[i * 4 + 0] = b;
|
||||||
|
dest[i * 4 + 2] = r;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
template<QImage::Format Format> constexpr static inline QPixelLayout pixelLayoutRGB()
|
template<QImage::Format Format> constexpr static inline QPixelLayout pixelLayoutRGB()
|
||||||
{
|
{
|
||||||
return QPixelLayout{
|
return QPixelLayout{
|
||||||
@ -1405,15 +1426,15 @@ QPixelLayout qPixelLayouts[QImage::NImageFormats] = {
|
|||||||
convertGrayscale8ToRGB32, convertGrayscale8ToRGB64,
|
convertGrayscale8ToRGB32, convertGrayscale8ToRGB64,
|
||||||
fetchGrayscale8ToRGB32, fetchGrayscale8ToRGB64,
|
fetchGrayscale8ToRGB32, fetchGrayscale8ToRGB64,
|
||||||
storeGrayscale8FromARGB32PM, storeGrayscale8FromRGB32 }, // Format_Grayscale8
|
storeGrayscale8FromARGB32PM, storeGrayscale8FromRGB32 }, // Format_Grayscale8
|
||||||
{ false, false, QPixelLayout::BPP64, nullptr,
|
{ false, false, QPixelLayout::BPP64, rbSwap_4x16,
|
||||||
convertPassThrough, nullptr,
|
convertPassThrough, nullptr,
|
||||||
fetchRGB64ToRGB32, fetchPassThrough64,
|
fetchRGB64ToRGB32, fetchPassThrough64,
|
||||||
storeRGB64FromRGB32, storeRGB64FromRGB32 }, // Format_RGBX64
|
storeRGB64FromRGB32, storeRGB64FromRGB32 }, // Format_RGBX64
|
||||||
{ true, false, QPixelLayout::BPP64, nullptr,
|
{ true, false, QPixelLayout::BPP64, rbSwap_4x16,
|
||||||
convertARGB32ToARGB32PM, nullptr,
|
convertARGB32ToARGB32PM, nullptr,
|
||||||
fetchRGBA64ToARGB32PM, fetchRGBA64ToRGBA64PM,
|
fetchRGBA64ToARGB32PM, fetchRGBA64ToRGBA64PM,
|
||||||
storeRGBA64FromARGB32PM, storeRGB64FromRGB32 }, // Format_RGBA64
|
storeRGBA64FromARGB32PM, storeRGB64FromRGB32 }, // Format_RGBA64
|
||||||
{ true, true, QPixelLayout::BPP64, nullptr,
|
{ true, true, QPixelLayout::BPP64, rbSwap_4x16,
|
||||||
convertPassThrough, nullptr,
|
convertPassThrough, nullptr,
|
||||||
fetchRGB64ToRGB32, fetchPassThrough64,
|
fetchRGB64ToRGB32, fetchPassThrough64,
|
||||||
storeRGB64FromRGB32, storeRGB64FromRGB32 }, // Format_RGBA64_Premultiplied
|
storeRGB64FromRGB32, storeRGB64FromRGB32 }, // Format_RGBA64_Premultiplied
|
||||||
|
Loading…
x
Reference in New Issue
Block a user