summaryrefslogtreecommitdiffstats
path: root/src/gui/image
diff options
context:
space:
mode:
authorAllan Sandfeld Jensen <allan.jensen@qt.io>2022-03-29 12:23:50 +0200
committerAllan Sandfeld Jensen <allan.jensen@qt.io>2022-04-06 00:04:09 +0200
commitdbae10487e302d36ab32f1e812834b53c1fbec71 (patch)
tree53b14435fff3e21f2e8c06e9a9081e05faec44a5 /src/gui/image
parent08733dff582e220ba381939e74c623a5321fb9a5 (diff)
Detach for colortransforms of indexed formats
We were triggering detach during the transform, but the short-cut for indexed formats wasn't triggering that. Instead make the detach explicit and avoid it during the loop. Pick-to: 6.3 6.2 5.15 Change-Id: I0f12b7f93841342a0770ce3d3c78f26ad19d8dac Reviewed-by: Eirik Aavitsland <eirik.aavitsland@qt.io>
Diffstat (limited to 'src/gui/image')
-rw-r--r--src/gui/image/qimage.cpp8
1 files changed, 5 insertions, 3 deletions
diff --git a/src/gui/image/qimage.cpp b/src/gui/image/qimage.cpp
index b49b47989a..ff1894807d 100644
--- a/src/gui/image/qimage.cpp
+++ b/src/gui/image/qimage.cpp
@@ -4994,7 +4994,8 @@ void QImage::convertToColorSpace(const QColorSpace &colorSpace)
qWarning() << "QImage::convertToColorSpace: Output colorspace is not valid";
return;
}
- detach();
+ if (d->colorSpace == colorSpace)
+ return;
applyColorTransform(d->colorSpace.transformationToColorSpace(colorSpace));
d->colorSpace = colorSpace;
}
@@ -5036,6 +5037,7 @@ QColorSpace QImage::colorSpace() const
*/
void QImage::applyColorTransform(const QColorTransform &transform)
{
+ detach();
if (!d)
return;
if (pixelFormat().colorModel() == QPixelFormat::Indexed) {
@@ -5078,14 +5080,14 @@ void QImage::applyColorTransform(const QColorTransform &transform)
if (depth() > 32) {
transformSegment = [&](int yStart, int yEnd) {
for (int y = yStart; y < yEnd; ++y) {
- QRgba64 *scanline = reinterpret_cast<QRgba64 *>(scanLine(y));
+ QRgba64 *scanline = reinterpret_cast<QRgba64 *>(d->data + y * d->bytes_per_line);
transform.d->apply(scanline, scanline, width(), flags);
}
};
} else {
transformSegment = [&](int yStart, int yEnd) {
for (int y = yStart; y < yEnd; ++y) {
- QRgb *scanline = reinterpret_cast<QRgb *>(scanLine(y));
+ QRgb *scanline = reinterpret_cast<QRgb *>(d->data + y * d->bytes_per_line);
transform.d->apply(scanline, scanline, width(), flags);
}
};