in src/core/lib/gif.js [30:98]
function a(d) {
var a, b;this.running = !1, this.options = {}, this.frames = [], this.freeWorkers = [], this.activeWorkers = [], this.setOptions(d);for (a in c) {
b = c[a], null != this.options[a] ? this.options[a] : this.options[a] = b;
}
}return i(a, d), c = { workerScript: 'gif.worker.js', workers: 2, repeat: 0, background: '#fff', quality: 10, width: null, height: null, transparent: null }, b = { delay: 500, copy: !1 }, a.prototype.setOption = function (a, b) {
return this.options[a] = b, null != this._canvas && (a === 'width' || a === 'height') ? this._canvas[a] = b : void 0;
}, a.prototype.setOptions = function (b) {
var a, c;return function (d) {
for (a in b) {
if (!g(b, a)) continue;c = b[a], d.push(this.setOption(a, c));
}return d;
}.call(this, []);
}, a.prototype.addFrame = function (a, d) {
var c, e;null == d && (d = {}), c = {}, c.transparent = this.options.transparent;for (e in b) {
c[e] = d[e] || b[e];
}if (null != this.options.width || this.setOption('width', a.width), null != this.options.height || this.setOption('height', a.height), 'undefined' !== typeof ImageData && null != ImageData && a instanceof ImageData) c.data = a.data;else if ('undefined' !== typeof CanvasRenderingContext2D && null != CanvasRenderingContext2D && a instanceof CanvasRenderingContext2D || 'undefined' !== typeof WebGLRenderingContext && null != WebGLRenderingContext && a instanceof WebGLRenderingContext) d.copy ? c.data = this.getContextData(a) : c.context = a;else if (null != a.childNodes) d.copy ? c.data = this.getImageData(a) : c.image = a;else throw new Error('Invalid image');return this.frames.push(c);
}, a.prototype.render = function () {
var d, a;if (this.running) throw new Error('Already running');if (!(null != this.options.width && null != this.options.height)) throw new Error('Width and height must be set prior to rendering');this.running = !0, this.nextFrame = 0, this.finishedFrames = 0, this.imageParts = function (c) {
for (var b = function () {
var b;b = [];for (var a = 0; 0 <= this.frames.length ? a < this.frames.length : a > this.frames.length; 0 <= this.frames.length ? ++a : --a) {
b.push(a);
}return b;
}.apply(this, arguments), a = 0, e = b.length; a < e; ++a) {
d = b[a], c.push(null);
}return c;
}.call(this, []), a = this.spawnWorkers();for (var c = function () {
var c;c = [];for (var b = 0; 0 <= a ? b < a : b > a; 0 <= a ? ++b : --b) {
c.push(b);
}return c;
}.apply(this, arguments), b = 0, e = c.length; b < e; ++b) {
d = c[b], this.renderNextFrame();
}return this.emit('start'), this.emit('progress', 0);
}, a.prototype.abort = function () {
var a;while (!0) {
if (a = this.activeWorkers.shift(), !(null != a)) break;console.log('killing active worker'), a.terminate();
}return this.running = !1, this.emit('abort');
}, a.prototype.spawnWorkers = function () {
var a;return a = Math.min(this.options.workers, this.frames.length), function () {
var c;c = [];for (var b = this.freeWorkers.length; this.freeWorkers.length <= a ? b < a : b > a; this.freeWorkers.length <= a ? ++b : --b) {
c.push(b);
}return c;
}.apply(this, arguments).forEach(function (a) {
return function (c) {
var b;return console.log('spawning worker ' + c), b = new Worker(a.options.workerScript), b.onmessage = function (a) {
return function (c) {
return a.activeWorkers.splice(a.activeWorkers.indexOf(b), 1), a.freeWorkers.push(b), a.frameFinished(c.data);
};
}(a), a.freeWorkers.push(b);
};
}(this)), a;
}, a.prototype.frameFinished = function (a) {
return console.log('frame ' + a.index + ' finished - ' + this.activeWorkers.length + ' active'), this.finishedFrames++, this.emit('progress', this.finishedFrames / this.frames.length), this.imageParts[a.index] = a, j(null, this.imageParts) ? this.renderNextFrame() : this.finishRendering();
}, a.prototype.finishRendering = function () {
var e, a, k, m, b, d, h;b = 0;for (var f = 0, j = this.imageParts.length; f < j; ++f) {
a = this.imageParts[f], b += (a.data.length - 1) * a.pageSize + a.cursor;
}b += a.pageSize - a.cursor, console.log('rendering finished - filesize ' + Math.round(b / 1e3) + 'kb'), e = new Uint8Array(b), d = 0;for (var g = 0, l = this.imageParts.length; g < l; ++g) {
a = this.imageParts[g];for (var c = 0, i = a.data.length; c < i; ++c) {
h = a.data[c], k = c, e.set(h, d), k === a.data.length - 1 ? d += a.cursor : d += a.pageSize;
}
}return m = new Blob([e], { type: 'image/gif' }), this.emit('finished', m, e);
}, a.prototype.renderNextFrame = function () {
var c, a, b;if (this.freeWorkers.length === 0) throw new Error('No free workers');return this.nextFrame >= this.frames.length ? void 0 : (c = this.frames[this.nextFrame++], b = this.freeWorkers.shift(), a = this.getTask(c), console.log('starting frame ' + (a.index + 1) + ' of ' + this.frames.length), this.activeWorkers.push(b), b.postMessage(a));
}, a.prototype.getContextData = function (a) {
return a.getImageData(0, 0, this.options.width, this.options.height).data;
}, a.prototype.getImageData = function (b) {
var a;return null != this._canvas || (this._canvas = document.createElement('canvas'), this._canvas.width = this.options.width, this._canvas.height = this.options.height), a = this._canvas.getContext('2d'), a.setFill = this.options.background, a.fillRect(0, 0, this.options.width, this.options.height), a.drawImage(b, 0, 0), this.getContextData(a);
}, a.prototype.getTask = function (a) {
var c, b;if (c = this.frames.indexOf(a), b = { index: c, last: c === this.frames.length - 1, delay: a.delay, transparent: a.transparent, width: this.options.width, height: this.options.height, quality: this.options.quality, repeat: this.options.repeat, canTransfer: h.name === 'chrome' }, null != a.data) b.data = a.data;else if (null != a.context) b.data = this.getContextData(a.context);else if (null != a.image) b.data = this.getImageData(a.image);else throw new Error('Invalid frame');return b;
}, a;