var linear_interpolate(var a, var b, var x)
{
return (a*(1-x) + b*x);
}
//Perturbation Filter
//recommended default values:
//magnitude_ = 0.3
///////////////////////////////
void bmap_perturbation_filter(BMAP* bmap_,var magnitude_)
{
var size_x_=bmap_width(bmap_);
var size_y_=bmap_height(bmap_);
var format=bmap_format(bmap_);
BMAP* bmap_tmp=bmap_createblack(size_x_,size_y_,format);
int py; for(py=0;py<size_y_;py++)
{
int px; for(px=0;px<size_x_;px++)
{
COLOR color_;
var format=bmap_lock(bmap_,0);var alpha_;
var pixel=pixel_for_bmap(bmap_, px, py);
pixel_to_vec(color_,alpha_,format,pixel);
bmap_unlock(bmap_);
var grey=clamp(color_.red*0.21 + color_.green*0.71 + color_.blue*0.07, 0, 255);
var p = (magnitude_*(grey-128))/255;
var x_coord = px + integer(size_x_*p);
var x_coord_lo = x_coord;
var x_coord_hi = x_coord_lo + 1;
var x_frac = x_coord - x_coord_lo;
var y_coord = py + size_y_*p;
var y_coord_lo = y_coord;
var y_coord_hi = y_coord_lo + 1;
var y_frac = y_coord - y_coord_lo;
x_coord_lo=clamp(x_coord_lo,0,size_x_-1);
x_coord_hi=clamp(x_coord_hi,0,size_x_-1);
y_coord_lo=clamp(y_coord_lo,0,size_y_-1);
y_coord_hi=clamp(y_coord_hi,0,size_y_-1);
COLOR v1,v2,v3,v4;
var a1,a2,a3,a4;
var format=bmap_lock(bmap_,0);
var pixel=pixel_for_bmap(bmap_,x_coord_lo,y_coord_lo);pixel_to_vec(v1,a1,format,pixel);
var pixel=pixel_for_bmap(bmap_,x_coord_hi,y_coord_lo);pixel_to_vec(v2,a2,format,pixel);
var pixel=pixel_for_bmap(bmap_,x_coord_lo,y_coord_hi);pixel_to_vec(v3,a3,format,pixel);
var pixel=pixel_for_bmap(bmap_,x_coord_hi,y_coord_hi);pixel_to_vec(v4,a4,format,pixel);
bmap_unlock(bmap_);
var val1a = linear_interpolate(v1.red,v2.red,x_frac);
var val2a = linear_interpolate(v3.red,v4.red,x_frac);
var val1b = linear_interpolate(v1.green,v2.green,x_frac);
var val2b = linear_interpolate(v3.green,v4.green,x_frac);
var val1c = linear_interpolate(v1.blue,v2.blue,x_frac);
var val2c = linear_interpolate(v3.blue,v4.blue,x_frac);
var val1d = linear_interpolate(a1,a2,x_frac);
var val2d = linear_interpolate(a3,a4,x_frac);
color_.red=linear_interpolate(val1a,val2a,y_frac);
color_.green=linear_interpolate(val1b,val2b,y_frac);
color_.blue=linear_interpolate(val1c,val2c,y_frac);
alpha_=linear_interpolate(val1d,val2d,y_frac);
var format=bmap_lock(bmap_tmp,0);
var pixel=pixel_for_vec(color_,alpha_,format);
pixel_to_bmap(bmap_tmp, px, py, pixel);
bmap_unlock(bmap_tmp);
}
}
bmap_blit(bmap_,bmap_tmp,NULL,NULL);
bmap_purge(bmap_tmp);bmap_remove(bmap_tmp);
}