diff options
author | Allan Sandfeld Jensen <allan.jensen@qt.io> | 2022-03-16 12:21:40 +0100 |
---|---|---|
committer | Allan Sandfeld Jensen <allan.jensen@qt.io> | 2022-05-26 09:06:45 +0200 |
commit | 734c9f2df26b12b89c8a4de4ae43a15726ff1886 (patch) | |
tree | 4be65958c6b790c63cd35371485c7338cec02ae0 /src/gui/image | |
parent | 34c21d040766d54d959ed835bdf5464f657b7693 (diff) |
Expand QColorTransform
Add comparison operators and an isIdentity() method to detect (1-1)
transforms.
[ChangeLog][QtGui] Added QColorTransform::isIdentity() method. Added QImage::colorTransformed() transitive method.
Change-Id: I5fbcd14e75f2179e43e94e8c5f42cd0a5600790b
Reviewed-by: Eirik Aavitsland <eirik.aavitsland@qt.io>
Diffstat (limited to 'src/gui/image')
-rw-r--r-- | src/gui/image/qimage.cpp | 45 | ||||
-rw-r--r-- | src/gui/image/qimage.h | 2 | ||||
-rw-r--r-- | src/gui/image/qimage_conversions.cpp | 8 |
3 files changed, 47 insertions, 8 deletions
diff --git a/src/gui/image/qimage.cpp b/src/gui/image/qimage.cpp index 5027a09a09..57900d4379 100644 --- a/src/gui/image/qimage.cpp +++ b/src/gui/image/qimage.cpp @@ -1,4 +1,4 @@ -// Copyright (C) 2021 The Qt Company Ltd. +// Copyright (C) 2022 The Qt Company Ltd. // SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only #include "qimage.h" @@ -4979,6 +4979,8 @@ QImage QImage::convertedToColorSpace(const QColorSpace &colorSpace) const { if (!d || !d->colorSpace.isValid() || !colorSpace.isValid()) return QImage(); + if (d->colorSpace == colorSpace) + return *this; QImage image = copy(); image.convertToColorSpace(colorSpace); return image; @@ -5003,6 +5005,8 @@ QColorSpace QImage::colorSpace() const */ void QImage::applyColorTransform(const QColorTransform &transform) { + if (transform.isIdentity()) + return; detach(); if (!d) return; @@ -5054,21 +5058,21 @@ void QImage::applyColorTransform(const QColorTransform &transform) transformSegment = [&](int yStart, int yEnd) { for (int y = yStart; y < yEnd; ++y) { QRgbaFloat32 *scanline = reinterpret_cast<QRgbaFloat32 *>(d->data + y * d->bytes_per_line); - transform.d->apply(scanline, scanline, width(), flags); + QColorTransformPrivate::get(transform)->apply(scanline, scanline, width(), flags); } }; } else if (depth() > 32) { transformSegment = [&](int yStart, int yEnd) { for (int y = yStart; y < yEnd; ++y) { QRgba64 *scanline = reinterpret_cast<QRgba64 *>(d->data + y * d->bytes_per_line); - transform.d->apply(scanline, scanline, width(), flags); + QColorTransformPrivate::get(transform)->apply(scanline, scanline, width(), flags); } }; } else { transformSegment = [&](int yStart, int yEnd) { for (int y = yStart; y < yEnd; ++y) { QRgb *scanline = reinterpret_cast<QRgb *>(d->data + y * d->bytes_per_line); - transform.d->apply(scanline, scanline, width(), flags); + QColorTransformPrivate::get(transform)->apply(scanline, scanline, width(), flags); } }; } @@ -5097,6 +5101,39 @@ void QImage::applyColorTransform(const QColorTransform &transform) *this = std::move(*this).convertToFormat(oldFormat); } +/*! + \since 6.4 + + Returns the image color transformed using \a transform on all pixels in the image. + + \sa applyColorTransform() +*/ +QImage QImage::colorTransformed(const QColorTransform &transform) const & +{ + if (!d || !d->colorSpace.isValid()) + return QImage(); + if (transform.isIdentity()) + return *this; + QImage image = copy(); + image.applyColorTransform(transform); + return image; +} + +/*! + \since 6.4 + \overload + + Returns the image color transformed using \a transform on all pixels in the image. + + \sa applyColorTransform() +*/ +QImage QImage::colorTransformed(const QColorTransform &transform) && +{ + if (!d || !d->colorSpace.isValid()) + return QImage(); + applyColorTransform(transform); + return std::move(*this); +} bool QImageData::convertInPlace(QImage::Format newFormat, Qt::ImageConversionFlags flags) { diff --git a/src/gui/image/qimage.h b/src/gui/image/qimage.h index fd42813115..9e4abd006e 100644 --- a/src/gui/image/qimage.h +++ b/src/gui/image/qimage.h @@ -234,6 +234,8 @@ public: void convertToColorSpace(const QColorSpace &); void setColorSpace(const QColorSpace &); + QImage colorTransformed(const QColorTransform &transform) const &; + QImage colorTransformed(const QColorTransform &transform) &&; void applyColorTransform(const QColorTransform &transform); bool load(QIODevice *device, const char *format); diff --git a/src/gui/image/qimage_conversions.cpp b/src/gui/image/qimage_conversions.cpp index 433134ff7e..fa75bed3c8 100644 --- a/src/gui/image/qimage_conversions.cpp +++ b/src/gui/image/qimage_conversions.cpp @@ -1418,7 +1418,7 @@ static void convert_ARGB_to_gray8(QImageData *dest, const QImageData *src, Qt::I QColorSpace fromCS = src->colorSpace.isValid() ? src->colorSpace : QColorSpace::SRgb; QColorTransform tf = QColorSpacePrivate::get(fromCS)->transformationToXYZ(); - QColorTransformPrivate *tfd = QColorTransformPrivate::get(tf); + const QColorTransformPrivate *tfd = QColorTransformPrivate::get(tf); QColorTransformPrivate::TransformFlags flags = Premultiplied ? QColorTransformPrivate::InputPremultiplied : QColorTransformPrivate::Unpremultiplied; @@ -1448,7 +1448,7 @@ static void convert_ARGB_to_gray16(QImageData *dest, const QImageData *src, Qt:: QColorSpace fromCS = src->colorSpace.isValid() ? src->colorSpace : QColorSpace::SRgb; QColorTransform tf = QColorSpacePrivate::get(fromCS)->transformationToXYZ(); - QColorTransformPrivate *tfd = QColorTransformPrivate::get(tf); + const QColorTransformPrivate *tfd = QColorTransformPrivate::get(tf); QColorTransformPrivate::TransformFlags flags = Premultiplied ? QColorTransformPrivate::InputPremultiplied : QColorTransformPrivate::Unpremultiplied; @@ -1487,7 +1487,7 @@ static void convert_RGBA64_to_gray8(QImageData *dest, const QImageData *src, Qt: QColorSpace fromCS = src->colorSpace.isValid() ? src->colorSpace : QColorSpace::SRgb; QColorTransform tf = QColorSpacePrivate::get(fromCS)->transformationToXYZ(); - QColorTransformPrivate *tfd = QColorTransformPrivate::get(tf); + const QColorTransformPrivate *tfd = QColorTransformPrivate::get(tf); QColorTransformPrivate::TransformFlags flags = Premultiplied ? QColorTransformPrivate::InputPremultiplied : QColorTransformPrivate::Unpremultiplied; @@ -1526,7 +1526,7 @@ static void convert_RGBA64_to_gray16(QImageData *dest, const QImageData *src, Qt QColorSpace fromCS = src->colorSpace.isValid() ? src->colorSpace : QColorSpace::SRgb; QColorTransform tf = QColorSpacePrivate::get(fromCS)->transformationToXYZ(); - QColorTransformPrivate *tfd = QColorTransformPrivate::get(tf); + const QColorTransformPrivate *tfd = QColorTransformPrivate::get(tf); QColorTransformPrivate::TransformFlags flags = Premultiplied ? QColorTransformPrivate::InputPremultiplied : QColorTransformPrivate::Unpremultiplied; |