summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rwxr-xr-x[-rw-r--r--]bin/proxy.py (renamed from proxy.py)2
-rw-r--r--bower.json2
-rw-r--r--gif-animate.html6
-rw-r--r--gif-dither.html16
-rw-r--r--gif.html14
-rw-r--r--halftone.html6
-rw-r--r--img/1376516658960-dumpfm-DoritoWitch-TimeFLyTrans0001.png (renamed from 1376516658960-dumpfm-DoritoWitch-TimeFLyTrans0001.png)bin163827 -> 163827 bytes
-rw-r--r--img/abyss.png (renamed from abyss.png)bin193659 -> 193659 bytes
-rw-r--r--img/building.png (renamed from building.png)bin408192 -> 408192 bytes
-rw-r--r--img/gradient.jpg (renamed from gradient.jpg)bin19198 -> 19198 bytes
-rw-r--r--index.html6
-rw-r--r--js/canvasquery.dither.js (renamed from canvasquery.dither.js)89
-rw-r--r--js/util.js3
-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-xjs/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.html6
-rw-r--r--shader-demo.html13
-rw-r--r--shader.html6
-rw-r--r--threshold.html6
-rw-r--r--vendor/FileSaver/FileSaver.js232
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
diff --git a/bower.json b/bower.json
index 31aa3d2..32f4913 100644
--- a/bower.json
+++ b/bower.json
@@ -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
diff --git a/gif.html b/gif.html
index a9090cc..221db89 100644
--- a/gif.html
+++ b/gif.html
@@ -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
index 019c209..019c209 100644
--- a/1376516658960-dumpfm-DoritoWitch-TimeFLyTrans0001.png
+++ b/img/1376516658960-dumpfm-DoritoWitch-TimeFLyTrans0001.png
Binary files differ
diff --git a/abyss.png b/img/abyss.png
index 4ce8d1d..4ce8d1d 100644
--- a/abyss.png
+++ b/img/abyss.png
Binary files differ
diff --git a/building.png b/img/building.png
index 4032700..4032700 100644
--- a/building.png
+++ b/img/building.png
Binary files differ
diff --git a/gradient.jpg b/img/gradient.jpg
index 8aad001..8aad001 100644
--- a/gradient.jpg
+++ b/img/gradient.jpg
Binary files differ
diff --git a/index.html b/index.html
index 18dfc3a..f622cce 100644
--- a/index.html
+++ b/index.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/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;