Jason Sams | 8f8a572 | 2010-07-15 17:11:13 -0700 | [diff] [blame] | 1 | #pragma version(1) |
| 2 | |
Jason Sams | 8f8a572 | 2010-07-15 17:11:13 -0700 | [diff] [blame] | 3 | #include "ip.rsh" |
| 4 | |
Jason Sams | 8f8a572 | 2010-07-15 17:11:13 -0700 | [diff] [blame] | 5 | void root(const void *v_in, void *v_out, const void *usrData, uint32_t x, uint32_t y) { |
Jason Sams | 43c3142 | 2010-08-16 12:29:23 -0700 | [diff] [blame] | 6 | float4 *output = (float4 *)v_out; |
Jason Sams | 8f8a572 | 2010-07-15 17:11:13 -0700 | [diff] [blame] | 7 | const FilterStruct *fs = (const FilterStruct *)usrData; |
Jason Sams | 43c3142 | 2010-08-16 12:29:23 -0700 | [diff] [blame] | 8 | const float4 *input = (const float4 *)rsGetElementAt(fs->ain, 0, y); |
Jason Sams | 8f8a572 | 2010-07-15 17:11:13 -0700 | [diff] [blame] | 9 | |
Jason Sams | f46f25a | 2010-07-22 14:44:04 -0700 | [diff] [blame] | 10 | float3 blurredPixel = 0; |
Jason Sams | f46f25a | 2010-07-22 14:44:04 -0700 | [diff] [blame] | 11 | const float *gPtr = fs->gaussian; |
| 12 | if ((x > fs->radius) && (x < (fs->width - fs->radius))) { |
Jason Sams | 43c3142 | 2010-08-16 12:29:23 -0700 | [diff] [blame] | 13 | const float4 *i = input + (x - fs->radius); |
Alex Sakhartchouk | ed9f210 | 2010-11-09 17:00:54 -0800 | [diff] [blame] | 14 | for (int r = -fs->radius; r <= fs->radius; r ++) { |
Jason Sams | 43c3142 | 2010-08-16 12:29:23 -0700 | [diff] [blame] | 15 | blurredPixel += i->xyz * gPtr[0]; |
Jason Sams | f46f25a | 2010-07-22 14:44:04 -0700 | [diff] [blame] | 16 | gPtr++; |
| 17 | i++; |
Jason Sams | 8f8a572 | 2010-07-15 17:11:13 -0700 | [diff] [blame] | 18 | } |
Jason Sams | f46f25a | 2010-07-22 14:44:04 -0700 | [diff] [blame] | 19 | } else { |
Alex Sakhartchouk | ed9f210 | 2010-11-09 17:00:54 -0800 | [diff] [blame] | 20 | for (int r = -fs->radius; r <= fs->radius; r ++) { |
Jason Sams | f46f25a | 2010-07-22 14:44:04 -0700 | [diff] [blame] | 21 | // Stepping left and right away from the pixel |
Jason Sams | 2cbd298 | 2010-08-11 13:26:28 -0700 | [diff] [blame] | 22 | int validW = rsClamp(x + r, (uint)0, (uint)(fs->width - 1)); |
Jason Sams | 43c3142 | 2010-08-16 12:29:23 -0700 | [diff] [blame] | 23 | blurredPixel += input[validW].xyz * gPtr[0]; |
Jason Sams | f46f25a | 2010-07-22 14:44:04 -0700 | [diff] [blame] | 24 | gPtr++; |
Jason Sams | 8f8a572 | 2010-07-15 17:11:13 -0700 | [diff] [blame] | 25 | } |
Jason Sams | 8f8a572 | 2010-07-15 17:11:13 -0700 | [diff] [blame] | 26 | } |
| 27 | |
Jason Sams | 43c3142 | 2010-08-16 12:29:23 -0700 | [diff] [blame] | 28 | output->xyz = blurredPixel; |
Jason Sams | 8f8a572 | 2010-07-15 17:11:13 -0700 | [diff] [blame] | 29 | } |
Jason Sams | f46f25a | 2010-07-22 14:44:04 -0700 | [diff] [blame] | 30 | |