Sine Distort
Distorts an image using sine.
Source
https://github.com/amsqr/Chromanin.js
Notes
This does not work the same as the code it was made from.
The way the edges are handled is different...might look at it later, but probably not
Still, makes some cool looks.
Code
Configuration
Configuration.AddEditBox("_dx", "dx", "", 0.100000001490116);
Configuration.AddEditBox("_dy", "dy", "", 0.125);
Configuration.AddEditBox("_depthX", "depthX", "", 25);
Configuration.AddEditBox("_depthY", "depthY", "", 20);
Execution
var image = Document.RasterImage;
var clone = Document.Duplicate();
clone = clone.RasterImage;
var w = image.sizeX;
var h = image.sizeY;
function getBilerpixel(l, x, y) {
var corner = [];
var xi, yi, xip, xip1;
var yip, yip1;
xi = ~~x;
yi = ~~y;
xip = Math.max(Math.min(xi , w-1),0);
xip1 = Math.max(Math.min(xi + 1,w-1),0) ;
yip1 = Math.max(Math.min(yi + 1, h-1),0);
yip = Math.max(Math.min(yi , h-1),0);
corner[0] = l.GetPixel(xip,yip,0,0);//this.layers[l].data32[xip + yip];
corner[1] = l.GetPixel(xip1,yip,0,0);//this.layers[l].data32[xip1 + yip];
corner[2] = l.GetPixel(xip,yip1,0,0);//this.layers[l].data32[xip + yip1];
corner[3] = l.GetPixel(xip1,yip1,0,0);//this.layers[l].data32[xip1 + yip1];
return cosineInterpolate(corner, (x - xi), (y - yi));
}
function cosineInterpolate(v, x, y) {
var f1, f2, mf1, mf2, g0, g1, g2, g3;
var color,r,g,b;
mf1 = (1 - Math.cos(x * Math.PI)) * 0.5;
mf2 = (1 - Math.cos(y * Math.PI)) * 0.5;
var f1 = 1 - mf1;
var f2 = 1 - mf2;
var g0 = f1 * f2;
var g1 = mf1 * f2;
var g2 = f1 * mf2;
var g3 = mf1 * mf2;
color = ((v[0] & 255) * g0 + (v[1] & 255) * g1 + (v[2] & 255) * g2 + (v[3] & 255) * g3);
color = color | ((((v[0] >> 8 & 255) * g0 + (v[1] >> 8 & 255) * g1 + (v[2] >> 8 & 255) * g2 + (v[3] >> 8 & 255) * g3) & 255) << 8);
color = color | ((((v[0] >> 16 & 255) * g0 + (v[1] >> 16 & 255) * g1 + (v[2] >> 16 & 255) * g2 + (v[3] >> 16 & 255) * g3) & 255) << 16);
color = color | ((((v[0] >> 24 & 255) * g0 + (v[1] >> 24 & 255) * g1 + (v[2] >> 24 & 255) * g2 + (v[3] >> 24 & 255) * g3) & 255) << 24);
return color;
}
var dx=Configuration._dx;
var dy=Configuration._dy;
var depthX=Configuration._depthX;
var depthY=Configuration._depthY;
var lookupX=[],lookupY=[];
for(var x=0;x<w;x++){
lookupX[x]=Math.sin(dy * x) * depthY;
}
for(var y=0;y<h;y++){
lookupY[y]= Math.sin(dx * y) * depthX;
}
var c;
for (x=0; x<w; x++){
for (y=0; y<h; y++){
c = getBilerpixel(clone, lookupY[y]+x, lookupX[x]+y);
image.SetPixel(x, y, 0, 0, c);
}
}