From 31c251765db45a068f1268027e5dd600151af1e5 Mon Sep 17 00:00:00 2001 From: Allan Sandfeld Jensen Date: Sun, 20 Mar 2016 15:35:23 +0100 Subject: 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) --- src/gui/image/qimage_conversions.cpp | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) (limited to 'src/gui/image/qimage_conversions.cpp') 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(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(destData)) + store(destData, ptr, x, l); x += l; } srcData += src->bytes_per_line; -- cgit v1.2.3