]> git.imager.perl.org - imager.git/blame - conv.c
- prevent a cast to integer warning on x64 builds in datatypes.c
[imager.git] / conv.c
CommitLineData
92bda632 1#include "imager.h"
02d1d628
AMH
2
3/*
4 General convolution for 2d decoupled filters
5 end effects are acounted for by increasing
6 scaling the result with the sum of used coefficients
7
8 coeff: (float array) coefficients for filter
9 len: length of filter.. number of coefficients
10 note that this has to be an odd number
11 (since the filter is even);
12*/
13
14void
97ac0a96 15i_conv(i_img *im,const float *coeff,int len) {
02d1d628
AMH
16 int i,l,c,ch,center;
17 float pc;
18 i_color rcolor;
19 float res[11];
20 i_img timg;
21
a73aeb5f 22 mm_log((1,"i_conv(im %p, coeff %p, len %d)\n",im,coeff,len));
02d1d628
AMH
23
24 i_img_empty_ch(&timg,im->xsize,im->ysize,im->channels);
25
26 center=(len-1)/2;
27
6e473a59
TC
28 /* don't move the calculation of pc up here, it depends on which pixels
29 are readable */
02d1d628
AMH
30 for(l=0;l<im->ysize;l++) {
31 for(i=0;i<im->xsize;i++) {
6e473a59 32 pc=0.0;
02d1d628
AMH
33 for(ch=0;ch<im->channels;ch++) res[ch]=0;
34 for(c=0;c<len;c++)
35 if (i_gpix(im,i+c-center,l,&rcolor)!=-1) {
0b76fec8
TC
36 for(ch=0;ch<im->channels;ch++)
37 res[ch]+=(float)(rcolor.channel[ch])*coeff[c];
6e473a59 38 pc+=coeff[c];
02d1d628 39 }
0b76fec8
TC
40 for(ch=0;ch<im->channels;ch++) {
41 double temp = res[ch]/pc;
42 rcolor.channel[ch] =
43 temp < 0 ? 0 : temp > 255 ? 255 : (unsigned char)temp;
44 }
02d1d628
AMH
45 i_ppix(&timg,i,l,&rcolor);
46 }
47 }
48
49 for(l=0;l<im->xsize;l++)
50 {
51 for(i=0;i<im->ysize;i++)
52 {
6e473a59 53 pc=0.0;
02d1d628
AMH
54 for(ch=0;ch<im->channels;ch++) res[ch]=0;
55 for(c=0;c<len;c++)
56 if (i_gpix(&timg,l,i+c-center,&rcolor)!=-1)
57 {
0b76fec8
TC
58 for(ch=0;ch<im->channels;ch++)
59 res[ch]+=(float)(rcolor.channel[ch])*coeff[c];
6e473a59 60 pc+=coeff[c];
02d1d628 61 }
0b76fec8
TC
62 for(ch=0;ch<im->channels;ch++) {
63 double temp = res[ch]/pc;
64 rcolor.channel[ch]=
65 temp < 0 ? 0 : temp > 255 ? 255 : (unsigned char)temp;
66 }
02d1d628
AMH
67 i_ppix(im,l,i,&rcolor);
68 }
69 }
a73aeb5f 70 i_img_exorcise(&timg);
02d1d628
AMH
71}
72
73
74
75
76
77
78
79
80