summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorAllan Sandfeld Jensen <allan.jensen@digia.com>2016-03-20 15:35:23 +0100
committerAllan Sandfeld Jensen <allan.jensen@qt.io>2016-09-20 23:21:11 +0000
commit31c251765db45a068f1268027e5dd600151af1e5 (patch)
tree6fc9072ffe90395f12e954e56350b5d8ba8f4945 /src
parentb69ac5a0afdea04e75e598a9e0ae1f8c60678b9b (diff)
Save memcpy when converting to 32bit formats
If the destination format is 32bit, we can convert directly in the destination instead of in a buffer. Change-Id: I2b4407da77b863deec7869c341e1a8d464b46600 Reviewed-by: Olivier Goffart (Woboq GmbH) <ogoffart@woboq.com>
Diffstat (limited to 'src')
-rw-r--r--src/gui/image/qimage_conversions.cpp12
1 files changed, 9 insertions, 3 deletions
diff --git a/src/gui/image/qimage_conversions.cpp b/src/gui/image/qimage_conversions.cpp
index 442492d198..9bd098b7b1 100644
--- a/src/gui/image/qimage_conversions.cpp
+++ b/src/gui/image/qimage_conversions.cpp
@@ -134,7 +134,8 @@ void convert_generic(QImageData *dest, const QImageData *src, Qt::ImageConversio
Q_ASSERT(dest->format > QImage::Format_Indexed8);
Q_ASSERT(src->format > QImage::Format_Indexed8);
const int buffer_size = 2048;
- uint buffer[buffer_size];
+ uint buf[buffer_size];
+ uint *buffer = buf;
const QPixelLayout *srcLayout = &qPixelLayouts[src->format];
const QPixelLayout *destLayout = &qPixelLayouts[dest->format];
const uchar *srcData = src->data;
@@ -169,11 +170,16 @@ void convert_generic(QImageData *dest, const QImageData *src, Qt::ImageConversio
int x = 0;
while (x < src->width) {
dither.x = x;
- int l = qMin(src->width - x, buffer_size);
+ int l = src->width - x;
+ if (destLayout->bpp == QPixelLayout::BPP32)
+ buffer = reinterpret_cast<uint *>(destData) + x;
+ else
+ l = qMin(l, buffer_size);
const uint *ptr = fetch(buffer, srcData, x, l);
ptr = convertToARGB32PM(buffer, ptr, l, 0, ditherPtr);
ptr = convertFromARGB32PM(buffer, ptr, l, 0, ditherPtr);
- store(destData, ptr, x, l);
+ if (ptr != reinterpret_cast<uint *>(destData))
+ store(destData, ptr, x, l);
x += l;
}
srcData += src->bytes_per_line;