blob: 45eea5ef2c4f41188835e9feabf2760a86398b09 [file] [log] [blame]
#pragma version(1)
#include "ip.rsh"
void root(const void *v_in, void *v_out, const void *usrData, uint32_t x, uint32_t y) {
float4 *output = (float4 *)v_out;
const FilterStruct *fs = (const FilterStruct *)usrData;
const float4 *input = (const float4 *)rsGetElementAt(fs->ain, 0, y);
float3 blurredPixel = 0;
const float *gPtr = fs->gaussian;
if ((x > fs->radius) && (x < (fs->width - fs->radius))) {
const float4 *i = input + (x - fs->radius);
for (int r = -fs->radius; r <= fs->radius; r ++) {
blurredPixel += i->xyz * gPtr[0];
gPtr++;
i++;
}
} else {
for (int r = -fs->radius; r <= fs->radius; r ++) {
// Stepping left and right away from the pixel
int validW = rsClamp((int)x + r, (int)0, (int)(fs->width - 1));
blurredPixel += input[validW].xyz * gPtr[0];
gPtr++;
}
}
output->xyz = blurredPixel;
}