21#include "kis_basic_math_toolbox.h"
23KisBasicMathToolbox::KisBasicMathToolbox()
24 : KisMathToolbox(
KisID(
"Basic"))
29KisBasicMathToolbox::~KisBasicMathToolbox()
34void KisBasicMathToolbox::wavetrans(KisMathToolbox::KisWavelet* wav, KisMathToolbox::KisWavelet* buff, uint halfsize)
36 uint l = (2*halfsize)*wav->depth*
sizeof(
float);
37 for(uint i = 0; i < halfsize; i++)
39 float * itLL = buff->coeffs + i*buff->size*buff->depth;
40 float * itHL = buff->coeffs + (i*buff->size + halfsize)*buff->depth;
41 float * itLH = buff->coeffs + (halfsize+i)*buff->size*buff->depth;
42 float * itHH = buff->coeffs + ( (halfsize+i)*buff->size + halfsize)*buff->depth;
43 float * itS11 = wav->coeffs + 2*i*wav->size*wav->depth;
44 float * itS12 = wav->coeffs + (2*i*wav->size+1)*wav->depth;
45 float * itS21 = wav->coeffs + (2*i+1)*wav->size*wav->depth;
46 float * itS22 = wav->coeffs + ((2*i+1)*wav->size+1)*wav->depth;
47 for(uint j = 0; j < halfsize; j++)
49 for( uint k = 0; k < wav->depth; k++)
51 *(itLL++) = (*itS11 + *itS12 + *itS21 + *itS22) * M_SQRT1_2;
52 *(itHL++) = (*itS11 - *itS12 + *itS21 - *itS22) * M_SQRT1_2;
53 *(itLH++) = (*itS11 + *itS12 - *itS21 - *itS22) * M_SQRT1_2;
54 *(itHH++) = (*(itS11++) - *(itS12++) - *(itS21++) + *(itS22++)) * M_SQRT1_2;
56 itS11 += wav->depth; itS12 += wav->depth;
57 itS21 += wav->depth; itS22 += wav->depth;
61 for(uint i = 0; i < halfsize; i++)
63 uint p = i*wav->size*wav->depth;
64 memcpy(wav->coeffs + p, buff->coeffs + p, l);
65 p = (i + halfsize )*wav->size*wav->depth;
66 memcpy(wav->coeffs + p, buff->coeffs + p, l);
70 wavetrans(wav, buff, halfsize/2);
74void KisBasicMathToolbox::waveuntrans(KisMathToolbox::KisWavelet* wav, KisMathToolbox::KisWavelet* buff, uint halfsize)
76 uint l = (2*halfsize)*wav->depth*
sizeof(
float);
77 for(uint i = 0; i < halfsize; i++)
79 float * itLL = wav->coeffs + i*buff->size*buff->depth;
80 float * itHL = wav->coeffs + (i*buff->size + halfsize)*buff->depth;
81 float * itLH = wav->coeffs + (halfsize+i)*buff->size*buff->depth;
82 float * itHH = wav->coeffs + ( (halfsize+i)*buff->size + halfsize)*buff->depth;
83 float * itS11 = buff->coeffs + 2*i*wav->size*wav->depth;
84 float * itS12 = buff->coeffs + (2*i*wav->size+1)*wav->depth;
85 float * itS21 = buff->coeffs + (2*i+1)*wav->size*wav->depth;
86 float * itS22 = buff->coeffs + ((2*i+1)*wav->size+1)*wav->depth;
87 for(uint j = 0; j < halfsize; j++)
89 for( uint k = 0; k < wav->depth; k++)
91 *(itS11++) = (*itLL + *itHL + *itLH + *itHH)*0.25*M_SQRT2;
92 *(itS12++) = (*itLL - *itHL + *itLH - *itHH)*0.25*M_SQRT2;
93 *(itS21++) = (*itLL + *itHL - *itLH - *itHH)*0.25*M_SQRT2;
94 *(itS22++) = (*(itLL++) - *(itHL++) - *(itLH++) + *(itHH++))*0.25*M_SQRT2;
96 itS11 += wav->depth; itS12 += wav->depth;
97 itS21 += wav->depth; itS22 += wav->depth;
101 for(uint i = 0; i < halfsize; i++)
103 uint p = i*wav->size*wav->depth;
104 memcpy(wav->coeffs + p, buff->coeffs + p, l);
105 p = (i + halfsize )*wav->size*wav->depth;
106 memcpy(wav->coeffs + p, buff->coeffs + p, l);
109 if(halfsize != wav->size/2)
111 waveuntrans(wav, buff, halfsize*2);
115KisMathToolbox::KisWavelet* KisBasicMathToolbox::fastWaveletTransformation(KisPaintDeviceSP src,
const TQRect& rect, KisWavelet* buff)
119 buff = initWavelet( src, rect );
121 KisWavelet* wav = initWavelet( src, rect );
122 transformToFR(src, wav, rect);
123 wavetrans(wav, buff, wav->size / 2);
128void KisBasicMathToolbox::fastWaveletUntransformation(KisPaintDeviceSP dst,
const TQRect& rect, KisWavelet* wav, KisWavelet* buff)
132 buff = initWavelet( dst, rect );
135 waveuntrans(wav, buff, 1 );
136 transformFromFR(dst, wav, rect);
Chalk has a large number of extensible resources.