diff --git a/index.html b/index.html
index 3b20ef4..b4fd70a 100644
--- a/index.html
+++ b/index.html
@@ -31,23 +31,26 @@
diff --git a/scripts/lib/delaunay.js b/scripts/lib/delaunay.js
deleted file mode 100644
index f7ba795..0000000
--- a/scripts/lib/delaunay.js
+++ /dev/null
@@ -1,190 +0,0 @@
-/*global define*/
-define(
- function()
- {
- // https://github.com/ironwallaby/delaunay/blob/master/delaunay.js
- function Triangle(a, b, c) {
- this.a = a
- this.b = b
- this.c = c
-
- var A = b.x - a.x,
- B = b.y - a.y,
- C = c.x - a.x,
- D = c.y - a.y,
- E = A * (a.x + b.x) + B * (a.y + b.y),
- F = C * (a.x + c.x) + D * (a.y + c.y),
- G = 2 * (A * (c.y - b.y) - B * (c.x - b.x)),
- minx, miny, dx, dy
-
- /* If the points of the triangle are collinear, then just find the
- * extremes and use the midpoint as the center of the circumcircle. */
- if(Math.abs(G) < 0.000001) {
- minx = Math.min(a.x, b.x, c.x)
- miny = Math.min(a.y, b.y, c.y)
- dx = (Math.max(a.x, b.x, c.x) - minx) * 0.5
- dy = (Math.max(a.y, b.y, c.y) - miny) * 0.5
-
- this.x = minx + dx
- this.y = miny + dy
- this.r = dx * dx + dy * dy
- }
-
- else {
- this.x = (D*E - B*F) / G
- this.y = (A*F - C*E) / G
- dx = this.x - a.x
- dy = this.y - a.y
- this.r = dx * dx + dy * dy
- }
- }
-
- Triangle.prototype.draw = function(ctx) {
- ctx.beginPath()
- ctx.moveTo(this.a.x, this.a.y)
- ctx.lineTo(this.b.x, this.b.y)
- ctx.lineTo(this.c.x, this.c.y)
- ctx.closePath()
- ctx.stroke()
- }
-
- function byX(a, b) {
- return b.x - a.x
- }
-
- function dedup(edges) {
- var j = edges.length,
- a, b, i, m, n
-
- outer: while(j) {
- b = edges[--j]
- a = edges[--j]
- i = j
- while(i) {
- n = edges[--i]
- m = edges[--i]
- if((a === m && b === n) || (a === n && b === m)) {
- edges.splice(j, 2)
- edges.splice(i, 2)
- j -= 2
- continue outer
- }
- }
- }
- }
-
- function triangulate(vertices) {
- /* Bail if there aren't enough vertices to form any triangles. */
- if(vertices.length < 3)
- return []
-
- /* Ensure the vertex array is in order of descending X coordinate
- * (which is needed to ensure a subquadratic runtime), and then find
- * the bounding box around the points. */
- vertices.sort(byX)
-
- var i = vertices.length - 1,
- xmin = vertices[i].x,
- xmax = vertices[0].x,
- ymin = vertices[i].y,
- ymax = ymin
-
- while(i--) {
- if(vertices[i].y < ymin) ymin = vertices[i].y
- if(vertices[i].y > ymax) ymax = vertices[i].y
- }
-
- /* Find a supertriangle, which is a triangle that surrounds all the
- * vertices. This is used like something of a sentinel value to remove
- * cases in the main algorithm, and is removed before we return any
- * results.
- *
- * Once found, put it in the "open" list. (The "open" list is for
- * triangles who may still need to be considered; the "closed" list is
- * for triangles which do not.) */
- var dx = xmax - xmin,
- dy = ymax - ymin,
- dmax = (dx > dy) ? dx : dy,
- xmid = (xmax + xmin) * 0.5,
- ymid = (ymax + ymin) * 0.5,
- open = [
- new Triangle(
- {x: xmid - 20 * dmax, y: ymid - dmax, __sentinel: true},
- {x: xmid , y: ymid + 20 * dmax, __sentinel: true},
- {x: xmid + 20 * dmax, y: ymid - dmax, __sentinel: true}
- )
- ],
- closed = [],
- edges = [],
- j, a, b
-
- /* Incrementally add each vertex to the mesh. */
- i = vertices.length
- while(i--) {
- /* For each open triangle, check to see if the current point is
- * inside it's circumcircle. If it is, remove the triangle and add
- * it's edges to an edge list. */
- edges.length = 0
- j = open.length
- while(j--) {
- /* If this point is to the right of this triangle's circumcircle,
- * then this triangle should never get checked again. Remove it
- * from the open list, add it to the closed list, and skip. */
- dx = vertices[i].x - open[j].x
- if(dx > 0 && dx * dx > open[j].r) {
- closed.push(open[j])
- open.splice(j, 1)
- continue
- }
-
- /* If not, skip this triangle. */
- dy = vertices[i].y - open[j].y
- if(dx * dx + dy * dy > open[j].r)
- continue
-
- /* Remove the triangle and add it's edges to the edge list. */
- edges.push(
- open[j].a, open[j].b,
- open[j].b, open[j].c,
- open[j].c, open[j].a
- )
- open.splice(j, 1)
- }
-
- /* Remove any doubled edges. */
- dedup(edges)
-
- /* Add a new triangle for each edge. */
- j = edges.length
- while(j) {
- b = edges[--j]
- a = edges[--j]
- open.push(new Triangle(a, b, vertices[i]))
- }
- }
-
- /* Copy any remaining open triangles to the closed list, and then
- * remove any triangles that share a vertex with the supertriangle. */
- Array.prototype.push.apply(closed, open)
-
- i = closed.length
- while(i--)
- if(closed[i].a.__sentinel ||
- closed[i].b.__sentinel ||
- closed[i].c.__sentinel)
- closed.splice(i, 1)
-
- /* Yay, we're done! */
- return closed
- }
-
- if (typeof module !== 'undefined') {
- module.exports = {
- Triangle: Triangle,
- triangulate: triangulate
- }
- }
-
- return triangulate;
- }
-);
\ No newline at end of file
diff --git a/scripts/lib/superfast-blur.0.5.js b/scripts/lib/superfast-blur.0.5.js
deleted file mode 100644
index b018eea..0000000
--- a/scripts/lib/superfast-blur.0.5.js
+++ /dev/null
@@ -1,338 +0,0 @@
-/*global define*/
-/*
-
-Superfast Blur - a fast Box Blur For Canvas
-
-Version: 0.5
-Author: Mario Klingemann
-Contact: mario@quasimondo.com
-Website: http://www.quasimondo.com/BoxBlurForCanvas
-Twitter: @quasimondo
-
-In case you find this class useful - especially in commercial projects -
-I am not totally unhappy for a small donation to my PayPal account
-mario@quasimondo.de
-
-Or support me on flattr:
-https://flattr.com/thing/140066/Superfast-Blur-a-pretty-fast-Box-Blur-Effect-for-CanvasJavascript
-
-Copyright (c) 2011 Mario Klingemann
-
-Note by Georg Fischer (snorpey@gmail.com / @snorpey):
-While much of the original algorithm is still the same,
-I modified some parts of the script to fit my needs:
-- removed the iterations argument
-- modified the functions to accept an imageData object
- instead of element ids to remove dependency on the
- document object.
-- added AMD / requirejs wrapper
-
-
-Permission is hereby granted, free of charge, to any person
-obtaining a copy of this software and associated documentation
-files (the "Software"), to deal in the Software without
-restriction, including without limitation the rights to use,
-copy, modify, merge, publish, distribute, sublicense, and/or sell
-copies of the Software, and to permit persons to whom the
-Software is furnished to do so, subject to the following
-conditions:
-
-The above copyright notice and this permission notice shall be
-included in all copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
-EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
-OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
-NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
-HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
-WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
-FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
-OTHER DEALINGS IN THE SOFTWARE.
-
-*/
-define(
- function()
- {
- var mul_table = [
- 1,57,41,21,203,34,97,73,227,91,149,62,105,45,39,137,241,107,3,173,39,71,65,238,219,101,
- 187,87,81,151,141,133,249,117,221,209,197,187,177,169,5,153,73,139,133,127,243,233,223,
- 107,103,99,191,23,177,171,165,159,77,149,9,139,135,131,253,245,119,231,224,109,211,103,
- 25,195,189,23,45,175,171,83,81,79,155,151,147,9,141,137,67,131,129,251,123,30,235,115,
- 113,221,217,53,13,51,50,49,193,189,185,91,179,175,43,169,83,163,5,79,155,19,75,147,145,
- 143,35,69,17,67,33,65,255,251,247,243,239,59,29,229,113,111,219,27,213,105,207,51,201,
- 199,49,193,191,47,93,183,181,179,11,87,43,85,167,165,163,161,159,157,155,77,19,75,37,
- 73,145,143,141,35,138,137,135,67,33,131,129,255,63,250,247,61,121,239,237,117,29,229,
- 227,225,111,55,109,216,213,211,209,207,205,203,201,199,197,195,193,48,190,47,93,185,
- 183,181,179,178,176,175,173,171,85,21,167,165,41,163,161,5,79,157,78,154,153,19,75,
- 149,74,147,73,144,143,71,141,140,139,137,17,135,134,133,66,131,65,129,1
- ];
-
- var shg_table = [
- 0,9,10,10,14,12,14,14,16,15,16,15,16,15,15,17,18,17,12,18,16,17,17,19,19,18,19,18,18,
- 19,19,19,20,19,20,20,20,20,20,20,15,20,19,20,20,20,21,21,21,20,20,20,21,18,21,21,21,
- 21,20,21,17,21,21,21,22,22,21,22,22,21,22,21,19,22,22,19,20,22,22,21,21,21,22,22,22,
- 18,22,22,21,22,22,23,22,20,23,22,22,23,23,21,19,21,21,21,23,23,23,22,23,23,21,23,22,
- 23,18,22,23,20,22,23,23,23,21,22,20,22,21,22,24,24,24,24,24,22,21,24,23,23,24,21,24,
- 23,24,22,24,24,22,24,24,22,23,24,24,24,20,23,22,23,24,24,24,24,24,24,24,23,21,23,22,
- 23,24,24,24,22,24,24,24,23,22,24,24,25,23,25,25,23,24,25,25,24,22,25,25,25,24,23,24,
- 25,25,25,25,25,25,25,25,25,25,25,25,23,25,23,24,25,25,25,25,25,25,25,25,25,24,22,25,
- 25,23,25,25,20,24,25,24,25,25,22,24,25,24,25,24,25,25,24,25,25,25,25,22,25,25,25,24,
- 25,24,25,18
- ];
-
- function boxBlurCanvas( image_data, radius, blur_alpha_channel )
- {
- var result = image_data;
-
- if ( ! ( isNaN( radius ) || radius < 1 ) )
- {
- if ( blur_alpha_channel )
- {
- result = boxBlurCanvasRGBA( image_data, radius );
- }
-
- else
- {
- result = boxBlurCanvasRGB( image_data, radius );
- }
- }
-
- return result;
- }
-
- function boxBlurCanvasRGBA( image_data, radius )
- {
- radius |= 0;
-
- var pixels = image_data.data;
- var width = image_data.width;
- var height = image_data.height;
- var rsum, gsum, bsum, asum, x, y, i, p, p1, p2, yp, yi, yw, idx, pa;
- var wm = width - 1;
- var hm = height - 1;
- var wh = width * height;
- var rad1 = radius + 1;
-
- var mul_sum = mul_table[radius];
- var shg_sum = shg_table[radius];
-
- var r = [ ];
- var g = [ ];
- var b = [ ];
- var a = [ ];
-
- var vmin = [ ];
- var vmax = [ ];
-
- yw = yi = 0;
-
- for ( y = 0; y < height; y++ )
- {
- rsum = pixels[yw] * rad1;
- gsum = pixels[yw + 1] * rad1;
- bsum = pixels[yw + 2] * rad1;
- asum = pixels[yw + 3] * rad1;
-
- for ( i = 1; i <= radius; i++ )
- {
- p = yw + ( ( ( i > wm ? wm : i ) ) << 2 );
- rsum += pixels[p++];
- gsum += pixels[p++];
- bsum += pixels[p++];
- asum += pixels[p];
- }
-
- for ( x = 0; x < width; x++ )
- {
- r[yi] = rsum;
- g[yi] = gsum;
- b[yi] = bsum;
- a[yi] = asum;
-
- if ( y === 0 )
- {
- vmin[x] = ( ( p = x + rad1) < wm ? p : wm ) << 2;
- vmax[x] = ( ( p = x - radius) > 0 ? p << 2 : 0 );
- }
-
- p1 = yw + vmin[x];
- p2 = yw + vmax[x];
-
- rsum += pixels[p1++] - pixels[p2++];
- gsum += pixels[p1++] - pixels[p2++];
- bsum += pixels[p1++] - pixels[p2++];
- asum += pixels[p1] - pixels[p2];
-
- yi++;
- }
-
- yw += ( width << 2 );
- }
-
- for ( x = 0; x < width; x++ )
- {
- yp = x;
- rsum = r[yp] * rad1;
- gsum = g[yp] * rad1;
- bsum = b[yp] * rad1;
- asum = a[yp] * rad1;
-
- for ( i = 1; i <= radius; i++ )
- {
- yp += ( i > hm ? 0 : width );
- rsum += r[yp];
- gsum += g[yp];
- bsum += b[yp];
- asum += a[yp];
- }
-
- yi = x << 2;
-
- for ( y = 0; y < height; y++ )
- {
- pixels[yi + 3] = pa = ( asum * mul_sum ) >>> shg_sum;
-
- if ( pa > 0 )
- {
- pa = 255 / pa;
- pixels[yi] = ( ( rsum * mul_sum ) >>> shg_sum ) * pa;
- pixels[yi+1] = ( ( gsum * mul_sum ) >>> shg_sum ) * pa;
- pixels[yi+2] = ( ( bsum * mul_sum ) >>> shg_sum ) * pa;
- }
-
- else
- {
- pixels[yi] = pixels[yi + 1] = pixels[yi + 2] = 0;
- }
-
- if ( x === 0 )
- {
- vmin[y] = ( ( p = y + rad1) < hm ? p : hm ) * width;
- vmax[y] = ( ( p = y - radius) > 0 ? p * width : 0 );
- }
-
- p1 = x + vmin[y];
- p2 = x + vmax[y];
-
- rsum += r[p1] - r[p2];
- gsum += g[p1] - g[p2];
- bsum += b[p1] - b[p2];
- asum += a[p1] - a[p2];
-
- yi += width << 2;
- }
- }
-
- return image_data;
- }
-
- function boxBlurCanvasRGB( image_data, radius )
- {
- radius |= 0;
-
- var pixels = image_data.data;
- var width = image_data.width;
- var height = image_data.height;
- var rsum, gsum, bsum, asum, x, y, i, p, p1, p2, yp, yi, yw, idx;
- var wm = width - 1;
- var hm = height - 1;
- var wh = width * height;
- var rad1 = radius + 1;
-
- var r = [ ];
- var g = [ ];
- var b = [ ];
-
- var mul_sum = mul_table[radius];
- var shg_sum = shg_table[radius];
-
- var vmin = [ ];
- var vmax = [ ];
-
- yw = yi = 0;
-
- for ( y = 0; y < height; y++ )
- {
- rsum = pixels[yw] * rad1;
- gsum = pixels[yw + 1] * rad1;
- bsum = pixels[yw + 2] * rad1;
-
- for ( i = 1; i <= radius; i++ )
- {
- p = yw + ( ( ( i > wm ? wm : i ) ) << 2 );
- rsum += pixels[p++];
- gsum += pixels[p++];
- bsum += pixels[p++];
- }
-
- for ( x = 0; x < width; x++ )
- {
- r[yi] = rsum;
- g[yi] = gsum;
- b[yi] = bsum;
-
- if ( y === 0 )
- {
- vmin[x] = ( ( p = x + rad1) < wm ? p : wm ) << 2;
- vmax[x] = ( ( p = x - radius) > 0 ? p << 2 : 0 );
- }
-
- p1 = yw + vmin[x];
- p2 = yw + vmax[x];
-
- rsum += pixels[p1++] - pixels[p2++];
- gsum += pixels[p1++] - pixels[p2++];
- bsum += pixels[p1++] - pixels[p2++];
-
- yi++;
- }
-
- yw += ( width << 2 );
- }
-
- for ( x = 0; x < width; x++ )
- {
- yp = x;
- rsum = r[yp] * rad1;
- gsum = g[yp] * rad1;
- bsum = b[yp] * rad1;
-
- for ( i = 1; i <= radius; i++ )
- {
- yp += ( i > hm ? 0 : width );
- rsum += r[yp];
- gsum += g[yp];
- bsum += b[yp];
- }
-
- yi = x << 2;
-
- for ( y = 0; y < height; y++ )
- {
- pixels[yi] = (rsum * mul_sum) >>> shg_sum;
- pixels[yi+1] = (gsum * mul_sum) >>> shg_sum;
- pixels[yi+2] = (bsum * mul_sum) >>> shg_sum;
-
- if ( x === 0 )
- {
- vmin[y] = ( ( p = y + rad1) < hm ? p : hm ) * width;
- vmax[y] = ( ( p = y - radius) > 0 ? p * width : 0 );
- }
-
- p1 = x + vmin[y];
- p2 = x + vmax[y];
-
- rsum += r[p1] - r[p2];
- gsum += g[p1] - g[p2];
- bsum += b[p1] - b[p2];
-
- yi += width << 2;
- }
- }
-
- return image_data;
- }
-
- return boxBlurCanvas;
- }
-);
\ No newline at end of file
diff --git a/scripts/lib/triangulate-image.js b/scripts/lib/triangulate-image.js
new file mode 100644
index 0000000..97a4d5b
--- /dev/null
+++ b/scripts/lib/triangulate-image.js
@@ -0,0 +1,951 @@
+(function(f) {
+ if (typeof exports === 'object' && typeof module !== 'undefined') {
+ module.exports = f();
+ } else {
+ if (typeof define === 'function' && define.amd) {
+ define([], f);
+ } else {
+ var g;
+ if (typeof window !== 'undefined') {
+ g = window;
+ } else {
+ if (typeof global !== 'undefined') {
+ g = global;
+ } else {
+ if (typeof self !== 'undefined') {
+ g = self;
+ } else {
+ g = this;
+ }
+ }
+ }
+ g.triangulate = f();
+ }
+ }
+})(function() {
+ var define, module, exports;
+ return function e(t, n, r) {
+ function s(o, u) {
+ if (!n[o]) {
+ if (!t[o]) {
+ var a = typeof require == 'function' && require;
+ if (!u && a) {
+ return a(o, !0);
+ }
+ if (i) {
+ return i(o, !0);
+ }
+ var f = new Error('Cannot find module \'' + o + '\'');
+ throw f.code = 'MODULE_NOT_FOUND', f;
+ }
+ var l = n[o] = {
+ exports: {}
+ };
+ t[o][0].call(l.exports, function(e) {
+ var n = t[o][1][e];
+ return s(n ? n : e);
+ }, l, l.exports, e, t, n, r);
+ }
+ return n[o].exports;
+ }
+ var i = typeof require == 'function' && require;
+ for (var o = 0; o < r.length; o++) {
+ s(r[o]);
+ }
+ return s;
+ }({
+ 1: [ function(_dereq_, module, exports) {
+ 'use strict';
+ module.exports = {
+ accuracy: .7,
+ blur: 40,
+ fill: !0,
+ stroke: !0,
+ strokeWidth: .5,
+ lineJoin: 'miter',
+ vertexCount: 700
+ };
+ }, {} ],
+ 2: [ function(_dereq_, module, exports) {
+ 'use strict';
+ function checkParams(params) {
+ return 'object' != typeof params && (params = {}), 'number' != typeof params.accuracy || isNaN(params.accuracy) ? params.accuracy = defaultParams.accuracy : params.accuracy = clamp(params.accuracy, 0, 1),
+ ('number' != typeof params.blur || isNaN(params.blur)) && (params.blur = defaultParams.blur),
+ 'string' != typeof params.fill && 'boolean' != typeof params.fill && (params.fill = defaultParams.fill),
+ 'string' != typeof params.stroke && 'boolean' != typeof params.stroke && (params.stroke = defaultParams.stroke),
+ ('number' != typeof params.strokeWidth || isNaN(params.strokeWidth)) && (params.strokeWidth = defaultParams.strokeWidth),
+ ('string' != typeof params.lineJoin || -1 === allowedLineJoins.indexOf(params.lineJoin)) && (params.lineJoin = defaultParams.lineJoin),
+ ('number' != typeof params.vertexCount || isNaN(params.vertexCount)) && (params.vertexCount = defaultParams.vertexCount),
+ params;
+ }
+ var clamp = _dereq_('./util/clamp.js'), defaultParams = _dereq_('./defaultParams.js'), fromImageToImageData = _dereq_('./input/fromImageToImageData.js'), polygonsToImageData = _dereq_('./output/polygonsToImageData.js'), polygonsToDataURL = _dereq_('./output/polygonsToDataURL.js'), polygonsToSVG = _dereq_('./output/polygonsToSVG.js'), fromBufferToImageData, polygonsToBuffer, polygonsToPNGStream, polygonsToJPGStream, polygonsToSVGStream, allowedLineJoins = [ 'miter', 'round', 'bevel' ];
+ module.exports = function(params, callback) {
+ function getInput() {
+ return input;
+ }
+ function getOutput() {
+ return output;
+ }
+ function canStart() {
+ return inputFn && outputFn && params;
+ }
+ function getParams() {
+ return params;
+ }
+ function go(fn) {
+ return canStart() ? start() : fn();
+ }
+ function start() {
+ var imageData = inputFn(), polygons = callback(imageData, params);
+ return outputFn(polygons, imageData);
+ }
+ params = checkParams(params);
+ var inputFn, outputFn, input = {
+ getParams: getParams
+ }, output = {
+ getParams: getParams
+ };
+ return input.fromImageData = function(imageData) {
+ return inputFn = function() {
+ return imageData;
+ }, go(getOutput);
+ }, output.toDataURL = function(dataUrlParams) {
+ return outputFn = function(polygons, size) {
+ return polygonsToDataURL(polygons, size, dataUrlParams);
+ }, go(getInput);
+ }, output.toImageData = function(imageDataParams) {
+ return outputFn = function(polygons, size) {
+ return polygonsToImageData(polygons, size, imageDataParams);
+ }, go(getInput);
+ }, output.toSVG = function() {
+ return outputFn = polygonsToSVG, go(getInput);
+ }, output.toData = function() {
+ return outputFn = function(polygons) {
+ return polygons;
+ }, go(getInput);
+ }, input.fromImage = function(imageEl) {
+ return inputFn = function() {
+ return fromImageToImageData(imageEl);
+ }, go(getOutput);
+ }, getInput();
+ };
+ }, {
+ './defaultParams.js': 1,
+ './input/fromImageToImageData.js': 6,
+ './output/polygonsToDataURL.js': 7,
+ './output/polygonsToImageData.js': 8,
+ './output/polygonsToSVG.js': 9,
+ './util/clamp.js': 14
+ } ],
+ 3: [ function(_dereq_, module, exports) {
+ 'use strict';
+ var Canvas = _dereq_('canvas-browserify');
+ module.exports = function(imageData) {
+ if ('undefined' == typeof Uint8ClampedArray) {
+ var canvas = Canvas(imageData.width, imageData.height), ctx = canvas.getContext('2d');
+ return ctx.putImageData(imageData, 0, 0), ctx.getImageData(0, 0, imageData.width, imageData.height);
+ }
+ return {
+ width: imageData.width,
+ height: imageData.height,
+ data: new Uint8ClampedArray(imageData.data)
+ };
+ };
+ }, {
+ 'canvas-browserify': 18
+ } ],
+ 4: [ function(_dereq_, module, exports) {
+ 'use strict';
+ function detectEdges(imageData, accuracy, edgeSize, divisor) {
+ var matrix = getEdgeMatrix(edgeSize).slice(), multiplier = parseInt(10 * (accuracy || .5), 10) || 1;
+ divisor = divisor || 1;
+ var k, len, divscalar = divisor ? 1 / divisor : 0;
+ if (1 !== divscalar) {
+ for (k = 0, len = matrix.length; k < matrix.length; k++) {
+ matrix[k] *= divscalar;
+ }
+ }
+ var data = imageData.data;
+ len = data.length >> 2;
+ var copy = new Uint8Array(len);
+ for (i = 0; len > i; i++) {
+ copy[i] = data[i << 2];
+ }
+ var x, y, r, g, b, v, col, row, sx, sy, i, istep, jstep, kstep, width = 0 | imageData.width, height = 0 | imageData.height, size = Math.sqrt(matrix.length), range = .5 * size | 0;
+ for (y = 0; height > y; y += multiplier) {
+ for (istep = y * width, x = 0; width > x; x += multiplier) {
+ for (r = g = b = 0, row = -range; range >= row; row++) {
+ if (sy = y + row, jstep = sy * width, kstep = (row + range) * size, sy >= 0 && height > sy) {
+ for (col = -range; range >= col; col++) {
+ sx = x + col, sx >= 0 && width > sx && (v = matrix[col + range + kstep]) && (r += copy[sx + jstep] * v);
+ }
+ }
+ }
+ 0 > r ? r = 0 : r > 255 && (r = 255), data[x + istep << 2] = 255 & r;
+ }
+ }
+ return imageData;
+ }
+ function getEdgeMatrix(size) {
+ var i, matrix = [], side = 2 * size + 1, len = side * side, center = .5 * len | 0;
+ for (i = 0; len > i; i++) {
+ matrix[i] = i === center ? -len + 1 : 1;
+ }
+ return matrix;
+ }
+ module.exports = detectEdges;
+ }, {} ],
+ 5: [ function(_dereq_, module, exports) {
+ 'use strict';
+ function greyscale(imageData) {
+ for (var len = imageData.data.length, data = imageData.data, brightness = void 0, i = 0; len > i; i += 4) {
+ brightness = .34 * data[i] + .5 * data[i + 1] + .16 * data[i + 2], data[i] = brightness,
+ data[i + 1] = brightness, data[i + 2] = brightness;
+ }
+ return imageData.data = data, imageData;
+ }
+ module.exports = greyscale;
+ }, {} ],
+ 6: [ function(_dereq_, module, exports) {
+ 'use strict';
+ var Canvas = _dereq_('canvas-browserify'), Image = Canvas.Image;
+ module.exports = function(image) {
+ if (image instanceof HTMLImageElement) {
+ if (0 === image.naturalWidth || 0 === image.naturalHeight || image.complete === !1) {
+ throw new Error('This this image hasn\'t finished loading: ' + image.src);
+ }
+ var canvas = new Canvas(image.naturalWidth, image.naturalHeight), ctx = canvas.getContext('2d');
+ return ctx.drawImage(image, 0, 0, canvas.width, canvas.height), ctx.getImageData(0, 0, canvas.width, canvas.height);
+ }
+ throw new Error('This object does not seem to be an image.');
+ };
+ }, {
+ 'canvas-browserify': 18
+ } ],
+ 7: [ function(_dereq_, module, exports) {
+ 'use strict';
+ var Canvas = _dereq_('canvas-browserify'), drawPolygonsOnContext = _dereq_('../util/drawPolygonsOnContext.js');
+ module.exports = function(polygons, size, options) {
+ var dpr = options && options.dpr ? options.dpr : 1, backgroundColor = options && options.backgroundColor ? options.backgroundColor : !1, canvas = new Canvas(size.width * dpr, size.height * dpr), ctx = canvas.getContext('2d');
+ return backgroundColor && (ctx.fillStyle = backgroundColor, ctx.fillRect(0, 0, size.width * dpr, size.height * dpr),
+ ctx.fillStyle = 'transparent'), drawPolygonsOnContext(ctx, polygons, size, dpr),
+ canvas.toDataURL();
+ };
+ }, {
+ '../util/drawPolygonsOnContext.js': 15,
+ 'canvas-browserify': 18
+ } ],
+ 8: [ function(_dereq_, module, exports) {
+ 'use strict';
+ var Canvas = _dereq_('canvas-browserify'), drawPolygonsOnContext = _dereq_('../util/drawPolygonsOnContext.js');
+ module.exports = function(polygons, size, options) {
+ var dpr = options && options.dpr ? options.dpr : 1, backgroundColor = options && options.backgroundColor ? options.backgroundColor : !1, canvas = new Canvas(size.width * dpr, size.height * dpr), ctx = canvas.getContext('2d');
+ return backgroundColor && (ctx.fillStyle = backgroundColor, ctx.fillRect(0, 0, size.width * dpr, size.height * dpr),
+ ctx.fillStyle = 'transparent'), drawPolygonsOnContext(ctx, polygons, size, dpr),
+ ctx.getImageData(0, 0, size.width * dpr, size.height * dpr);
+ };
+ }, {
+ '../util/drawPolygonsOnContext.js': 15,
+ 'canvas-browserify': 18
+ } ],
+ 9: [ function(_dereq_, module, exports) {
+ 'use strict';
+ module.exports = function(polygons, size) {
+ var svg = '\n