Krita Source Code Documentation
Loading...
Searching...
No Matches
KoColorConversionAlphaTransformation.cpp
Go to the documentation of this file.
1/*
2 * SPDX-FileCopyrightText: 2007 Cyrille Berger <cberger@cberger.net>
3 *
4 * SPDX-License-Identifier: LGPL-2.1-or-later
5*/
6
8
9#include "KoColorSpace.h"
10#include "KoIntegerMaths.h"
11#include "KoColorSpaceTraits.h"
14
18template <typename alpha_channel_type>
20{
21public:
24 KoColorConversionTransformation::ConversionFlags conversionFlags)
26 {
27 }
28
29 void transform(const quint8 *src, quint8 *dst, qint32 nPixels) const override
30 {
31 const alpha_channel_type *srcPtr = reinterpret_cast<const alpha_channel_type*>(src);
32
33 quint16 data[4];
34 const qint32 pixelSize = dstColorSpace()->pixelSize();
35
36 data[1] = UINT16_MAX / 2; // a
37 data[2] = UINT16_MAX / 2; // b
38 data[3] = UINT16_MAX; // A
39
40 while (nPixels > 0) {
42 dstColorSpace()->fromLabA16((quint8*)data, dst, 1);
43
44 srcPtr++;
45 dst += pixelSize;
46 nPixels--;
47 }
48 }
49};
50
51template <typename alpha_channel_type>
53{
54public:
57 KoColorConversionTransformation::ConversionFlags conversionFlags)
59 {
60 }
61
62 void transform(const quint8 *src, quint8 *dst, qint32 nPixels) const override
63 {
64 const alpha_channel_type *srcPtr = reinterpret_cast<const alpha_channel_type*>(src);
65 quint16 *dstPtr = reinterpret_cast<quint16*>(dst);
66
67 while (nPixels > 0) {
69 dstPtr[1] = UINT16_MAX / 2; // a
70 dstPtr[2] = UINT16_MAX / 2; // b
71 dstPtr[3] = UINT16_MAX; // A
72
73 srcPtr++;
74 dstPtr += 4;
75 nPixels--;
76 }
77 }
78};
79
80
81template <typename alpha_channel_type, typename gray_channel_type>
83{
84public:
86 const KoColorSpace* dstCs,
88 KoColorConversionTransformation::ConversionFlags conversionFlags)
90 {
91 }
92 void transform(const quint8 *src, quint8 *dst, qint32 nPixels) const override {
93 const alpha_channel_type *srcPtr = reinterpret_cast<const alpha_channel_type*>(src);
94 gray_channel_type *dstPtr = reinterpret_cast<gray_channel_type*>(dst);
95
96 while (nPixels > 0) {
99
100 srcPtr++;
101 dstPtr += 2;
102 nPixels--;
103 }
104 }
105};
106
107//------ KoColorConversionFromAlphaTransformationFactoryImpl ------//
108
109template<typename alpha_channel_type>
111 KoColorConversionFromAlphaTransformationFactoryImpl(const QString& _dstModelId, const QString& _dstDepthId, const QString& _dstProfileName)
113 colorDepthIdForChannelType<alpha_channel_type>().id(),
114 "default",
115 _dstModelId, _dstDepthId, _dstProfileName)
116{
117}
118
119template<typename alpha_channel_type>
122 createColorTransformation(const KoColorSpace* srcColorSpace,
123 const KoColorSpace* dstColorSpace,
125 KoColorConversionTransformation::ConversionFlags conversionFlags) const
126{
127 Q_ASSERT(canBeSource(srcColorSpace));
128 Q_ASSERT(canBeDestination(dstColorSpace));
129
130 if (dstColorSpace->colorModelId() == GrayAColorModelID &&
131 dstColorSpace->colorDepthId() == Integer8BitsColorDepthID) {
132 return new KoColorConversionGrayAFromAlphaTransformation<alpha_channel_type, quint8>(srcColorSpace, dstColorSpace, renderingIntent, conversionFlags);
133
134 } else if (dstColorSpace->colorModelId() == GrayAColorModelID &&
135 dstColorSpace->colorDepthId() == Integer16BitsColorDepthID) {
136 return new KoColorConversionGrayAFromAlphaTransformation<alpha_channel_type, quint16>(srcColorSpace, dstColorSpace, renderingIntent, conversionFlags);
137
138 #ifdef HAVE_OPENEXR
139 } else if (dstColorSpace->colorModelId() == GrayAColorModelID &&
140 dstColorSpace->colorDepthId() == Float16BitsColorDepthID) {
141 return new KoColorConversionGrayAFromAlphaTransformation<alpha_channel_type, half>(srcColorSpace, dstColorSpace, renderingIntent, conversionFlags);
142 #endif
143
144 } else if (dstColorSpace->colorModelId() == GrayAColorModelID &&
145 dstColorSpace->colorDepthId() == Float32BitsColorDepthID) {
146 return new KoColorConversionGrayAFromAlphaTransformation<alpha_channel_type, float>(srcColorSpace, dstColorSpace, renderingIntent, conversionFlags);
147
148 } else if (dstColorSpace->colorModelId() == LABAColorModelID &&
149 dstColorSpace->colorDepthId() == Integer16BitsColorDepthID) {
150 return new KoColorConversionAlphaToLab16Transformation<alpha_channel_type>(srcColorSpace, dstColorSpace, renderingIntent, conversionFlags);
151
152 } else {
153 return new KoColorConversionFromAlphaTransformation<alpha_channel_type>(srcColorSpace, dstColorSpace, renderingIntent, conversionFlags);
154 }
155}
156
159#ifdef HAVE_OPENEXR
161#endif
163
164//------ KoColorConversionToAlphaTransformation ------//
165
169template <typename alpha_channel_type>
171{
172public:
173 KoColorConversionToAlphaTransformation(const KoColorSpace* srcCs, const KoColorSpace* dstCs, Intent renderingIntent, ConversionFlags conversionFlags)
174 : KoColorConversionTransformation(srcCs, dstCs, renderingIntent, conversionFlags)
175 {
176 }
177
178 void transform(const quint8 *src, quint8 *dst, qint32 nPixels) const override {
179 alpha_channel_type *dstPtr = reinterpret_cast<alpha_channel_type*>(dst);
180
181 quint16 data[4];
182 qint32 pixelSize = srcColorSpace()->pixelSize();
183
184 while (nPixels > 0) {
185 srcColorSpace()->toLabA16(src, (quint8*)data, 1);
186 *dstPtr = KoColorSpaceMaths<quint16, alpha_channel_type>::scaleToA(UINT16_MULT(data[0], data[3])); // L * A
187
188 src += pixelSize;
189 dstPtr ++;
190 nPixels --;
191
192 }
193 }
194};
195
196template <typename alpha_channel_type>
198{
199public:
201 Intent renderingIntent,
202 KoColorConversionTransformation::ConversionFlags conversionFlags)
203 : KoColorConversionTransformation(srcCs, dstCs, renderingIntent, conversionFlags)
204 {
205 }
206
207 void transform(const quint8 *src, quint8 *dst, qint32 nPixels) const override
208 {
209 const quint16 *srcPtr = reinterpret_cast<const quint16*>(src);
210 alpha_channel_type *dstPtr = reinterpret_cast<alpha_channel_type*>(dst);
211
212 while (nPixels > 0) {
213 *dstPtr = KoColorSpaceMaths<quint16, alpha_channel_type>::scaleToA(UINT16_MULT(srcPtr[0], srcPtr[3])); // L * A
214
215 srcPtr += 4;
216 dstPtr++;
217 nPixels--;
218 }
219 }
220};
221
222
223//------ KoColorConversionGrayAU8ToAlphaTransformation ------//
224
225template <typename gray_channel_type, typename alpha_channel_type>
227{
228public:
230 const KoColorSpace* dstCs,
231 Intent renderingIntent,
232 ConversionFlags conversionFlags)
233 : KoColorConversionTransformation(srcCs, dstCs, renderingIntent, conversionFlags)
234 {
235 }
236
237 void transform(const quint8 *src, quint8 *dst, qint32 nPixels) const override
238 {
239 const gray_channel_type *srcPtr = reinterpret_cast<const gray_channel_type*>(src);
240 alpha_channel_type *dstPtr = reinterpret_cast<alpha_channel_type*>(dst);
241
242 while (nPixels > 0) {
245
246 srcPtr += 2;
247 dstPtr++;
248 nPixels --;
249 }
250 }
251};
252
253//------ KoColorConversionToAlphaTransformationFactoryImpl ------//
254
255template <typename alpha_channel_type>
257 KoColorConversionToAlphaTransformationFactoryImpl(const QString& _srcModelId, const QString& _srcDepthId, const QString& _srcProfileName)
258 : KoColorConversionTransformationFactory(_srcModelId, _srcDepthId, _srcProfileName,
259 AlphaColorModelID.id(), colorDepthIdForChannelType<alpha_channel_type>().id(), "default")
260{
261}
262
263template <typename alpha_channel_type>
266 createColorTransformation(const KoColorSpace* srcColorSpace,
267 const KoColorSpace* dstColorSpace,
269 KoColorConversionTransformation::ConversionFlags conversionFlags) const
270{
271 Q_ASSERT(canBeSource(srcColorSpace));
272 Q_ASSERT(canBeDestination(dstColorSpace));
273
274 if (srcColorSpace->colorModelId() == GrayAColorModelID &&
275 srcColorSpace->colorDepthId() == Integer8BitsColorDepthID) {
276 return new KoColorConversionGrayAToAlphaTransformation<quint8, alpha_channel_type>(srcColorSpace, dstColorSpace, renderingIntent, conversionFlags);
277
278 } else if (srcColorSpace->colorModelId() == GrayAColorModelID &&
279 srcColorSpace->colorDepthId() == Integer16BitsColorDepthID) {
280 return new KoColorConversionGrayAToAlphaTransformation<quint16, alpha_channel_type>(srcColorSpace, dstColorSpace, renderingIntent, conversionFlags);
281
282#ifdef HAVE_OPENEXR
283 } else if (srcColorSpace->colorModelId() == GrayAColorModelID &&
284 srcColorSpace->colorDepthId() == Float16BitsColorDepthID) {
285 return new KoColorConversionGrayAToAlphaTransformation<half, alpha_channel_type>(srcColorSpace, dstColorSpace, renderingIntent, conversionFlags);
286#endif
287
288 } else if (srcColorSpace->colorModelId() == GrayAColorModelID &&
289 srcColorSpace->colorDepthId() == Float32BitsColorDepthID) {
290 return new KoColorConversionGrayAToAlphaTransformation<float, alpha_channel_type>(srcColorSpace, dstColorSpace, renderingIntent, conversionFlags);
291
292 } else if (srcColorSpace->colorModelId() == LABAColorModelID &&
293 srcColorSpace->colorDepthId() == Integer16BitsColorDepthID) {
294 return new KoColorConversionLab16ToAlphaTransformation<alpha_channel_type>(srcColorSpace, dstColorSpace, renderingIntent, conversionFlags);
295
296 } else {
297 return new KoColorConversionToAlphaTransformation<alpha_channel_type>(srcColorSpace, dstColorSpace, renderingIntent, conversionFlags);
298 }
299}
300
303#ifdef HAVE_OPENEXR
305#endif
KoID colorDepthIdForChannelType()
const KoID Float32BitsColorDepthID("F32", ki18n("32-bit float/channel"))
const KoID GrayAColorModelID("GRAYA", ki18n("Grayscale/Alpha"))
const KoID AlphaColorModelID("A", ki18n("Alpha mask"))
const KoID Float16BitsColorDepthID("F16", ki18n("16-bit float/channel"))
const KoID Integer8BitsColorDepthID("U8", ki18n("8-bit integer/channel"))
const KoID Integer16BitsColorDepthID("U16", ki18n("16-bit integer/channel"))
const KoID LABAColorModelID("LABA", ki18n("L*a*b*/Alpha"))
#define UINT16_MAX
uint UINT16_MULT(uint a, uint b)
void transform(const quint8 *src, quint8 *dst, qint32 nPixels) const override
KoColorConversionAlphaToLab16Transformation(const KoColorSpace *srcCs, const KoColorSpace *dstCs, Intent renderingIntent, KoColorConversionTransformation::ConversionFlags conversionFlags)
KoColorConversionFromAlphaTransformationFactoryImpl(const QString &_dstModelId, const QString &_dstDepthId, const QString &_dstProfileName)
KoColorConversionTransformation * createColorTransformation(const KoColorSpace *srcColorSpace, const KoColorSpace *dstColorSpace, KoColorConversionTransformation::Intent renderingIntent, KoColorConversionTransformation::ConversionFlags conversionFlags) const override
void transform(const quint8 *src, quint8 *dst, qint32 nPixels) const override
KoColorConversionFromAlphaTransformation(const KoColorSpace *srcCs, const KoColorSpace *dstCs, Intent renderingIntent, KoColorConversionTransformation::ConversionFlags conversionFlags)
KoColorConversionGrayAFromAlphaTransformation(const KoColorSpace *srcCs, const KoColorSpace *dstCs, Intent renderingIntent, KoColorConversionTransformation::ConversionFlags conversionFlags)
void transform(const quint8 *src, quint8 *dst, qint32 nPixels) const override
void transform(const quint8 *src, quint8 *dst, qint32 nPixels) const override
KoColorConversionGrayAToAlphaTransformation(const KoColorSpace *srcCs, const KoColorSpace *dstCs, Intent renderingIntent, ConversionFlags conversionFlags)
void transform(const quint8 *src, quint8 *dst, qint32 nPixels) const override
KoColorConversionLab16ToAlphaTransformation(const KoColorSpace *srcCs, const KoColorSpace *dstCs, Intent renderingIntent, KoColorConversionTransformation::ConversionFlags conversionFlags)
KoColorConversionTransformation * createColorTransformation(const KoColorSpace *srcColorSpace, const KoColorSpace *dstColorSpace, KoColorConversionTransformation::Intent renderingIntent, KoColorConversionTransformation::ConversionFlags conversionFlags) const override
KoColorConversionToAlphaTransformationFactoryImpl(const QString &_dstModelId, const QString &_dstDepthId, const QString &_srcProfileName)
KoColorConversionToAlphaTransformation(const KoColorSpace *srcCs, const KoColorSpace *dstCs, Intent renderingIntent, ConversionFlags conversionFlags)
void transform(const quint8 *src, quint8 *dst, qint32 nPixels) const override
static _Tdst scaleToA(_T a)
virtual quint32 pixelSize() const =0
virtual KoID colorModelId() const =0
virtual void fromLabA16(const quint8 *src, quint8 *dst, quint32 nPixels) const
virtual KoID colorDepthId() const =0