fragment-tools 0.1.12 → 0.1.13

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,5 @@
1
+ LICENSE.md
2
+ pnpm-lock.yaml
3
+ pnpm-workspace.yaml
4
+ package.json
5
+ /docs
package/.prettierrc ADDED
@@ -0,0 +1,9 @@
1
+ {
2
+ "semi": true,
3
+ "tabWidth": 4,
4
+ "useTabs": true,
5
+ "singleQuote": true,
6
+ "printWidth": 80,
7
+ "bracketSpacing": true,
8
+ "trailingComma": "all"
9
+ }
package/bin/index.js CHANGED
@@ -1,20 +1,20 @@
1
1
  #!/usr/bin/env node
2
2
 
3
- import sade from "sade";
4
- import { run } from "../src/cli/index.js";
3
+ import sade from 'sade';
4
+ import { run } from '../src/cli/index.js';
5
5
 
6
6
  sade('fragment [entry]')
7
- .version('0.1.0')
8
- .describe('Run a dev environment for fragment')
9
- .option('-n, --new', 'Create file if it does not exist', false)
10
- .option('-t, --template', 'Specify template to create the file from', '2d')
11
- .option('-p, --port', 'Port to bind', 3000)
12
- .option('-dev, --development', 'Enable development mode', false)
13
- .option('-b, --build', 'Build sketch for production', false)
14
- .option('--exportDir', 'Directory used for exports', process.cwd())
15
- .option('--outDir', 'Directory used for static build', null)
16
- .option('--emptyOutDir', "Empty outDir before static build", false)
17
- .action((entry, options) => {
18
- run(entry, options);
19
- })
20
- .parse(process.argv);
7
+ .version('0.1.13')
8
+ .describe('Run a dev environment for fragment')
9
+ .option('-n, --new', 'Create file if it does not exist', false)
10
+ .option('-t, --template', 'Specify template to create the file from', '2d')
11
+ .option('-p, --port', 'Port to bind', 3000)
12
+ .option('-dev, --development', 'Enable development mode', false)
13
+ .option('-b, --build', 'Build sketch for production', false)
14
+ .option('--exportDir', 'Directory used for exports', process.cwd())
15
+ .option('--outDir', 'Directory used for static build', null)
16
+ .option('--emptyOutDir', 'Empty outDir before static build', false)
17
+ .action((entry, options) => {
18
+ run(entry, options);
19
+ })
20
+ .parse(process.argv);
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "fragment-tools",
3
- "version": "0.1.12",
3
+ "version": "0.1.13",
4
4
  "description": "A web development environment for creative coding",
5
5
  "main": "index.js",
6
6
  "bin": {
@@ -25,6 +25,7 @@
25
25
  "chokidar": "^3.5.2",
26
26
  "convert-length": "^1.0.1",
27
27
  "get-port": "^6.0.0",
28
+ "gifenc": "^1.0.3",
28
29
  "glslify": "^7.1.1",
29
30
  "kleur": "^4.1.4",
30
31
  "sade": "^1.7.4",
package/src/cli/server.js CHANGED
@@ -1,6 +1,5 @@
1
1
  import path from "path";
2
- import os from 'os';
3
- import fs from "fs/promises";
2
+ import kleur from "kleur";
4
3
  import { fileURLToPath } from 'url';
5
4
  import { createServer, defineConfig, build } from "vite";
6
5
  import { svelte } from '@sveltejs/vite-plugin-svelte'
@@ -129,8 +128,25 @@ export async function start({ options, filepaths, entries, fragment }) {
129
128
  });
130
129
 
131
130
  await server.listen();
131
+
132
132
  log.success(`Server started at:`);
133
- server.printUrls();
133
+
134
+ const { resolvedUrls } = server;
135
+
136
+ for (const url of resolvedUrls.local) {
137
+ console.log(
138
+ ` ${kleur.green('➜')} ${kleur.bold('Local')}: ${kleur.cyan(
139
+ url,
140
+ )}`,
141
+ );
142
+ }
143
+ for (const url of resolvedUrls.network) {
144
+ console.log(
145
+ ` ${kleur.green('➜')} ${kleur.bold('Network')}: ${kleur.cyan(
146
+ url,
147
+ )}`,
148
+ );
149
+ }
134
150
 
135
151
  return server;
136
152
  }
@@ -1,51 +1,46 @@
1
- import { map } from "../../utils/math.utils";
2
- import { loadScript } from "../loader/loadScript";
3
- import CanvasRecorder from "./CanvasRecorder";
1
+ import { map } from '../../utils/math.utils';
2
+ import { GIFEncoder, quantize, applyPalette } from 'gifenc';
3
+ import CanvasRecorder from './CanvasRecorder';
4
4
 
