diff options
author | Allan Sandfeld Jensen <allan.jensen@qt.io> | 2020-03-11 14:29:03 +0100 |
---|---|---|
committer | Allan Sandfeld Jensen <allan.jensen@qt.io> | 2020-03-11 15:34:33 +0000 |
commit | 198d8eb5d093db233d7354bb6451e3cb9113fe61 (patch) | |
tree | fb0ad3db0edb9e1d1540bcd68884c8a7d6c1f932 | |
parent | 296bbbfa5098d8af5c4d55facd1497a275e15c70 (diff) |
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 <lars.knoll@qt.io>
Reviewed-by: Eirik Aavitsland <eirik.aavitsland@qt.io>
-rw-r--r-- | src/gui/image/qimage_conversions.cpp | 14 |
1 files changed, 13 insertions, 1 deletions
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); |