gint fp_median_nxn_filter_process(guchar *src, guchar *dest, gint srcW, gint srcH, gint srcChannels, gint srcRowstride, ...)
{
//Checks
g_return_val_if_fail(src!=NULL, -1);
g_return_val_if_fail(dest!=NULL, -2);
//Window
gint N, offset;
//Arguments
va_list flags;
va_start(flags, srcRowstride);
N = va_arg(flags, gint);
va_end(flags);
offset = N/2;
if(N%2==0)
printf("WARN: Asymmetric window.\n");
//Proper
int x, y, nx, ny, accum_r, accum_g, accum_b, dpix, winsize=N*N;
guchar *s;
for(x=0;x<srcW;x++)
for(y=0;y<srcH;y++)
{
if(x<=N||y<=N||x>=srcW-N||y>=srcH-N)continue; //FIXME: Ignore borders.
accum_r=accum_g=accum_b=0;
for(nx=0;nx<N;nx++)
for(ny=0;ny<N;ny++)
{
s=src+(srcChannels*(x-offset+nx))+(srcRowstride*(y-offset+ny));
accum_r+=s[0];
accum_g+=s[1];
accum_b+=s[2];
}
dpix=srcChannels*x+y*srcRowstride;
dest[dpix ]=accum_r/winsize;
dest[dpix+1]=accum_g/winsize;
dest[dpix+2]=accum_b/winsize;
}
return 0;
}