vendor: 5,566 bytes, lines 1-156
1// gif.js 0.2.0 - https://github.com/jnordberg/gif.js 2(function (f) { 3 if (typeof exports === 'object' && typeof module !== 'undefined') { 4 module.exports = f(); 5 } else if (typeof define === 'function' && define.amd) { 6 define([], f); 7 } else { 8 var g; 9 if (typeof window !== 'undefined') { 10 g = window; 11 } else if (typeof global !== 'undefined') { 12 g = global; 13 } else if (typeof self !== 'undefined') { 14 g = self; 15 } else { 16 g = this; 17 } 18 g.GIF = f(); 19 } 20})(() => { 21 var define, module, exports; 22 return (function e(t, n, r) { 23 function s(o, u) { 24 if (!n[o]) { 25 if (!t[o]) { 26 var a = typeof require == 'function' && require; 27 if (!u && a) return a(o, !0); 28 if (i) return i(o, !0); 29 var f = new Error("Cannot find module '" + o + "'"); 30 throw ((f.code = 'MODULE_NOT_FOUND'), f); 31 } 32 var l = (n[o] = { exports: {} }); 33 t[o][0].call( 34 l.exports, 35 (e) => { 36 var n = t[o][1][e]; 37 return s(n ? n : e); 38 }, 39 l, 40 l.exports, 41 e, 42 t, 43 n, 44 r 45 ); 46 } 47 return n[o].exports; 48 } 49 var i = typeof require == 'function' && require; 50 for (var o = 0; o < r.length; o++) s(r[o]); 51 return s; 52 })( 53 { 54 1: [ 55 (require, module, exports) => { 56 function EventEmitter() { 57 this._events = this._events || {}; 58 this._maxListeners = this._maxListeners || undefined; 59 } 60 module.exports = EventEmitter; 61 EventEmitter.EventEmitter = EventEmitter; 62 EventEmitter.prototype._events = undefined; 63 EventEmitter.prototype._maxListeners = undefined; 64 EventEmitter.defaultMaxListeners = 10; 65 EventEmitter.prototype.setMaxListeners = function (n) { 66 if (!isNumber(n) || n < 0 || isNaN(n)) 67 throw TypeError('n must be a positive number'); 68 this._maxListeners = n; 69 return this; 70 }; 71 EventEmitter.prototype.emit = function (type) { 72 var er, handler, len, args, i, listeners; 73 if (!this._events) this._events = {}; 74 if (type === 'error') { 75 if ( 76 !this._events.error || 77 (isObject(this._events.error) && !this._events.error.length) 78 ) { 79 er = arguments[1]; 80 if (er instanceof Error) { 81 throw er; 82 } else { 83 var err = new Error( 84 'Uncaught, unspecified "error" event. (' + er + ')' 85 ); 86 err.context = er; 87 throw err; 88 } 89 } 90 } 91 handler = this._events[type]; 92 if (isUndefined(handler)) return false; 93 if (isFunction(handler)) { 94 switch (arguments.length) { 95 case 1: 96 handler.call(this); 97 break; 98 case 2: 99 handler.call(this, arguments[1]); 100 break; 101 case 3: 102 handler.call(this, arguments[1], arguments[2]); 103 break; 104 default: 105 args = Array.prototype.slice.call(arguments, 1); 106 handler.apply(this, args); 107 } 108 } else if (isObject(handler)) { 109 args = Array.prototype.slice.call(arguments, 1); 110 listeners = handler.slice(); 111 len = listeners.length; 112 for (i = 0; i < len; i++) listeners[i].apply(this, args); 113 } 114 return true; 115 }; 116 EventEmitter.prototype.addListener = function (type, listener) { 117 var m; 118 if (!isFunction(listener)) 119 throw TypeError('listener must be a function'); 120 if (!this._events) this._events = {}; 121 if (this._events.newListener) 122 this.emit( 123 'newListener', 124 type, 125 isFunction(listener.listener) ? listener.listener : listener 126 ); 127 if (!this._events[type]) this._events[type] = listener; 128 else if (isObject(this._events[type])) 129 this._events[type].push(listener); 130 else this._events[type] = [this._events[type], listener]; 131 if (isObject(this._events[type]) && !this._events[type].warned) { 132 if (!isUndefined(this._maxListeners)) { 133 m = this._maxListeners; 134 } else { 135 m = EventEmitter.defaultMaxListeners; 136 } 137 if (m && m > 0 && this._events[type].length > m) { 138 this._events[type].warned = true; 139 console.error( 140 '(node) warning: possible EventEmitter memory ' + 141 'leak detected. %d listeners added. ' + 142 'Use emitter.setMaxListeners() to increase limit.', 143 this._events[type].length 144 ); 145 if (typeof console.trace === 'function') { 146 console.trace(); 147 } 148 } 149 } 150 return this; 151 }; 152 EventEmitter.prototype.on = EventEmitter.prototype.addListener; 153 EventEmitter.prototype.once = function (type, listener) { 154 if (!isFunction(listener)) 155 throw TypeError('listener must be a function'); 156 var fired = false;
157 function g() { 158 this.removeListener(type, g); 159 if (!fired) { 160 fired = true; 161 listener.apply(this, arguments); 162 } 163 } 164 g.listener = listener; 165 this.on(type, g); 166 return this; 167 }; 168 EventEmitter.prototype.removeListener = function (type, listener) { 169 var list, position, length, i; 170 if (!isFunction(listener)) 171 throw TypeError('listener must be a function'); 172 if (!this._events || !this._events[type]) return this; 173 list = this._events[type]; 174 length = list.length; 175 position = -1; 176 if ( 177 list === listener || 178 (isFunction(list.listener) && list.listener === listener) 179 ) { 180 delete this._events[type]; 181 if (this._events.removeListener) 182 this.emit('removeListener', type, listener); 183 } else if (isObject(list)) { 184 for (i = length; i-- > 0; ) { 185 if ( 186 list[i] === listener || 187 (list[i].listener && list[i].listener === listener) 188 ) { 189 position = i; 190 break; 191 } 192 } 193 if (position < 0) return this; 194 if (list.length === 1) { 195 list.length = 0; 196 delete this._events[type]; 197 } else { 198 list.splice(position, 1); 199 } 200 if (this._events.removeListener) 201 this.emit('removeListener', type, listener); 202 } 203 return this; 204 }; 205 EventEmitter.prototype.removeAllListeners = function (type) { 206 var key, listeners; 207 if (!this._events) return this; 208 if (!this._events.removeListener) { 209 if (arguments.length === 0) this._events = {}; 210 else if (this._events[type]) delete this._events[type]; 211 return this; 212 } 213 if (arguments.length === 0) { 214 for (key in this._events) { 215 if (key === 'removeListener') continue; 216 this.removeAllListeners(key); 217 } 218 this.removeAllListeners('removeListener'); 219 this._events = {}; 220 return this; 221 } 222 listeners = this._events[type]; 223 if (isFunction(listeners)) { 224 this.removeListener(type, listeners); 225 } else if (listeners) { 226 while (listeners.length) 227 this.removeListener(type, listeners[listeners.length - 1]); 228 } 229 delete this._events[type]; 230 return this; 231 }; 232 EventEmitter.prototype.listeners = function (type) { 233 var ret; 234 if (!this._events || !this._events[type]) ret = []; 235 else if (isFunction(this._events[type])) ret = [this._events[type]]; 236 else ret = this._events[type].slice(); 237 return ret; 238 }; 239 EventEmitter.prototype.listenerCount = function (type) { 240 if (this._events) { 241 var evlistener = this._events[type]; 242 if (isFunction(evlistener)) return 1; 243 else if (evlistener) return evlistener.length; 244 } 245 return 0; 246 }; 247 EventEmitter.listenerCount = (emitter, type) => 248 emitter.listenerCount(type); 249 function isFunction(arg) { 250 return typeof arg === 'function'; 251 } 252 function isNumber(arg) { 253 return typeof arg === 'number'; 254 } 255 function isObject(arg) { 256 return typeof arg === 'object' && arg !== null; 257 } 258 function isUndefined(arg) { 259 return arg === void 0; 260 } 261 }, 262 {}, 263 ], 264 2: [ 265 (require, module, exports) => { 266 var UA, browser, mode, platform, ua; 267 ua = navigator.userAgent.toLowerCase(); 268 platform = navigator.platform.toLowerCase(); 269 UA = ua.match( 270 /(opera|ie|firefox|chrome|version)[\s\/:]([\w\d\.]+)?.*?(safari|version[\s\/:]([\w\d\.]+)|$)/ 271 ) || [null, 'unknown', 0]; 272 mode = UA[1] === 'ie' && document.documentMode; 273 browser = { 274 name: UA[1] === 'version' ? UA[3] : UA[1], 275 version: 276 mode || 277 Number.parseFloat(UA[1] === 'opera' && UA[4] ? UA[4] : UA[2]), 278 platform: { 279 name: ua.match(/ip(?:ad|od|hone)/) 280 ? 'ios' 281 : (ua.match(/(?:webos|android)/) || 282 platform.match(/mac|win|linux/) || ['other'])[0], 283 }, 284 }; 285 browser[browser.name] = true; 286 browser[browser.name + Number.parseInt(browser.version, 10)] = true; 287 browser.platform[browser.platform.name] = true; 288 module.exports = browser; 289 }, 290 {}, 291 ], 292 3: [
293 (require, module, exports) => { 294 var EventEmitter, 295 GIF, 296 browser, 297 extend = (child, parent) => { 298 for (var key in parent) { 299 if (hasProp.call(parent, key)) child[key] = parent[key]; 300 } 301 function ctor() { 302 this.constructor = child; 303 } 304 ctor.prototype = parent.prototype; 305 child.prototype = new ctor(); 306 child.__super__ = parent.prototype; 307 return child; 308 }, 309 hasProp = {}.hasOwnProperty, 310 indexOf = 311 [].indexOf || 312 function (item) { 313 for (var i = 0, l = this.length; i < l; i++) { 314 if (i in this && this[i] === item) return i; 315 } 316 return -1; 317 }, 318 slice = [].slice; 319 EventEmitter = require('events').EventEmitter; 320 browser = require('./browser.coffee'); 321 GIF = ((superClass) => { 322 var defaults, frameDefaults; 323 extend(GIF, superClass); 324 defaults = { 325 workerScript: 'gif.worker.js', 326 workers: 2, 327 repeat: 0, 328 background: '#fff', 329 quality: 10, 330 width: null, 331 height: null, 332 transparent: null, 333 debug: false, 334 dither: false, 335 }; 336 frameDefaults = { delay: 500, copy: false }; 337 function GIF(options) { 338 var base, key, value; 339 this.running = false; 340 this.options = {}; 341 this.frames = []; 342 this.freeWorkers = []; 343 this.activeWorkers = []; 344 this.setOptions(options); 345 for (key in defaults) { 346 value = defaults[key]; 347 if ((base = this.options)[key] == null) { 348 base[key] = value; 349 } 350 } 351 } 352 GIF.prototype.setOption = function (key, value) { 353 this.options[key] = value; 354 if ( 355 this._canvas != null && 356 (key === 'width' || key === 'height') 357 ) { 358 return (this._canvas[key] = value); 359 } 360 }; 361 GIF.prototype.setOptions = function (options) { 362 var key, results, value; 363 results = []; 364 for (key in options) { 365 if (!hasProp.call(options, key)) continue; 366 value = options[key]; 367 results.push(this.setOption(key, value)); 368 } 369 return results; 370 }; 371 GIF.prototype.addFrame = function (image, options) { 372 var frame, key; 373 if (options == null) { 374 options = {}; 375 } 376 frame = {}; 377 frame.transparent = this.options.transparent; 378 for (key in frameDefaults) { 379 frame[key] = options[key] || frameDefaults[key]; 380 } 381 if (this.options.width == null) { 382 this.setOption('width', image.width); 383 } 384 if (this.options.height == null) { 385 this.setOption('height', image.height); 386 } 387 if ( 388 typeof ImageData !== 'undefined' && 389 ImageData !== null && 390 image instanceof ImageData 391 ) { 392 frame.data = image.data; 393 } else if ( 394 (typeof CanvasRenderingContext2D !== 'undefined' && 395 CanvasRenderingContext2D !== null && 396 image instanceof CanvasRenderingContext2D) || 397 (typeof WebGLRenderingContext !== 'undefined' && 398 WebGLRenderingContext !== null && 399 image instanceof WebGLRenderingContext) 400 ) { 401 if (options.copy) { 402 frame.data = this.getContextData(image); 403 } else { 404 frame.context = image; 405 } 406 } else if (image.childNodes != null) { 407 if (options.copy) { 408 frame.data = this.getImageData(image); 409 } else { 410 frame.image = image; 411 } 412 } else { 413 throw new Error('Invalid image'); 414 } 415 return this.frames.push(frame); 416 }; 417 GIF.prototype.render = function () { 418 var i, j, numWorkers, ref; 419 if (this.running) { 420 throw new Error('Already running'); 421 } 422 if (this.options.width == null || this.options.height == null) { 423 throw new Error( 424 'Width and height must be set prior to rendering' 425 ); 426 } 427 this.running = true; 428 this.nextFrame = 0; 429 this.finishedFrames = 0; 430 this.imageParts = function () { 431 var j, ref, results; 432 results = []; 433 for ( 434 i = j = 0, ref = this.frames.length; 435 0 <= ref ? j < ref : j > ref; 436 i = 0 <= ref ? ++j : --j 437 ) { 438 results.push(null); 439 } 440 return results; 441 }.call(this); 442 numWorkers = this.spawnWorkers(); 443 if (this.options.globalPalette === true) { 444 this.renderNextFrame(); 445 } else { 446 for ( 447 i = j = 0, ref = numWorkers; 448 0 <= ref ? j < ref : j > ref; 449 i = 0 <= ref ? ++j : --j 450 ) { 451 this.renderNextFrame(); 452 } 453 }
454 this.emit('start'); 455 return this.emit('progress', 0); 456 }; 457 GIF.prototype.abort = function () { 458 var worker; 459 while (true) { 460 worker = this.activeWorkers.shift(); 461 if (worker == null) { 462 break; 463 } 464 this.log('killing active worker'); 465 worker.terminate(); 466 } 467 this.running = false; 468 return this.emit('abort'); 469 }; 470 GIF.prototype.spawnWorkers = function () { 471 var j, numWorkers, ref, results; 472 numWorkers = Math.min(this.options.workers, this.frames.length); 473 (function () { 474 results = []; 475 for ( 476 var j = (ref = this.freeWorkers.length); 477 ref <= numWorkers ? j < numWorkers : j > numWorkers; 478 ref <= numWorkers ? j++ : j-- 479 ) { 480 results.push(j); 481 } 482 return results; 483 }) 484 .apply(this) 485 .forEach( 486 ((_this) => (i) => { 487 var worker; 488 _this.log('spawning worker ' + i); 489 worker = new Worker(_this.options.workerScript); 490 worker.onmessage = (event) => { 491 _this.activeWorkers.splice( 492 _this.activeWorkers.indexOf(worker), 493 1 494 ); 495 _this.freeWorkers.push(worker); 496 return _this.frameFinished(event.data); 497 }; 498 return _this.freeWorkers.push(worker); 499 })(this) 500 ); 501 return numWorkers; 502 }; 503 GIF.prototype.frameFinished = function (frame) { 504 var i, j, ref; 505 this.log( 506 'frame ' + 507 frame.index + 508 ' finished - ' + 509 this.activeWorkers.length + 510 ' active' 511 ); 512 this.finishedFrames++; 513 this.emit('progress', this.finishedFrames / this.frames.length); 514 this.imageParts[frame.index] = frame; 515 if (this.options.globalPalette === true) { 516 this.options.globalPalette = frame.globalPalette; 517 this.log('global palette analyzed'); 518 if (this.frames.length > 2) { 519 for ( 520 i = j = 1, ref = this.freeWorkers.length; 521 1 <= ref ? j < ref : j > ref; 522 i = 1 <= ref ? ++j : --j 523 ) { 524 this.renderNextFrame(); 525 } 526 } 527 } 528 if (indexOf.call(this.imageParts, null) >= 0) { 529 return this.renderNextFrame(); 530 } else { 531 return this.finishRendering(); 532 } 533 }; 534 GIF.prototype.finishRendering = function () { 535 var data, 536 frame, 537 i, 538 image, 539 j, 540 k, 541 l, 542 len, 543 len1, 544 len2, 545 len3, 546 offset, 547 page, 548 ref, 549 ref1, 550 ref2; 551 len = 0; 552 ref = this.imageParts; 553 for (j = 0, len1 = ref.length; j < len1; j++) { 554 frame = ref[j]; 555 len += (frame.data.length - 1) * frame.pageSize + frame.cursor; 556 } 557 len += frame.pageSize - frame.cursor; 558 this.log( 559 'rendering finished - filesize ' + Math.round(len / 1e3) + 'kb' 560 ); 561 data = new Uint8Array(len); 562 offset = 0; 563 ref1 = this.imageParts; 564 for (k = 0, len2 = ref1.length; k < len2; k++) { 565 frame = ref1[k]; 566 ref2 = frame.data; 567 for (i = l = 0, len3 = ref2.length; l < len3; i = ++l) {
568 page = ref2[i]; 569 data.set(page, offset); 570 if (i === frame.data.length - 1) { 571 offset += frame.cursor; 572 } else { 573 offset += frame.pageSize; 574 } 575 } 576 } 577 image = new Blob([data], { type: 'image/gif' }); 578 return this.emit('finished', image, data); 579 }; 580 GIF.prototype.renderNextFrame = function () { 581 var frame, task, worker; 582 if (this.freeWorkers.length === 0) { 583 throw new Error('No free workers'); 584 } 585 if (this.nextFrame >= this.frames.length) { 586 return; 587 } 588 frame = this.frames[this.nextFrame++]; 589 worker = this.freeWorkers.shift(); 590 task = this.getTask(frame); 591 this.log( 592 'starting frame ' + 593 (task.index + 1) + 594 ' of ' + 595 this.frames.length 596 ); 597 this.activeWorkers.push(worker); 598 return worker.postMessage(task); 599 }; 600 GIF.prototype.getContextData = function (ctx) { 601 return ctx.getImageData( 602 0, 603 0, 604 this.options.width, 605 this.options.height 606 ).data; 607 }; 608 GIF.prototype.getImageData = function (image) { 609 var ctx; 610 if (this._canvas == null) { 611 this._canvas = document.createElement('canvas'); 612 this._canvas.width = this.options.width; 613 this._canvas.height = this.options.height; 614 } 615 ctx = this._canvas.getContext('2d'); 616 ctx.setFill = this.options.background; 617 ctx.fillRect(0, 0, this.options.width, this.options.height); 618 ctx.drawImage(image, 0, 0); 619 return this.getContextData(ctx); 620 }; 621 GIF.prototype.getTask = function (frame) { 622 var index, task; 623 index = this.frames.indexOf(frame); 624 task = { 625 index: index, 626 last: index === this.frames.length - 1, 627 delay: frame.delay, 628 transparent: frame.transparent, 629 width: this.options.width, 630 height: this.options.height, 631 quality: this.options.quality, 632 dither: this.options.dither, 633 globalPalette: this.options.globalPalette, 634 repeat: this.options.repeat, 635 canTransfer: browser.name === 'chrome', 636 }; 637 if (frame.data != null) { 638 task.data = frame.data; 639 } else if (frame.context != null) { 640 task.data = this.getContextData(frame.context); 641 } else if (frame.image != null) { 642 task.data = this.getImageData(frame.image); 643 } else { 644 throw new Error('Invalid frame'); 645 } 646 return task; 647 }; 648 GIF.prototype.log = function () { 649 var args; 650 args = 1 <= arguments.length ? slice.call(arguments, 0) : []; 651 if (!this.options.debug) { 652 return; 653 } 654 return console.log.apply(console, args); 655 }; 656 return GIF; 657 })(EventEmitter); 658 module.exports = GIF; 659 }, 660 { './browser.coffee': 2, events: 1 }, 661 ], 662 }, 663 {}, 664 [3] 665 )(3); 666}); 667//# sourceMappingURL=gif.js.map
Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.