63
64
template<typename T>
64
double toDouble(const quint8* data, int channelpos)
65
inline double toDouble(const quint8* data, int channelpos)
66
return (float)(*((T*)(data + channelpos)));
67
return (double)(*((T*)(data + channelpos)));
69
typedef double(*PtrToDouble)(const quint8*, int);
71
70
template<typename T>
72
71
void fromDouble(quint8* data, int channelpos, double v)
74
73
*((T*)(data + channelpos)) = (T)v;
77
typedef void (*PtrFromDouble)(quint8*, int, double);
79
76
void KisMathToolbox::transformToFR(KisPaintDeviceSP src, KisFloatRepresentation* fr, const QRect& rect)
81
78
qint32 depth = src->colorSpace()->colorChannelCount();
79
QList<KoChannelInfo *> cis = src->colorSpace()->channels();
80
// remove non-color channels
81
for (qint32 c = 0; c < cis.count(); ++c) {
82
if (cis[c]->channelType() != KoChannelInfo::COLOR)
82
85
QVector<PtrToDouble> f(depth);
83
QList<KoChannelInfo *> cis = src->colorSpace()->channels();
84
for (qint32 k = 0; k < depth; k++) {
85
switch (cis[k]->channelValueType()) {
86
case KoChannelInfo::UINT8:
87
f[k] = toDouble<quint8>;
89
case KoChannelInfo::UINT16:
90
f[k] = toDouble<quint16>;
93
case KoChannelInfo::FLOAT16:
94
f[k] = toDouble<half>;
97
case KoChannelInfo::FLOAT32:
98
f[k] = toDouble<float>;
100
case KoChannelInfo::INT8:
101
f[k] = toDouble<qint8>;
103
case KoChannelInfo::INT16:
104
f[k] = toDouble<qint16>;
107
warnKrita << "Unsupported value type in KisMathToolbox";
86
if (!getToDoubleChannelPtr(cis, f))
112
89
KisHLineConstIteratorPixel srcIt = src->createHLineIterator(rect.x(), rect.y(), rect.width());
105
bool KisMathToolbox::getToDoubleChannelPtr(QList<KoChannelInfo *> cis, QVector<PtrToDouble>& f)
107
qint32 channels = cis.count();
109
for (qint32 k = 0; k < channels; k++) {
110
switch (cis[k]->channelValueType()) {
111
case KoChannelInfo::UINT8:
112
f[k] = toDouble<quint8>;
114
case KoChannelInfo::UINT16:
115
f[k] = toDouble<quint16>;
118
case KoChannelInfo::FLOAT16:
119
f[k] = toDouble<half>;
122
case KoChannelInfo::FLOAT32:
123
f[k] = toDouble<float>;
125
case KoChannelInfo::INT8:
126
f[k] = toDouble<qint8>;
128
case KoChannelInfo::INT16:
129
f[k] = toDouble<qint16>;
132
warnKrita << "Unsupported value type in KisMathToolbox";
128
140
void KisMathToolbox::transformFromFR(KisPaintDeviceSP dst, KisFloatRepresentation* fr, const QRect& rect)
130
142
qint32 depth = dst->colorSpace()->colorChannelCount();
143
QList<KoChannelInfo *> cis = dst->colorSpace()->channels();
144
// remove non-color channels
145
for (qint32 c = 0; c < cis.count(); ++c) {
146
if (cis[c]->channelType() != KoChannelInfo::COLOR)
131
150
QVector<PtrFromDouble> f(depth);
132
QList<KoChannelInfo *> cis = dst->colorSpace()->channels();
133
for (qint32 k = 0; k < depth; k++) {
134
switch (cis[k]->channelValueType()) {
135
case KoChannelInfo::UINT8:
136
f[k] = fromDouble<quint8>;
138
case KoChannelInfo::UINT16:
139
f[k] = fromDouble<quint16>;
142
case KoChannelInfo::FLOAT16:
143
f[k] = fromDouble<half>;
146
case KoChannelInfo::FLOAT32:
147
f[k] = fromDouble<float>;
149
case KoChannelInfo::INT8:
150
f[k] = fromDouble<qint8>;
152
case KoChannelInfo::INT16:
153
f[k] = fromDouble<qint16>;
156
warnKrita << "Unsupported value type in KisMathToolbox";
151
if (!getFromDoubleChannelPtr(cis, f))
161
154
KisHLineIteratorPixel dstIt = dst->createHLineIterator(rect.x(), rect.y(), rect.width());
162
155
for (int i = rect.y(); i < rect.height(); i++) {
169
bool KisMathToolbox::getFromDoubleChannelPtr(QList<KoChannelInfo *> cis, QVector<PtrFromDouble>& f)
171
qint32 channels = cis.count();
173
for (qint32 k = 0; k < channels; k++) {
174
switch (cis[k]->channelValueType()) {
175
case KoChannelInfo::UINT8:
176
f[k] = fromDouble<quint8>;
178
case KoChannelInfo::UINT16:
179
f[k] = fromDouble<quint16>;
182
case KoChannelInfo::FLOAT16:
183
f[k] = fromDouble<half>;
186
case KoChannelInfo::FLOAT32:
187
f[k] = fromDouble<float>;
189
case KoChannelInfo::INT8:
190
f[k] = fromDouble<qint8>;
192
case KoChannelInfo::INT16:
193
f[k] = fromDouble<qint16>;
196
warnKrita << "Unsupported value type in KisMathToolbox";
204
double KisMathToolbox::minChannelValue(KoChannelInfo *c)
206
switch (c->channelValueType())
208
case KoChannelInfo::UINT8 : return KoColorSpaceMathsTraits<quint8>::min;
209
case KoChannelInfo::UINT16 : return KoColorSpaceMathsTraits<quint16>::min;
210
case KoChannelInfo::UINT32 : return KoColorSpaceMathsTraits<quint32>::min;
212
case KoChannelInfo::FLOAT16 : return KoColorSpaceMathsTraits<half>::min;
214
case KoChannelInfo::FLOAT32 : return KoColorSpaceMathsTraits<float>::min;
215
case KoChannelInfo::FLOAT64 : return KoColorSpaceMathsTraits<double>::min;
216
case KoChannelInfo::INT8 : return 127;
217
case KoChannelInfo::INT16 : return KoColorSpaceMathsTraits<qint16>::min;
222
double KisMathToolbox::maxChannelValue(KoChannelInfo *c)
224
switch (c->channelValueType())
226
case KoChannelInfo::UINT8 : return KoColorSpaceMathsTraits<quint8>::max;
227
case KoChannelInfo::UINT16 : return KoColorSpaceMathsTraits<quint16>::max;
228
case KoChannelInfo::UINT32 : return KoColorSpaceMathsTraits<quint32>::max;
230
case KoChannelInfo::FLOAT16 : return KoColorSpaceMathsTraits<half>::max;
232
case KoChannelInfo::FLOAT32 : return KoColorSpaceMathsTraits<float>::max;
233
case KoChannelInfo::FLOAT64 : return KoColorSpaceMathsTraits<double>::max;
234
case KoChannelInfo::INT8 : return -128;
235
case KoChannelInfo::INT16 : return KoColorSpaceMathsTraits<qint16>::max;
176
240
#include "kis_math_toolbox.moc"