1 /* two small different kernels are better than one big
*/
3 #define NUM_INTENSITIES
256
5 kernel void kernel_oilify
(global float4
*in
,
11 int gidx
= get_global_id
(0);
12 int gidy
= get_global_id
(1);
13 int x
= gidx
+ mask_radius
;
14 int y
= gidy
+ mask_radius
;
15 int dst_width
= get_global_size
(0);
16 int src_width
= dst_width
+ mask_radius
* 2;
17 float4 hist
[NUM_INTENSITIES];
18 float4 hist_max = 1.0;
20 int radius_sq = mask_radius * mask_radius;
22 for (i = 0; i < intensities; i++)
25 for (i = -mask_radius; i <= mask_radius; i++)
27 for (j = -mask_radius; j <= mask_radius; j++)
29 if (i*i + j*j <= radius_sq)
31 temp_pixel = in[x + i + (y + j) * src_width];
32 hist[(int)(clamp(temp_pixel.x, 0.f, 1.f) * (intensities - 1))].x+=1;
33 hist[(int)(clamp(temp_pixel.y, 0.f, 1.f) * (intensities - 1))].y+=1;
34 hist[(int)(clamp(temp_pixel.z, 0.f, 1.f) * (intensities - 1))].z+=1;
35 hist[(int)(clamp(temp_pixel.w, 0.f, 1.f) * (intensities - 1))].w+=1;
40 for (i = 0; i < intensities; i++) {
41 if(hist_max.x < hist[i].x)
42 hist_max.x = hist[i].x;
43 if(hist_max.y < hist[i].y)
44 hist_max.y = hist[i].y;
45 if(hist_max.z < hist[i].z)
46 hist_max.z = hist[i].z;
47 if(hist_max.w < hist[i].w)
48 hist_max.w = hist[i].w;
53 for (i = 0; i < intensities; i++)
55 ratio = hist[i] / hist_max;
58 for (j = 0; j < exponent; j++)
61 sum += weight * (float4)i;
64 out[gidx + gidy * dst_width] = sum / div / (float)(intensities - 1);
67 kernel void kernel_oilify_inten(global float4 *in,
69 global float *inten_buf,
70 const int mask_radius,
71 const int intensities,
74 int gidx = get_global_id(0);
75 int gidy = get_global_id(1);
76 int x = gidx + mask_radius;
77 int y = gidy + mask_radius;
78 int dst_width = get_global_size(0);
79 int src_width = dst_width + mask_radius * 2;
80 float4 cumulative_rgb[NUM_INTENSITIES];
81 int hist_inten
[NUM_INTENSITIES], inten_max;
83 int radius_sq = mask_radius * mask_radius;
87 for (i = 0; i < intensities; i++)
90 cumulative_rgb[i] = 0.0;
92 for (i = -mask_radius; i <= mask_radius; i++)
94 for (j = -mask_radius; j <= mask_radius; j++)
96 if (i*i + j*j <= radius_sq)
98 temp_pixel = in[x + i + (y + j) * src_width];
99 temp_pixel.x = clamp(temp_pixel.x, 0.f, 1.f);
100 temp_pixel.y = clamp(temp_pixel.y, 0.f, 1.f);
101 temp_pixel.z = clamp(temp_pixel.z, 0.f, 1.f);
102 temp_pixel.w = clamp(temp_pixel.w, 0.f, 1.f);
103 tmp_px_inten = inten_buf[x + i + (y + j) * src_width];
104 intensity = tmp_px_inten * (float)(intensities-1);
105 hist_inten[intensity] += 1;
106 cumulative_rgb[intensity] += temp_pixel;
112 /* calculated maximums */
113 for (i = 0; i < intensities; i++) {
114 if(hist_inten[i] > inten_max)
115 inten_max = hist_inten[i];
118 float ratio, weight, mult_inten;
121 for (i = 0; i < intensities; i++)
123 if (hist_inten[i] > 0)
125 ratio = (float)(hist_inten[i]) / (float)(inten_max);
128 for (j = 0; j < exponent; j++)
131 mult_inten = weight / (float)(hist_inten[i]);
134 color += mult_inten * cumulative_rgb[i];
137 out[gidx + gidy * dst_width] = color/div;