summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAllan Sandfeld Jensen <allan.jensen@qt.io>2020-03-11 14:29:03 +0100
committerAllan Sandfeld Jensen <allan.jensen@qt.io>2020-03-11 15:34:33 +0000
commit198d8eb5d093db233d7354bb6451e3cb9113fe61 (patch)
treefb0ad3db0edb9e1d1540bcd68884c8a7d6c1f932
parent296bbbfa5098d8af5c4d55facd1497a275e15c70 (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.cpp14
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);