PageSourceSearch

https://www.magic3d.io/libs/gif.js/gif.js

js magic3d.io collected 2026-10-07 18:42:55 UTC 24,352 bytes, 667 lines download raw bytes

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.