From 198d8eb5d093db233d7354bb6451e3cb9113fe61 Mon Sep 17 00:00:00 2001 From: Allan Sandfeld Jensen Date: Wed, 11 Mar 2020 14:29:03 +0100 Subject: [PATCH] Fix multi-threaded shrinking conversion The conversion takes place in separate blocks, but may need to be compressed after converting. Fixes: QTBUG-82818 Change-Id: I71431af3d41e1bfe1f9b3d8cd7c1e0a2020846cd Reviewed-by: Lars Knoll Reviewed-by: Eirik Aavitsland --- src/gui/image/qimage_conversions.cpp | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/src/gui/image/qimage_conversions.cpp b/src/gui/image/qimage_conversions.cpp index c02c0c0d97..6ddd08d08d 100644 --- a/src/gui/image/qimage_conversions.cpp +++ b/src/gui/image/qimage_conversions.cpp @@ -365,7 +365,7 @@ bool convert_generic_inplace(QImageData *data, QImage::Format dst_format, Qt::Im uint buf[BufferSize]; uint *buffer = buf; uchar *srcData = data->data + data->bytes_per_line * yStart; - uchar *destData = srcData; + uchar *destData = srcData; // This can be temporarily wrong if we doing a shrinking conversion QDitherInfo dither; QDitherInfo *ditherPtr = nullptr; if ((flags & Qt::PreferDither) && (flags & Qt::Dither_Mask) != Qt::ThresholdDither) @@ -403,6 +403,18 @@ bool convert_generic_inplace(QImageData *data, QImage::Format dst_format, Qt::Im y += yn; } semaphore.acquire(segments); + if (data->bytes_per_line != params.bytesPerLine) { + // Compress segments to a continuous block + y = 0; + for (int i = 0; i < segments; ++i) { + int yn = (data->height - y) / (segments - i); + uchar *srcData = data->data + data->bytes_per_line * y; + uchar *destData = data->data + params.bytesPerLine * y; + if (srcData != destData) + memmove(destData, srcData, params.bytesPerLine * yn); + y += yn; + } + } } else #endif convertSegment(0, data->height);