summaryrefslogtreecommitdiff
path: root/convolve.js
diff options
context:
space:
mode:
Diffstat (limited to 'convolve.js')
-rw-r--r--convolve.js79
1 files changed, 79 insertions, 0 deletions
diff --git a/convolve.js b/convolve.js
new file mode 100644
index 0000000..2e59c6c
--- /dev/null
+++ b/convolve.js
@@ -0,0 +1,79 @@
+Kernel = function (w, h, a) {
+ this.w = w
+ this.h = h
+ this.a = a
+}
+Kernel.prototype.normalize = function(){
+ var n = 0;
+ for (var i = 0; i < this.a.length; i++)
+ n += this.a[i];
+ for (var i = 0; i < this.a.length; i++)
+ this.a[i] /= n;
+ return this
+}
+ConvolveOp = function (kernel, edge_zero_fill, idk) {
+ var k = kernel.a
+ var klen = k.length
+ var kw = kernel.w
+ var kh = kernel.h
+ var kx = -((kw / 2)|0)
+ var ky = -((kh / 2)|0)
+ this.filter = function(srcImageData, destImageData){
+ // assume these are both identically sized canvas objects..
+ var src = srcImageData.data
+ var dest = destImageData.data
+ var w = srcImageData.width
+ var h = srcImageData.height
+ var ix, iy, it, jx, jy, jt
+ var r, g, b, a
+
+ for (var i = 0, len = w*h; i < len; i++) {
+ ix = i%w
+ iy = (i/w)|0
+ it = i * 4
+ r = g = b = a = 0
+ for (var j = 0; j < klen; j++) {
+ jx = ix + j%kw + kx
+ jy = iy + ((j/kh)|0) + ky
+ jt = 4 * (jx + jy*w)
+ if (0 > jx || jx > w || 0 > jy || jy > h) {
+ if (edge_zero_fill) {
+ continue
+ }
+ jt = it
+ }
+ r += src[jt] * k[j]
+ g += src[jt+1] * k[j]
+ b += src[jt+2] * k[j]
+ a += src[jt+3] * k[j]
+ }
+ dest[it] = r
+ dest[it+1] = g
+ dest[it+2] = b
+ dest[it+3] = a
+ }
+ return destImageData
+ }
+ this.convolveCanvas = function(image){
+ var target = document.createElement("canvas")
+ var w = target.width = image.width
+ var h = target.height = image.height
+ var imagectx = image.getContext('2d')
+ var targetctx = target.getContext('2d')
+
+ targetctx.drawImage(image, 0, 0);
+
+ // get source pixels
+ var src = imagectx.getImageData(0,0,w,h)
+ var dest = targetctx.getImageData(0,0,w,h)
+
+ // convolve the cloned image
+ dest = this.filter(src, dest);
+
+ targetctx.putImageData(dest, 0,0)
+
+ return target
+ }
+}
+ConvolveOp.prototype.EDGE_NO_OP = 0
+ConvolveOp.prototype.EDGE_ZERO_FILL = 1