blob: 652ffd76dd3dfe42192ed409d060f556a5ddceda [file] [log] [blame]
Jason Sams8f8a5722010-07-15 17:11:13 -07001#pragma version(1)
2
Jason Sams8f8a5722010-07-15 17:11:13 -07003#include "ip.rsh"
4
Jason Sams8f8a5722010-07-15 17:11:13 -07005void root(const void *v_in, void *v_out, const void *usrData, uint32_t x, uint32_t y) {
Jason Sams43c31422010-08-16 12:29:23 -07006 float4 *output = (float4 *)v_out;
Jason Sams8f8a5722010-07-15 17:11:13 -07007 const FilterStruct *fs = (const FilterStruct *)usrData;
Jason Sams43c31422010-08-16 12:29:23 -07008 const float4 *input = (const float4 *)rsGetElementAt(fs->ain, 0, y);
Jason Sams8f8a5722010-07-15 17:11:13 -07009
Jason Samsf46f25a2010-07-22 14:44:04 -070010 float3 blurredPixel = 0;
Jason Samsf46f25a2010-07-22 14:44:04 -070011 const float *gPtr = fs->gaussian;
12 if ((x > fs->radius) && (x < (fs->width - fs->radius))) {
Jason Sams43c31422010-08-16 12:29:23 -070013 const float4 *i = input + (x - fs->radius);
Alex Sakhartchouked9f2102010-11-09 17:00:54 -080014 for (int r = -fs->radius; r <= fs->radius; r ++) {
Jason Sams43c31422010-08-16 12:29:23 -070015 blurredPixel += i->xyz * gPtr[0];
Jason Samsf46f25a2010-07-22 14:44:04 -070016 gPtr++;
17 i++;
Jason Sams8f8a5722010-07-15 17:11:13 -070018 }
Jason Samsf46f25a2010-07-22 14:44:04 -070019 } else {
Alex Sakhartchouked9f2102010-11-09 17:00:54 -080020 for (int r = -fs->radius; r <= fs->radius; r ++) {
Jason Samsf46f25a2010-07-22 14:44:04 -070021 // Stepping left and right away from the pixel
Jason Sams2cbd2982010-08-11 13:26:28 -070022 int validW = rsClamp(x + r, (uint)0, (uint)(fs->width - 1));
Jason Sams43c31422010-08-16 12:29:23 -070023 blurredPixel += input[validW].xyz * gPtr[0];
Jason Samsf46f25a2010-07-22 14:44:04 -070024 gPtr++;
Jason Sams8f8a5722010-07-15 17:11:13 -070025 }
Jason Sams8f8a5722010-07-15 17:11:13 -070026 }
27
Jason Sams43c31422010-08-16 12:29:23 -070028 output->xyz = blurredPixel;
Jason Sams8f8a5722010-07-15 17:11:13 -070029}
Jason Samsf46f25a2010-07-22 14:44:04 -070030