21#include "kis_math_toolbox.h"
27#include "kis_basic_math_toolbox.h"
28#include "kis_iterators_pixel.h"
31KisMathToolbox::KisMathToolbox(
KisID id) : m_id(id)
35KisMathToolbox::~KisMathToolbox()
39KisMathToolboxFactoryRegistry::KisMathToolboxFactoryRegistry()
43KisMathToolboxFactoryRegistry::~KisMathToolboxFactoryRegistry()
47double toDouble(TQ_UINT8* data,
int channelpos )
49 return (
float)( *((T*)(data + channelpos)) );
52typedef double (*PtrToDouble)(TQ_UINT8*, int);
55void fromDouble(TQ_UINT8* data,
int channelpos,
double v )
57 *((T*)(data + channelpos)) = (T)v;
60typedef void (*PtrFromDouble)(TQ_UINT8*, int, double);
63void KisMathToolbox::transformToFR(KisPaintDeviceSP src, KisFloatRepresentation* fr,
const TQRect& rect)
65 TQ_INT32 depth = src->colorSpace()->nColorChannels();
66 TQMemArray<PtrToDouble> f(depth);
67 TQValueVector<KisChannelInfo *> cis = src->colorSpace()->channels();
68 for(TQ_INT32 k = 0; k < depth; k++)
70 switch( cis[k]->channelValueType() )
72 case KisChannelInfo::UINT8:
73 f[k] = toDouble<TQ_UINT8>;
75 case KisChannelInfo::UINT16:
76 f[k] = toDouble<TQ_UINT16>;
79 case KisChannelInfo::FLOAT16:
80 f[k] = toDouble<half>;
83 case KisChannelInfo::FLOAT32:
84 f[k] = toDouble<float>;
86 case KisChannelInfo::INT8:
87 f[k] = toDouble<TQ_INT8>;
89 case KisChannelInfo::INT16:
90 f[k] = toDouble<TQ_INT16>;
93 kdWarning() <<
"Unsupported value type in KisMathToolbox" << endl;
98 for(
int i = rect.y(); i < rect.height(); i++)
101 float *dstIt = fr->coeffs + (i-rect.y()) * fr->size * fr->depth;
102 while( ! srcIt.isDone() )
104 TQ_UINT8* v1 = srcIt.rawData();
105 for(
int k = 0; k < depth; k++)
107 *dstIt = f[k](v1, cis[k]->pos());
115void KisMathToolbox::transformFromFR(KisPaintDeviceSP dst, KisFloatRepresentation* fr,
const TQRect& rect)
117 TQ_INT32 depth = dst->colorSpace()->nColorChannels();
118 TQMemArray<PtrFromDouble> f(depth);
119 TQValueVector<KisChannelInfo *> cis = dst->colorSpace()->channels();
120 for(TQ_INT32 k = 0; k < depth; k++)
122 switch( cis[k]->channelValueType() )
124 case KisChannelInfo::UINT8:
125 f[k] = fromDouble<TQ_UINT8>;
127 case KisChannelInfo::UINT16:
128 f[k] = fromDouble<TQ_UINT16>;
131 case KisChannelInfo::FLOAT16:
132 f[k] = fromDouble<half>;
135 case KisChannelInfo::FLOAT32:
136 f[k] = fromDouble<float>;
138 case KisChannelInfo::INT8:
139 f[k] = fromDouble<TQ_INT8>;
141 case KisChannelInfo::INT16:
142 f[k] = fromDouble<TQ_INT16>;
145 kdWarning() <<
"Unsupported value type in KisMathToolbox" << endl;
149 for(
int i = rect.y(); i < rect.height(); i++)
152 float *srcIt = fr->coeffs + (i-rect.y()) * fr->size * fr->depth;
153 while( ! dstIt.isDone() )
155 TQ_UINT8* v1 = dstIt.rawData();
156 for(
int k = 0; k < depth; k++)
158 f[k](v1, cis[k]->pos(), *srcIt);
166#include "kis_math_toolbox.moc"
The pixel iterators are high level iterarators.
Chalk has a large number of extensible resources.