5
5
  class GIFRecorder extends CanvasRecorder {
6
+ start() {
7
+ this.encoder = GIFEncoder();
6
8
 
7
- static loaded = false;
9
+ this.tmpCanvas = document.createElement('canvas');
10
+ this.tmpContext = this.tmpCanvas.getContext('2d');
8
11
 
9
- async load() {
10
- if (!GIFRecorder.loaded) {
11
- await loadScript('/js/gif.worker.js');
12
- await loadScript('/js/gif.js');
12
+ this.maxColors = Math.floor(map(this.quality, 1, 100, 1, 256));
13
13
 
14
- GIFRecorder.loaded = true;
15
- }
16
-
17
- const quality = map(this.quality, 1, 100, 10, 0);
14
+ super.start();
15
+ }
18
16
 
19
- this.writer = new GIF({
20
- workerScript: '/js/gif.worker.js',
21
- workers: 4,
22
- quality,
23
- width: this.canvas.width,
24
- height: this.canvas.height,
25
- });
17
+ getBitmapRGBA(bitmap, width = bitmap.width, height = bitmap.height) {
18
+ this.tmpCanvas.width = width;
19
+ this.tmpCanvas.height = height;
20
+ this.tmpContext.clearRect(0, 0, width, height);
21
+ this.tmpContext.drawImage(bitmap, 0, 0, width, height);
22
+ return this.tmpContext.getImageData(0, 0, width, height).data;
26
23
  }
27
24
 
28
25
  tick() {
29
- this.writer.addFrame(this.canvas, { copy: true, delay: this.frameDuration });
30
- }
26
+ const { width, height } = this.canvas;
31
27
 
32
- end() {
33
- return new Promise((resolve, reject) => {
34
- this.writer.on('finished', (result) => {
35
- this.result = result;
36
- this.writer = null;
28
+ const pixels = this.getBitmapRGBA(this.canvas, width, height);
29
+ const palette = quantize(pixels, this.maxColors);
30
+ const index = applyPalette(pixels, palette);
37
31
 
38
- super.end();
32
+ this.encoder.writeFrame(index, width, height, {
33
+ palette: palette,
34
+ delay: this.frameDuration,
35
+ });
36
+ }
39
37
 
40
- resolve();
41
- });
38
+ end() {
39
+ this.encoder.finish();
42
40
 
43
- this.writer.on('error', (err) => {
44
- reject(err);
45
- });
41
+ this.result = new Blob([this.encoder.bytes()], { type: 'image/gif' });
46
42
 
47
- this.writer.render();
48
- });
43
+ super.end();
49
44
  }
50
45
  }
51
46
 
@@ -1,148 +1,160 @@
1
1
  class Renderer {
2
+ constructor({
3
+ canvas = document.createElement("canvas"),
4
+ antialias = false,
5
+ alpha = true,
6
+ depth = false,
7
+ stencil = false,
8
+ premultipliedAlpha = false,
9
+ pixelRatio = window.devicePixelRatio,
10
+ webgl = 2,
11
+ }) {
12
+ let gl;
13
+ let attributes = {
14
+ depth,
15
+ stencil,
16
+ antialias,
17
+ alpha,
18
+ premultipliedAlpha,
19
+ preserveDrawingBuffer: true,
20
+ };
21
+
22
+ this.canvas = canvas;
23
+
24
+ if (webgl === 2) gl = canvas.getContext("webgl2", attributes);
25
+ if (!gl) {
26
+ gl =
27
+ canvas.getContext("webgl", attributes) ||
28
+ canvas.getContext("experimental-webgl", attributes);
29
+ }
2
30
 
3
- constructor({
4
- canvas = document.createElement('canvas'),
5
- antialias = false,
6
- alpha = true,
7
- depth = false,
8
- stencil = false,
9
- premultipliedAlpha = false,
10
- pixelRatio = window.devicePixelRatio,
11
- webgl = 2,
12
- }) {
13
- let gl;
14
- let attributes = {
15
- depth,
16
- stencil,
17
- antialias,
18
- alpha,
19
- premultipliedAlpha,
20
- preserveDrawingBuffer: true
21
- };
22
-
23
- this.canvas = canvas;
24
-
25
- if (webgl === 2) gl = canvas.getContext('webgl2', attributes);
26
- if (!gl) {
27
- gl = canvas.getContext('webgl', attributes) || canvas.getContext('experimental-webgl', attributes);
28
- }
29
-
30
- this.gl = gl;
31
-
32
- this.state = {
33
- activeTextureUnit: 0,
34
- textureUnits: [],
35
- flipY: false,
36
- viewport: { width: 0, height: 0 },
37
- pixelRatio,
38
- width: 0,
39
- height: 0,
40
- };
41
- this.gl.state = this.state;
42
- }
43
-
44
- render({
45
- geometry,
46
- program,
47
- primitiveType = this.gl.TRIANGLES,
48
- offset = 0,
49
- count = 3
50
- }) {
51
- if (program.needsUpdate) {
52
- program.compile();
53
- }
31
+ this.gl = gl;
32
+
33
+ this.state = {
34
+ activeTextureUnit: 0,
35
+ textureUnits: [],
36
+ flipY: false,
37
+ viewport: { width: 0, height: 0 },
38
+ pixelRatio,
39
+ width: 0,
40
+ height: 0,
41
+ };
42
+ this.gl.state = this.state;
43
+ }
44
+
45
+ render({
46
+ geometry,
47
+ program,
48
+ primitiveType = this.gl.TRIANGLES,
49
+ offset = 0,
50
+ count = 3,
51
+ }) {
52
+ if (program.needsUpdate) {
53
+ program.compile();
54
+ }
54
55
 
55
- this.gl.clear(this.gl.COLOR_BUFFER_BIT);
56
-
57
- this.gl.useProgram(program._program);
58
-
59
- for (let attributeName in program.attributesLocations) {
60
- let location = program.attributesLocations[attributeName];
61
- let buffer = geometry.buffers[attributeName];
62
-
63
- this.gl.enableVertexAttribArray(location);
64
- this.gl.bindBuffer(this.gl.ARRAY_BUFFER, buffer);
65
-
66
- const size = 2; // 2 components per iteration
67
- const type = this.gl.FLOAT; // the data is 32bit floats
68
- const normalize = false; // don't normalize the data
69
- const stride = 0; // 0 = move forward size * sizeof(type) each iteration to get the next position
70
- const bufferOffset = 0; // start at the beginning of the buffer
71
- this.gl.vertexAttribPointer(
72
- location,
73
- size,
74
- type,
75
- normalize,
76
- stride,
77
- bufferOffset
78
- );
79
- }
56
+ this.gl.clear(this.gl.COLOR_BUFFER_BIT);
57
+
58
+ this.gl.useProgram(program._program);
59
+
60
+ for (let attributeName in program.attributesLocations) {
61
+ let location = program.attributesLocations[attributeName];
62
+ let buffer = geometry.buffers[attributeName];
63
+
64
+ this.gl.enableVertexAttribArray(location);
65
+ this.gl.bindBuffer(this.gl.ARRAY_BUFFER, buffer);
66
+
67
+ const size = 2; // 2 components per iteration
68
+ const type = this.gl.FLOAT; // the data is 32bit floats
69
+ const normalize = false; // don't normalize the data
70
+ const stride = 0; // 0 = move forward size * sizeof(type) each iteration to get the next position
71
+ const bufferOffset = 0; // start at the beginning of the buffer
72
+ this.gl.vertexAttribPointer(
73
+ location,
74
+ size,
75
+ type,
76
+ normalize,
77
+ stride,
78
+ bufferOffset
79
+ );
80
+ }
80
81
 
81
- let textureUnit = -1;
82
-
83
- for (let uniformName in program.uniforms) {
84
- let location = program.uniformsLocations[uniformName];
85
- if (location) {
86
- let uniform = program.uniforms[uniformName];
87
-
88
- if (uniform.type === 'float') {
89
- this.gl.uniform1f(location, uniform.value);
90
- } else if (uniform.type === 'vec2') {
91
- this.gl.uniform2f(location, uniform.value[0], uniform.value[1]);
92
- } else if (uniform.type === 'vec3') {
93
- this.gl.uniform3f(location, uniform.value[0], uniform.value[1], uniform.value[2]);
94
- } else if (uniform.type === 'vec4') {
95
- this.gl.uniform4f(location, uniform.value[0], uniform.value[1], uniform.value[2], uniform.value[3]);
96
- } else if (uniform.type === 'sampler2D') {
97
- if (uniform.value) {
98
- textureUnit = textureUnit + 1;
99
- uniform.value.update(textureUnit);
100
-
101
- this.gl.uniform1i(location, textureUnit);
102
- }
103
- }
104
- }
82
+ let textureUnit = -1;
83
+
84
+ for (let uniformName in program.uniforms) {
85
+ let location = program.uniformsLocations[uniformName];
86
+ if (location) {
87
+ let uniform = program.uniforms[uniformName];
88
+
89
+ if (uniform.type === "float") {
90
+ this.gl.uniform1f(location, uniform.value);
91
+ } else if (uniform.type === "vec2") {
92
+ this.gl.uniform2f(location, uniform.value[0], uniform.value[1]);
93
+ } else if (uniform.type === "vec3") {
94
+ this.gl.uniform3f(
95
+ location,
96
+ uniform.value[0],
97
+ uniform.value[1],
98
+ uniform.value[2]
99
+ );
100
+ } else if (uniform.type === "vec4") {
101
+ this.gl.uniform4f(
102
+ location,
103
+ uniform.value[0],
104
+ uniform.value[1],
105
+ uniform.value[2],
106
+ uniform.value[3]
107
+ );
108
+ } else if (uniform.type === "sampler2D") {
109
+ if (uniform.value) {
110
+ textureUnit = textureUnit + 1;
111
+ uniform.value.update(textureUnit);
112
+
113
+ this.gl.uniform1i(location, textureUnit);
114
+ }
105
115
  }
106
-
107
- this.gl.drawArrays(primitiveType, offset, count);
116
+ }
108
117
  }
109
118
 
110
- setPixelRatio(pixelRatio = this.state.pixelRatio) {
111
- if (this.state.pixelRatio !== pixelRatio) {
112
- this.state.pixelRatio = pixelRatio;
113
- this.setSize();
114
- }
119
+ this.gl.drawArrays(primitiveType, offset, count);
120
+ }
121
+
122
+ setPixelRatio(pixelRatio = this.state.pixelRatio) {
123
+ if (this.state.pixelRatio !== pixelRatio) {
124
+ this.state.pixelRatio = pixelRatio;
125
+ this.setSize();
115
126
  }
127
+ }
116
128
 
117
- setSize({ width = this.state.width, height = this.state.height } = {}) {
118
- this.state.width = width;
119
- this.state.height = height;
129
+ setSize({ width = this.state.width, height = this.state.height } = {}) {
130
+ this.state.width = width;
131
+ this.state.height = height;
120
132
 
121
- this.canvas.width = this.state.width * this.state.pixelRatio;
122
- this.canvas.height = this.state.height * this.state.pixelRatio;
133
+ this.canvas.width = this.state.width * this.state.pixelRatio;
134
+ this.canvas.height = this.state.height * this.state.pixelRatio;
123
135
 
124
- this.setViewport();
125
- }
136
+ this.setViewport();
137
+ }
126
138
 
127
- setViewport({ width = this.state.width, height = this.state.height } = {}) {
128
- let w = Math.floor(width * this.state.pixelRatio);
129
- let h = Math.floor(height * this.state.pixelRatio);
139
+ setViewport({ width = this.state.width, height = this.state.height } = {}) {
140
+ let w = Math.floor(width * this.state.pixelRatio);
141
+ let h = Math.floor(height * this.state.pixelRatio);
130
142
 
131
- if (this.state.viewport.width !== w || this.state.viewport.height !== h) {
132
- this.gl.viewport(0, 0, w, h);
143
+ if (this.state.viewport.width !== w || this.state.viewport.height !== h) {
144
+ this.gl.viewport(0, 0, w, h);
133
145
 
134
- this.state.viewport.width = w;
135
- this.state.viewport.height = h;
136
- }
146
+ this.state.viewport.width = w;
147
+ this.state.viewport.height = h;
137
148
  }
149
+ }
138
150
 
139
- destroy() {
140
- let extension = this.gl.getExtension('WEBGL_lose_context');
151
+ destroy() {
152
+ let extension = this.gl.getExtension("WEBGL_lose_context");
141
153
 
142
- if (extension) {
143
- extension.loseContext();
144
- }
154
+ if (extension) {
155
+ extension.loseContext();
145
156
  }
157
+ }
146
158
  }
147
159
 
148
160
  export default Renderer;
@@ -1,2 +0,0 @@
1
- // gif.js 0.2.0 - https://github.com/jnordberg/gif.js
2
- (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.GIF=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(require,module,exports){function EventEmitter(){this._events=this._events||{};this._maxListeners=this._maxListeners||undefined}module.exports=EventEmitter;EventEmitter.EventEmitter=EventEmitter;EventEmitter.prototype._events=undefined;EventEmitter.prototype._maxListeners=undefined;EventEmitter.defaultMaxListeners=10;EventEmitter.prototype.setMaxListeners=function(n){if(!isNumber(n)||n<0||isNaN(n))throw TypeError("n must be a positive number");this._maxListeners=n;return this};EventEmitter.prototype.emit=function(type){var er,handler,len,args,i,listeners;if(!this._events)this._events={};if(type==="error"){if(!this._events.error||isObject(this._events.error)&&!this._events.error.length){er=arguments[1];if(er instanceof Error){throw er}else{var err=new Error('Uncaught, unspecified "error" event. ('+er+")");err.context=er;throw err}}}handler=this._events[type];if(isUndefined(handler))return false;if(isFunction(handler)){switch(arguments.length){case 1:handler.call(this);break;case 2:handler.call(this,arguments[1]);break;case 3:handler.call(this,arguments[1],arguments[2]);break;default:args=Array.prototype.slice.call(arguments,1);handler.apply(this,args)}}else if(isObject(handler)){args=Array.prototype.slice.call(arguments,1);listeners=handler.slice();len=listeners.length;for(i=0;i<len;i++)listeners[i].apply(this,args)}return true};EventEmitter.prototype.addListener=function(type,listener){var m;if(!isFunction(listener))throw TypeError("listener must be a function");if(!this._events)this._events={};if(this._events.newListener)this.emit("newListener",type,isFunction(listener.listener)?listener.listener:listener);if(!this._events[type])this._events[type]=listener;else if(isObject(this._events[type]))this._events[type].push(listener);else this._events[type]=[this._events[type],listener];if(isObject(this._events[type])&&!this._events[type].warned){if(!isUndefined(this._maxListeners)){m=this._maxListeners}else{m=EventEmitter.defaultMaxListeners}if(m&&m>0&&this._events[type].length>m){this._events[type].warned=true;console.error("(node) warning: possible EventEmitter memory "+"leak detected. %d listeners added. "+"Use emitter.setMaxListeners() to increase limit.",this._events[type].length);if(typeof console.trace==="function"){console.trace()}}}return this};EventEmitter.prototype.on=EventEmitter.prototype.addListener;EventEmitter.prototype.once=function(type,listener){if(!isFunction(listener))throw TypeError("listener must be a function");var fired=false;function g(){this.removeListener(type,g);if(!fired){fired=true;listener.apply(this,arguments)}}g.listener=listener;this.on(type,g);return this};EventEmitter.prototype.removeListener=function(type,listener){var list,position,length,i;if(!isFunction(listener))throw TypeError("listener must be a function");if(!this._events||!this._events[type])return this;list=this._events[type];length=list.length;position=-1;if(list===listener||isFunction(list.listener)&&list.listener===listener){delete this._events[type];if(this._events.removeListener)this.emit("removeListener",type,listener)}else if(isObject(list)){for(i=length;i-- >0;){if(list[i]===listener||list[i].listener&&list[i].listener===listener){position=i;break}}if(position<0)return this;if(list.length===1){list.length=0;delete this._events[type]}else{list.splice(position,1)}if(this._events.removeListener)this.emit("removeListener",type,listener)}return this};EventEmitter.prototype.removeAllListeners=function(type){var key,listeners;if(!this._events)return this;if(!this._events.removeListener){if(arguments.length===0)this._events={};else if(this._events[type])delete this._events[type];return this}if(arguments.length===0){for(key in this._events){if(key==="removeListener")continue;this.removeAllListeners(key)}this.removeAllListeners("removeListener");this._events={};return this}listeners=this._events[type];if(isFunction(listeners)){this.removeListener(type,listeners)}else if(listeners){while(listeners.length)this.removeListener(type,listeners[listeners.length-1])}delete this._events[type];return this};EventEmitter.prototype.listeners=function(type){var ret;if(!this._events||!this._events[type])ret=[];else if(isFunction(this._events[type]))ret=[this._events[type]];else ret=this._events[type].slice();return ret};EventEmitter.prototype.listenerCount=function(type){if(this._events){var evlistener=this._events[type];if(isFunction(evlistener))return 1;else if(evlistener)return evlistener.length}return 0};EventEmitter.listenerCount=function(emitter,type){return emitter.listenerCount(type)};function isFunction(arg){return typeof arg==="function"}function isNumber(arg){return typeof arg==="number"}function isObject(arg){return typeof arg==="object"&&arg!==null}function isUndefined(arg){return arg===void 0}},{}],2:[function(require,module,exports){var UA,browser,mode,platform,ua;ua=navigator.userAgent.toLowerCase();platform=navigator.platform.toLowerCase();UA=ua.match(/(opera|ie|firefox|chrome|version)[\s\/:]([\w\d\.]+)?.*?(safari|version[\s\/:]([\w\d\.]+)|$)/)||[null,"unknown",0];mode=UA[1]==="ie"&&document.documentMode;browser={name:UA[1]==="version"?UA[3]:UA[1],version:mode||parseFloat(UA[1]==="opera"&&UA[4]?UA[4]:UA[2]),platform:{name:ua.match(/ip(?:ad|od|hone)/)?"ios":(ua.match(/(?:webos|android)/)||platform.match(/mac|win|linux/)||["other"])[0]}};browser[browser.name]=true;browser[browser.name+parseInt(browser.version,10)]=true;browser.platform[browser.platform.name]=true;module.exports=browser},{}],3:[function(require,module,exports){var EventEmitter,GIF,browser,extend=function(child,parent){for(var key in parent){if(hasProp.call(parent,key))child[key]=parent[key]}function ctor(){this.constructor=child}ctor.prototype=parent.prototype;child.prototype=new ctor;child.__super__=parent.prototype;return child},hasProp={}.hasOwnProperty,indexOf=[].indexOf||function(item){for(var i=0,l=this.length;i<l;i++){if(i in this&&this[i]===item)return i}return-1},slice=[].slice;EventEmitter=require("events").EventEmitter;browser=require("./browser.coffee");GIF=function(superClass){var defaults,frameDefaults;extend(GIF,superClass);defaults={workerScript:"gif.worker.js",workers:2,repeat:0,background:"#fff",quality:10,width:null,height:null,transparent:null,debug:false,dither:false};frameDefaults={delay:500,copy:false};function GIF(options){var base,key,value;this.running=false;this.options={};this.frames=[];this.freeWorkers=[];this.activeWorkers=[];this.setOptions(options);for(key in defaults){value=defaults[key];if((base=this.options)[key]==null){base[key]=value}}}GIF.prototype.setOption=function(key,value){this.options[key]=value;if(this._canvas!=null&&(key==="width"||key==="height")){return this._canvas[key]=value}};GIF.prototype.setOptions=function(options){var key,results,value;results=[];for(key in options){if(!hasProp.call(options,key))continue;value=options[key];results.push(this.setOption(key,value))}return results};GIF.prototype.addFrame=function(image,options){var frame,key;if(options==null){options={}}frame={};frame.transparent=this.options.transparent;for(key in frameDefaults){frame[key]=options[key]||frameDefaults[key]}if(this.options.width==null){this.setOption("width",image.width)}if(this.options.height==null){this.setOption("height",image.height)}if(typeof ImageData!=="undefined"&&ImageData!==null&&image instanceof ImageData){frame.data=image.data}else if(typeof CanvasRenderingContext2D!=="undefined"&&CanvasRenderingContext2D!==null&&image instanceof CanvasRenderingContext2D||typeof WebGLRenderingContext!=="undefined"&&WebGLRenderingContext!==null&&image instanceof WebGLRenderingContext){if(options.copy){frame.data=this.getContextData(image)}else{frame.context=image}}else if(image.childNodes!=null){if(options.copy){frame.data=this.getImageData(image)}else{frame.image=image}}else{throw new Error("Invalid image")}return this.frames.push(frame)};GIF.prototype.render=function(){var i,j,numWorkers,ref;if(this.running){throw new Error("Already running")}if(this.options.width==null||this.options.height==null){throw new Error("Width and height must be set prior to rendering")}this.running=true;this.nextFrame=0;this.finishedFrames=0;this.imageParts=function(){var j,ref,results;results=[];for(i=j=0,ref=this.frames.length;0<=ref?j<ref:j>ref;i=0<=ref?++j:--j){results.push(null)}return results}.call(this);numWorkers=this.spawnWorkers();if(this.options.globalPalette===true){this.renderNextFrame()}else{for(i=j=0,ref=numWorkers;0<=ref?j<ref:j>ref;i=0<=ref?++j:--j){this.renderNextFrame()}}this.emit("start");return this.emit("progress",0)};GIF.prototype.abort=function(){var worker;while(true){worker=this.activeWorkers.shift();if(worker==null){break}this.log("killing active worker");worker.terminate()}this.running=false;return this.emit("abort")};GIF.prototype.spawnWorkers=function(){var j,numWorkers,ref,results;numWorkers=Math.min(this.options.workers,this.frames.length);(function(){results=[];for(var j=ref=this.freeWorkers.length;ref<=numWorkers?j<numWorkers:j>numWorkers;ref<=numWorkers?j++:j--){results.push(j)}return results}).apply(this).forEach(function(_this){return function(i){var worker;_this.log("spawning worker "+i);worker=new Worker(_this.options.workerScript);worker.onmessage=function(event){_this.activeWorkers.splice(_this.activeWorkers.indexOf(worker),1);_this.freeWorkers.push(worker);return _this.frameFinished(event.data)};return _this.freeWorkers.push(worker)}}(this));return numWorkers};GIF.prototype.frameFinished=function(frame){var i,j,ref;this.log("frame "+frame.index+" finished - "+this.activeWorkers.length+" active");this.finishedFrames++;this.emit("progress",this.finishedFrames/this.frames.length);this.imageParts[frame.index]=frame;if(this.options.globalPalette===true){this.options.globalPalette=frame.globalPalette;this.log("global palette analyzed");if(this.frames.length>2){for(i=j=1,ref=this.freeWorkers.length;1<=ref?j<ref:j>ref;i=1<=ref?++j:--j){this.renderNextFrame()}}}if(indexOf.call(this.imageParts,null)>=0){return this.renderNextFrame()}else{return this.finishRendering()}};GIF.prototype.finishRendering=function(){var data,frame,i,image,j,k,l,len,len1,len2,len3,offset,page,ref,ref1,ref2;len=0;ref=this.imageParts;for(j=0,len1=ref.length;j<len1;j++){frame=ref[j];len+=(frame.data.length-1)*frame.pageSize+frame.cursor}len+=frame.pageSize-frame.cursor;this.log("rendering finished - filesize "+Math.round(len/1e3)+"kb");data=new Uint8Array(len);offset=0;ref1=this.imageParts;for(k=0,len2=ref1.length;k<len2;k++){frame=ref1[k];ref2=frame.data;for(i=l=0,len3=ref2.length;l<len3;i=++l){page=ref2[i];data.set(page,offset);if(i===frame.data.length-1){offset+=frame.cursor}else{offset+=frame.pageSize}}}image=new Blob([data],{type:"image/gif"});return this.emit("finished",image,data)};GIF.prototype.renderNextFrame=function(){var frame,task,worker;if(this.freeWorkers.length===0){throw new Error("No free workers")}if(this.nextFrame>=this.frames.length){return}frame=this.frames[this.nextFrame++];worker=this.freeWorkers.shift();task=this.getTask(frame);this.log("starting frame "+(task.index+1)+" of "+this.frames.length);this.activeWorkers.push(worker);return worker.postMessage(task)};GIF.prototype.getContextData=function(ctx){return ctx.getImageData(0,0,this.options.width,this.options.height).data};GIF.prototype.getImageData=function(image){var ctx;if(this._canvas==null){this._canvas=document.createElement("canvas");this._canvas.width=this.options.width;this._canvas.height=this.options.height}ctx=this._canvas.getContext("2d");ctx.setFill=this.options.background;ctx.fillRect(0,0,this.options.width,this.options.height);ctx.drawImage(image,0,0);return this.getContextData(ctx)};GIF.prototype.getTask=function(frame){var index,task;index=this.frames.indexOf(frame);task={index:index,last:index===this.frames.length-1,delay:frame.delay,transparent:frame.transparent,width:this.options.width,height:this.options.height,quality:this.options.quality,dither:this.options.dither,globalPalette:this.options.globalPalette,repeat:this.options.repeat,canTransfer:browser.name==="chrome"};if(frame.data!=null){task.data=frame.data}else if(frame.context!=null){task.data=this.getContextData(frame.context)}else if(frame.image!=null){task.data=this.getImageData(frame.image)}else{throw new Error("Invalid frame")}return task};GIF.prototype.log=function(){var args;args=1<=arguments.length?slice.call(arguments,0):[];if(!this.options.debug){return}return console.log.apply(console,args)};return GIF}(EventEmitter);module.exports=GIF},{"./browser.coffee":2,events:1}]},{},[3])(3)});
@@ -1,2 +0,0 @@
1
- // gif.worker.js 0.2.0 - https://github.com/jnordberg/gif.js
2
- (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(require,module,exports){var NeuQuant=require("./TypedNeuQuant.js");var LZWEncoder=require("./LZWEncoder.js");function ByteArray(){this.page=-1;this.pages=[];this.newPage()}ByteArray.pageSize=4096;ByteArray.charMap={};for(var i=0;i<256;i++)ByteArray.charMap[i]=String.fromCharCode(i);ByteArray.prototype.newPage=function(){this.pages[++this.page]=new Uint8Array(ByteArray.pageSize);this.cursor=0};ByteArray.prototype.getData=function(){var rv="";for(var p=0;p<this.pages.length;p++){for(var i=0;i<ByteArray.pageSize;i++){rv+=ByteArray.charMap[this.pages[p][i]]}}return rv};ByteArray.prototype.writeByte=function(val){if(this.cursor>=ByteArray.pageSize)this.newPage();this.pages[this.page][this.cursor++]=val};ByteArray.prototype.writeUTFBytes=function(string){for(var l=string.length,i=0;i<l;i++)this.writeByte(string.charCodeAt(i))};ByteArray.prototype.writeBytes=function(array,offset,length){for(var l=length||array.length,i=offset||0;i<l;i++)this.writeByte(array[i])};function GIFEncoder(width,height){this.width=~~width;this.height=~~height;this.transparent=null;this.transIndex=0;this.repeat=-1;this.delay=0;this.image=null;this.pixels=null;this.indexedPixels=null;this.colorDepth=null;this.colorTab=null;this.neuQuant=null;this.usedEntry=new Array;this.palSize=7;this.dispose=-1;this.firstFrame=true;this.sample=10;this.dither=false;this.globalPalette=false;this.out=new ByteArray}GIFEncoder.prototype.setDelay=function(milliseconds){this.delay=Math.round(milliseconds/10)};GIFEncoder.prototype.setFrameRate=function(fps){this.delay=Math.round(100/fps)};GIFEncoder.prototype.setDispose=function(disposalCode){if(disposalCode>=0)this.dispose=disposalCode};GIFEncoder.prototype.setRepeat=function(repeat){this.repeat=repeat};GIFEncoder.prototype.setTransparent=function(color){this.transparent=color};GIFEncoder.prototype.addFrame=function(imageData){this.image=imageData;this.colorTab=this.globalPalette&&this.globalPalette.slice?this.globalPalette:null;this.getImagePixels();this.analyzePixels();if(this.globalPalette===true)this.globalPalette=this.colorTab;if(this.firstFrame){this.writeLSD();this.writePalette();if(this.repeat>=0){this.writeNetscapeExt()}}this.writeGraphicCtrlExt();this.writeImageDesc();if(!this.firstFrame&&!this.globalPalette)this.writePalette();this.writePixels();this.firstFrame=false};GIFEncoder.prototype.finish=function(){this.out.writeByte(59)};GIFEncoder.prototype.setQuality=function(quality){if(quality<1)quality=1;this.sample=quality};GIFEncoder.prototype.setDither=function(dither){if(dither===true)dither="FloydSteinberg";this.dither=dither};GIFEncoder.prototype.setGlobalPalette=function(palette){this.globalPalette=palette};GIFEncoder.prototype.getGlobalPalette=function(){return this.globalPalette&&this.globalPalette.slice&&this.globalPalette.slice(0)||this.globalPalette};GIFEncoder.prototype.writeHeader=function(){this.out.writeUTFBytes("GIF89a")};GIFEncoder.prototype.analyzePixels=function(){if(!this.colorTab){this.neuQuant=new NeuQuant(this.pixels,this.sample);this.neuQuant.buildColormap();this.colorTab=this.neuQuant.getColormap()}if(this.dither){this.ditherPixels(this.dither.replace("-serpentine",""),this.dither.match(/-serpentine/)!==null)}else{this.indexPixels()}this.pixels=null;this.colorDepth=8;this.palSize=7;if(this.transparent!==null){this.transIndex=this.findClosest(this.transparent,true)}};GIFEncoder.prototype.indexPixels=function(imgq){var nPix=this.pixels.length/3;this.indexedPixels=new Uint8Array(nPix);var k=0;for(var j=0;j<nPix;j++){var index=this.findClosestRGB(this.pixels[k++]&255,this.pixels[k++]&255,this.pixels[k++]&255);this.usedEntry[index]=true;this.indexedPixels[j]=index}};GIFEncoder.prototype.ditherPixels=function(kernel,serpentine){var kernels={FalseFloydSteinberg:[[3/8,1,0],[3/8,0,1],[2/8,1,1]],FloydSteinberg:[[7/16,1,0],[3/16,-1,1],[5/16,0,1],[1/16,1,1]],Stucki:[[8/42,1,0],[4/42,2,0],[2/42,-2,1],[4/42,-1,1],[8/42,0,1],[4/42,1,1],[2/42,2,1],[1/42,-2,2],[2/42,-1,2],[4/42,0,2],[2/42,1,2],[1/42,2,2]],Atkinson:[[1/8,1,0],[1/8,2,0],[1/8,-1,1],[1/8,0,1],[1/8,1,1],[1/8,0,2]]};if(!kernel||!kernels[kernel]){throw"Unknown dithering kernel: "+kernel}var ds=kernels[kernel];var index=0,height=this.height,width=this.width,data=this.pixels;var direction=serpentine?-1:1;this.indexedPixels=new Uint8Array(this.pixels.length/3);for(var y=0;y<height;y++){if(serpentine)direction=direction*-1;for(var x=direction==1?0:width-1,xend=direction==1?width:0;x!==xend;x+=direction){index=y*width+x;var idx=index*3;var r1=data[idx];var g1=data[idx+1];var b1=data[idx+2];idx=this.findClosestRGB(r1,g1,b1);this.usedEntry[idx]=true;this.indexedPixels[index]=idx;idx*=3;var r2=this.colorTab[idx];var g2=this.colorTab[idx+1];var b2=this.colorTab[idx+2];var er=r1-r2;var eg=g1-g2;var eb=b1-b2;for(var i=direction==1?0:ds.length-1,end=direction==1?ds.length:0;i!==end;i+=direction){var x1=ds[i][1];var y1=ds[i][2];if(x1+x>=0&&x1+x<width&&y1+y>=0&&y1+y<height){var d=ds[i][0];idx=index+x1+y1*width;idx*=3;data[idx]=Math.max(0,Math.min(255,data[idx]+er*d));data[idx+1]=Math.max(0,Math.min(255,data[idx+1]+eg*d));data[idx+2]=Math.max(0,Math.min(255,data[idx+2]+eb*d))}}}}};GIFEncoder.prototype.findClosest=function(c,used){return this.findClosestRGB((c&16711680)>>16,(c&65280)>>8,c&255,used)};GIFEncoder.prototype.findClosestRGB=function(r,g,b,used){if(this.colorTab===null)return-1;if(this.neuQuant&&!used){return this.neuQuant.lookupRGB(r,g,b)}var c=b|g<<8|r<<16;var minpos=0;var dmin=256*256*256;var len=this.colorTab.length;for(var i=0,index=0;i<len;index++){var dr=r-(this.colorTab[i++]&255);var dg=g-(this.colorTab[i++]&255);var db=b-(this.colorTab[i++]&255);var d=dr*dr+dg*dg+db*db;if((!used||this.usedEntry[index])&&d<dmin){dmin=d;minpos=index}}return minpos};GIFEncoder.prototype.getImagePixels=function(){var w=this.width;var h=this.height;this.pixels=new Uint8Array(w*h*3);var data=this.image;var srcPos=0;var count=0;for(var i=0;i<h;i++){for(var j=0;j<w;j++){this.pixels[count++]=data[srcPos++];this.pixels[count++]=data[srcPos++];this.pixels[count++]=data[srcPos++];srcPos++}}};GIFEncoder.prototype.writeGraphicCtrlExt=function(){this.out.writeByte(33);this.out.writeByte(249);this.out.writeByte(4);var transp,disp;if(this.transparent===null){transp=0;disp=0}else{transp=1;disp=2}if(this.dispose>=0){disp=dispose&7}disp<<=2;this.out.writeByte(0|disp|0|transp);this.writeShort(this.delay);this.out.writeByte(this.transIndex);this.out.writeByte(0)};GIFEncoder.prototype.writeImageDesc=function(){this.out.writeByte(44);this.writeShort(0);this.writeShort(0);this.writeShort(this.width);this.writeShort(this.height);if(this.firstFrame||this.globalPalette){this.out.writeByte(0)}else{this.out.writeByte(128|0|0|0|this.palSize)}};GIFEncoder.prototype.writeLSD=function(){this.writeShort(this.width);this.writeShort(this.height);this.out.writeByte(128|112|0|this.palSize);this.out.writeByte(0);this.out.writeByte(0)};GIFEncoder.prototype.writeNetscapeExt=function(){this.out.writeByte(33);this.out.writeByte(255);this.out.writeByte(11);this.out.writeUTFBytes("NETSCAPE2.0");this.out.writeByte(3);this.out.writeByte(1);this.writeShort(this.repeat);this.out.writeByte(0)};GIFEncoder.prototype.writePalette=function(){this.out.writeBytes(this.colorTab);var n=3*256-this.colorTab.length;for(var i=0;i<n;i++)this.out.writeByte(0)};GIFEncoder.prototype.writeShort=function(pValue){this.out.writeByte(pValue&255);this.out.writeByte(pValue>>8&255)};GIFEncoder.prototype.writePixels=function(){var enc=new LZWEncoder(this.width,this.height,this.indexedPixels,this.colorDepth);enc.encode(this.out)};GIFEncoder.prototype.stream=function(){return this.out};module.exports=GIFEncoder},{"./LZWEncoder.js":2,"./TypedNeuQuant.js":3}],2:[function(require,module,exports){var EOF=-1;var BITS=12;var HSIZE=5003;var masks=[0,1,3,7,15,31,63,127,255,511,1023,2047,4095,8191,16383,32767,65535];function LZWEncoder(width,height,pixels,colorDepth){var initCodeSize=Math.max(2,colorDepth);var accum=new Uint8Array(256);var htab=new Int32Array(HSIZE);var codetab=new Int32Array(HSIZE);var cur_accum,cur_bits=0;var a_count;var free_ent=0;var maxcode;var clear_flg=false;var g_init_bits,ClearCode,EOFCode;function char_out(c,outs){accum[a_count++]=c;if(a_count>=254)flush_char(outs)}function cl_block(outs){cl_hash(HSIZE);free_ent=ClearCode+2;clear_flg=true;output(ClearCode,outs)}function cl_hash(hsize){for(var i=0;i<hsize;++i)htab[i]=-1}function compress(init_bits,outs){var fcode,c,i,ent,disp,hsize_reg,hshift;g_init_bits=init_bits;clear_flg=false;n_bits=g_init_bits;maxcode=MAXCODE(n_bits);ClearCode=1<<init_bits-1;EOFCode=ClearCode+1;free_ent=ClearCode+2;a_count=0;ent=nextPixel();hshift=0;for(fcode=HSIZE;fcode<65536;fcode*=2)++hshift;hshift=8-hshift;hsize_reg=HSIZE;cl_hash(hsize_reg);output(ClearCode,outs);outer_loop:while((c=nextPixel())!=EOF){fcode=(c<<BITS)+ent;i=c<<hshift^ent;if(htab[i]===fcode){ent=codetab[i];continue}else if(htab[i]>=0){disp=hsize_reg-i;if(i===0)disp=1;do{if((i-=disp)<0)i+=hsize_reg;if(htab[i]===fcode){ent=codetab[i];continue outer_loop}}while(htab[i]>=0)}output(ent,outs);ent=c;if(free_ent<1<<BITS){codetab[i]=free_ent++;htab[i]=fcode}else{cl_block(outs)}}output(ent,outs);output(EOFCode,outs)}function encode(outs){outs.writeByte(initCodeSize);remaining=width*height;curPixel=0;compress(initCodeSize+1,outs);outs.writeByte(0)}function flush_char(outs){if(a_count>0){outs.writeByte(a_count);outs.writeBytes(accum,0,a_count);a_count=0}}function MAXCODE(n_bits){return(1<<n_bits)-1}function nextPixel(){if(remaining===0)return EOF;--remaining;var pix=pixels[curPixel++];return pix&255}function output(code,outs){cur_accum&=masks[cur_bits];if(cur_bits>0)cur_accum|=code<<cur_bits;else cur_accum=code;cur_bits+=n_bits;while(cur_bits>=8){char_out(cur_accum&255,outs);cur_accum>>=8;cur_bits-=8}if(free_ent>maxcode||clear_flg){if(clear_flg){maxcode=MAXCODE(n_bits=g_init_bits);clear_flg=false}else{++n_bits;if(n_bits==BITS)maxcode=1<<BITS;else maxcode=MAXCODE(n_bits)}}if(code==EOFCode){while(cur_bits>0){char_out(cur_accum&255,outs);cur_accum>>=8;cur_bits-=8}flush_char(outs)}}this.encode=encode}module.exports=LZWEncoder},{}],3:[function(require,module,exports){var ncycles=100;var netsize=256;var maxnetpos=netsize-1;var netbiasshift=4;var intbiasshift=16;var intbias=1<<intbiasshift;var gammashift=10;var gamma=1<<gammashift;var betashift=10;var beta=intbias>>betashift;var betagamma=intbias<<gammashift-betashift;var initrad=netsize>>3;var radiusbiasshift=6;var radiusbias=1<<radiusbiasshift;var initradius=initrad*radiusbias;var radiusdec=30;var alphabiasshift=10;var initalpha=1<<alphabiasshift;var alphadec;var radbiasshift=8;var radbias=1<<radbiasshift;var alpharadbshift=alphabiasshift+radbiasshift;var alpharadbias=1<<alpharadbshift;var prime1=499;var prime2=491;var prime3=487;var prime4=503;var minpicturebytes=3*prime4;function NeuQuant(pixels,samplefac){var network;var netindex;var bias;var freq;var radpower;function init(){network=[];netindex=new Int32Array(256);bias=new Int32Array(netsize);freq=new Int32Array(netsize);radpower=new Int32Array(netsize>>3);var i,v;for(i=0;i<netsize;i++){v=(i<<netbiasshift+8)/netsize;network[i]=new Float64Array([v,v,v,0]);freq[i]=intbias/netsize;bias[i]=0}}function unbiasnet(){for(var i=0;i<netsize;i++){network[i][0]>>=netbiasshift;network[i][1]>>=netbiasshift;network[i][2]>>=netbiasshift;network[i][3]=i}}function altersingle(alpha,i,b,g,r){network[i][0]-=alpha*(network[i][0]-b)/initalpha;network[i][1]-=alpha*(network[i][1]-g)/initalpha;network[i][2]-=alpha*(network[i][2]-r)/initalpha}function alterneigh(radius,i,b,g,r){var lo=Math.abs(i-radius);var hi=Math.min(i+radius,netsize);var j=i+1;var k=i-1;var m=1;var p,a;while(j<hi||k>lo){a=radpower[m++];if(j<hi){p=network[j++];p[0]-=a*(p[0]-b)/alpharadbias;p[1]-=a*(p[1]-g)/alpharadbias;p[2]-=a*(p[2]-r)/alpharadbias}if(k>lo){p=network[k--];p[0]-=a*(p[0]-b)/alpharadbias;p[1]-=a*(p[1]-g)/alpharadbias;p[2]-=a*(p[2]-r)/alpharadbias}}}function contest(b,g,r){var bestd=~(1<<31);var bestbiasd=bestd;var bestpos=-1;var bestbiaspos=bestpos;var i,n,dist,biasdist,betafreq;for(i=0;i<netsize;i++){n=network[i];dist=Math.abs(n[0]-b)+Math.abs(n[1]-g)+Math.abs(n[2]-r);if(dist<bestd){bestd=dist;bestpos=i}biasdist=dist-(bias[i]>>intbiasshift-netbiasshift);if(biasdist<bestbiasd){bestbiasd=biasdist;bestbiaspos=i}betafreq=freq[i]>>betashift;freq[i]-=betafreq;bias[i]+=betafreq<<gammashift}freq[bestpos]+=beta;bias[bestpos]-=betagamma;return bestbiaspos}function inxbuild(){var i,j,p,q,smallpos,smallval,previouscol=0,startpos=0;for(i=0;i<netsize;i++){p=network[i];smallpos=i;smallval=p[1];for(j=i+1;j<netsize;j++){q=network[j];if(q[1]<smallval){smallpos=j;smallval=q[1]}}q=network[smallpos];if(i!=smallpos){j=q[0];q[0]=p[0];p[0]=j;j=q[1];q[1]=p[1];p[1]=j;j=q[2];q[2]=p[2];p[2]=j;j=q[3];q[3]=p[3];p[3]=j}if(smallval!=previouscol){netindex[previouscol]=startpos+i>>1;for(j=previouscol+1;j<smallval;j++)netindex[j]=i;previouscol=smallval;startpos=i}}netindex[previouscol]=startpos+maxnetpos>>1;for(j=previouscol+1;j<256;j++)netindex[j]=maxnetpos}function inxsearch(b,g,r){var a,p,dist;var bestd=1e3;var best=-1;var i=netindex[g];var j=i-1;while(i<netsize||j>=0){if(i<netsize){p=network[i];dist=p[1]-g;if(dist>=bestd)i=netsize;else{i++;if(dist<0)dist=-dist;a=p[0]-b;if(a<0)a=-a;dist+=a;if(dist<bestd){a=p[2]-r;if(a<0)a=-a;dist+=a;if(dist<bestd){bestd=dist;best=p[3]}}}}if(j>=0){p=network[j];dist=g-p[1];if(dist>=bestd)j=-1;else{j--;if(dist<0)dist=-dist;a=p[0]-b;if(a<0)a=-a;dist+=a;if(dist<bestd){a=p[2]-r;if(a<0)a=-a;dist+=a;if(dist<bestd){bestd=dist;best=p[3]}}}}}return best}function learn(){var i;var lengthcount=pixels.length;var alphadec=30+(samplefac-1)/3;var samplepixels=lengthcount/(3*samplefac);var delta=~~(samplepixels/ncycles);var alpha=initalpha;var radius=initradius;var rad=radius>>radiusbiasshift;if(rad<=1)rad=0;for(i=0;i<rad;i++)radpower[i]=alpha*((rad*rad-i*i)*radbias/(rad*rad));var step;if(lengthcount<minpicturebytes){samplefac=1;step=3}else if(lengthcount%prime1!==0){step=3*prime1}else if(lengthcount%prime2!==0){step=3*prime2}else if(lengthcount%prime3!==0){step=3*prime3}else{step=3*prime4}var b,g,r,j;var pix=0;i=0;while(i<samplepixels){b=(pixels[pix]&255)<<netbiasshift;g=(pixels[pix+1]&255)<<netbiasshift;r=(pixels[pix+2]&255)<<netbiasshift;j=contest(b,g,r);altersingle(alpha,j,b,g,r);if(rad!==0)alterneigh(rad,j,b,g,r);pix+=step;if(pix>=lengthcount)pix-=lengthcount;i++;if(delta===0)delta=1;if(i%delta===0){alpha-=alpha/alphadec;radius-=radius/radiusdec;rad=radius>>radiusbiasshift;if(rad<=1)rad=0;for(j=0;j<rad;j++)radpower[j]=alpha*((rad*rad-j*j)*radbias/(rad*rad))}}}function buildColormap(){init();learn();unbiasnet();inxbuild()}this.buildColormap=buildColormap;function getColormap(){var map=[];var index=[];for(var i=0;i<netsize;i++)index[network[i][3]]=i;var k=0;for(var l=0;l<netsize;l++){var j=index[l];map[k++]=network[j][0];map[k++]=network[j][1];map[k++]=network[j][2]}return map}this.getColormap=getColormap;this.lookupRGB=inxsearch}module.exports=NeuQuant},{}],4:[function(require,module,exports){var GIFEncoder,renderFrame;GIFEncoder=require("./GIFEncoder.js");renderFrame=function(frame){var encoder,page,stream,transfer;encoder=new GIFEncoder(frame.width,frame.height);if(frame.index===0){encoder.writeHeader()}else{encoder.firstFrame=false}encoder.setTransparent(frame.transparent);encoder.setRepeat(frame.repeat);encoder.setDelay(frame.delay);encoder.setQuality(frame.quality);encoder.setDither(frame.dither);encoder.setGlobalPalette(frame.globalPalette);encoder.addFrame(frame.data);if(frame.last){encoder.finish()}if(frame.globalPalette===true){frame.globalPalette=encoder.getGlobalPalette()}stream=encoder.stream();frame.data=stream.pages;frame.cursor=stream.cursor;frame.pageSize=stream.constructor.pageSize;if(frame.canTransfer){transfer=function(){var i,len,ref,results;ref=frame.data;results=[];for(i=0,len=ref.length;i<len;i++){page=ref[i];results.push(page.buffer)}return results}();return self.postMessage(frame,transfer)}else{return self.postMessage(frame)}};self.onmessage=function(event){return renderFrame(event.data)}},{"./GIFEncoder.js":1}]},{},[4]);