blob: 7f0694d06c9d681a7da848e7d95805d39fbc3647 [file] [log] [blame]
/* eslint-disable */
// gif.js 0.2.0 - https://github.com/jnordberg/gif.js
(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.fillStyle = 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)
});
//# sourceMappingURL=gif.js.map