diff options
| author | jules <jules@okfoc.us> | 2013-12-13 15:28:31 -0500 |
|---|---|---|
| committer | jules <jules@okfoc.us> | 2013-12-13 15:28:31 -0500 |
| commit | 346f3a9817b1e0812565396b9811a1ce5adc97b8 (patch) | |
| tree | 47944eb9a2762ef2036d140430a69be5afa9f368 | |
| parent | 96fd8423cc0793d47cab9117b0167fe19041cdea (diff) | |
reorganize
| -rwxr-xr-x[-rw-r--r--] | bin/proxy.py (renamed from proxy.py) | 2 | ||||
| -rw-r--r-- | bower.json | 2 | ||||
| -rw-r--r-- | gif-animate.html | 6 | ||||
| -rw-r--r-- | gif-dither.html | 16 | ||||
| -rw-r--r-- | gif.html | 14 | ||||
| -rw-r--r-- | halftone.html | 6 | ||||
| -rw-r--r-- | img/1376516658960-dumpfm-DoritoWitch-TimeFLyTrans0001.png (renamed from 1376516658960-dumpfm-DoritoWitch-TimeFLyTrans0001.png) | bin | 163827 -> 163827 bytes | |||
| -rw-r--r-- | img/abyss.png (renamed from abyss.png) | bin | 193659 -> 193659 bytes | |||
| -rw-r--r-- | img/building.png (renamed from building.png) | bin | 408192 -> 408192 bytes | |||
| -rw-r--r-- | img/gradient.jpg (renamed from gradient.jpg) | bin | 19198 -> 19198 bytes | |||
| -rw-r--r-- | index.html | 6 | ||||
| -rw-r--r-- | js/canvasquery.dither.js (renamed from canvasquery.dither.js) | 89 | ||||
| -rw-r--r-- | js/util.js | 3 | ||||
| -rw-r--r-- | js/vendor/FileSaver/.bower.json (renamed from vendor/FileSaver/.bower.json) | 0 | ||||
| -rw-r--r-- | js/vendor/FileSaver/FileSaver.js (renamed from FileSaver.js) | 0 | ||||
| -rw-r--r-- | js/vendor/FileSaver/LICENSE.md (renamed from vendor/FileSaver/LICENSE.md) | 0 | ||||
| -rw-r--r-- | js/vendor/FileSaver/README.md (renamed from vendor/FileSaver/README.md) | 0 | ||||
| -rw-r--r-- | js/vendor/FileSaver/bower.json (renamed from vendor/FileSaver/bower.json) | 0 | ||||
| -rw-r--r-- | js/vendor/FileSaver/demo/demo.css (renamed from vendor/FileSaver/demo/demo.css) | 0 | ||||
| -rw-r--r-- | js/vendor/FileSaver/demo/demo.js (renamed from vendor/FileSaver/demo/demo.js) | 0 | ||||
| -rw-r--r-- | js/vendor/FileSaver/demo/demo.min.js (renamed from vendor/FileSaver/demo/demo.min.js) | 0 | ||||
| -rw-r--r-- | js/vendor/FileSaver/demo/index.xhtml (renamed from vendor/FileSaver/demo/index.xhtml) | 0 | ||||
| -rw-r--r-- | js/vendor/FileSaver/package.json (renamed from vendor/FileSaver/package.json) | 0 | ||||
| -rw-r--r-- | js/vendor/canvasquery.js (renamed from canvasquery.js) | 0 | ||||
| -rw-r--r-- | js/vendor/dataUriToBlob.js (renamed from dataUriToBlob.js) | 0 | ||||
| -rwxr-xr-x | js/vendor/gif-encode/GIFEncoder.js (renamed from gif-encode/GIFEncoder.js) | 0 | ||||
| -rw-r--r-- | js/vendor/gif-encode/LZWEncoder.js (renamed from gif-encode/LZWEncoder.js) | 0 | ||||
| -rw-r--r-- | js/vendor/gif-encode/NeuQuant.js (renamed from gif-encode/NeuQuant.js) | 0 | ||||
| -rw-r--r-- | js/vendor/gif-encode/client.js (renamed from gif-encode/client.js) | 0 | ||||
| -rw-r--r-- | js/vendor/gif-encode/tube.js (renamed from gif-encode/tube.js) | 0 | ||||
| -rw-r--r-- | js/vendor/gif-encode/util.js (renamed from gif-encode/util.js) | 0 | ||||
| -rw-r--r-- | js/vendor/gif-encode/worker.js (renamed from gif-encode/worker.js) | 0 | ||||
| -rw-r--r-- | js/vendor/gif.js (renamed from gif.js) | 0 | ||||
| -rw-r--r-- | pattern.html | 6 | ||||
| -rw-r--r-- | shader-demo.html | 13 | ||||
| -rw-r--r-- | shader.html | 6 | ||||
| -rw-r--r-- | threshold.html | 6 | ||||
| -rw-r--r-- | vendor/FileSaver/FileSaver.js | 232 |
38 files changed, 94 insertions, 313 deletions
diff --git a/proxy.py b/bin/proxy.py index ff9b0ea..6171dab 100644..100755 --- a/proxy.py +++ b/bin/proxy.py @@ -1,4 +1,4 @@ -#!/usr/bin/env python +#!/usr/bin/env python3 import http.server import urllib.request @@ -1,7 +1,7 @@ { "name": "dither", "version": "0.0.4", - "homepage": "http://asdf.us", + "homepage": "http://asdf.us/dither/", "authors": [ "julie" ], diff --git a/gif-animate.html b/gif-animate.html index 6681aff..55396cd 100644 --- a/gif-animate.html +++ b/gif-animate.html @@ -19,9 +19,9 @@ </div> <div id="images"></div> </body> -<script type="text/javascript" src="gif.js"></script> -<script type="text/javascript" src="canvasquery.js"></script> -<script type="text/javascript" src="canvasquery.dither.js"></script> +<script type="text/javascript" src="js/vendor/gif.js"></script> +<script type="text/javascript" src="js/vendor/canvasquery.js"></script> +<script type="text/javascript" src="js/canvasquery.dither.js"></script> <script type="text/javascript"> document.getElementById("url").onchange = load diff --git a/gif-dither.html b/gif-dither.html index 3421588..359c0b5 100644 --- a/gif-dither.html +++ b/gif-dither.html @@ -20,14 +20,14 @@ </div> <div id="images"></div> </body> -<script type="text/javascript" src="gif-encode/util.js"></script> -<script type="text/javascript" src="gif-encode/tube.js"></script> -<script type="text/javascript" src="gif-encode/client.js"></script> -<script type="text/javascript" src="gif.js"></script> -<script type="text/javascript" src="FileSaver.js"></script> -<script type="text/javascript" src="dataUriToBlob.js"></script> -<script type="text/javascript" src="canvasquery.js"></script> -<script type="text/javascript" src="canvasquery.dither.js"></script> +<script type="text/javascript" src="js/vendor/gif-encode/util.js"></script> +<script type="text/javascript" src="js/vendor/gif-encode/tube.js"></script> +<script type="text/javascript" src="js/vendor/gif-encode/client.js"></script> +<script type="text/javascript" src="js/vendor/gif.js"></script> +<script type="text/javascript" src="js/vendor/FileSaver.js"></script> +<script type="text/javascript" src="js/vendor/dataUriToBlob.js"></script> +<script type="text/javascript" src="js/vendor/canvasquery.js"></script> +<script type="text/javascript" src="js/canvasquery.dither.js"></script> <script type="text/javascript"> document.getElementById("url").onchange = load @@ -20,13 +20,13 @@ </div> <div id="images"></div> </body> -<script type="text/javascript" src="gif-encode/util.js"></script> -<script type="text/javascript" src="gif-encode/tube.js"></script> -<script type="text/javascript" src="gif-encode/client.js"></script> -<script type="text/javascript" src="gif.js"></script> -<script type="text/javascript" src="FileSaver.js"></script> -<script type="text/javascript" src="canvasquery.js"></script> -<script type="text/javascript" src="canvasquery.dither.js"></script> +<script type="text/javascript" src="js/vendor/gif-encode/util.js"></script> +<script type="text/javascript" src="js/vendor/gif-encode/tube.js"></script> +<script type="text/javascript" src="js/vendor/gif-encode/client.js"></script> +<script type="text/javascript" src="js/vendor/gif.js"></script> +<script type="text/javascript" src="js/vendor/FileSaver.js"></script> +<script type="text/javascript" src="js/vendor/canvasquery.js"></script> +<script type="text/javascript" src="js/canvasquery.dither.js"></script> <script type="text/javascript"> document.getElementById("url").onchange = load diff --git a/halftone.html b/halftone.html index 17f7ca8..5e6d655 100644 --- a/halftone.html +++ b/halftone.html @@ -10,10 +10,10 @@ angle <input type="range" min="0" max="90" step="1" value="45" id="angle"> </div> <div id="images"></div> </body> -<script type="text/javascript" src="canvasquery.js"></script> -<script type="text/javascript" src="canvasquery.dither.js"></script> +<script type="text/javascript" src="js/vendor/canvasquery.js"></script> +<script type="text/javascript" src="js/canvasquery.dither.js"></script> <script type="text/javascript"> -var urls = ["abyss.png","building.png","gradient.jpg"] +var urls = ["img/abyss.png","img/building.png","img/gradient.jpg"] var imgs = [] var complete = 0 urls.forEach(function(src){ diff --git a/1376516658960-dumpfm-DoritoWitch-TimeFLyTrans0001.png b/img/1376516658960-dumpfm-DoritoWitch-TimeFLyTrans0001.png Binary files differindex 019c209..019c209 100644 --- a/1376516658960-dumpfm-DoritoWitch-TimeFLyTrans0001.png +++ b/img/1376516658960-dumpfm-DoritoWitch-TimeFLyTrans0001.png diff --git a/abyss.png b/img/abyss.png Binary files differindex 4ce8d1d..4ce8d1d 100644 --- a/abyss.png +++ b/img/abyss.png diff --git a/building.png b/img/building.png Binary files differindex 4032700..4032700 100644 --- a/building.png +++ b/img/building.png diff --git a/gradient.jpg b/img/gradient.jpg Binary files differindex 8aad001..8aad001 100644 --- a/gradient.jpg +++ b/img/gradient.jpg @@ -17,11 +17,11 @@ </div> <div id="images"></div> </body> -<script type="text/javascript" src="canvasquery.js"></script> -<script type="text/javascript" src="canvasquery.dither.js"></script> +<script type="text/javascript" src="js/vendor/canvasquery.js"></script> +<script type="text/javascript" src="js/canvasquery.dither.js"></script> <script type="text/javascript"> var algo = 'random'; -var urls = ["abyss.png","building.png","gradient.jpg"] +var urls = ["img/abyss.png","img/building.png","img/gradient.jpg"] var imgs = [] var complete = 0 urls.forEach(function(src){ diff --git a/canvasquery.dither.js b/js/canvasquery.dither.js index a76ad12..88b2588 100644 --- a/canvasquery.dither.js +++ b/js/canvasquery.dither.js @@ -1,30 +1,53 @@ -var patterns = {} -patterns[2] = [ 0, 2, - 3, 1 ] -patterns[3] = [ 0, 5, 3, - 8, 1, 6, - 4, 7, 2, ] +// These patterns are used by the pattern dither effect +(function(){ + var patterns = {} + patterns[2] = [ 0, 2, + 3, 1 ] -patterns[4] = [ 0, 8, 2, 10, - 6, 14, 4, 12, - 3, 11, 1, 9, - 5, 13, 7, 15 ] + patterns[3] = [ 0, 5, 3, + 8, 1, 6, + 4, 7, 2, ] -CanvasQuery.Wrapper.prototype.threshold = function(factor) { + patterns[4] = [ 0, 8, 2, 10, + 6, 14, 4, 12, + 3, 11, 1, 9, + 5, 13, 7, 15 ] + CanvasQuery.Wrapper.prototype.pattern2Dither = function() { + this.patternDither(patterns[2]) + } + CanvasQuery.Wrapper.prototype.pattern3Dither = function() { + this.patternDither(patterns[3]) + } + CanvasQuery.Wrapper.prototype.pattern4Dither = function() { + this.patternDither(patterns[4]) + } + CanvasQuery.Wrapper.prototype.pattern2LiteDither = function() { + this.patternLiteDither(patterns[2]) + } + CanvasQuery.Wrapper.prototype.pattern3LiteDither = function() { + this.patternLiteDither(patterns[3]) + } + CanvasQuery.Wrapper.prototype.pattern4LiteDither = function() { + this.patternLiteDither(patterns[4]) + } +})() + +// Threshold dither, black if less than n, white otherwise +CanvasQuery.Wrapper.prototype.threshold = function(n) { var bitmap = this.context.getImageData(0, 0, this.canvas.width, this.canvas.height) var bitmapData = bitmap.data var width = this.canvas.width var height = this.canvas.height - if (factor < 1) factor *= 255 + if (n < 1) n *= 255 for (var i = 0; i < height; i++) { for (var j = 0; j < width; j++) { var a = 4 * (i*width + j) var val = (bitmapData[a] + bitmapData[a+1] + bitmapData[a+2]) / 3 - var lum = val > factor ? 255 : 0 + var lum = val > n ? 255 : 0 bitmapData[a] = bitmapData[a+1] = bitmapData[a+2] = lum } } @@ -32,6 +55,7 @@ CanvasQuery.Wrapper.prototype.threshold = function(factor) { return this; } +// Random dither, black if less than a random number (chosen per pixel), white otherwise CanvasQuery.Wrapper.prototype.randomDither = function() { var bitmap = this.context.getImageData(0, 0, this.canvas.width, this.canvas.height) var bitmapData = bitmap.data @@ -51,31 +75,23 @@ CanvasQuery.Wrapper.prototype.randomDither = function() { return this; } -CanvasQuery.Wrapper.prototype.pattern2Dither = function() { - this.patternDither(2) -} -CanvasQuery.Wrapper.prototype.pattern3Dither = function() { - this.patternDither(3) -} -CanvasQuery.Wrapper.prototype.pattern4Dither = function() { - this.patternDither(4) -} -CanvasQuery.Wrapper.prototype.patternDither = function(n) { +// Pattern dither, uses a square matrix of dither steps (see patterns above) to dither +CanvasQuery.Wrapper.prototype.patternDither = function(pattern) { var bitmap = this.context.getImageData(0, 0, this.canvas.width, this.canvas.height) var bitmapData = bitmap.data var width = this.canvas.width var height = this.canvas.height - var pat = patterns[n] - var len = pat.length - 1 + var n = Math.floor(Math.sqrt(pattern.length)) + var len = pattern.length - 1 for (var i = 0; i < height; i++) { for (var j = 0; j < width; j++) { var p = ((i % n) * n) + (j % n) var a = 4 * (i*width + j) var val = (bitmapData[a] + bitmapData[a+1] + bitmapData[a+2]) / (3*255) - var lum = val > pat[p]/len ? 255 : 0 + var lum = val > pattern[p]/len ? 255 : 0 bitmapData[a] = bitmapData[a+1] = bitmapData[a+2] = lum } } @@ -83,31 +99,23 @@ CanvasQuery.Wrapper.prototype.patternDither = function(n) { return this; } -CanvasQuery.Wrapper.prototype.pattern2LiteDither = function() { - this.patternLiteDither(2) -} -CanvasQuery.Wrapper.prototype.pattern3LiteDither = function() { - this.patternLiteDither(3) -} -CanvasQuery.Wrapper.prototype.pattern4LiteDither = function() { - this.patternLiteDither(4) -} -CanvasQuery.Wrapper.prototype.patternLiteDither = function(n) { +// Light version of pattern dither, uses the wrong array size +CanvasQuery.Wrapper.prototype.patternLiteDither = function(pattern) { var bitmap = this.context.getImageData(0, 0, this.canvas.width, this.canvas.height) var bitmapData = bitmap.data var width = this.canvas.width var height = this.canvas.height - var pat = patterns[n] - var len = pat.length + var n = Math.floor(Math.sqrt(pattern.length)) + var len = pattern.length for (var i = 0; i < height; i++) { for (var j = 0; j < width; j++) { var p = ((i % n) * n) + (j % n) var a = 4 * (i*width + j) var val = (bitmapData[a] + bitmapData[a+1] + bitmapData[a+2]) / (3*255) - var lum = val > pat[p]/len ? 255 : 0 + var lum = val > pattern[p]/len ? 255 : 0 bitmapData[a] = bitmapData[a+1] = bitmapData[a+2] = lum } } @@ -115,6 +123,7 @@ CanvasQuery.Wrapper.prototype.patternLiteDither = function(n) { return this; } +// Floyd-Steinberg error diffusion, propagates error down and to the right CanvasQuery.Wrapper.prototype.floydSteinbergDither = function(n) { var bitmap = this.context.getImageData(0, 0, this.canvas.width, this.canvas.height) var bitmapData = bitmap.data @@ -146,6 +155,7 @@ CanvasQuery.Wrapper.prototype.floydSteinbergDither = function(n) { return this; } +// Rightwise diffusion dither, propagates error to the right only CanvasQuery.Wrapper.prototype.rightDither = function(n) { var bitmap = this.context.getImageData(0, 0, this.canvas.width, this.canvas.height) var bitmapData = bitmap.data @@ -171,6 +181,7 @@ CanvasQuery.Wrapper.prototype.rightDither = function(n) { return this; } +// Print-style halftone effect CanvasQuery.Wrapper.prototype.halftone = function(radius, angle) { var mask = this.grayscaleToMask() diff --git a/js/util.js b/js/util.js new file mode 100644 index 0000000..9dc306c --- /dev/null +++ b/js/util.js @@ -0,0 +1,3 @@ +$.fn.int = function(){ return parseInt($(this).val(),10) } +$.fn.float = function(){ return parseFloat($(this).val()) } +function clamp(n,a,b){ return n<a?a:n<b?n:b } diff --git a/vendor/FileSaver/.bower.json b/js/vendor/FileSaver/.bower.json index 586a935..586a935 100644 --- a/vendor/FileSaver/.bower.json +++ b/js/vendor/FileSaver/.bower.json diff --git a/FileSaver.js b/js/vendor/FileSaver/FileSaver.js index 378a9dc..378a9dc 100644 --- a/FileSaver.js +++ b/js/vendor/FileSaver/FileSaver.js diff --git a/vendor/FileSaver/LICENSE.md b/js/vendor/FileSaver/LICENSE.md index 7eb56b9..7eb56b9 100644 --- a/vendor/FileSaver/LICENSE.md +++ b/js/vendor/FileSaver/LICENSE.md diff --git a/vendor/FileSaver/README.md b/js/vendor/FileSaver/README.md index 49aff62..49aff62 100644 --- a/vendor/FileSaver/README.md +++ b/js/vendor/FileSaver/README.md diff --git a/vendor/FileSaver/bower.json b/js/vendor/FileSaver/bower.json index 0e0d7e0..0e0d7e0 100644 --- a/vendor/FileSaver/bower.json +++ b/js/vendor/FileSaver/bower.json diff --git a/vendor/FileSaver/demo/demo.css b/js/vendor/FileSaver/demo/demo.css index fe03ca5..fe03ca5 100644 --- a/vendor/FileSaver/demo/demo.css +++ b/js/vendor/FileSaver/demo/demo.css diff --git a/vendor/FileSaver/demo/demo.js b/js/vendor/FileSaver/demo/demo.js index e08497b..e08497b 100644 --- a/vendor/FileSaver/demo/demo.js +++ b/js/vendor/FileSaver/demo/demo.js diff --git a/vendor/FileSaver/demo/demo.min.js b/js/vendor/FileSaver/demo/demo.min.js index 77f9ed1..77f9ed1 100644 --- a/vendor/FileSaver/demo/demo.min.js +++ b/js/vendor/FileSaver/demo/demo.min.js diff --git a/vendor/FileSaver/demo/index.xhtml b/js/vendor/FileSaver/demo/index.xhtml index abc8813..abc8813 100644 --- a/vendor/FileSaver/demo/index.xhtml +++ b/js/vendor/FileSaver/demo/index.xhtml diff --git a/vendor/FileSaver/package.json b/js/vendor/FileSaver/package.json index 3ddf184..3ddf184 100644 --- a/vendor/FileSaver/package.json +++ b/js/vendor/FileSaver/package.json diff --git a/canvasquery.js b/js/vendor/canvasquery.js index a5b36f3..a5b36f3 100644 --- a/canvasquery.js +++ b/js/vendor/canvasquery.js diff --git a/dataUriToBlob.js b/js/vendor/dataUriToBlob.js index 582aecb..582aecb 100644 --- a/dataUriToBlob.js +++ b/js/vendor/dataUriToBlob.js diff --git a/gif-encode/GIFEncoder.js b/js/vendor/gif-encode/GIFEncoder.js index 01d3618..01d3618 100755 --- a/gif-encode/GIFEncoder.js +++ b/js/vendor/gif-encode/GIFEncoder.js diff --git a/gif-encode/LZWEncoder.js b/js/vendor/gif-encode/LZWEncoder.js index e3c512a..e3c512a 100644 --- a/gif-encode/LZWEncoder.js +++ b/js/vendor/gif-encode/LZWEncoder.js diff --git a/gif-encode/NeuQuant.js b/js/vendor/gif-encode/NeuQuant.js index 91424ba..91424ba 100644 --- a/gif-encode/NeuQuant.js +++ b/js/vendor/gif-encode/NeuQuant.js diff --git a/gif-encode/client.js b/js/vendor/gif-encode/client.js index a6c09ec..a6c09ec 100644 --- a/gif-encode/client.js +++ b/js/vendor/gif-encode/client.js diff --git a/gif-encode/tube.js b/js/vendor/gif-encode/tube.js index 17d3bfd..17d3bfd 100644 --- a/gif-encode/tube.js +++ b/js/vendor/gif-encode/tube.js diff --git a/gif-encode/util.js b/js/vendor/gif-encode/util.js index 92d8129..92d8129 100644 --- a/gif-encode/util.js +++ b/js/vendor/gif-encode/util.js diff --git a/gif-encode/worker.js b/js/vendor/gif-encode/worker.js index b2f32d4..b2f32d4 100644 --- a/gif-encode/worker.js +++ b/js/vendor/gif-encode/worker.js diff --git a/gif.js b/js/vendor/gif.js index a2c22fa..a2c22fa 100644 --- a/gif.js +++ b/js/vendor/gif.js diff --git a/pattern.html b/pattern.html index 18dfc3a..f622cce 100644 --- a/pattern.html +++ b/pattern.html @@ -17,11 +17,11 @@ </div> <div id="images"></div> </body> -<script type="text/javascript" src="canvasquery.js"></script> -<script type="text/javascript" src="canvasquery.dither.js"></script> +<script type="text/javascript" src="js/vendor/canvasquery.js"></script> +<script type="text/javascript" src="js/canvasquery.dither.js"></script> <script type="text/javascript"> var algo = 'random'; -var urls = ["abyss.png","building.png","gradient.jpg"] +var urls = ["img/abyss.png","img/building.png","img/gradient.jpg"] var imgs = [] var complete = 0 urls.forEach(function(src){ diff --git a/shader-demo.html b/shader-demo.html index 8631ad0..9077ec5 100644 --- a/shader-demo.html +++ b/shader-demo.html @@ -12,7 +12,7 @@ div { float: left; padding: 10px;} <div id="controls"> w/h <input type="text" id="width" value="250">x<input type="text" id="height" value="320"> frames <input type="text" id="frames" value="7"> -delay <input type="text" id="frames" value="20"> +delay <input type="text" id="delay" value="60"> <button id="render" disabled>render</button> <button id="demo">demo</button> <button id="dither-demo">dither</button> @@ -24,18 +24,17 @@ delay <input type="text" id="frames" value="20"> <div id="workspace"> </div> </body> -<script type="text/javascript" src="vendor/jquery/jquery.min.js"></script> -<script type="text/javascript" src="canvasquery.js"></script> -<script type="text/javascript" src="canvasquery.dither.js"></script> +<script type="text/javascript" src="js/vendor/jquery/jquery.min.js"></script> +<script type="text/javascript" src="js/vendor/canvasquery.js"></script> +<script type="text/javascript" src="js/canvasquery.dither.js"></script> +<script type="text/javascript" src="js/util.js"></script> <script type="text/javascript"> -$.fn.int = function(){ return parseInt($(this).val(),10) } -$.fn.float = function(){ return parseFloat($(this).val()) } -function clamp(n,a,b){ return n<a?a:n<b?n:b } $("#width,#height").change(resize) $("#demo").click(function(){ demo("#first") }) $("#dither-demo").click(function(){ demo("#second") }) $(function(){ demo('#second') }) + //$("#shader").keyup(draw) //$("#render").click(drawFrame) diff --git a/shader.html b/shader.html index c263c18..33a1775 100644 --- a/shader.html +++ b/shader.html @@ -23,9 +23,9 @@ delay <input type="text" id="frames" value="20"> <div id="workspace"> </div> </body> -<script type="text/javascript" src="vendor/jquery/jquery.min.js"></script> -<script type="text/javascript" src="canvasquery.js"></script> -<script type="text/javascript" src="canvasquery.dither.js"></script> +<script type="text/javascript" src="js/vendor/jquery/jquery.min.js"></script> +<script type="text/javascript" src="js/vendor/canvasquery.js"></script> +<script type="text/javascript" src="js/canvasquery.dither.js"></script> <script type="text/javascript"> $.fn.int = function(){ return parseInt($(this).val(),10) } $.fn.float = function(){ return parseFloat($(this).val()) } diff --git a/threshold.html b/threshold.html index f3cdc76..c32f738 100644 --- a/threshold.html +++ b/threshold.html @@ -9,10 +9,10 @@ threshold <input type="range" min="0" max="1" step="0.01" value="0.5" id="thresh </div> <div id="images"></div> </body> -<script type="text/javascript" src="canvasquery.js"></script> -<script type="text/javascript" src="canvasquery.dither.js"></script> +<script type="text/javascript" src="js/vendor/canvasquery.js"></script> +<script type="text/javascript" src="js/canvasquery.dither.js"></script> <script type="text/javascript"> -var urls = ["abyss.png","building.png","gradient.jpg"] +var urls = ["img/abyss.png","img/building.png","img/gradient.jpg"] var imgs = [] var complete = 0 urls.forEach(function(src){ diff --git a/vendor/FileSaver/FileSaver.js b/vendor/FileSaver/FileSaver.js deleted file mode 100644 index 378a9dc..0000000 --- a/vendor/FileSaver/FileSaver.js +++ /dev/null @@ -1,232 +0,0 @@ -/* FileSaver.js - * A saveAs() FileSaver implementation. - * 2013-10-21 - * - * By Eli Grey, http://eligrey.com - * License: X11/MIT - * See LICENSE.md - */ - -/*global self */ -/*jslint bitwise: true, regexp: true, confusion: true, es5: true, vars: true, white: true, - plusplus: true */ - -/*! @source http://purl.eligrey.com/github/FileSaver.js/blob/master/FileSaver.js */ - -var saveAs = saveAs - || (typeof navigator !== 'undefined' && navigator.msSaveOrOpenBlob && navigator.msSaveOrOpenBlob.bind(navigator)) - || (function(view) { - "use strict"; - var - doc = view.document - // only get URL when necessary in case BlobBuilder.js hasn't overridden it yet - , get_URL = function() { - return view.URL || view.webkitURL || view; - } - , URL = view.URL || view.webkitURL || view - , save_link = doc.createElementNS("http://www.w3.org/1999/xhtml", "a") - , can_use_save_link = !view.externalHost && "download" in save_link - , click = function(node) { - var event = doc.createEvent("MouseEvents"); - event.initMouseEvent( - "click", true, false, view, 0, 0, 0, 0, 0 - , false, false, false, false, 0, null - ); - node.dispatchEvent(event); - } - , webkit_req_fs = view.webkitRequestFileSystem - , req_fs = view.requestFileSystem || webkit_req_fs || view.mozRequestFileSystem - , throw_outside = function (ex) { - (view.setImmediate || view.setTimeout)(function() { - throw ex; - }, 0); - } - , force_saveable_type = "application/octet-stream" - , fs_min_size = 0 - , deletion_queue = [] - , process_deletion_queue = function() { - var i = deletion_queue.length; - while (i--) { - var file = deletion_queue[i]; - if (typeof file === "string") { // file is an object URL - URL.revokeObjectURL(file); - } else { // file is a File - file.remove(); - } - } - deletion_queue.length = 0; // clear queue - } - , dispatch = function(filesaver, event_types, event) { - event_types = [].concat(event_types); - var i = event_types.length; - while (i--) { - var listener = filesaver["on" + event_types[i]]; - if (typeof listener === "function") { - try { - listener.call(filesaver, event || filesaver); - } catch (ex) { - throw_outside(ex); - } - } - } - } - , FileSaver = function(blob, name) { - // First try a.download, then web filesystem, then object URLs - var - filesaver = this - , type = blob.type - , blob_changed = false - , object_url - , target_view - , get_object_url = function() { - var object_url = get_URL().createObjectURL(blob); - deletion_queue.push(object_url); - return object_url; - } - , dispatch_all = function() { - dispatch(filesaver, "writestart progress write writeend".split(" ")); - } - // on any filesys errors revert to saving with object URLs - , fs_error = function() { - // don't create more object URLs than needed - if (blob_changed || !object_url) { - object_url = get_object_url(blob); - } - if (target_view) { - target_view.location.href = object_url; - } else { - window.open(object_url, "_blank"); - } - filesaver.readyState = filesaver.DONE; - dispatch_all(); - } - , abortable = function(func) { - return function() { - if (filesaver.readyState !== filesaver.DONE) { - return func.apply(this, arguments); - } - }; - } - , create_if_not_found = {create: true, exclusive: false} - , slice - ; - filesaver.readyState = filesaver.INIT; - if (!name) { - name = "download"; - } - if (can_use_save_link) { - object_url = get_object_url(blob); - // FF for Android has a nasty garbage collection mechanism - // that turns all objects that are not pure javascript into 'deadObject' - // this means `doc` and `save_link` are unusable and need to be recreated - // `view` is usable though: - doc = view.document; - save_link = doc.createElementNS("http://www.w3.org/1999/xhtml", "a"); - save_link.href = object_url; - save_link.download = name; - var event = doc.createEvent("MouseEvents"); - event.initMouseEvent( - "click", true, false, view, 0, 0, 0, 0, 0 - , false, false, false, false, 0, null - ); - save_link.dispatchEvent(event); - filesaver.readyState = filesaver.DONE; - dispatch_all(); - return; - } - // Object and web filesystem URLs have a problem saving in Google Chrome when - // viewed in a tab, so I force save with application/octet-stream - // http://code.google.com/p/chromium/issues/detail?id=91158 - if (view.chrome && type && type !== force_saveable_type) { - slice = blob.slice || blob.webkitSlice; - blob = slice.call(blob, 0, blob.size, force_saveable_type); - blob_changed = true; - } - // Since I can't be sure that the guessed media type will trigger a download - // in WebKit, I append .download to the filename. - // https://bugs.webkit.org/show_bug.cgi?id=65440 - if (webkit_req_fs && name !== "download") { - name += ".download"; - } - if (type === force_saveable_type || webkit_req_fs) { - target_view = view; - } - if (!req_fs) { - fs_error(); - return; - } - fs_min_size += blob.size; - req_fs(view.TEMPORARY, fs_min_size, abortable(function(fs) { - fs.root.getDirectory("saved", create_if_not_found, abortable(function(dir) { - var save = function() { - dir.getFile(name, create_if_not_found, abortable(function(file) { - file.createWriter(abortable(function(writer) { - writer.onwriteend = function(event) { - target_view.location.href = file.toURL(); - deletion_queue.push(file); - filesaver.readyState = filesaver.DONE; - dispatch(filesaver, "writeend", event); - }; - writer.onerror = function() { - var error = writer.error; - if (error.code !== error.ABORT_ERR) { - fs_error(); - } - }; - "writestart progress write abort".split(" ").forEach(function(event) { - writer["on" + event] = filesaver["on" + event]; - }); - writer.write(blob); - filesaver.abort = function() { - writer.abort(); - filesaver.readyState = filesaver.DONE; - }; - filesaver.readyState = filesaver.WRITING; - }), fs_error); - }), fs_error); - }; - dir.getFile(name, {create: false}, abortable(function(file) { - // delete file if it already exists - file.remove(); - save(); - }), abortable(function(ex) { - if (ex.code === ex.NOT_FOUND_ERR) { - save(); - } else { - fs_error(); - } - })); - }), fs_error); - }), fs_error); - } - , FS_proto = FileSaver.prototype - , saveAs = function(blob, name) { - return new FileSaver(blob, name); - } - ; - FS_proto.abort = function() { - var filesaver = this; - filesaver.readyState = filesaver.DONE; - dispatch(filesaver, "abort"); - }; - FS_proto.readyState = FS_proto.INIT = 0; - FS_proto.WRITING = 1; - FS_proto.DONE = 2; - - FS_proto.error = - FS_proto.onwritestart = - FS_proto.onprogress = - FS_proto.onwrite = - FS_proto.onabort = - FS_proto.onerror = - FS_proto.onwriteend = - null; - - view.addEventListener("unload", process_deletion_queue, false); - return saveAs; -}(this.self || this.window || this.content)); -// `self` is undefined in Firefox for Android content script context -// while `this` is nsIContentFrameMessageManager -// with an attribute `content` that corresponds to the window - -if (typeof module !== 'undefined') module.exports = saveAs; |
