Update Portuguese translation
[gegl.git] / opencl / motion-blur-linear.cl
blob265b163e6d603ed67974e23e0c1d428758e61c48
1 float4 get_pixel_color(const __global float4 *in_buf,
2 int rect_width,
3 int rect_height,
4 int rect_x,
5 int rect_y,
6 int x,
7 int y)
9 int ix = x - rect_x;
10 int iy = y - rect_y;
12 ix = clamp(ix, 0, rect_width-1);
13 iy = clamp(iy, 0, rect_height-1);
15 return in_buf[iy * rect_width + ix];
18 __kernel void motion_blur_linear(const __global float4 *src_buf,
19 int src_width,
20 int src_height,
21 int src_x,
22 int src_y,
23 __global float4 *dst_buf,
24 int dst_x,
25 int dst_y,
26 int num_steps,
27 float offset_x,
28 float offset_y)
30 int gidx = get_global_id(0);
31 int gidy = get_global_id(1);
33 float4 sum = 0.0f;
34 int px = gidx + dst_x;
35 int py = gidy + dst_y;
37 for(int step = 0; step < num_steps; ++step)
39 float t = num_steps == 1 ? 0.0f :
40 step / (float)(num_steps - 1) - 0.5f;
42 float xx = px + t * offset_x;
43 float yy = py + t * offset_y;
45 int ix = (int)floor(xx);
46 int iy = (int)floor(yy);
48 float dx = xx - floor(xx);
49 float dy = yy - floor(yy);
51 float4 mixy0,mixy1,pix0,pix1,pix2,pix3;
53 pix0 = get_pixel_color(src_buf, src_width,
54 src_height, src_x, src_y, ix, iy);
55 pix1 = get_pixel_color(src_buf, src_width,
56 src_height, src_x, src_y, ix+1, iy);
57 pix2 = get_pixel_color(src_buf, src_width,
58 src_height, src_x, src_y, ix, iy+1);
59 pix3 = get_pixel_color(src_buf, src_width,
60 src_height, src_x, src_y, ix+1, iy+1);
62 mixy0 = dy * (pix2 - pix0) + pix0;
63 mixy1 = dy * (pix3 - pix1) + pix1;
65 sum += dx * (mixy1 - mixy0) + mixy0;
68 dst_buf[gidy * get_global_size(0) + gidx] =
69 sum / (float4)(num_steps);