| line | stmt | bran | cond | sub | pod | time | code | 
| 1 |  |  |  |  |  |  | #define IMAGER_NO_CONTEXT | 
| 2 |  |  |  |  |  |  | #include "imager.h" | 
| 3 |  |  |  |  |  |  | #include "imageri.h" | 
| 4 |  |  |  |  |  |  |  | 
| 5 |  |  |  |  |  |  | /* | 
| 6 |  |  |  |  |  |  | General convolution for 2d decoupled filters | 
| 7 |  |  |  |  |  |  | end effects are acounted for by increasing | 
| 8 |  |  |  |  |  |  | scaling the result with the sum of used coefficients | 
| 9 |  |  |  |  |  |  |  | 
| 10 |  |  |  |  |  |  | coeff: (double array) coefficients for filter | 
| 11 |  |  |  |  |  |  | len: length of filter.. number of coefficients | 
| 12 |  |  |  |  |  |  | note that this has to be an odd number | 
| 13 |  |  |  |  |  |  | (since the filter is even); | 
| 14 |  |  |  |  |  |  | */ | 
| 15 |  |  |  |  |  |  |  | 
| 16 |  |  |  |  |  |  | int | 
| 17 | 64 |  |  |  |  |  | i_conv(i_img *im, const double *coeff,int len) { | 
| 18 |  |  |  |  |  |  | i_img_dim xo, yo; /* output pixel co-ordinate */ | 
| 19 |  |  |  |  |  |  | int c, ch, center; | 
| 20 |  |  |  |  |  |  | double pc; | 
| 21 |  |  |  |  |  |  | double res[MAXCHANNELS]; | 
| 22 |  |  |  |  |  |  | i_img *timg; | 
| 23 | 64 |  |  |  |  |  | dIMCTXim(im); | 
| 24 |  |  |  |  |  |  |  | 
| 25 | 64 |  |  |  |  |  | im_log((aIMCTX,1,"i_conv(im %p, coeff %p, len %d)\n",im,coeff,len)); | 
| 26 | 64 |  |  |  |  |  | im_clear_error(aIMCTX); | 
| 27 |  |  |  |  |  |  |  | 
| 28 | 64 | 100 |  |  |  |  | if (len < 1) { | 
| 29 | 2 |  |  |  |  |  | im_push_error(aIMCTX, 0, "there must be at least one coefficient"); | 
| 30 | 2 |  |  |  |  |  | return 0; | 
| 31 |  |  |  |  |  |  | } | 
| 32 |  |  |  |  |  |  |  | 
| 33 | 62 |  |  |  |  |  | center=(len-1)/2; | 
| 34 |  |  |  |  |  |  |  | 
| 35 | 62 |  |  |  |  |  | pc = 0; | 
| 36 | 362 | 100 |  |  |  |  | for (c = 0; c < len; ++c) | 
| 37 | 300 |  |  |  |  |  | pc += coeff[c]; | 
| 38 |  |  |  |  |  |  |  | 
| 39 | 62 | 100 |  |  |  |  | if (pc == 0) { | 
| 40 | 1 |  |  |  |  |  | i_push_error(0, "sum of coefficients is zero"); | 
| 41 | 1 |  |  |  |  |  | return 0; | 
| 42 |  |  |  |  |  |  | } | 
| 43 |  |  |  |  |  |  |  | 
| 44 | 61 |  |  |  |  |  | timg = i_sametype(im, im->xsize, im->ysize); | 
| 45 |  |  |  |  |  |  |  | 
| 46 | 61 | 100 |  |  |  |  | #code im->bits <= 8 | 
| 47 |  |  |  |  |  |  | IM_COLOR rcolor; | 
| 48 |  |  |  |  |  |  | /* don't move the calculation of pc up here, it depends on which pixels | 
| 49 |  |  |  |  |  |  | are readable */ | 
| 50 | 9211 | 100 |  |  |  |  | for(yo = 0; yo < im->ysize; yo++) { | 
|  |  | 100 |  |  |  |  |  | 
| 51 | 1381650 | 100 |  |  |  |  | for(xo = 0; xo < im->xsize; xo++) { | 
|  |  | 100 |  |  |  |  |  | 
| 52 | 5220000 | 100 |  |  |  |  | for(ch = 0;ch < im->channels; ch++) | 
|  |  | 100 |  |  |  |  |  | 
| 53 | 3847500 |  |  |  |  |  | res[ch] = 0; | 
| 54 | 8055000 | 100 |  |  |  |  | for(c = 0;c < len; c++) { | 
|  |  | 100 |  |  |  |  |  | 
| 55 | 6682500 |  |  |  |  |  | i_img_dim xi = xo + c - center; | 
| 56 | 6682500 | 100 |  |  |  |  | if (xi < 0) | 
|  |  | 100 |  |  |  |  |  | 
| 57 | 26250 |  |  |  |  |  | xi = 0; | 
| 58 | 6656250 | 100 |  |  |  |  | else if (xi >= im->xsize) | 
|  |  | 100 |  |  |  |  |  | 
| 59 | 26250 |  |  |  |  |  | xi = im->xsize - 1; | 
| 60 |  |  |  |  |  |  |  | 
| 61 | 6682500 | 50 |  |  |  |  | if (IM_GPIX(im, xi, yo, &rcolor)!=-1) { | 
|  |  | 50 |  |  |  |  |  | 
| 62 | 25380000 | 100 |  |  |  |  | for(ch = 0; ch < im->channels; ch++) | 
|  |  | 100 |  |  |  |  |  | 
| 63 | 18697500 |  |  |  |  |  | res[ch] += (rcolor.channel[ch])  *coeff[c]; | 
| 64 |  |  |  |  |  |  | } | 
| 65 |  |  |  |  |  |  | } | 
| 66 | 1372500 | 50 |  |  |  |  | im_assert(pc != 0); | 
|  |  | 50 |  |  |  |  |  | 
| 67 | 5220000 | 100 |  |  |  |  | for(ch = 0; ch < im->channels; ch++) { | 
|  |  | 100 |  |  |  |  |  | 
| 68 | 3847500 |  |  |  |  |  | double temp = res[ch] / pc; | 
| 69 | 2970000 | 100 |  |  |  |  | rcolor.channel[ch] = | 
|  |  | 100 |  |  |  |  |  | 
| 70 | 877500 | 100 |  |  |  |  | temp < 0 ? 0 : temp > IM_SAMPLE_MAX ? IM_SAMPLE_MAX : (IM_SAMPLE_T)temp; | 
|  |  | 100 |  |  |  |  |  | 
| 71 |  |  |  |  |  |  | } | 
| 72 | 1372500 |  |  |  |  |  | IM_PPIX(timg, xo, yo, &rcolor); | 
| 73 |  |  |  |  |  |  | } | 
| 74 |  |  |  |  |  |  | } | 
| 75 |  |  |  |  |  |  |  | 
| 76 | 9211 | 100 |  |  |  |  | for(xo = 0; xo < im->xsize; xo++) { | 
|  |  | 100 |  |  |  |  |  | 
| 77 | 1381650 | 100 |  |  |  |  | for(yo = 0;yo < im->ysize; yo++) { | 
|  |  | 100 |  |  |  |  |  | 
| 78 | 5220000 | 100 |  |  |  |  | for(ch =  0; ch < im->channels; ch++) | 
|  |  | 100 |  |  |  |  |  | 
| 79 | 3847500 |  |  |  |  |  | res[ch] = 0; | 
| 80 | 8055000 | 100 |  |  |  |  | for(c = 0; c < len; c++) { | 
|  |  | 100 |  |  |  |  |  | 
| 81 | 6682500 |  |  |  |  |  | i_img_dim yi = yo + c - center; | 
| 82 | 6682500 | 100 |  |  |  |  | if (yi < 0) | 
|  |  | 100 |  |  |  |  |  | 
| 83 | 26250 |  |  |  |  |  | yi = 0; | 
| 84 | 6656250 | 100 |  |  |  |  | else if (yi >= im->ysize) | 
|  |  | 100 |  |  |  |  |  | 
| 85 | 26250 |  |  |  |  |  | yi = im->ysize - 1; | 
| 86 | 6682500 | 50 |  |  |  |  | if (IM_GPIX(timg, xo, yi, &rcolor) != -1) { | 
|  |  | 50 |  |  |  |  |  | 
| 87 | 25380000 | 100 |  |  |  |  | for(ch = 0;ch < im->channels; ch++) | 
|  |  | 100 |  |  |  |  |  | 
| 88 | 18697500 |  |  |  |  |  | res[ch] += (rcolor.channel[ch]) * coeff[c]; | 
| 89 |  |  |  |  |  |  | } | 
| 90 |  |  |  |  |  |  | } | 
| 91 | 1372500 | 50 |  |  |  |  | im_assert(pc != 0); | 
|  |  | 50 |  |  |  |  |  | 
| 92 | 5220000 | 100 |  |  |  |  | for(ch = 0;ch < im->channels; ch++) { | 
|  |  | 100 |  |  |  |  |  | 
| 93 | 3847500 |  |  |  |  |  | double temp = res[ch] / pc; | 
| 94 | 2970000 | 100 |  |  |  |  | rcolor.channel[ch] = | 
|  |  | 100 |  |  |  |  |  | 
| 95 | 877500 | 100 |  |  |  |  | temp < 0 ? 0 : temp > IM_SAMPLE_MAX ? IM_SAMPLE_MAX : (IM_SAMPLE_T)temp; | 
|  |  | 100 |  |  |  |  |  | 
| 96 |  |  |  |  |  |  | } | 
| 97 | 1372500 |  |  |  |  |  | IM_PPIX(im, xo, yo,&rcolor); | 
| 98 |  |  |  |  |  |  | } | 
| 99 |  |  |  |  |  |  | } | 
| 100 |  |  |  |  |  |  | #/code | 
| 101 |  |  |  |  |  |  |  | 
| 102 | 61 |  |  |  |  |  | i_img_destroy(timg); | 
| 103 |  |  |  |  |  |  |  | 
| 104 | 64 |  |  |  |  |  | return 1; | 
| 105 |  |  |  |  |  |  | } |