| /* 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 |