Krita Source Code Documentation
Loading...
Searching...
No Matches
KoColorSpaceAbstract.h
Go to the documentation of this file.
1/*
2 * SPDX-FileCopyrightText: 2006 Cyrille Berger <cberger@cberger.net>
3 * SPDX-FileCopyrightText: 2007 Emanuele Tamponi <emanuele@valinor.it>
4 * SPDX-FileCopyrightText: 2021 L. E. Segovia <amy@amyspark.me>
5 * SPDX-License-Identifier: LGPL-2.1-or-later
6 */
7
8#ifndef KOCOLORSPACEABSTRACT_H
9#define KOCOLORSPACEABSTRACT_H
10
11#include <QBitArray>
12#include <klocalizedstring.h>
13
14#include <KoColorSpace.h>
15#include <KoColorProfile.h>
16#include <KoColorSpaceMaths.h>
20#include "KoMixColorsOpImpl.h"
21
22#include "KoConvolutionOpImpl.h"
26
37template<class _CSTrait>
39{
40public:
41 typedef _CSTrait ColorSpaceTraits;
42
43public:
44 KoColorSpaceAbstract(const QString &id, const QString &name)
45 : KoColorSpace(id, name, new KoMixColorsOpImpl< _CSTrait>(), new KoConvolutionOpImpl< _CSTrait>()),
46 m_alphaMaskApplicator(KoAlphaMaskApplicatorFactory::create(colorDepthIdForChannelType<typename _CSTrait::channels_type>(), _CSTrait::channels_nb, _CSTrait::alpha_pos))
47 {
48 }
49
50 quint32 colorChannelCount() const override {
51 if (_CSTrait::alpha_pos == -1)
52 return _CSTrait::channels_nb;
53 else
54 return _CSTrait::channels_nb - 1;
55 }
56
57 quint32 channelCount() const override {
58 return _CSTrait::channels_nb;
59 }
60
61 quint32 alphaPos() const override {
62 return _CSTrait::alpha_pos;
63 }
64
65
66 quint32 pixelSize() const override {
67 return _CSTrait::pixelSize;
68 }
69
70 QString channelValueText(const quint8 *pixel, quint32 channelIndex) const override {
71 return _CSTrait::channelValueText(pixel, channelIndex);
72 }
73
74 QString normalisedChannelValueText(const quint8 *pixel, quint32 channelIndex) const override {
75 return _CSTrait::normalisedChannelValueText(pixel, channelIndex);
76 }
77
78 void normalisedChannelsValue(const quint8 *pixel, QVector<float> &channels) const override {
79 return _CSTrait::normalisedChannelsValue(pixel, channels);
80 }
81
82 void fromNormalisedChannelsValue(quint8 *pixel, const QVector<float> &values) const override {
83 return _CSTrait::fromNormalisedChannelsValue(pixel, values);
84 }
85
86 quint8 scaleToU8(const quint8 * srcPixel, qint32 channelIndex) const override {
87 typename _CSTrait::channels_type c = _CSTrait::nativeArray(srcPixel)[channelIndex];
89 }
90
91 void singleChannelPixel(quint8 *dstPixel, const quint8 *srcPixel, quint32 channelIndex) const override {
92 _CSTrait::singleChannelPixel(dstPixel, srcPixel, channelIndex);
93 }
94
95 quint8 opacityU8(const quint8 * U8_pixel) const override {
96 return _CSTrait::opacityU8(U8_pixel);
97 }
98
99 qreal opacityF(const quint8 * U8_pixel) const override {
100 return _CSTrait::opacityF(U8_pixel);
101 }
102
103 void setOpacity(quint8 * pixels, quint8 alpha, qint32 nPixels) const override {
104 _CSTrait::setOpacity(pixels, alpha, nPixels);
105 }
106
107 void setOpacity(quint8 * pixels, qreal alpha, qint32 nPixels) const override {
108 _CSTrait::setOpacity(pixels, alpha, nPixels);
109 }
110
111 void copyOpacityU8(quint8* src, quint8 *dst, qint32 nPixels) const override {
112 _CSTrait::copyOpacityU8(src, dst, nPixels);
113 }
114
115 void multiplyAlpha(quint8 * pixels, quint8 alpha, qint32 nPixels) const override {
116 _CSTrait::multiplyAlpha(pixels, alpha, nPixels);
117 }
118
119 void applyAlphaU8Mask(quint8 * pixels, const quint8 * alpha, qint32 nPixels) const override {
120 _CSTrait::applyAlphaU8Mask(pixels, alpha, nPixels);
121 }
122
123 void applyInverseAlphaU8Mask(quint8 * pixels, const quint8 * alpha, qint32 nPixels) const override {
124 _CSTrait::applyInverseAlphaU8Mask(pixels, alpha, nPixels);
125 }
126
127 void applyAlphaNormedFloatMask(quint8 * pixels, const float * alpha, qint32 nPixels) const override {
128 _CSTrait::applyAlphaNormedFloatMask(pixels, alpha, nPixels);
129 }
130
131 void applyInverseNormedFloatMask(quint8 * pixels, const float * alpha, qint32 nPixels) const override {
132 m_alphaMaskApplicator->applyInverseNormedFloatMask(pixels, alpha, nPixels);
133 }
134
135 void fillInverseAlphaNormedFloatMaskWithColor(quint8 * pixels, const float * alpha, const quint8 *brushColor, qint32 nPixels) const override {
136 m_alphaMaskApplicator->fillInverseAlphaNormedFloatMaskWithColor(pixels, alpha, brushColor, nPixels);
137 }
138
139 void fillGrayBrushWithColor(quint8 *dst, const QRgb *brush, quint8 *brushColor, qint32 nPixels) const override {
140 m_alphaMaskApplicator->fillGrayBrushWithColor(dst, brush, brushColor, nPixels);
141 }
142
146 void toQColor16(const quint8 *src, QColor *c) const override {
147 this->toQColor(src, c);
148 }
149
150 quint8 intensity8(const quint8 * src) const override {
151 QColor c;
152 const_cast<KoColorSpaceAbstract<_CSTrait> *>(this)->toQColor(src, &c);
153 // Integer version of:
154 // static_cast<quint8>(qRound(c.red() * 0.30 + c.green() * 0.59 + c.blue() * 0.11))
155 // The "+ 50" is used for rounding
156 return static_cast<quint8>((c.red() * 30 + c.green() * 59 + c.blue() * 11 + 50) / 100);
157 }
158
159 qreal intensityF(const quint8 * src) const override {
160 QColor c;
161 const_cast<KoColorSpaceAbstract<_CSTrait> *>(this)->toQColor16(src, &c);
162 return c.redF() * 0.30 + c.greenF() * 0.59 + c.blueF() * 0.11;
163 }
164
168
169 KoColorTransformation *createDarkenAdjustment(qint32 shade, bool compensate, qreal compensation) const override {
170 return new KoFallBackColorTransformation(this, KoColorSpaceRegistry::instance()->lab16(""), new KoLabDarkenColorTransformation<quint16>(shade, compensate, compensation, KoColorSpaceRegistry::instance()->lab16("")));
171 }
172
173 void convertChannelToVisualRepresentation(const quint8 *src, quint8 *dst, quint32 nPixels, const qint32 selectedChannelIndex) const override
174 {
175 const int alphaPos = _CSTrait::alpha_pos;
176
177 for (uint pixelIndex = 0; pixelIndex < nPixels; ++pixelIndex) {
178
179 const quint8 *srcPtr = src + pixelIndex * _CSTrait::pixelSize;
180 quint8 *dstPtr = dst + pixelIndex * _CSTrait::pixelSize;
181
182 const typename _CSTrait::channels_type *srcPixel = _CSTrait::nativeArray(srcPtr);
183 typename _CSTrait::channels_type *dstPixel = _CSTrait::nativeArray(dstPtr);
184
185 typename _CSTrait::channels_type commonChannel = srcPixel[selectedChannelIndex];
186
187 for (uint channelIndex = 0; channelIndex < _CSTrait::channels_nb; ++channelIndex) {
188
189 if (channelIndex != alphaPos) {
190 dstPixel[channelIndex] = commonChannel;
191 } else {
192 dstPixel[channelIndex] = srcPixel[channelIndex];
193 }
194 }
195 }
196 }
197
198 void convertChannelToVisualRepresentation(const quint8 *src, quint8 *dst, quint32 nPixels, const QBitArray selectedChannels) const override
199 {
200 for (uint pixelIndex = 0; pixelIndex < nPixels; ++pixelIndex) {
201 const quint8 *srcPtr = src + pixelIndex * _CSTrait::pixelSize;
202 quint8 *dstPtr = dst + pixelIndex * _CSTrait::pixelSize;
203
204 const typename _CSTrait::channels_type *srcPixel = _CSTrait::nativeArray(srcPtr);
205 typename _CSTrait::channels_type *dstPixel = _CSTrait::nativeArray(dstPtr);
206
207 for (uint channelIndex = 0; channelIndex < _CSTrait::channels_nb; ++channelIndex) {
208 if (selectedChannels.testBit(channelIndex)) {
209 dstPixel[channelIndex] = srcPixel[channelIndex];
210 } else {
211 dstPixel[channelIndex] = _CSTrait::math_trait::zeroValue;
212 }
213 }
214 }
215 }
216
217private:
218 QScopedPointer<KoAlphaMaskApplicatorBase> m_alphaMaskApplicator;
219};
220
221#endif // KOCOLORSPACEABSTRACT_H
KoID colorDepthIdForChannelType()
unsigned int uint
qreal opacityF(const quint8 *U8_pixel) const override
void setOpacity(quint8 *pixels, qreal alpha, qint32 nPixels) const override
void applyAlphaU8Mask(quint8 *pixels, const quint8 *alpha, qint32 nPixels) const override
quint32 pixelSize() const override
quint8 scaleToU8(const quint8 *srcPixel, qint32 channelIndex) const override
void fillGrayBrushWithColor(quint8 *dst, const QRgb *brush, quint8 *brushColor, qint32 nPixels) const override
void setOpacity(quint8 *pixels, quint8 alpha, qint32 nPixels) const override
void fromNormalisedChannelsValue(quint8 *pixel, const QVector< float > &values) const override
quint8 intensity8(const quint8 *src) const override
KoColorTransformation * createInvertTransformation() const override
void fillInverseAlphaNormedFloatMaskWithColor(quint8 *pixels, const float *alpha, const quint8 *brushColor, qint32 nPixels) const override
void convertChannelToVisualRepresentation(const quint8 *src, quint8 *dst, quint32 nPixels, const qint32 selectedChannelIndex) const override
QScopedPointer< KoAlphaMaskApplicatorBase > m_alphaMaskApplicator
KoColorSpaceAbstract(const QString &id, const QString &name)
QString normalisedChannelValueText(const quint8 *pixel, quint32 channelIndex) const override
quint32 channelCount() const override
quint32 alphaPos() const override
void multiplyAlpha(quint8 *pixels, quint8 alpha, qint32 nPixels) const override
void normalisedChannelsValue(const quint8 *pixel, QVector< float > &channels) const override
void applyInverseAlphaU8Mask(quint8 *pixels, const quint8 *alpha, qint32 nPixels) const override
quint32 colorChannelCount() const override
void applyAlphaNormedFloatMask(quint8 *pixels, const float *alpha, qint32 nPixels) const override
void copyOpacityU8(quint8 *src, quint8 *dst, qint32 nPixels) const override
void applyInverseNormedFloatMask(quint8 *pixels, const float *alpha, qint32 nPixels) const override
quint8 opacityU8(const quint8 *U8_pixel) const override
qreal intensityF(const quint8 *src) const override
void singleChannelPixel(quint8 *dstPixel, const quint8 *srcPixel, quint32 channelIndex) const override
void convertChannelToVisualRepresentation(const quint8 *src, quint8 *dst, quint32 nPixels, const QBitArray selectedChannels) const override
QString channelValueText(const quint8 *pixel, quint32 channelIndex) const override
KoColorTransformation * createDarkenAdjustment(qint32 shade, bool compensate, qreal compensation) const override
void toQColor16(const quint8 *src, QColor *c) const override
static _Tdst scaleToA(_T a)
virtual void toQColor(const quint8 *src, QColor *c) const =0
QList< KoChannelInfo * > channels
static KoColorTransformation * getTransformator(const KoColorSpace *cs)
unsigned int QRgb
static KoColorSpaceRegistry * instance()