diff options
author | Allan Sandfeld Jensen <allan.jensen@qt.io> | 2022-03-29 12:23:50 +0200 |
---|---|---|
committer | Allan Sandfeld Jensen <allan.jensen@qt.io> | 2022-04-06 00:04:09 +0200 |
commit | dbae10487e302d36ab32f1e812834b53c1fbec71 (patch) | |
tree | 53b14435fff3e21f2e8c06e9a9081e05faec44a5 /src/gui/image | |
parent | 08733dff582e220ba381939e74c623a5321fb9a5 (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.cpp | 8 |
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); } }; |