Update Portuguese translation
[gegl.git] / opencl / snn-mean.cl
blob2f4fde39b15f7323de68fdbc85dea79f578590dc
1 static inline float colordiff (float4 pixA,
2 float4 pixB)
4 float4 pix = pixA - pixB;
5 pix *= pix;
6 return pix.x + pix.y + pix.z;
9 __kernel void snn_mean (__global const float4 *src_buf,
10 int src_width,
11 int src_height,
12 __global float4 *dst_buf,
13 int radius,
14 int pairs)
16 int gidx = get_global_id(0);
17 int gidy = get_global_id(1);
18 int offset = gidy * get_global_size(0) + gidx;
20 const float4 center_pix =
21 *(src_buf + ((radius + gidx) + (gidy + radius) * src_width));
22 float4 accumulated = 0;
24 int count = 0;
25 if (pairs == 2)
27 for (int i = -radius; i <= 0; i++)
29 for (int j = -radius; j <= 0 ; j++)
31 float4 selected_pix = center_pix;
32 float best_diff = 1000.0f;
34 if (i != 0 && j != 0)
36 int xs[4] =
38 gidx + j + radius, gidx - j + radius,
39 gidx - j + radius, gidx + j + radius
41 int ys[4] =
43 gidy + i + radius, gidy - i + radius,
44 gidy + i + radius, gidy - i + radius
47 for (int k = 0; k < 4; k++)
49 if (xs[k] >= 0 && xs[k] < src_width &&
50 ys[k] >= 0 && ys[k] < src_height)
52 const float4 tpix =
53 *(src_buf + (xs[k] + ys[k] * src_width));
54 float diff = colordiff (tpix, center_pix);
55 if (diff < best_diff)
57 best_diff = diff;
58 selected_pix = tpix;
63 accumulated += selected_pix;
64 ++count;
65 if (i == 0 && j == 0)
66 break;
69 dst_buf[offset] = accumulated / (float4)(count);
70 return;
72 else if (pairs == 1)
74 for (int i = -radius; i <= 0; i++)
76 for (int j = -radius; j <= radius; j++)
78 float4 selected_pix = center_pix;
79 float best_diff = 1000.0f;
81 /* skip computations for the center pixel */
82 if (i != 0 && j != 0)
84 int xs[4] =
86 gidx + j + radius, gidx - j + radius,
87 gidx - j + radius, gidx + j + radius
89 int ys[4] =
91 gidy + i + radius, gidy - i + radius,
92 gidy + i + radius, gidy - i + radius
95 for (int k = 0; k < 2; k++)
97 if (xs[k] >= 0 && xs[k] < src_width &&
98 ys[k] >= 0 && ys[k] < src_height)
100 const float4 tpix =
101 *(src_buf + (xs[k] + ys[k] * src_width));
102 float diff = colordiff (tpix, center_pix);
103 if (diff < best_diff)
105 best_diff = diff;
106 selected_pix = tpix;
111 accumulated += selected_pix;
112 ++count;
113 if (i == 0 && j == 0)
114 break;
117 dst_buf[offset] = accumulated / (float4)(count);
118 return;
120 return;