diff options
Diffstat (limited to 'src/gui/painting/qpixellayout.cpp')
-rw-r--r-- | src/gui/painting/qpixellayout.cpp | 368 |
1 files changed, 224 insertions, 144 deletions
diff --git a/src/gui/painting/qpixellayout.cpp b/src/gui/painting/qpixellayout.cpp index f181d78a10..4f2f0ae13a 100644 --- a/src/gui/painting/qpixellayout.cpp +++ b/src/gui/painting/qpixellayout.cpp @@ -1,41 +1,5 @@ -/**************************************************************************** -** -** Copyright (C) 2021 The Qt Company Ltd. -** Contact: https://www.qt.io/licensing/ -** -** This file is part of the QtGui module of the Qt Toolkit. -** -** $QT_BEGIN_LICENSE:LGPL$ -** Commercial License Usage -** Licensees holding valid commercial Qt licenses may use this file in -** accordance with the commercial license agreement provided with the -** Software or, alternatively, in accordance with the terms contained in -** a written agreement between you and The Qt Company. For licensing terms -** and conditions see https://www.qt.io/terms-conditions. For further -** information use the contact form at https://www.qt.io/contact-us. -** -** GNU Lesser General Public License Usage -** Alternatively, this file may be used under the terms of the GNU Lesser -** General Public License version 3 as published by the Free Software -** Foundation and appearing in the file LICENSE.LGPL3 included in the -** packaging of this file. Please review the following information to -** ensure the GNU Lesser General Public License version 3 requirements -** will be met: https://www.gnu.org/licenses/lgpl-3.0.html. -** -** GNU General Public License Usage -** Alternatively, this file may be used under the terms of the GNU -** General Public License version 2.0 or (at your option) the GNU General -** Public license version 3 or any later version approved by the KDE Free -** Qt Foundation. The licenses are as published by the Free Software -** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3 -** included in the packaging of this file. Please review the following -** information to ensure the GNU General Public License requirements will -** be met: https://www.gnu.org/licenses/gpl-2.0.html and -** https://www.gnu.org/licenses/gpl-3.0.html. -** -** $QT_END_LICENSE$ -** -****************************************************************************/ +// Copyright (C) 2021 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 <qglobal.h> @@ -43,6 +7,7 @@ #include "qpixellayout_p.h" #include "qrgba64_p.h" #include <QtCore/private/qsimd_p.h> +#include <QtGui/private/qcmyk_p.h> QT_BEGIN_NAMESPACE @@ -248,8 +213,7 @@ inline void QT_FASTCALL storePixel<QPixelLayout::BPP24>(uchar *dest, int index, template <QPixelLayout::BPP bpp> static inline uint QT_FASTCALL fetchPixel(const uchar *, int) { - Q_UNREACHABLE(); - return 0; + Q_UNREACHABLE_RETURN(0); } template <> @@ -302,7 +266,7 @@ template <> inline uint QT_FASTCALL fetchPixel<QPixelLayout::BPP16FPx4>(const uchar *src, int index) { // We have to do the conversion in fetch to fit into a 32bit uint - QRgba16F c = reinterpret_cast<const QRgba16F *>(src)[index]; + QRgbaFloat16 c = reinterpret_cast<const QRgbaFloat16 *>(src)[index]; return c.toArgb32(); } @@ -311,7 +275,7 @@ template <> inline uint QT_FASTCALL fetchPixel<QPixelLayout::BPP32FPx4>(const uchar *src, int index) { // We have to do the conversion in fetch to fit into a 32bit uint - QRgba32F c = reinterpret_cast<const QRgba32F *>(src)[index]; + QRgbaFloat32 c = reinterpret_cast<const QRgbaFloat32 *>(src)[index]; return c.toArgb32(); } @@ -395,13 +359,13 @@ static const QRgba64 *QT_FASTCALL fetchRGBToRGB64(QRgba64 *buffer, const uchar * } template<QImage::Format Format> -static Q_ALWAYS_INLINE QRgba32F convertPixelToRGB32F(uint s) +static Q_ALWAYS_INLINE QRgbaFloat32 convertPixelToRGB32F(uint s) { - return QRgba32F::fromArgb32(convertPixelToRGB32<Format>(s)); + return QRgbaFloat32::fromArgb32(convertPixelToRGB32<Format>(s)); } template<QImage::Format Format> -static const QRgba32F *QT_FASTCALL fetchRGBToRGB32F(QRgba32F *buffer, const uchar *src, int index, int count, +static const QRgbaFloat32 *QT_FASTCALL fetchRGBToRGB32F(QRgbaFloat32 *buffer, const uchar *src, int index, int count, const QList<QRgb> *, QDitherInfo *) { for (int i = 0; i < count; ++i) @@ -502,13 +466,13 @@ static const QRgba64 *QT_FASTCALL fetchARGBPMToRGBA64PM(QRgba64 *buffer, const u } template<QImage::Format Format> -static Q_ALWAYS_INLINE QRgba32F convertPixelToRGBA32F(uint s) +static Q_ALWAYS_INLINE QRgbaFloat32 convertPixelToRGBA32F(uint s) { - return QRgba32F::fromArgb32(convertPixelToARGB32PM<Format>(s)); + return QRgbaFloat32::fromArgb32(convertPixelToARGB32PM<Format>(s)); } template<QImage::Format Format> -static const QRgba32F *QT_FASTCALL fetchARGBPMToRGBA32F(QRgba32F *buffer, const uchar *src, int index, int count, +static const QRgbaFloat32 *QT_FASTCALL fetchARGBPMToRGBA32F(QRgbaFloat32 *buffer, const uchar *src, int index, int count, const QList<QRgb> *, QDitherInfo *) { constexpr QPixelLayout::BPP bpp = bitsPerPixel<Format>(); @@ -518,7 +482,7 @@ static const QRgba32F *QT_FASTCALL fetchARGBPMToRGBA32F(QRgba32F *buffer, const } template<QImage::Format Format> -static const QRgba32F *QT_FASTCALL fetchARGBToRGBA32F(QRgba32F *buffer, const uchar *src, int index, int count, +static const QRgbaFloat32 *QT_FASTCALL fetchARGBToRGBA32F(QRgbaFloat32 *buffer, const uchar *src, int index, int count, const QList<QRgb> *, QDitherInfo *) { constexpr QPixelLayout::BPP bpp = bitsPerPixel<Format>(); @@ -809,12 +773,12 @@ static const QRgba64 *QT_FASTCALL fetchIndexedToRGBA64PM(QRgba64 *buffer, const } template<QPixelLayout::BPP BPP> -static const QRgba32F *QT_FASTCALL fetchIndexedToRGBA32F(QRgba32F *buffer, const uchar *src, int index, int count, +static const QRgbaFloat32 *QT_FASTCALL fetchIndexedToRGBA32F(QRgbaFloat32 *buffer, const uchar *src, int index, int count, const QList<QRgb> *clut, QDitherInfo *) { for (int i = 0; i < count; ++i) { const uint s = fetchPixel<BPP>(src, index + i); - buffer[i] = QRgba32F::fromArgb32(clut->at(s)).premultiplied(); + buffer[i] = QRgbaFloat32::fromArgb32(clut->at(s)).premultiplied(); } return buffer; } @@ -1224,10 +1188,12 @@ static const QRgba64 *QT_FASTCALL fetchRGBA64ToRGBA64PM(QRgba64 *buffer, const u const QRgba64 *s = reinterpret_cast<const QRgba64 *>(src) + index; #ifdef __SSE2__ for (int i = 0; i < count; ++i) { + const auto a = s[i].alpha(); __m128i vs = _mm_loadl_epi64((const __m128i *)(s + i)); __m128i va = _mm_shufflelo_epi16(vs, _MM_SHUFFLE(3, 3, 3, 3)); vs = multiplyAlpha65535(vs, va); _mm_storel_epi64((__m128i *)(buffer + i), vs); + buffer[i].setAlpha(a); } #else for (int i = 0; i < count; ++i) @@ -1389,30 +1355,30 @@ static const QRgba64 *QT_FASTCALL fetchA2RGB30PMToRGBA64PM(QRgba64 *buffer, cons return convertA2RGB30PMToRGBA64PM<PixelOrder>(buffer, reinterpret_cast<const uint *>(src) + index, count, nullptr, nullptr); } -template<enum QtPixelOrder> inline QRgba32F qConvertA2rgb30ToRgbaFP(uint rgb); +template<enum QtPixelOrder> inline QRgbaFloat32 qConvertA2rgb30ToRgbaFP(uint rgb); template<> -inline QRgba32F qConvertA2rgb30ToRgbaFP<PixelOrderBGR>(uint rgb) +inline QRgbaFloat32 qConvertA2rgb30ToRgbaFP<PixelOrderBGR>(uint rgb) { float alpha = (rgb >> 30) * (1.f/3.f); float blue = ((rgb >> 20) & 0x3ff) * (1.f/1023.f); float green = ((rgb >> 10) & 0x3ff) * (1.f/1023.f); float red = (rgb & 0x3ff) * (1.f/1023.f); - return QRgba32F{ red, green, blue, alpha }; + return QRgbaFloat32{ red, green, blue, alpha }; } template<> -inline QRgba32F qConvertA2rgb30ToRgbaFP<PixelOrderRGB>(uint rgb) +inline QRgbaFloat32 qConvertA2rgb30ToRgbaFP<PixelOrderRGB>(uint rgb) { float alpha = (rgb >> 30) * (1.f/3.f); float red = ((rgb >> 20) & 0x3ff) * (1.f/1023.f); float green = ((rgb >> 10) & 0x3ff) * (1.f/1023.f); float blue = (rgb & 0x3ff) * (1.f/1023.f); - return QRgba32F{ red, green, blue, alpha }; + return QRgbaFloat32{ red, green, blue, alpha }; } template<QtPixelOrder PixelOrder> -static const QRgba32F *QT_FASTCALL convertA2RGB30PMToRGBA32F(QRgba32F *buffer, const uint *src, int count, +static const QRgbaFloat32 *QT_FASTCALL convertA2RGB30PMToRGBA32F(QRgbaFloat32 *buffer, const uint *src, int count, const QList<QRgb> *, QDitherInfo *) { for (int i = 0; i < count; ++i) @@ -1421,7 +1387,7 @@ static const QRgba32F *QT_FASTCALL convertA2RGB30PMToRGBA32F(QRgba32F *buffer, c } template<QtPixelOrder PixelOrder> -static const QRgba32F *QT_FASTCALL fetchRGB30ToRGBA32F(QRgba32F *buffer, const uchar *src, int index, int count, +static const QRgbaFloat32 *QT_FASTCALL fetchRGB30ToRGBA32F(QRgbaFloat32 *buffer, const uchar *src, int index, int count, const QList<QRgb> *, QDitherInfo *) { return convertA2RGB30PMToRGBA32F<PixelOrder>(buffer, reinterpret_cast<const uint *>(src) + index, count, nullptr, nullptr); @@ -1583,7 +1549,7 @@ static void QT_FASTCALL storeRGBA64FromARGB32(uchar *dest, const uint *src, int static const uint *QT_FASTCALL fetchRGB16FToRGB32(uint *buffer, const uchar *src, int index, int count, const QList<QRgb> *, QDitherInfo *) { - const QRgba16F *s = reinterpret_cast<const QRgba16F *>(src) + index; + const QRgbaFloat16 *s = reinterpret_cast<const QRgbaFloat16 *>(src) + index; for (int i = 0; i < count; ++i) buffer[i] = s[i].toArgb32(); return buffer; @@ -1592,15 +1558,15 @@ static const uint *QT_FASTCALL fetchRGB16FToRGB32(uint *buffer, const uchar *src static void QT_FASTCALL storeRGB16FFromRGB32(uchar *dest, const uint *src, int index, int count, const QList<QRgb> *, QDitherInfo *) { - QRgba16F *d = reinterpret_cast<QRgba16F *>(dest) + index; + QRgbaFloat16 *d = reinterpret_cast<QRgbaFloat16 *>(dest) + index; for (int i = 0; i < count; ++i) - d[i] = QRgba16F::fromArgb32(src[i]); + d[i] = QRgbaFloat16::fromArgb32(src[i]); } static const uint *QT_FASTCALL fetchRGBA16FToARGB32PM(uint *buffer, const uchar *src, int index, int count, const QList<QRgb> *, QDitherInfo *) { - const QRgba16F *s = reinterpret_cast<const QRgba16F *>(src) + index; + const QRgbaFloat16 *s = reinterpret_cast<const QRgbaFloat16 *>(src) + index; for (int i = 0; i < count; ++i) buffer[i] = s[i].premultiplied().toArgb32(); return buffer; @@ -1609,9 +1575,9 @@ static const uint *QT_FASTCALL fetchRGBA16FToARGB32PM(uint *buffer, const uchar static const QRgba64 *QT_FASTCALL fetchRGBA16FToRGBA64PM(QRgba64 *buffer, const uchar *src, int index, int count, const QList<QRgb> *, QDitherInfo *) { - const QRgba16F *s = reinterpret_cast<const QRgba16F *>(src) + index; + const QRgbaFloat16 *s = reinterpret_cast<const QRgbaFloat16 *>(src) + index; for (int i = 0; i < count; ++i) { - QRgba16F c = s[i].premultiplied(); + QRgbaFloat16 c = s[i].premultiplied(); buffer[i] = QRgba64::fromRgba64(c.red16(), c.green16(), c.blue16(), c.alpha16()); } return buffer; @@ -1620,17 +1586,17 @@ static const QRgba64 *QT_FASTCALL fetchRGBA16FToRGBA64PM(QRgba64 *buffer, const static void QT_FASTCALL storeRGBA16FFromARGB32PM(uchar *dest, const uint *src, int index, int count, const QList<QRgb> *, QDitherInfo *) { - QRgba16F *d = reinterpret_cast<QRgba16F *>(dest) + index; + QRgbaFloat16 *d = reinterpret_cast<QRgbaFloat16 *>(dest) + index; for (int i = 0; i < count; ++i) - d[i] = QRgba16F::fromArgb32(src[i]).unpremultiplied(); + d[i] = QRgbaFloat16::fromArgb32(src[i]).unpremultiplied(); } static const QRgba64 *QT_FASTCALL fetchRGBA16FPMToRGBA64PM(QRgba64 *buffer, const uchar *src, int index, int count, const QList<QRgb> *, QDitherInfo *) { - const QRgba16F *s = reinterpret_cast<const QRgba16F *>(src) + index; + const QRgbaFloat16 *s = reinterpret_cast<const QRgbaFloat16 *>(src) + index; for (int i = 0; i < count; ++i) { - QRgba16F c = s[i]; + QRgbaFloat16 c = s[i]; buffer[i] = QRgba64::fromRgba64(c.red16(), c.green16(), c.blue16(), c.alpha16()); } return buffer; @@ -1639,7 +1605,7 @@ static const QRgba64 *QT_FASTCALL fetchRGBA16FPMToRGBA64PM(QRgba64 *buffer, cons static const uint *QT_FASTCALL fetchRGB32FToRGB32(uint *buffer, const uchar *src, int index, int count, const QList<QRgb> *, QDitherInfo *) { - const QRgba32F *s = reinterpret_cast<const QRgba32F *>(src) + index; + const QRgbaFloat32 *s = reinterpret_cast<const QRgbaFloat32 *>(src) + index; for (int i = 0; i < count; ++i) buffer[i] = s[i].toArgb32(); return buffer; @@ -1648,15 +1614,15 @@ static const uint *QT_FASTCALL fetchRGB32FToRGB32(uint *buffer, const uchar *src static void QT_FASTCALL storeRGB32FFromRGB32(uchar *dest, const uint *src, int index, int count, const QList<QRgb> *, QDitherInfo *) { - QRgba32F *d = reinterpret_cast<QRgba32F *>(dest) + index; + QRgbaFloat32 *d = reinterpret_cast<QRgbaFloat32 *>(dest) + index; for (int i = 0; i < count; ++i) - d[i] = QRgba32F::fromArgb32(src[i]); + d[i] = QRgbaFloat32::fromArgb32(src[i]); } static const uint *QT_FASTCALL fetchRGBA32FToARGB32PM(uint *buffer, const uchar *src, int index, int count, const QList<QRgb> *, QDitherInfo *) { - const QRgba32F *s = reinterpret_cast<const QRgba32F *>(src) + index; + const QRgbaFloat32 *s = reinterpret_cast<const QRgbaFloat32 *>(src) + index; for (int i = 0; i < count; ++i) buffer[i] = s[i].premultiplied().toArgb32(); return buffer; @@ -1665,9 +1631,9 @@ static const uint *QT_FASTCALL fetchRGBA32FToARGB32PM(uint *buffer, const uchar static const QRgba64 *QT_FASTCALL fetchRGBA32FToRGBA64PM(QRgba64 *buffer, const uchar *src, int index, int count, const QList<QRgb> *, QDitherInfo *) { - const QRgba32F *s = reinterpret_cast<const QRgba32F *>(src) + index; + const QRgbaFloat32 *s = reinterpret_cast<const QRgbaFloat32 *>(src) + index; for (int i = 0; i < count; ++i) { - QRgba32F c = s[i].premultiplied(); + QRgbaFloat32 c = s[i].premultiplied(); buffer[i] = QRgba64::fromRgba64(c.red16(), c.green16(), c.blue16(), c.alpha16()); } return buffer; @@ -1676,27 +1642,87 @@ static const QRgba64 *QT_FASTCALL fetchRGBA32FToRGBA64PM(QRgba64 *buffer, const static void QT_FASTCALL storeRGBA32FFromARGB32PM(uchar *dest, const uint *src, int index, int count, const QList<QRgb> *, QDitherInfo *) { - QRgba32F *d = reinterpret_cast<QRgba32F *>(dest) + index; + QRgbaFloat32 *d = reinterpret_cast<QRgbaFloat32 *>(dest) + index; for (int i = 0; i < count; ++i) - d[i] = QRgba32F::fromArgb32(src[i]).unpremultiplied(); + d[i] = QRgbaFloat32::fromArgb32(src[i]).unpremultiplied(); } static const QRgba64 *QT_FASTCALL fetchRGBA32FPMToRGBA64PM(QRgba64 *buffer, const uchar *src, int index, int count, const QList<QRgb> *, QDitherInfo *) { - const QRgba32F *s = reinterpret_cast<const QRgba32F *>(src) + index; + const QRgbaFloat32 *s = reinterpret_cast<const QRgbaFloat32 *>(src) + index; for (int i = 0; i < count; ++i) { - QRgba32F c = s[i]; + QRgbaFloat32 c = s[i]; buffer[i] = QRgba64::fromRgba64(c.red16(), c.green16(), c.blue16(), c.alpha16()); } return buffer; } +inline const uint *qt_convertCMYK8888ToARGB32PM(uint *buffer, const uint *src, int count) +{ + UNALIASED_CONVERSION_LOOP(buffer, src, count, [](uint s) { + const QColor color = QCmyk32::fromCmyk32(s).toColor(); + return color.rgba(); + }); + return buffer; +} + +static void QT_FASTCALL convertCMYK8888ToARGB32PM(uint *buffer, int count, const QList<QRgb> *) +{ + qt_convertCMYK8888ToARGB32PM(buffer, buffer, count); +} + +static const QRgba64 *QT_FASTCALL convertCMYK8888ToToRGBA64PM(QRgba64 *buffer, const uint *src, int count, + const QList<QRgb> *, QDitherInfo *) +{ + for (int i = 0; i < count; ++i) + buffer[i] = QCmyk32::fromCmyk32(src[i]).toColor().rgba64(); + return buffer; +} + +static const uint *QT_FASTCALL fetchCMYK8888ToARGB32PM(uint *buffer, const uchar *src, int index, int count, + const QList<QRgb> *, QDitherInfo *) +{ + const uint *s = reinterpret_cast<const uint *>(src) + index; + for (int i = 0; i < count; ++i) + buffer[i] = QCmyk32::fromCmyk32(s[i]).toColor().rgba(); + return buffer; +} + +static const QRgba64 *QT_FASTCALL fetchCMYK8888ToRGBA64PM(QRgba64 *buffer, const uchar *src, int index, int count, + const QList<QRgb> *, QDitherInfo *) +{ + const uint *s = reinterpret_cast<const uint *>(src) + index; + for (int i = 0; i < count; ++i) + buffer[i] = QCmyk32::fromCmyk32(s[i]).toColor().rgba64(); + return buffer; +} + +static void QT_FASTCALL storeCMYK8888FromARGB32PM(uchar *dest, const uint *src, int index, int count, + const QList<QRgb> *, QDitherInfo *) +{ + uint *d = reinterpret_cast<uint *>(dest) + index; + for (int i = 0; i < count; ++i) { + QColor c = qUnpremultiply(src[i]); + d[i] = QCmyk32::fromColor(c).toUint(); + } +} + +static void QT_FASTCALL storeCMYK8888FromRGB32(uchar *dest, const uint *src, int index, int count, + const QList<QRgb> *, QDitherInfo *) +{ + uint *d = reinterpret_cast<uint *>(dest) + index; + for (int i = 0; i < count; ++i) { + QColor c = src[i]; + d[i] = QCmyk32::fromColor(c).toUint(); + } +} + // Note: // convertToArgb32() assumes that no color channel is less than 4 bits. // storeRGBFromARGB32PM() assumes that no color channel is more than 8 bits. // QImage::rgbSwapped() assumes that the red and blue color channels have the same number of bits. -QPixelLayout qPixelLayouts[QImage::NImageFormats] = { +QPixelLayout qPixelLayouts[] = { { false, false, QPixelLayout::BPPNone, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr }, // Format_Invalid { false, false, QPixelLayout::BPP1MSB, nullptr, convertIndexedToARGB32PM, convertIndexedTo<QRgba64>, @@ -1814,9 +1840,13 @@ QPixelLayout qPixelLayouts[QImage::NImageFormats] = { convertPassThrough, nullptr, fetchRGB32FToRGB32, fetchRGBA32FPMToRGBA64PM, storeRGB32FFromRGB32, storeRGB32FFromRGB32 }, // Format_RGBA32FPx4_Premultiplied + { false, false, QPixelLayout::BPP32, nullptr, + convertCMYK8888ToARGB32PM, convertCMYK8888ToToRGBA64PM, + fetchCMYK8888ToARGB32PM, fetchCMYK8888ToRGBA64PM, + storeCMYK8888FromARGB32PM, storeCMYK8888FromRGB32 }, // Format_CMYK8888 }; -static_assert(sizeof(qPixelLayouts) / sizeof(*qPixelLayouts) == QImage::NImageFormats); +static_assert(std::size(qPixelLayouts) == QImage::NImageFormats); static void QT_FASTCALL convertFromRgb64(uint *dest, const QRgba64 *src, int length) { @@ -1902,7 +1932,7 @@ static void QT_FASTCALL storeGray16FromRGBA64PM(uchar *dest, const QRgba64 *src, static void QT_FASTCALL storeRGBX16FFromRGBA64PM(uchar *dest, const QRgba64 *src, int index, int count, const QList<QRgb> *, QDitherInfo *) { - QRgba16F *d = reinterpret_cast<QRgba16F *>(dest) + index; + QRgbaFloat16 *d = reinterpret_cast<QRgbaFloat16 *>(dest) + index; for (int i = 0; i < count; ++i) { d[i] = qConvertRgb64ToRgbaF16(src[i]).unpremultiplied(); d[i].setAlpha(1.0); @@ -1912,7 +1942,7 @@ static void QT_FASTCALL storeRGBX16FFromRGBA64PM(uchar *dest, const QRgba64 *src static void QT_FASTCALL storeRGBA16FFromRGBA64PM(uchar *dest, const QRgba64 *src, int index, int count, const QList<QRgb> *, QDitherInfo *) { - QRgba16F *d = reinterpret_cast<QRgba16F *>(dest) + index; + QRgbaFloat16 *d = reinterpret_cast<QRgbaFloat16 *>(dest) + index; for (int i = 0; i < count; ++i) d[i] = qConvertRgb64ToRgbaF16(src[i]).unpremultiplied(); } @@ -1920,7 +1950,7 @@ static void QT_FASTCALL storeRGBA16FFromRGBA64PM(uchar *dest, const QRgba64 *src static void QT_FASTCALL storeRGBA16FPMFromRGBA64PM(uchar *dest, const QRgba64 *src, int index, int count, const QList<QRgb> *, QDitherInfo *) { - QRgba16F *d = reinterpret_cast<QRgba16F *>(dest) + index; + QRgbaFloat16 *d = reinterpret_cast<QRgbaFloat16 *>(dest) + index; for (int i = 0; i < count; ++i) d[i] = qConvertRgb64ToRgbaF16(src[i]); } @@ -1928,7 +1958,7 @@ static void QT_FASTCALL storeRGBA16FPMFromRGBA64PM(uchar *dest, const QRgba64 *s static void QT_FASTCALL storeRGBX32FFromRGBA64PM(uchar *dest, const QRgba64 *src, int index, int count, const QList<QRgb> *, QDitherInfo *) { - QRgba32F *d = reinterpret_cast<QRgba32F *>(dest) + index; + QRgbaFloat32 *d = reinterpret_cast<QRgbaFloat32 *>(dest) + index; for (int i = 0; i < count; ++i) { d[i] = qConvertRgb64ToRgbaF32(src[i]).unpremultiplied(); d[i].setAlpha(1.0); @@ -1938,7 +1968,7 @@ static void QT_FASTCALL storeRGBX32FFromRGBA64PM(uchar *dest, const QRgba64 *src static void QT_FASTCALL storeRGBA32FFromRGBA64PM(uchar *dest, const QRgba64 *src, int index, int count, const QList<QRgb> *, QDitherInfo *) { - QRgba32F *d = reinterpret_cast<QRgba32F *>(dest) + index; + QRgbaFloat32 *d = reinterpret_cast<QRgbaFloat32 *>(dest) + index; for (int i = 0; i < count; ++i) d[i] = qConvertRgb64ToRgbaF32(src[i]).unpremultiplied(); } @@ -1946,12 +1976,20 @@ static void QT_FASTCALL storeRGBA32FFromRGBA64PM(uchar *dest, const QRgba64 *src static void QT_FASTCALL storeRGBA32FPMFromRGBA64PM(uchar *dest, const QRgba64 *src, int index, int count, const QList<QRgb> *, QDitherInfo *) { - QRgba32F *d = reinterpret_cast<QRgba32F *>(dest) + index; + QRgbaFloat32 *d = reinterpret_cast<QRgbaFloat32 *>(dest) + index; for (int i = 0; i < count; ++i) d[i] = qConvertRgb64ToRgbaF32(src[i]); } -ConvertAndStorePixelsFunc64 qStoreFromRGBA64PM[QImage::NImageFormats] = { +static void QT_FASTCALL storeCMYKFromRGBA64PM(uchar *dest, const QRgba64 *src, int index, int count, + const QList<QRgb> *, QDitherInfo *) +{ + uint *d = reinterpret_cast<uint *>(dest) + index; + for (int i = 0; i < count; ++i) + d[i] = QCmyk32::fromColor(QColor(src[i])).toUint(); +} + +ConvertAndStorePixelsFunc64 qStoreFromRGBA64PM[] = { nullptr, nullptr, nullptr, @@ -1988,17 +2026,20 @@ ConvertAndStorePixelsFunc64 qStoreFromRGBA64PM[QImage::NImageFormats] = { storeRGBX32FFromRGBA64PM, storeRGBA32FFromRGBA64PM, storeRGBA32FPMFromRGBA64PM, + storeCMYKFromRGBA64PM, }; +static_assert(std::size(qStoreFromRGBA64PM) == QImage::NImageFormats); + #if QT_CONFIG(raster_fp) -static void QT_FASTCALL convertToRgbaF32(QRgba32F *dest, const uint *src, int length) +static void QT_FASTCALL convertToRgbaF32(QRgbaFloat32 *dest, const uint *src, int length) { for (int i = 0; i < length; ++i) - dest[i] = QRgba32F::fromArgb32(src[i]); + dest[i] = QRgbaFloat32::fromArgb32(src[i]); } template<QImage::Format format> -static const QRgba32F * QT_FASTCALL convertGenericToRGBA32F(QRgba32F *buffer, const uint *src, int count, +static const QRgbaFloat32 * QT_FASTCALL convertGenericToRGBA32F(QRgbaFloat32 *buffer, const uint *src, int count, const QList<QRgb> *clut, QDitherInfo *) { uint buffer32[BufferSize]; @@ -2008,38 +2049,47 @@ static const QRgba32F * QT_FASTCALL convertGenericToRGBA32F(QRgba32F *buffer, co return buffer; } -static const QRgba32F * QT_FASTCALL convertARGB32ToRGBA32F(QRgba32F *buffer, const uint *src, int count, +static const QRgbaFloat32 * QT_FASTCALL convertARGB32ToRGBA32F(QRgbaFloat32 *buffer, const uint *src, int count, const QList<QRgb> *, QDitherInfo *) { for (int i = 0; i < count; ++i) - buffer[i] = QRgba32F::fromArgb32(src[i]).premultiplied(); + buffer[i] = QRgbaFloat32::fromArgb32(src[i]).premultiplied(); return buffer; } -static const QRgba32F * QT_FASTCALL convertRGBA8888ToRGBA32F(QRgba32F *buffer, const uint *src, int count, +static const QRgbaFloat32 * QT_FASTCALL convertRGBA8888ToRGBA32F(QRgbaFloat32 *buffer, const uint *src, int count, const QList<QRgb> *, QDitherInfo *) { for (int i = 0; i < count; ++i) - buffer[i] = QRgba32F::fromArgb32(RGBA2ARGB(src[i])).premultiplied(); + buffer[i] = QRgbaFloat32::fromArgb32(RGBA2ARGB(src[i])).premultiplied(); return buffer; } template<QtPixelOrder PixelOrder> -static const QRgba32F * QT_FASTCALL convertRGB30ToRGBA32F(QRgba32F *buffer, const uint *src, int count, +static const QRgbaFloat32 * QT_FASTCALL convertRGB30ToRGBA32F(QRgbaFloat32 *buffer, const uint *src, int count, const QList<QRgb> *, QDitherInfo *) { for (int i = 0; i < count; ++i) { QRgba64 s = qConvertA2rgb30ToRgb64<PixelOrder>(src[i]); - buffer[i] = QRgba32F::fromRgba64(s.red(), s.green(), s.blue(), s.alpha()); + buffer[i] = QRgbaFloat32::fromRgba64(s.red(), s.green(), s.blue(), s.alpha()); } return buffer; } -ConvertToFPFunc qConvertToRGBA32F[QImage::NImageFormats] = { +static const QRgbaFloat32 * QT_FASTCALL convertCMYKToRGBA32F(QRgbaFloat32 *buffer, const uint *src, int count, + const QList<QRgb> *, QDitherInfo *) +{ + for (int i = 0; i < count; ++i) + buffer[i] = QRgbaFloat32::fromArgb32(QCmyk32::fromCmyk32(src[i]).toColor().rgba()); + + return buffer; +} + +ConvertToFPFunc qConvertToRGBA32F[] = { nullptr, - convertIndexedTo<QRgba32F>, - convertIndexedTo<QRgba32F>, - convertIndexedTo<QRgba32F>, + convertIndexedTo<QRgbaFloat32>, + convertIndexedTo<QRgbaFloat32>, + convertIndexedTo<QRgbaFloat32>, convertGenericToRGBA32F<QImage::Format_RGB32>, convertARGB32ToRGBA32F, convertGenericToRGBA32F<QImage::Format_ARGB32_Premultiplied>, @@ -2059,12 +2109,12 @@ ConvertToFPFunc qConvertToRGBA32F[QImage::NImageFormats] = { convertRGB30ToRGBA32F<PixelOrderBGR>, convertRGB30ToRGBA32F<PixelOrderRGB>, convertRGB30ToRGBA32F<PixelOrderRGB>, - convertAlpha8To<QRgba32F>, - convertGrayscale8To<QRgba32F>, + convertAlpha8To<QRgbaFloat32>, + convertGrayscale8To<QRgbaFloat32>, nullptr, nullptr, nullptr, - convertGrayscale16To<QRgba32F>, + convertGrayscale16To<QRgbaFloat32>, convertGenericToRGBA32F<QImage::Format_BGR888>, nullptr, nullptr, @@ -2072,20 +2122,23 @@ ConvertToFPFunc qConvertToRGBA32F[QImage::NImageFormats] = { nullptr, nullptr, nullptr, + convertCMYKToRGBA32F, }; -static const QRgba32F *QT_FASTCALL fetchRGBX64ToRGBA32F(QRgba32F *buffer, const uchar *src, int index, int count, +static_assert(std::size(qConvertToRGBA32F) == QImage::NImageFormats); + +static const QRgbaFloat32 *QT_FASTCALL fetchRGBX64ToRGBA32F(QRgbaFloat32 *buffer, const uchar *src, int index, int count, const QList<QRgb> *, QDitherInfo *) { const QRgba64 *s = reinterpret_cast<const QRgba64 *>(src) + index; for (int i = 0; i < count; ++i) { QRgba64 c = s[i]; - buffer[i] = QRgba32F::fromRgba64(c.red(), c.green(), c.blue(), 65535); + buffer[i] = QRgbaFloat32::fromRgba64(c.red(), c.green(), c.blue(), 65535); } return buffer; } -static const QRgba32F *QT_FASTCALL fetchRGBA64ToRGBA32F(QRgba32F *buffer, const uchar *src, int index, int count, +static const QRgbaFloat32 *QT_FASTCALL fetchRGBA64ToRGBA32F(QRgbaFloat32 *buffer, const uchar *src, int index, int count, const QList<QRgb> *, QDitherInfo *) { const QRgba64 *s = reinterpret_cast<const QRgba64 *>(src) + index; @@ -2094,7 +2147,7 @@ static const QRgba32F *QT_FASTCALL fetchRGBA64ToRGBA32F(QRgba32F *buffer, const return buffer; } -static const QRgba32F *QT_FASTCALL fetchRGBA64PMToRGBA32F(QRgba32F *buffer, const uchar *src, int index, int count, +static const QRgbaFloat32 *QT_FASTCALL fetchRGBA64PMToRGBA32F(QRgbaFloat32 *buffer, const uchar *src, int index, int count, const QList<QRgb> *, QDitherInfo *) { const QRgba64 *s = reinterpret_cast<const QRgba64 *>(src) + index; @@ -2103,42 +2156,52 @@ static const QRgba32F *QT_FASTCALL fetchRGBA64PMToRGBA32F(QRgba32F *buffer, cons return buffer; } -static const QRgba32F *QT_FASTCALL fetchRGBA16FToRGBA32F(QRgba32F *buffer, const uchar *src, int index, int count, +static const QRgbaFloat32 *QT_FASTCALL fetchRGBA16FToRGBA32F(QRgbaFloat32 *buffer, const uchar *src, int index, int count, const QList<QRgb> *, QDitherInfo *) { - const QRgba16F *s = reinterpret_cast<const QRgba16F *>(src) + index; + const QRgbaFloat16 *s = reinterpret_cast<const QRgbaFloat16 *>(src) + index; for (int i = 0; i < count; ++i) { auto c = s[i].premultiplied(); - buffer[i] = QRgba32F { c.r, c.g, c.b, c.a}; + buffer[i] = QRgbaFloat32 { c.r, c.g, c.b, c.a}; } return buffer; } -static const QRgba32F *QT_FASTCALL fetchRGBA16F(QRgba32F *buffer, const uchar *src, int index, int count, +static const QRgbaFloat32 *QT_FASTCALL fetchRGBA16F(QRgbaFloat32 *buffer, const uchar *src, int index, int count, const QList<QRgb> *, QDitherInfo *) { - const QRgba16F *s = reinterpret_cast<const QRgba16F *>(src) + index; + const QRgbaFloat16 *s = reinterpret_cast<const QRgbaFloat16 *>(src) + index; qFloatFromFloat16((float *)buffer, (const qfloat16 *)s, count * 4); return buffer; } -static const QRgba32F *QT_FASTCALL fetchRGBA32FToRGBA32F(QRgba32F *buffer, const uchar *src, int index, int count, +static const QRgbaFloat32 *QT_FASTCALL fetchRGBA32FToRGBA32F(QRgbaFloat32 *buffer, const uchar *src, int index, int count, const QList<QRgb> *, QDitherInfo *) { - const QRgba32F *s = reinterpret_cast<const QRgba32F *>(src) + index; + const QRgbaFloat32 *s = reinterpret_cast<const QRgbaFloat32 *>(src) + index; for (int i = 0; i < count; ++i) buffer[i] = s[i].premultiplied(); return buffer; } -static const QRgba32F *QT_FASTCALL fetchRGBA32F(QRgba32F *, const uchar *src, int index, int, +static const QRgbaFloat32 *QT_FASTCALL fetchRGBA32F(QRgbaFloat32 *, const uchar *src, int index, int, const QList<QRgb> *, QDitherInfo *) { - const QRgba32F *s = reinterpret_cast<const QRgba32F *>(src) + index; + const QRgbaFloat32 *s = reinterpret_cast<const QRgbaFloat32 *>(src) + index; return s; } -FetchAndConvertPixelsFuncFP qFetchToRGBA32F[QImage::NImageFormats] = { +static const QRgbaFloat32 *QT_FASTCALL fetchCMYKToRGBA32F(QRgbaFloat32 *buffer, const uchar *src, int index, int count, + const QList<QRgb> *, QDitherInfo *) +{ + const uint *s = reinterpret_cast<const uint *>(src) + index; + for (int i = 0; i < count; ++i) + buffer[i] = QRgbaFloat32::fromArgb32(QCmyk32::fromCmyk32(s[i]).toColor().rgba()); + + return buffer; +} + +FetchAndConvertPixelsFuncFP qFetchToRGBA32F[] = { nullptr, fetchIndexedToRGBA32F<QPixelLayout::BPP1MSB>, fetchIndexedToRGBA32F<QPixelLayout::BPP1LSB>, @@ -2162,12 +2225,12 @@ FetchAndConvertPixelsFuncFP qFetchToRGBA32F[QImage::NImageFormats] = { fetchRGB30ToRGBA32F<PixelOrderBGR>, fetchRGB30ToRGBA32F<PixelOrderRGB>, fetchRGB30ToRGBA32F<PixelOrderRGB>, - fetchAlpha8To<QRgba32F>, - fetchGrayscale8To<QRgba32F>, + fetchAlpha8To<QRgbaFloat32>, + fetchGrayscale8To<QRgbaFloat32>, fetchRGBX64ToRGBA32F, fetchRGBA64ToRGBA32F, fetchRGBA64PMToRGBA32F, - fetchGrayscale16To<QRgba32F>, + fetchGrayscale16To<QRgbaFloat32>, fetchRGBToRGB32F<QImage::Format_BGR888>, fetchRGBA16F, fetchRGBA16FToRGBA32F, @@ -2175,16 +2238,19 @@ FetchAndConvertPixelsFuncFP qFetchToRGBA32F[QImage::NImageFormats] = { fetchRGBA32F, fetchRGBA32FToRGBA32F, fetchRGBA32F, + fetchCMYKToRGBA32F, }; -static void QT_FASTCALL convertFromRgba32f(uint *dest, const QRgba32F *src, int length) +static_assert(std::size(qFetchToRGBA32F) == QImage::NImageFormats); + +static void QT_FASTCALL convertFromRgba32f(uint *dest, const QRgbaFloat32 *src, int length) { for (int i = 0; i < length; ++i) dest[i] = src[i].toArgb32(); } template<QImage::Format format> -static void QT_FASTCALL storeGenericFromRGBA32F(uchar *dest, const QRgba32F *src, int index, int count, +static void QT_FASTCALL storeGenericFromRGBA32F(uchar *dest, const QRgbaFloat32 *src, int index, int count, const QList<QRgb> *clut, QDitherInfo *dither) { uint buffer[BufferSize]; @@ -2192,7 +2258,7 @@ static void QT_FASTCALL storeGenericFromRGBA32F(uchar *dest, const QRgba32F *src qPixelLayouts[format].storeFromARGB32PM(dest, buffer, index, count, clut, dither); } -static void QT_FASTCALL storeARGB32FromRGBA32F(uchar *dest, const QRgba32F *src, int index, int count, +static void QT_FASTCALL storeARGB32FromRGBA32F(uchar *dest, const QRgbaFloat32 *src, int index, int count, const QList<QRgb> *, QDitherInfo *) { uint *d = (uint*)dest + index; @@ -2200,7 +2266,7 @@ static void QT_FASTCALL storeARGB32FromRGBA32F(uchar *dest, const QRgba32F *src, d[i] = src[i].unpremultiplied().toArgb32(); } -static void QT_FASTCALL storeRGBA8888FromRGBA32F(uchar *dest, const QRgba32F *src, int index, int count, +static void QT_FASTCALL storeRGBA8888FromRGBA32F(uchar *dest, const QRgbaFloat32 *src, int index, int count, const QList<QRgb> *, QDitherInfo *) { uint *d = (uint*)dest + index; @@ -2209,7 +2275,7 @@ static void QT_FASTCALL storeRGBA8888FromRGBA32F(uchar *dest, const QRgba32F *sr } template<QtPixelOrder PixelOrder> -static void QT_FASTCALL storeRGB30FromRGBA32F(uchar *dest, const QRgba32F *src, int index, int count, +static void QT_FASTCALL storeRGB30FromRGBA32F(uchar *dest, const QRgbaFloat32 *src, int index, int count, const QList<QRgb> *, QDitherInfo *) { uint *d = (uint*)dest + index; @@ -2219,7 +2285,7 @@ static void QT_FASTCALL storeRGB30FromRGBA32F(uchar *dest, const QRgba32F *src, } } -static void QT_FASTCALL storeRGBX64FromRGBA32F(uchar *dest, const QRgba32F *src, int index, int count, +static void QT_FASTCALL storeRGBX64FromRGBA32F(uchar *dest, const QRgbaFloat32 *src, int index, int count, const QList<QRgb> *, QDitherInfo *) { QRgba64 *d = reinterpret_cast<QRgba64 *>(dest) + index; @@ -2229,7 +2295,7 @@ static void QT_FASTCALL storeRGBX64FromRGBA32F(uchar *dest, const QRgba32F *src, } } -static void QT_FASTCALL storeRGBA64FromRGBA32F(uchar *dest, const QRgba32F *src, int index, int count, +static void QT_FASTCALL storeRGBA64FromRGBA32F(uchar *dest, const QRgbaFloat32 *src, int index, int count, const QList<QRgb> *, QDitherInfo *) { QRgba64 *d = reinterpret_cast<QRgba64 *>(dest) + index; @@ -2239,7 +2305,7 @@ static void QT_FASTCALL storeRGBA64FromRGBA32F(uchar *dest, const QRgba32F *src, } } -static void QT_FASTCALL storeRGBA64PMFromRGBA32F(uchar *dest, const QRgba32F *src, int index, int count, +static void QT_FASTCALL storeRGBA64PMFromRGBA32F(uchar *dest, const QRgbaFloat32 *src, int index, int count, const QList<QRgb> *, QDitherInfo *) { QRgba64 *d = reinterpret_cast<QRgba64 *>(dest) + index; @@ -2247,7 +2313,7 @@ static void QT_FASTCALL storeRGBA64PMFromRGBA32F(uchar *dest, const QRgba32F *sr d[i] = QRgba64::fromRgba64(src[i].red16(), src[i].green16(), src[i].blue16(), src[i].alpha16()); } -static void QT_FASTCALL storeGray16FromRGBA32F(uchar *dest, const QRgba32F *src, int index, int count, +static void QT_FASTCALL storeGray16FromRGBA32F(uchar *dest, const QRgbaFloat32 *src, int index, int count, const QList<QRgb> *, QDitherInfo *) { quint16 *d = reinterpret_cast<quint16 *>(dest) + index; @@ -2257,37 +2323,37 @@ static void QT_FASTCALL storeGray16FromRGBA32F(uchar *dest, const QRgba32F *src, } } -static void QT_FASTCALL storeRGBX16FFromRGBA32F(uchar *dest, const QRgba32F *src, int index, int count, +static void QT_FASTCALL storeRGBX16FFromRGBA32F(uchar *dest, const QRgbaFloat32 *src, int index, int count, const QList<QRgb> *, QDitherInfo *) { - QRgba16F *d = reinterpret_cast<QRgba16F *>(dest) + index; + QRgbaFloat16 *d = reinterpret_cast<QRgbaFloat16 *>(dest) + index; for (int i = 0; i < count; ++i) { auto s = src[i].unpremultiplied(); - d[i] = QRgba16F{ s.r, s.g, s.b, 1.0f }; + d[i] = QRgbaFloat16{ qfloat16(s.r), qfloat16(s.g), qfloat16(s.b), qfloat16(1.0f) }; } } -static void QT_FASTCALL storeRGBA16FFromRGBA32F(uchar *dest, const QRgba32F *src, int index, int count, +static void QT_FASTCALL storeRGBA16FFromRGBA32F(uchar *dest, const QRgbaFloat32 *src, int index, int count, const QList<QRgb> *, QDitherInfo *) { - QRgba16F *d = reinterpret_cast<QRgba16F *>(dest) + index; + QRgbaFloat16 *d = reinterpret_cast<QRgbaFloat16 *>(dest) + index; for (int i = 0; i < count; ++i) { auto s = src[i].unpremultiplied(); - d[i] = QRgba16F{ s.r, s.g, s.b, s.a }; + d[i] = QRgbaFloat16{ qfloat16(s.r), qfloat16(s.g), qfloat16(s.b), qfloat16(s.a) }; } } -static void QT_FASTCALL storeRGBA16FPMFromRGBA32F(uchar *dest, const QRgba32F *src, int index, int count, +static void QT_FASTCALL storeRGBA16FPMFromRGBA32F(uchar *dest, const QRgbaFloat32 *src, int index, int count, const QList<QRgb> *, QDitherInfo *) { - QRgba16F *d = reinterpret_cast<QRgba16F *>(dest) + index; + QRgbaFloat16 *d = reinterpret_cast<QRgbaFloat16 *>(dest) + index; qFloatToFloat16((qfloat16 *)d, (const float *)src, count * 4); } -static void QT_FASTCALL storeRGBX32FFromRGBA32F(uchar *dest, const QRgba32F *src, int index, int count, +static void QT_FASTCALL storeRGBX32FFromRGBA32F(uchar *dest, const QRgbaFloat32 *src, int index, int count, const QList<QRgb> *, QDitherInfo *) { - QRgba32F *d = reinterpret_cast<QRgba32F *>(dest) + index; + QRgbaFloat32 *d = reinterpret_cast<QRgbaFloat32 *>(dest) + index; for (int i = 0; i < count; ++i) { auto s = src[i].unpremultiplied(); s.a = 1.0f; @@ -2295,25 +2361,35 @@ static void QT_FASTCALL storeRGBX32FFromRGBA32F(uchar *dest, const QRgba32F *src } } -static void QT_FASTCALL storeRGBA32FFromRGBA32F(uchar *dest, const QRgba32F *src, int index, int count, +static void QT_FASTCALL storeRGBA32FFromRGBA32F(uchar *dest, const QRgbaFloat32 *src, int index, int count, const QList<QRgb> *, QDitherInfo *) { - QRgba32F *d = reinterpret_cast<QRgba32F *>(dest) + index; + QRgbaFloat32 *d = reinterpret_cast<QRgbaFloat32 *>(dest) + index; for (int i = 0; i < count; ++i) d[i] = src[i].unpremultiplied(); } -static void QT_FASTCALL storeRGBA32FPMFromRGBA32F(uchar *dest, const QRgba32F *src, int index, int count, +static void QT_FASTCALL storeRGBA32FPMFromRGBA32F(uchar *dest, const QRgbaFloat32 *src, int index, int count, const QList<QRgb> *, QDitherInfo *) { - QRgba32F *d = reinterpret_cast<QRgba32F *>(dest) + index; + QRgbaFloat32 *d = reinterpret_cast<QRgbaFloat32 *>(dest) + index; if (d != src) { for (int i = 0; i < count; ++i) d[i] = src[i]; } } -ConvertAndStorePixelsFuncFP qStoreFromRGBA32F[QImage::NImageFormats] = { +static void QT_FASTCALL storeCMYKFromRGBA32F(uchar *dest, const QRgbaFloat32 *src, int index, int count, + const QList<QRgb> *, QDitherInfo *) +{ + uint *d = reinterpret_cast<uint *>(dest) + index; + for (int i = 0; i < count; ++i) { + // Yikes, this really needs enablers in QColor and friends + d[i] = QCmyk32::fromColor(QColor(src[i].toArgb32())).toUint(); + } +} + +ConvertAndStorePixelsFuncFP qStoreFromRGBA32F[] = { nullptr, nullptr, nullptr, @@ -2350,7 +2426,11 @@ ConvertAndStorePixelsFuncFP qStoreFromRGBA32F[QImage::NImageFormats] = { storeRGBX32FFromRGBA32F, storeRGBA32FFromRGBA32F, storeRGBA32FPMFromRGBA32F, + storeCMYKFromRGBA32F, }; + +static_assert(std::size(qStoreFromRGBA32F) == QImage::NImageFormats); + #endif // QT_CONFIG(raster_fp) QT_END_NAMESPACE |