| /* eslint-disable */ |
| // gif.worker.js 0.2.0 - https://github.com/jnordberg/gif.js |
| (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]); |
| //# sourceMappingURL=gif.worker.js.map |