%ffp // works with tiles, 16 bit images and correct edge handling Title :"Box Blur" Filename :"colorspace.8bf" Description:"Box blur." Copyright :"© 2007 GPL" Author :"Alois Zingl" Version :"1.1 6. Mai 2008" URL :"http://free.pages.at/easyfilter/filtermeister.html" Category :"easyFilter" ctl(0):"Blur (pixels)" OnFilterStart: { isTileable = !doingProxy; needPadding = ctl(0)+1; bandWidth = 100+needPadding; return false; } ForEveryTile: { int Blur = (2*ctl(0)+scaleFactor)/(2*scaleFactor); // blur box radius int x, y, z; for (z = 0; z < planesWithoutAlpha; ++z) { if (updateProgress((1-doingProxy)*y_start*planesWithoutAlpha*2+(y_end-y_start)*(2*z+1), (doingProxy ? y_end-y_start : Y)*planesWithoutAlpha*2)) abort(); // vertical blur... for (x = max(0, x_start-Blur); x < min(X, x_end+Blur); ++x) { // loop +/- blur radius needed in case of preview zooming int sum = 0, Weight = min(Y-1, y_start+Blur); for (y = Weight; y >= max(0, y_start-Blur); --y) sum += src(x, y, z); Weight -= y; for (y = y_start; y < y_end; ++y) { pset(x, y, z, sum/Weight); if (y+Blur+1 < Y) { sum += src(x, y+Blur+1, z); Weight++; } if (y-Blur >= 0) { sum -= src(x, y-Blur, z); Weight--; } } } if (updateProgress((1-doingProxy)*y_start*planesWithoutAlpha+(y_end-y_start)*(z+1), (doingProxy ? y_end-y_start : Y)*planesWithoutAlpha)) abort(); // horizontal blur... for (y = y_start; y < y_end; ++y) { int sum = 0, Weight = min(X-1, x_start+Blur); for (x = Weight; x >= max(0, x_start-Blur); --x) { i = pget(x, y, z); put(i,x&1023); sum += i; } Weight -= x; for (x = x_start; x < x_end; ++x) { pset(x, y, z, sum/Weight); if (x+Blur+1 < X) { i = pget(x+Blur+1, y, z); put(i,(x+Blur+1)&1023); sum += i; Weight++; } if (x-Blur >= 0) { sum -= get((x-Blur)&1023); Weight--; } } } } return true; //Done! } OnFilterEnd: { updateProgress(0, 1); return false; }