diff options
Diffstat (limited to 'src/gui/image/qimage.cpp')
-rw-r--r-- | src/gui/image/qimage.cpp | 17 |
1 files changed, 14 insertions, 3 deletions
diff --git a/src/gui/image/qimage.cpp b/src/gui/image/qimage.cpp index 7152ac1607..53bb3beb10 100644 --- a/src/gui/image/qimage.cpp +++ b/src/gui/image/qimage.cpp @@ -4975,7 +4975,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; } @@ -5017,6 +5018,14 @@ QColorSpace QImage::colorSpace() const */ void QImage::applyColorTransform(const QColorTransform &transform) { + detach(); + if (!d) + return; + if (pixelFormat().colorModel() == QPixelFormat::Indexed) { + for (int i = 0; i < d->colortable.size(); ++i) + d->colortable[i] = transform.map(d->colortable[i]); + return; + } QImage::Format oldFormat = format(); if (depth() > 32) { if (format() != QImage::Format_RGBX64 && format() != QImage::Format_RGBA64 @@ -5052,14 +5061,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); } }; @@ -5648,3 +5657,5 @@ QMap<QString, QString> qt_getImageTextFromDescription(const QString &description } QT_END_NAMESPACE + +#include "moc_qimage.cpp" |