gif.js

gif.js from https://github.com/jnordberg/gif.js

目前为 2014-07-02 提交的版本。查看 最新版本

此脚本不应直接安装,它是一个供其他脚本使用的外部库。如果您需要使用该库,请在脚本元属性加入:// @require https://update.gf.qytechs.cn/scripts/2963/8459/gifjs.js

  1. // ==UserScript==
  2. // @name gif.js
  3. // @namespace http://mfish.twbbs.org/
  4. // @version 0.1.6
  5. // @grant none
  6. // ==/UserScript==
  7.  
  8. /**
  9. *
  10. * I didn't create this, just modified it to allow it running in userscript.
  11. * Auther : https://github.com/jnordberg/gif.js
  12. *
  13. */
  14.  
  15. var GIF_worker_URL = (function () {
  16. var workerScript = "(function(b){function a(b,d){if({}.hasOwnProperty.call(a.cache,b))return a.cache[b];var e=a.resolve(b);if(!e)throw new Error('Failed to resolve module '+b);var c={id:b,require:a,filename:b,exports:{},loaded:!1,parent:d,children:[]};d&&d.children.push(c);var f=b.slice(0,b.lastIndexOf('/')+1);return a.cache[b]=c.exports,e.call(c.exports,c,c.exports,f,b),c.loaded=!0,a.cache[b]=c.exports}a.modules={},a.cache={},a.resolve=function(b){return{}.hasOwnProperty.call(a.modules,b)?a.modules[b]:void 0},a.define=function(b,c){a.modules[b]=c},a.define('/gif.worker.coffee',function(d,e,f,g){var b,c;b=a('/GIFEncoder.js',d),c=function(a){var c,e,d,f;return c=new b(a.width,a.height),a.index===0?c.writeHeader():c.firstFrame=!1,c.setTransparent(a.transparent),c.setRepeat(a.repeat),c.setDelay(a.delay),c.setQuality(a.quality),c.setDither(a.dither),c.setGlobalPalette(a.globalPalette),c.addFrame(a.data),a.last&&c.finish(),a.globalPalette===!0&&(a.globalPalette=c.getGlobalPalette()),d=c.stream(),a.data=d.pages,a.cursor=d.cursor,a.pageSize=d.constructor.pageSize,a.canTransfer?(f=function(c){for(var b=0,d=a.data.length;b<d;++b)e=a.data[b],c.push(e.buffer);return c}.call(this,[]),self.postMessage(a,f)):self.postMessage(a)},self.onmessage=function(a){return c(a.data)}}),a.define('/GIFEncoder.js',function(e,h,i,j){function c(){this.page=-1,this.pages=[],this.newPage()}function b(a,b){this.width=~~a,this.height=~~b,this.transparent=null,this.transIndex=0,this.repeat=-1,this.delay=0,this.image=null,this.pixels=null,this.indexedPixels=null,this.colorDepth=null,this.colorTab=null,this.usedEntry=new Array,this.palSize=7,this.dispose=-1,this.firstFrame=!0,this.sample=10,this.dither=!1,this.globalPalette=!1,this.out=new c}var f=a('/TypedNeuQuant.js',e),g=a('/LZWEncoder.js',e);c.pageSize=4096,c.charMap={};for(var d=0;d<256;d++)c.charMap[d]=String.fromCharCode(d);c.prototype.newPage=function(){this.pages[++this.page]=new Uint8Array(c.pageSize),this.cursor=0},c.prototype.getData=function(){var d='';for(var a=0;a<this.pages.length;a++)for(var b=0;b<c.pageSize;b++)d+=c.charMap[this.pages[a][b]];return d},c.prototype.writeByte=function(a){this.cursor>=c.pageSize&&this.newPage(),this.pages[this.page][this.cursor++]=a},c.prototype.writeUTFBytes=function(b){for(var c=b.length,a=0;a<c;a++)this.writeByte(b.charCodeAt(a))},c.prototype.writeBytes=function(b,d,e){for(var c=e||b.length,a=d||0;a<c;a++)this.writeByte(b[a])},b.prototype.setDelay=function(a){this.delay=Math.round(a/10)},b.prototype.setFrameRate=function(a){this.delay=Math.round(100/a)},b.prototype.setDispose=function(a){a>=0&&(this.dispose=a)},b.prototype.setRepeat=function(a){this.repeat=a},b.prototype.setTransparent=function(a){this.transparent=a},b.prototype.addFrame=function(a){this.image=a,this.colorTab=this.globalPalette.slice?this.globalPalette:null,this.getImagePixels(),this.analyzePixels(),this.globalPalette===!0&&(this.globalPalette=this.colorTab),this.firstFrame&&(this.writeLSD(),this.writePalette(),this.repeat>=0&&this.writeNetscapeExt()),this.writeGraphicCtrlExt(),this.writeImageDesc(),this.firstFrame||this.globalPalette||this.writePalette(),this.writePixels(),this.firstFrame=!1},b.prototype.finish=function(){this.out.writeByte(59)},b.prototype.setQuality=function(a){a<1&&(a=1),this.sample=a},b.prototype.setDither=function(a){a===!0&&(a='FloydSteinberg'),this.dither=a},b.prototype.setGlobalPalette=function(a){this.globalPalette=a},b.prototype.getGlobalPalette=function(){return this.globalPalette.slice&&this.globalPalette.slice(0)||this.globalPalette},b.prototype.writeHeader=function(){this.out.writeUTFBytes('GIF89a')},b.prototype.analyzePixels=function(){if(!this.colorTab){var a=new f(this.pixels,this.sample);a.buildColormap(),this.colorTab=a.getColormap()}this.dither?this.ditherPixels(this.dither.replace('-serpentine',''),this.dither.match(/-serpentine/)!==null):this.indexPixels(),this.pixels=null,this.colorDepth=8,this.palSize=7,this.transparent!==null&&(this.transIndex=this.findClosest(this.transparent,!0))},b.prototype.indexPixels=function(e){var c=this.pixels.length/3;this.indexedPixels=new Uint8Array(c);var a=0;for(var b=0;b<c;b++){var d=this.findClosestRGB(this.pixels[a++]&255,this.pixels[a++]&255,this.pixels[a++]&255);this.usedEntry[d]=!0,this.indexedPixels[b]=d}},b.prototype.ditherPixels=function(l,A){var o={FalseFloydSteinberg:[[.375,1,0],[.375,0,1],[.25,1,1]],FloydSteinberg:[[.4375,1,0],[.1875,-1,1],[.3125,0,1],[.0625,1,1]],Stucki:[[.19047619047619047,1,0],[.09523809523809523,2,0],[.047619047619047616,-2,1],[.09523809523809523,-1,1],[.19047619047619047,0,1],[.09523809523809523,1,1],[.047619047619047616,2,1],[.023809523809523808,-2,2],[.047619047619047616,-1,2],[.09523809523809523,0,2],[.047619047619047616,1,2],[.023809523809523808,2,2]],Atkinson:[[.125,1,0],[.125,2,0],[.125,-1,1],[.125,0,1],[.125,1,1],[.125,0,2]]};if(!(l&&o[l]))throw'Unknown dithering kernel: '+l;var f=o[l],i=0,r=this.height,e=this.width,b=this.pixels,c=A?-1:1;this.indexedPixels=new Uint8Array(this.pixels.length/3);for(var h=0;h<r;h++){A&&(c*=-1);for(var g=c==1?0:e-1,z=c==1?e:0;g!==z;g+=c){i=h*e+g;var a=i*3,n=b[a],p=b[a+1],q=b[a+2];a=this.findClosestRGB(n,p,q),this.usedEntry[a]=!0,this.indexedPixels[i]=a,a*=3;var x=this.colorTab[a],s=this.colorTab[a+1],t=this.colorTab[a+2],u=n-x,v=p-s,w=q-t;for(var d=c==1?0:f.length-1,y=c==1?f.length:0;d!==y;d+=c){var k=f[d][1],j=f[d][2];if(k+g>=0&&k+g<e&&j+h>=0&&j+h<r){var m=f[d][0];a=i+k+j*e,a*=3,b[a]=Math.max(0,Math.min(255,b[a]+u*m)),b[a+1]=Math.max(0,Math.min(255,b[a+1]+v*m)),b[a+2]=Math.max(0,Math.min(255,b[a+2]+w*m))}}}}},b.prototype.findClosest=function(a,b){return this.findClosestRGB((a&16711680)>>16,(a&65280)>>8,a&255,b)},b.prototype.findClosestRGB=function(j,l,k,n){if(this.colorTab===null)return-1;var m=k|l<<8|j<<16,g=0,b=16777216,i=this.colorTab.length;for(var a=0;a<i;){var f=j-(this.colorTab[a++]&255),e=l-(this.colorTab[a++]&255),d=k-(this.colorTab[a]&255),c=f*f+e*e+d*d,h=parseInt(a/3);(!n||this.usedEntry[h])&&c<b&&(b=c,g=h),a++}return g},b.prototype.getImagePixels=function(){var a=this.width,g=this.height;this.pixels=new Uint8Array(a*g*3);var b=this.image,c=0;for(var d=0;d<g;d++)for(var e=0;e<a;e++){var f=d*a*4+e*4;this.pixels[c++]=b[f],this.pixels[c++]=b[f+1],this.pixels[c++]=b[f+2]}},b.prototype.writeGraphicCtrlExt=function(){this.out.writeByte(33),this.out.writeByte(249),this.out.writeByte(4);var b,a;this.transparent===null?(b=0,a=0):(b=1,a=2),this.dispose>=0&&(a=dispose&7),a<<=2,this.out.writeByte(0|a|0|b),this.writeShort(this.delay),this.out.writeByte(this.transIndex),this.out.writeByte(0)},b.prototype.writeImageDesc=function(){this.out.writeByte(44),this.writeShort(0),this.writeShort(0),this.writeShort(this.width),this.writeShort(this.height),this.firstFrame||this.globalPalette?this.out.writeByte(0):this.out.writeByte(128|this.palSize)},b.prototype.writeLSD=function(){this.writeShort(this.width),this.writeShort(this.height),this.out.writeByte(240|this.palSize),this.out.writeByte(0),this.out.writeByte(0)},b.prototype.writeNetscapeExt=function(){this.out.writeByte(33),this.out.writeByte(255),this.out.writeByte(11),this.out.writeUTFBytes('NETSCAPE2.0'),this.out.writeByte(3),this.out.writeByte(1),this.writeShort(this.repeat),this.out.writeByte(0)},b.prototype.writePalette=function(){this.out.writeBytes(this.colorTab);var b=768-this.colorTab.length;for(var a=0;a<b;a++)this.out.writeByte(0)},b.prototype.writeShort=function(a){this.out.writeByte(a&255),this.out.writeByte(a>>8&255)},b.prototype.writePixels=function(){var a=new g(this.width,this.height,this.indexedPixels,this.colorDepth);a.encode(this.out)},b.prototype.stream=function(){return this.out},e.exports=b}),a.define('/LZWEncoder.js',function(e,g,h,i){function f(y,D,C,B){function w(a,b){r[f++]=a,f>=254&&t(b)}function x(b){u(a),k=i+2,j=!0,l(i,b)}function u(b){for(var a=0;a<b;++a)h[a]=-1}function A(z,r){var g,t,d,e,y,w,s;for(q=z,j=!1,n_bits=q,m=p(n_bits),i=1<<z-1,o=i+1,k=i+2,f=0,e=v(),s=0,g=a;g<65536;g*=2)++s;s=8-s,w=a,u(w),l(i,r);a:while((t=v())!=c){if(g=(t<<b)+e,d=t<<s^e,h[d]===g){e=n[d];continue}if(h[d]>=0){y=w-d,d===0&&(y=1);do if((d-=y)<0&&(d+=w),h[d]===g){e=n[d];continue a}while(h[d]>=0)}l(e,r),e=t,k<1<<b?(n[d]=k++,h[d]=g):x(r)}l(e,r),l(o,r)}function z(a){a.writeByte(s),remaining=y*D,curPixel=0,A(s+1,a),a.writeByte(0)}function t(a){f>0&&(a.writeByte(f),a.writeBytes(r,0,f),f=0)}function p(a){return(1<<a)-1}function v(){if(remaining===0)return c;--remaining;var a=C[curPixel++];return a&255}function l(a,c){g&=d[e],e>0?g|=a<<e:g=a,e+=n_bits;while(e>=8)w(g&255,c),g>>=8,e-=8;if((k>m||j)&&(j?(m=p(n_bits=q),j=!1):(++n_bits,n_bits==b?m=1<<b:m=p(n_bits))),a==o){while(e>0)w(g&255,c),g>>=8,e-=8;t(c)}}var s=Math.max(2,B),r=new Uint8Array(256),h=new Int32Array(a),n=new Int32Array(a),g,e=0,f,k=0,m,j=!1,q,i,o;this.encode=z}var c=-1,b=12,a=5003,d=[0,1,3,7,15,31,63,127,255,511,1023,2047,4095,8191,16383,32767,65535];e.exports=f}),a.define('/TypedNeuQuant.js',function(A,F,E,D){function C(A,B){function I(){o=[],q=new Int32Array(256),t=new Int32Array(a),y=new Int32Array(a),z=new Int32Array(a>>3);var c,d;for(c=0;c<a;c++)d=(c<<b+8)/a,o[c]=new Float64Array([d,d,d,0]),y[c]=e/a,t[c]=0}function J(){for(var c=0;c<a;c++)o[c][0]>>=b,o[c][1]>>=b,o[c][2]>>=b,o[c][3]=c}function K(b,a,c,e,f){o[a][0]-=b*(o[a][0]-c)/d,o[a][1]-=b*(o[a][1]-e)/d,o[a][2]-=b*(o[a][2]-f)/d}function L(j,e,n,l,k){var h=Math.abs(e-j),i=Math.min(e+j,a),g=e+1,f=e-1,m=1,b,d;while(g<i||f>h)d=z[m++],g<i&&(b=o[g++],b[0]-=d*(b[0]-n)/c,b[1]-=d*(b[1]-l)/c,b[2]-=d*(b[2]-k)/c),f>h&&(b=o[f--],b[0]-=d*(b[0]-n)/c,b[1]-=d*(b[1]-l)/c,b[2]-=d*(b[2]-k)/c)}function C(p,s,q){var h=2147483647,k=h,d=-1,m=d,c,j,e,n,l;for(c=0;c<a;c++)j=o[c],e=Math.abs(j[0]-p)+Math.abs(j[1]-s)+Math.abs(j[2]-q),e<h&&(h=e,d=c),n=e-(t[c]>>i-b),n<k&&(k=n,m=c),l=y[c]>>g,y[c]-=l,t[c]+=l<<f;return y[d]+=x,t[d]-=r,m}function D(){var d,b,e,c,h,g,f=0,i=0;for(d=0;d<a;d++){for(e=o[d],h=d,g=e[1],b=d+1;b<a;b++)c=o[b],c[1]<g&&(h=b,g=c[1]);if(c=o[h],d!=h&&(b=c[0],c[0]=e[0],e[0]=b,b=c[1],c[1]=e[1],e[1]=b,b=c[2],c[2]=e[2],e[2]=b,b=c[3],c[3]=e[3],e[3]=b),g!=f){for(q[f]=i+d>>1,b=f+1;b<g;b++)q[b]=d;f=g,i=d}}for(q[f]=i+n>>1,b=f+1;b<256;b++)q[b]=n}function E(j,i,k){var b,d,c,e=1e3,h=-1,f=q[i],g=f-1;while(f<a||g>=0)f<a&&(d=o[f],c=d[1]-i,c>=e?f=a:(f++,c<0&&(c=-c),b=d[0]-j,b<0&&(b=-b),c+=b,c<e&&(b=d[2]-k,b<0&&(b=-b),c+=b,c<e&&(e=c,h=d[3])))),g>=0&&(d=o[g],c=i-d[1],c>=e?g=-1:(g--,c<0&&(c=-c),b=d[0]-j,b<0&&(b=-b),c+=b,c<e&&(b=d[2]-k,b<0&&(b=-b),c+=b,c<e&&(e=c,h=d[3]))));return h}function F(){var c,f=A.length,D=30+(B-1)/3,y=f/(3*B),q=~~(y/w),n=d,o=u,a=o>>h;for(a<=1&&(a=0),c=0;c<a;c++)z[c]=n*((a*a-c*c)*m/(a*a));var i;f<s?(B=1,i=3):f%l!==0?i=3*l:f%k!==0?i=3*k:f%p!==0?i=3*p:i=3*j;var r,t,x,e,g=0;c=0;while(c<y)if(r=(A[g]&255)<<b,t=(A[g+1]&255)<<b,x=(A[g+2]&255)<<b,e=C(r,t,x),K(n,e,r,t,x),a!==0&&L(a,e,r,t,x),g+=i,g>=f&&(g-=f),c++,q===0&&(q=1),c%q===0)for(n-=n/D,o-=o/v,a=o>>h,a<=1&&(a=0),e=0;e<a;e++)z[e]=n*((a*a-e*e)*m/(a*a))}function G(){I(),F(),J(),D()}function H(){var b=[],g=[];for(var c=0;c<a;c++)g[o[c][3]]=c;var d=0;for(var e=0;e<a;e++){var f=g[e];b[d++]=o[f][0],b[d++]=o[f][1],b[d++]=o[f][2]}return b}var o,q,t,y,z;this.buildColormap=G,this.getColormap=H,this.lookupRGB=E}var w=100,a=256,n=a-1,b=4,i=16,e=1<<i,f=10,B=1<<f,g=10,x=e>>g,r=e<<f-g,z=a>>3,h=6,t=1<<h,u=z*t,v=30,o=10,d=1<<o,q=8,m=1<<q,y=o+q,c=1<<y,l=499,k=491,p=487,j=503,s=3*j;A.exports=C}),a('/gif.worker.coffee')}.call(this,this))";
  17. function getUrl (blob) {
  18. return URL.createObjectURL(blob);
  19. }
  20. function createBlob (text, MIME) {
  21. var aFileParts = [text];
  22. var oMyBlob = new Blob(aFileParts, {type : MIME});
  23. return oMyBlob;
  24. }
  25. var workerURL = getUrl(createBlob(workerScript, 'application/x-javascript'));
  26. return workerURL;
  27. }());
  28. // Generated by CommonJS Everywhere 0.9.7
  29. (function (global) {
  30. function require(file, parentModule) {
  31. if ({}.hasOwnProperty.call(require.cache, file))
  32. return require.cache[file];
  33. var resolved = require.resolve(file);
  34. if (!resolved)
  35. throw new Error('Failed to resolve module ' + file);
  36. var module$ = {
  37. id: file,
  38. require: require,
  39. filename: file,
  40. exports: {},
  41. loaded: false,
  42. parent: parentModule,
  43. children: []
  44. };
  45. if (parentModule)
  46. parentModule.children.push(module$);
  47. var dirname = file.slice(0, file.lastIndexOf('/') + 1);
  48. require.cache[file] = module$.exports;
  49. resolved.call(module$.exports, module$, module$.exports, dirname, file);
  50. module$.loaded = true;
  51. return require.cache[file] = module$.exports;
  52. }
  53. require.modules = {};
  54. require.cache = {};
  55. require.resolve = function (file) {
  56. return {}.hasOwnProperty.call(require.modules, file) ? require.modules[file] : void 0;
  57. };
  58. require.define = function (file, fn) {
  59. require.modules[file] = fn;
  60. };
  61. var process = function () {
  62. var cwd = '/';
  63. return {
  64. title: 'browser',
  65. version: 'v0.10.26',
  66. browser: true,
  67. env: {},
  68. argv: [],
  69. nextTick: global.setImmediate || function (fn) {
  70. setTimeout(fn, 0);
  71. },
  72. cwd: function () {
  73. return cwd;
  74. },
  75. chdir: function (dir) {
  76. cwd = dir;
  77. }
  78. };
  79. }();
  80. require.define('/gif.coffee', function (module, exports, __dirname, __filename) {
  81. var browser, defaults, EventEmitter, frameDefaults, GIF;
  82. EventEmitter = require('events', module).EventEmitter;
  83. browser = require('/browser.coffee', module);
  84. GIF = function (super$) {
  85. extends$(GIF, super$);
  86. defaults = {
  87. workerScript: 'gif.worker.js',
  88. workers: 2,
  89. repeat: 0,
  90. background: '#fff',
  91. quality: 10,
  92. width: null,
  93. height: null,
  94. transparent: null
  95. };
  96. frameDefaults = {
  97. delay: 500,
  98. copy: false
  99. };
  100. function GIF(options) {
  101. var key, value;
  102. this.running = false;
  103. this.options = {};
  104. this.frames = [];
  105. this.freeWorkers = [];
  106. this.activeWorkers = [];
  107. this.setOptions(options);
  108. for (key in defaults) {
  109. value = defaults[key];
  110. if (null != this.options[key])
  111. this.options[key];
  112. else
  113. this.options[key] = value;
  114. }
  115. }
  116. GIF.prototype.setOption = function (key, value) {
  117. this.options[key] = value;
  118. if (null != this._canvas && (key === 'width' || key === 'height'))
  119. return this._canvas[key] = value;
  120. };
  121. GIF.prototype.setOptions = function (options) {
  122. var key, value;
  123. return function (accum$) {
  124. for (key in options) {
  125. if (!isOwn$(options, key))
  126. continue;
  127. value = options[key];
  128. accum$.push(this.setOption(key, value));
  129. }
  130. return accum$;
  131. }.call(this, []);
  132. };
  133. GIF.prototype.addFrame = function (image, options) {
  134. var frame, key;
  135. if (null == options)
  136. options = {};
  137. frame = {};
  138. frame.transparent = this.options.transparent;
  139. for (key in frameDefaults) {
  140. frame[key] = options[key] || frameDefaults[key];
  141. }
  142. if (!(null != this.options.width))
  143. this.setOption('width', image.width);
  144. if (!(null != this.options.height))
  145. this.setOption('height', image.height);
  146. if ('undefined' !== typeof ImageData && null != ImageData && image instanceof ImageData) {
  147. frame.data = image.data;
  148. } else if ('undefined' !== typeof CanvasRenderingContext2D && null != CanvasRenderingContext2D && image instanceof CanvasRenderingContext2D || 'undefined' !== typeof WebGLRenderingContext && null != WebGLRenderingContext && image instanceof WebGLRenderingContext) {
  149. if (options.copy) {
  150. frame.data = this.getContextData(image);
  151. } else {
  152. frame.context = image;
  153. }
  154. } else if (null != image.childNodes) {
  155. if (options.copy) {
  156. frame.data = this.getImageData(image);
  157. } else {
  158. frame.image = image;
  159. }
  160. } else {
  161. throw new Error('Invalid image');
  162. }
  163. return this.frames.push(frame);
  164. };
  165. GIF.prototype.render = function () {
  166. var i, numWorkers;
  167. if (this.running)
  168. throw new Error('Already running');
  169. if (!(null != this.options.width) || !(null != this.options.height))
  170. throw new Error('Width and height must be set prior to rendering');
  171. this.running = true;
  172. this.nextFrame = 0;
  173. this.finishedFrames = 0;
  174. this.imageParts = function (accum$) {
  175. for (var cache$ = function () {
  176. var accum$1;
  177. accum$1 = [];
  178. for (var i$ = 0; 0 <= this.frames.length ? i$ < this.frames.length : i$ > this.frames.length; 0 <= this.frames.length ? ++i$ : --i$)
  179. accum$1.push(i$);
  180. return accum$1;
  181. }.apply(this, arguments), i$ = 0, length$ = cache$.length; i$ < length$; ++i$) {
  182. i = cache$[i$];
  183. accum$.push(null);
  184. }
  185. return accum$;
  186. }.call(this, []);
  187. numWorkers = this.spawnWorkers();
  188. if (this.options.globalPalette === true) {
  189. this.renderNextFrame();
  190. } else {
  191. for (var cache$1 = function () {
  192. var accum$1;
  193. accum$1 = [];
  194. for (var i$1 = 0; 0 <= numWorkers ? i$1 < numWorkers : i$1 > numWorkers; 0 <= numWorkers ? ++i$1 : --i$1)
  195. accum$1.push(i$1);
  196. return accum$1;
  197. }.apply(this, arguments), i$1 = 0, length$1 = cache$1.length; i$1 < length$1; ++i$1) {
  198. i = cache$1[i$1];
  199. this.renderNextFrame();
  200. }
  201. }
  202. this.emit('start');
  203. return this.emit('progress', 0);
  204. };
  205. GIF.prototype.abort = function () {
  206. var worker;
  207. while (true) {
  208. worker = this.activeWorkers.shift();
  209. if (!(null != worker))
  210. break;
  211. console.log('killing active worker');
  212. worker.terminate();
  213. }
  214. this.running = false;
  215. return this.emit('abort');
  216. };
  217. GIF.prototype.spawnWorkers = function () {
  218. var numWorkers;
  219. numWorkers = Math.min(this.options.workers, this.frames.length);
  220. (function () {
  221. var accum$;
  222. accum$ = [];
  223. for (var i$ = this.freeWorkers.length; this.freeWorkers.length <= numWorkers ? i$ < numWorkers : i$ > numWorkers; this.freeWorkers.length <= numWorkers ? ++i$ : --i$)
  224. accum$.push(i$);
  225. return accum$;
  226. }.apply(this, arguments).forEach(function (this$) {
  227. return function (i) {
  228. var worker;
  229. console.log('spawning worker ' + i);
  230. worker = new Worker(this$.options.workerScript);
  231. worker.onmessage = function (this$1) {
  232. return function (event) {
  233. this$1.activeWorkers.splice(this$1.activeWorkers.indexOf(worker), 1);
  234. this$1.freeWorkers.push(worker);
  235. return this$1.frameFinished(event.data);
  236. };
  237. }(this$);
  238. return this$.freeWorkers.push(worker);
  239. };
  240. }(this)));
  241. return numWorkers;
  242. };
  243. GIF.prototype.frameFinished = function (frame) {
  244. var i;
  245. console.log('frame ' + frame.index + ' finished - ' + this.activeWorkers.length + ' active');
  246. this.finishedFrames++;
  247. this.emit('progress', this.finishedFrames / this.frames.length);
  248. this.imageParts[frame.index] = frame;
  249. if (this.options.globalPalette === true) {
  250. this.options.globalPalette = frame.globalPalette;
  251. console.log('global palette analyzed');
  252. if (this.frames.length > 2)
  253. for (var cache$ = function () {
  254. var accum$;
  255. accum$ = [];
  256. for (var i$ = 1; 1 <= this.freeWorkers.length ? i$ < this.freeWorkers.length : i$ > this.freeWorkers.length; 1 <= this.freeWorkers.length ? ++i$ : --i$)
  257. accum$.push(i$);
  258. return accum$;
  259. }.apply(this, arguments), i$ = 0, length$ = cache$.length; i$ < length$; ++i$) {
  260. i = cache$[i$];
  261. this.renderNextFrame();
  262. }
  263. }
  264. if (in$(null, this.imageParts)) {
  265. return this.renderNextFrame();
  266. } else {
  267. return this.finishRendering();
  268. }
  269. };
  270. GIF.prototype.finishRendering = function () {
  271. var data, frame, i, image, len, offset, page;
  272. len = 0;
  273. for (var i$ = 0, length$ = this.imageParts.length; i$ < length$; ++i$) {
  274. frame = this.imageParts[i$];
  275. len += (frame.data.length - 1) * frame.pageSize + frame.cursor;
  276. }
  277. len += frame.pageSize - frame.cursor;
  278. console.log('rendering finished - filesize ' + Math.round(len / 1e3) + 'kb');
  279. data = new Uint8Array(len);
  280. offset = 0;
  281. for (var i$1 = 0, length$1 = this.imageParts.length; i$1 < length$1; ++i$1) {
  282. frame = this.imageParts[i$1];
  283. for (var i$2 = 0, length$2 = frame.data.length; i$2 < length$2; ++i$2) {
  284. page = frame.data[i$2];
  285. i = i$2;
  286. data.set(page, offset);
  287. if (i === frame.data.length - 1) {
  288. offset += frame.cursor;
  289. } else {
  290. offset += frame.pageSize;
  291. }
  292. }
  293. }
  294. image = new Blob([data], { type: 'image/gif' });
  295. return this.emit('finished', image, data);
  296. };
  297. GIF.prototype.renderNextFrame = function () {
  298. var frame, task, worker;
  299. if (this.freeWorkers.length === 0)
  300. throw new Error('No free workers');
  301. if (this.nextFrame >= this.frames.length)
  302. return;
  303. frame = this.frames[this.nextFrame++];
  304. worker = this.freeWorkers.shift();
  305. task = this.getTask(frame);
  306. console.log('starting frame ' + (task.index + 1) + ' of ' + this.frames.length);
  307. this.activeWorkers.push(worker);
  308. return worker.postMessage(task);
  309. };
  310. GIF.prototype.getContextData = function (ctx) {
  311. return ctx.getImageData(0, 0, this.options.width, this.options.height).data;
  312. };
  313. GIF.prototype.getImageData = function (image) {
  314. var ctx;
  315. if (!(null != this._canvas)) {
  316. this._canvas = document.createElement('canvas');
  317. this._canvas.width = this.options.width;
  318. this._canvas.height = this.options.height;
  319. }
  320. ctx = this._canvas.getContext('2d');
  321. ctx.setFill = this.options.background;
  322. ctx.fillRect(0, 0, this.options.width, this.options.height);
  323. ctx.drawImage(image, 0, 0);
  324. return this.getContextData(ctx);
  325. };
  326. GIF.prototype.getTask = function (frame) {
  327. var index, task;
  328. index = this.frames.indexOf(frame);
  329. task = {
  330. index: index,
  331. last: index === this.frames.length - 1,
  332. delay: frame.delay,
  333. transparent: frame.transparent,
  334. width: this.options.width,
  335. height: this.options.height,
  336. quality: this.options.quality,
  337. dither: this.options.dither,
  338. globalPalette: this.options.globalPalette,
  339. repeat: this.options.repeat,
  340. canTransfer: browser.name === 'chrome'
  341. };
  342. if (null != frame.data) {
  343. task.data = frame.data;
  344. } else if (null != frame.context) {
  345. task.data = this.getContextData(frame.context);
  346. } else if (null != frame.image) {
  347. task.data = this.getImageData(frame.image);
  348. } else {
  349. throw new Error('Invalid frame');
  350. }
  351. return task;
  352. };
  353. return GIF;
  354. }(EventEmitter);
  355. module.exports = GIF;
  356. function isOwn$(o, p) {
  357. return {}.hasOwnProperty.call(o, p);
  358. }
  359. function in$(member, list) {
  360. for (var i = 0, length = list.length; i < length; ++i)
  361. if (i in list && list[i] === member)
  362. return true;
  363. return false;
  364. }
  365. function extends$(child, parent) {
  366. for (var key in parent)
  367. if (isOwn$(parent, key))
  368. child[key] = parent[key];
  369. function ctor() {
  370. this.constructor = child;
  371. }
  372. ctor.prototype = parent.prototype;
  373. child.prototype = new ctor;
  374. child.__super__ = parent.prototype;
  375. return child;
  376. }
  377. });
  378. require.define('/browser.coffee', function (module, exports, __dirname, __filename) {
  379. var browser, mode, platform, ua, UA;
  380. ua = navigator.userAgent.toLowerCase();
  381. platform = navigator.platform.toLowerCase();
  382. UA = ua.match(/(opera|ie|firefox|chrome|version)[\s\/:]([\w\d\.]+)?.*?(safari|version[\s\/:]([\w\d\.]+)|$)/) || [
  383. null,
  384. 'unknown',
  385. 0
  386. ];
  387. mode = UA[1] === 'ie' && document.documentMode;
  388. browser = {
  389. name: UA[1] === 'version' ? UA[3] : UA[1],
  390. version: mode || parseFloat(UA[1] === 'opera' && UA[4] ? UA[4] : UA[2]),
  391. platform: { name: ua.match(/ip(?:ad|od|hone)/) ? 'ios' : (ua.match(/(?:webos|android)/) || platform.match(/mac|win|linux/) || ['other'])[0] }
  392. };
  393. browser[browser.name] = true;
  394. browser[browser.name + parseInt(browser.version, 10)] = true;
  395. browser.platform[browser.platform.name] = true;
  396. module.exports = browser;
  397. function isOwn$(o, p) {
  398. return {}.hasOwnProperty.call(o, p);
  399. }
  400. function in$(member, list) {
  401. for (var i = 0, length = list.length; i < length; ++i)
  402. if (i in list && list[i] === member)
  403. return true;
  404. return false;
  405. }
  406. function extends$(child, parent) {
  407. for (var key in parent)
  408. if (isOwn$(parent, key))
  409. child[key] = parent[key];
  410. function ctor() {
  411. this.constructor = child;
  412. }
  413. ctor.prototype = parent.prototype;
  414. child.prototype = new ctor;
  415. child.__super__ = parent.prototype;
  416. return child;
  417. }
  418. });
  419. require.define('events', function (module, exports, __dirname, __filename) {
  420. if (!process.EventEmitter)
  421. process.EventEmitter = function () {
  422. };
  423. var EventEmitter = exports.EventEmitter = process.EventEmitter;
  424. var isArray = typeof Array.isArray === 'function' ? Array.isArray : function (xs) {
  425. return Object.prototype.toString.call(xs) === '[object Array]';
  426. };
  427. var defaultMaxListeners = 10;
  428. EventEmitter.prototype.setMaxListeners = function (n) {
  429. if (!this._events)
  430. this._events = {};
  431. this._events.maxListeners = n;
  432. };
  433. EventEmitter.prototype.emit = function (type) {
  434. if (type === 'error') {
  435. if (!this._events || !this._events.error || isArray(this._events.error) && !this._events.error.length) {
  436. if (arguments[1] instanceof Error) {
  437. throw arguments[1];
  438. } else {
  439. throw new Error("Uncaught, unspecified 'error' event.");
  440. }
  441. return false;
  442. }
  443. }
  444. if (!this._events)
  445. return false;
  446. var handler = this._events[type];
  447. if (!handler)
  448. return false;
  449. if (typeof handler == 'function') {
  450. switch (arguments.length) {
  451. case 1:
  452. handler.call(this);
  453. break;
  454. case 2:
  455. handler.call(this, arguments[1]);
  456. break;
  457. case 3:
  458. handler.call(this, arguments[1], arguments[2]);
  459. break;
  460. default:
  461. var args = Array.prototype.slice.call(arguments, 1);
  462. handler.apply(this, args);
  463. }
  464. return true;
  465. } else if (isArray(handler)) {
  466. var args = Array.prototype.slice.call(arguments, 1);
  467. var listeners = handler.slice();
  468. for (var i = 0, l = listeners.length; i < l; i++) {
  469. listeners[i].apply(this, args);
  470. }
  471. return true;
  472. } else {
  473. return false;
  474. }
  475. };
  476. EventEmitter.prototype.addListener = function (type, listener) {
  477. if ('function' !== typeof listener) {
  478. throw new Error('addListener only takes instances of Function');
  479. }
  480. if (!this._events)
  481. this._events = {};
  482. this.emit('newListener', type, listener);
  483. if (!this._events[type]) {
  484. this._events[type] = listener;
  485. } else if (isArray(this._events[type])) {
  486. if (!this._events[type].warned) {
  487. var m;
  488. if (this._events.maxListeners !== undefined) {
  489. m = this._events.maxListeners;
  490. } else {
  491. m = defaultMaxListeners;
  492. }
  493. if (m && m > 0 && this._events[type].length > m) {
  494. this._events[type].warned = true;
  495. console.error('(node) warning: possible EventEmitter memory ' + 'leak detected. %d listeners added. ' + 'Use emitter.setMaxListeners() to increase limit.', this._events[type].length);
  496. console.trace();
  497. }
  498. }
  499. this._events[type].push(listener);
  500. } else {
  501. this._events[type] = [
  502. this._events[type],
  503. listener
  504. ];
  505. }
  506. return this;
  507. };
  508. EventEmitter.prototype.on = EventEmitter.prototype.addListener;
  509. EventEmitter.prototype.once = function (type, listener) {
  510. var self = this;
  511. self.on(type, function g() {
  512. self.removeListener(type, g);
  513. listener.apply(this, arguments);
  514. });
  515. return this;
  516. };
  517. EventEmitter.prototype.removeListener = function (type, listener) {
  518. if ('function' !== typeof listener) {
  519. throw new Error('removeListener only takes instances of Function');
  520. }
  521. if (!this._events || !this._events[type])
  522. return this;
  523. var list = this._events[type];
  524. if (isArray(list)) {
  525. var i = list.indexOf(listener);
  526. if (i < 0)
  527. return this;
  528. list.splice(i, 1);
  529. if (list.length == 0)
  530. delete this._events[type];
  531. } else if (this._events[type] === listener) {
  532. delete this._events[type];
  533. }
  534. return this;
  535. };
  536. EventEmitter.prototype.removeAllListeners = function (type) {
  537. if (type && this._events && this._events[type])
  538. this._events[type] = null;
  539. return this;
  540. };
  541. EventEmitter.prototype.listeners = function (type) {
  542. if (!this._events)
  543. this._events = {};
  544. if (!this._events[type])
  545. this._events[type] = [];
  546. if (!isArray(this._events[type])) {
  547. this._events[type] = [this._events[type]];
  548. }
  549. return this._events[type];
  550. };
  551. });
  552. global.GIF = require('/gif.coffee');
  553. }.call(this, this));
  554. //# sourceMappingURL=gif.js.map
  555. // gif.js 0.1.6 - https://github.com/jnordberg/gif.js

QingJ © 2025

镜像随时可能失效,请加Q群300939539或关注我们的公众号极客氢云获取最新地址