Zlib and Deflate Encode Library imaya Follow 2011-10-13 14:24:18 License: MIT License Fork0 Fav0 View590 Play Stop Reload Fullscreen Smart Phone Readme JavaScript 78 lines HTML 0 lines CSS 0 lines Zlib(RFC1950), Deflate(RFC1951) のエンコード実装 Deflateは非圧縮、固定ハフマン符号、動的ハフマン符号(カスタムハフマンテーブル)に対応 ただし LZ77 符号化の lazy match は実装していないため、既存のエンコーダの高圧縮設定より圧縮率が下がる可能性がある。 ソースコードは https://github.com/imaya/canvas2png で公開しています。 Zlib and Deflate Encode Library /** * @license * zlib.deflate.js * JavaScript Zlib and Deflate Library * https://github.com/imaya/canvas2png/ * * The MIT License * * Copyright (c) 2011 imaya * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal * in the Software without restriction, including without limitation the rights * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell * copies of the Software, and to permit persons to whom the Software is * furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN * THE SOFTWARE. */ (function() {var COMPILED=!0,goog=goog||{};goog.global=this;goog.DEBUG=!1;goog.LOCALE="en";goog.provide=function(a){if(!COMPILED){if(goog.isProvided_(a))throw Error('Namespace "'+a+'" already declared.');delete goog.implicitNamespaces_[a];for(var b=a;b=b.substring(0,b.lastIndexOf("."));){if(goog.getObjectByName(b))break;goog.implicitNamespaces_[b]=!0}}goog.exportPath_(a)}; goog.setTestOnly=function(a){if(COMPILED&&!goog.DEBUG)throw a=a||"",Error("Importing test-only code into non-debug environment"+a?": "+a:".");};if(!COMPILED)goog.isProvided_=function(a){return!goog.implicitNamespaces_[a]&&!!goog.getObjectByName(a)},goog.implicitNamespaces_={};goog.exportPath_=function(a,b,c){a=a.split(".");c=c||goog.global;!(a[0]in c)&&c.execScript&&c.execScript("var "+a[0]);for(var d;a.length&&(d=a.shift());)!a.length&&goog.isDef(b)?c[d]=b:c=c[d]?c[d]:c[d]={}}; goog.getObjectByName=function(a,b){for(var c=a.split("."),d=b||goog.global,e;e=c.shift();)if(goog.isDefAndNotNull(d[e]))d=d[e];else return null;return d};goog.globalize=function(a,b){var c=b||goog.global,d;for(d in a)c[d]=a[d]}; goog.addDependency=function(a,b,c){if(!COMPILED){for(var d,a=a.replace(/\\/g,"/"),e=goog.dependencies_,f=0;d=b[f];f++)e.nameToPath[d]=a,a in e.pathToNames||(e.pathToNames[a]={}),e.pathToNames[a][d]=!0;for(d=0;b=c[d];d++)a in e.requires||(e.requires[a]={}),e.requires[a][b]=!0}};goog.ENABLE_DEBUG_LOADER=!0; goog.require=function(a){if(!COMPILED&&!goog.isProvided_(a)){if(goog.ENABLE_DEBUG_LOADER){var b=goog.getPathFromDeps_(a);if(b){goog.included_[b]=!0;goog.writeScripts_();return}}a="goog.require could not find: "+a;goog.global.console&&goog.global.console.error(a);throw Error(a);}};goog.basePath="";goog.nullFunction=function(){};goog.identityFunction=function(a){return a};goog.abstractMethod=function(){throw Error("unimplemented abstract method");}; goog.addSingletonGetter=function(a){a.getInstance=function(){return a.instance_||(a.instance_=new a)}}; if(!COMPILED&&goog.ENABLE_DEBUG_LOADER)goog.included_={},goog.dependencies_={pathToNames:{},nameToPath:{},requires:{},visited:{},written:{}},goog.inHtmlDocument_=function(){var a=goog.global.document;return typeof a!="undefined"&&"write"in a},goog.findBasePath_=function(){if(goog.global.CLOSURE_BASE_PATH)goog.basePath=goog.global.CLOSURE_BASE_PATH;else if(goog.inHtmlDocument_())for(var a=goog.global.document.getElementsByTagName("script"),b=a.length-1;b>=0;--b){var c=a[b].src,d=c.lastIndexOf("?"), d=d==-1?c.length:d;if(c.substr(d-7,7)=="base.js"){goog.basePath=c.substr(0,d-7);break}}},goog.importScript_=function(a){var b=goog.global.CLOSURE_IMPORT_SCRIPT||goog.writeScriptTag_;!goog.dependencies_.written[a]&&b(a)&&(goog.dependencies_.written[a]=!0)},goog.writeScriptTag_=function(a){return goog.inHtmlDocument_()?(goog.global.document.write('<script type="text/javascript" src="'+a+'"><\/script>'),!0):!1},goog.writeScripts_=function(){function a(e){if(!(e in d.written)){if(!(e in d.visited)&&(d.visited[e]= !0,e in d.requires))for(var h in d.requires[e])if(!goog.isProvided_(h))if(h in d.nameToPath)a(d.nameToPath[h]);else throw Error("Undefined nameToPath for "+h);e in c||(c[e]=!0,b.push(e))}}var b=[],c={},d=goog.dependencies_,e;for(e in goog.included_)d.written[e]||a(e);for(e=0;e<b.length;e++)if(b[e])goog.importScript_(goog.basePath+b[e]);else throw Error("Undefined script input");},goog.getPathFromDeps_=function(a){return a in goog.dependencies_.nameToPath?goog.dependencies_.nameToPath[a]:null},goog.findBasePath_(), goog.global.CLOSURE_NO_DEPS||goog.importScript_(goog.basePath+"deps.js"); goog.typeOf=function(a){var b=typeof a;if(b=="object")if(a){if(a instanceof Array)return"array";else if(a instanceof Object)return b;var c=Object.prototype.toString.call(a);if(c=="[object Window]")return"object";if(c=="[object Array]"||typeof a.length=="number"&&typeof a.splice!="undefined"&&typeof a.propertyIsEnumerable!="undefined"&&!a.propertyIsEnumerable("splice"))return"array";if(c=="[object Function]"||typeof a.call!="undefined"&&typeof a.propertyIsEnumerable!="undefined"&&!a.propertyIsEnumerable("call"))return"function"}else return"null"; else if(b=="function"&&typeof a.call=="undefined")return"object";return b};goog.propertyIsEnumerableCustom_=function(a,b){if(b in a)for(var c in a)if(c==b&&Object.prototype.hasOwnProperty.call(a,b))return!0;return!1};goog.propertyIsEnumerable_=function(a,b){return a instanceof Object?Object.prototype.propertyIsEnumerable.call(a,b):goog.propertyIsEnumerableCustom_(a,b)};goog.isDef=function(a){return a!==void 0};goog.isNull=function(a){return a===null};goog.isDefAndNotNull=function(a){return a!=null}; goog.isArray=function(a){return goog.typeOf(a)=="array"};goog.isArrayLike=function(a){var b=goog.typeOf(a);return b=="array"||b=="object"&&typeof a.length=="number"};goog.isDateLike=function(a){return goog.isObject(a)&&typeof a.getFullYear=="function"};goog.isString=function(a){return typeof a=="string"};goog.isBoolean=function(a){return typeof a=="boolean"};goog.isNumber=function(a){return typeof a=="number"};goog.isFunction=function(a){return goog.typeOf(a)=="function"}; goog.isObject=function(a){a=goog.typeOf(a);return a=="object"||a=="array"||a=="function"};goog.getUid=function(a){return a[goog.UID_PROPERTY_]||(a[goog.UID_PROPERTY_]=++goog.uidCounter_)};goog.removeUid=function(a){"removeAttribute"in a&&a.removeAttribute(goog.UID_PROPERTY_);try{delete a[goog.UID_PROPERTY_]}catch(b){}};goog.UID_PROPERTY_="closure_uid_"+Math.floor(Math.random()*2147483648).toString(36);goog.uidCounter_=0;goog.getHashCode=goog.getUid;goog.removeHashCode=goog.removeUid; goog.cloneObject=function(a){var b=goog.typeOf(a);if(b=="object"||b=="array"){if(a.clone)return a.clone();var b=b=="array"?[]:{},c;for(c in a)b[c]=goog.cloneObject(a[c]);return b}return a};goog.bindNative_=function(a,b,c){return a.call.apply(a.bind,arguments)}; goog.bindJs_=function(a,b,c){if(!a)throw Error();if(arguments.length>2){var d=Array.prototype.slice.call(arguments,2);return function(){var c=Array.prototype.slice.call(arguments);Array.prototype.unshift.apply(c,d);return a.apply(b,c)}}else return function(){return a.apply(b,arguments)}};goog.bind=function(a,b,c){goog.bind=Function.prototype.bind&&Function.prototype.bind.toString().indexOf("native code")!=-1?goog.bindNative_:goog.bindJs_;return goog.bind.apply(null,arguments)}; goog.partial=function(a,b){var c=Array.prototype.slice.call(arguments,1);return function(){var b=Array.prototype.slice.call(arguments);b.unshift.apply(b,c);return a.apply(this,b)}};goog.mixin=function(a,b){for(var c in b)a[c]=b[c]};goog.now=Date.now||function(){return+new Date}; goog.globalEval=function(a){if(goog.global.execScript)goog.global.execScript(a,"JavaScript");else if(goog.global.eval){if(goog.evalWorksForGlobals_==null)goog.global.eval("var _et_ = 1;"),typeof goog.global._et_!="undefined"?(delete goog.global._et_,goog.evalWorksForGlobals_=!0):goog.evalWorksForGlobals_=!1;if(goog.evalWorksForGlobals_)goog.global.eval(a);else{var b=goog.global.document,c=b.createElement("script");c.type="text/javascript";c.defer=!1;c.appendChild(b.createTextNode(a));b.body.appendChild(c); b.body.removeChild(c)}}else throw Error("goog.globalEval not available");};goog.evalWorksForGlobals_=null;goog.getCssName=function(a,b){var c=function(a){return goog.cssNameMapping_[a]||a},d;d=goog.cssNameMapping_?goog.cssNameMappingStyle_=="BY_WHOLE"?c:function(a){for(var a=a.split("-"),b=[],d=0;d<a.length;d++)b.push(c(a[d]));return b.join("-")}:function(a){return a};return b?a+"-"+d(b):d(a)};goog.setCssNameMapping=function(a,b){goog.cssNameMapping_=a;goog.cssNameMappingStyle_=b}; goog.getMsg=function(a,b){var c=b||{},d;for(d in c)var e=(""+c[d]).replace(/\$/g,"$$$$"),a=a.replace(RegExp("\\{\\$"+d+"\\}","gi"),e);return a};goog.exportSymbol=function(a,b,c){goog.exportPath_(a,b,c)};goog.exportProperty=function(a,b,c){a[b]=c};goog.inherits=function(a,b){function c(){}c.prototype=b.prototype;a.superClass_=b.prototype;a.prototype=new c;a.prototype.constructor=a}; goog.base=function(a,b,c){var d=arguments.callee.caller;if(d.superClass_)return d.superClass_.constructor.apply(a,Array.prototype.slice.call(arguments,1));for(var e=Array.prototype.slice.call(arguments,2),f=!1,h=a.constructor;h;h=h.superClass_&&h.superClass_.constructor)if(h.prototype[b]===d)f=!0;else if(f)return h.prototype[b].apply(a,e);if(a[b]===d)return a.constructor.prototype[b].apply(a,e);else throw Error("goog.base called from a method of one name to a method of a different name");}; goog.scope=function(a){a.call(goog.global)};var Zlib={};Zlib.Adler32=function(a){return Zlib.Adler32.update(1,a)};Zlib.Adler32.update=function(a,b){for(var c=a&65535,d=a>>>16&65535,e=0,f=b.length;e<f;e++)c=(c+b[e])%65521,d=(d+c)%65521;return d<<16|c};Zlib.BitStream=function(){this.bitindex=this.index=0;this.buffer=[]};Zlib.BitStream.prototype.writeBits=function(a,b,c){var d,e,f=this.buffer;for(d=0;d<b;d++)if(f[this.index]===void 0&&(f[this.index]=0),c?(e=a&1,a>>>=1):e=(a>>>b-d-1&1)===0?0:1,f[this.index]=f[this.index]<<1|e,this.bitindex++,this.bitindex===8)this.bitindex=0,this.reverseByte(this.index),this.index++}; Zlib.BitStream.prototype.finish=function(){this.bitindex>0&&(this.buffer[this.index]<<=8-this.bitindex);this.reverseByte(this.index);return this.buffer};Zlib.BitStream.prototype.reverseByte=function(a){var b=0,c=this.buffer[a],d;for(d=0;d<8;d++)b=b<<1|c&1,c>>>=1;this.buffer[a]=b;return this.buffer[a]};Zlib.Util={};Zlib.Util.convertNetworkByteOrder=function(a,b){var c=[],d;do d=a&255,c.unshift(d),a>>>=8;while(a>0);if(typeof b==="number")for(;c.length<b;)c.unshift(0);return c};Zlib.Util.slice=function(a,b,c){var d,e=a.length;if(a instanceof Array)return a.slice(b,b+c);d=[];for(var f=0;f<c;f++){if(b+f>=e)break;d.push(a[b+f])}return d}; Zlib.Util.concat=function(a,b){var c=a.length,d=b.length,e;if(a instanceof Array&&b instanceof Array){if(b.length>65535)for(e=0;e<d;e+=65535)Array.prototype.push.apply(a,b.slice(e,e+65535));else Array.prototype.push.apply(a,b);return a}for(e=0;e<d;e++)a[c+e]=b[e];return a};Zlib.Heap=function(a){this.buffer=Array(a*2);this.length=0};Zlib.Heap.prototype.getParent=function(a){return((a-2)/4|0)*2};Zlib.Heap.prototype.getChild=function(a){return 2*a+2};Zlib.Heap.prototype.push=function(a,b){var c,d,e=this.buffer,f;c=this.length;e[this.length++]=b;for(e[this.length++]=a;c>0;)if(d=this.getParent(c),e[c+1]<e[d+1])f=e[c],e[c]=e[d],e[d]=f,f=e[c+1],e[c+1]=e[d+1],e[d+1]=f,c=d;else break;return this.length}; Zlib.Heap.prototype.pop=function(){var a,b,c=this.buffer,d,e,f;b=c[0];a=c[1];this.length-=2;c[0]=c[this.length];c[1]=c[this.length+1];for(f=0;;){e=this.getChild(f);if(e>=this.length)break;e+2<this.length&&c[e+3]<c[e+1]&&(e+=2);if(c[f+1]>c[e+1])d=c[f],c[f]=c[e],c[e]=d,d=c[f+1],c[f+1]=c[e+1],c[e+1]=d;else break;f=e}return{index:a,value:b,length:this.length}};Zlib.RawDeflate=function(a){this.compressionType=a;this.matchTable={};this.freqsLitLen=[];this.freqsDist=[]};Zlib.RawDeflate.Lz77MinLength=3;Zlib.RawDeflate.Lz77MaxLength=258;Zlib.RawDeflate.WindowSize=32768;Zlib.RawDeflate.MaxCodeLength=16;Zlib.RawDeflate.HUFMAX=286; Zlib.RawDeflate.FixedHuffmanTable=function(){var a=[],b;for(b=0;b<288;b++)switch(!0){case b<=143:a.push([b-0+48,8]);break;case b<=255:a.push([b-144+400,9]);break;case b<=279:a.push([b-256+0,7]);break;case b<=287:a.push([b-280+192,8]);break;default:throw"invalid literal: "+b;}return a}(); Zlib.RawDeflate.prototype.dynamicHuffman=function(a,b,c,d){var e,f,h,i,g;d instanceof Zlib.BitStream||(d=new Zlib.BitStream);h=b[0];b=b[1];i=c[0];g=c[1];for(c=0,e=a.length;c<e;c++)if(f=a[c],d.writeBits(h[f],b[f],!0),f>256)d.writeBits(a[++c],a[++c],!0),d.writeBits(i[a[++c]],g[a[c]],!0),d.writeBits(a[++c],a[++c],!0);else if(f===256)break;return d}; Zlib.RawDeflate.prototype.fixedHuffman=function(a,b){var c,d,e;b instanceof Zlib.BitStream||(b=new Zlib.BitStream);for(c=0,d=a.length;c<d;c++)if(e=a[c],Zlib.BitStream.prototype.writeBits.apply(b,Zlib.RawDeflate.FixedHuffmanTable[e]),e>256)b.writeBits(a[++c],a[++c],!0),b.writeBits(a[++c],5),b.writeBits(a[++c],a[++c],!0);else if(e===256)break;return b.finish()};function Lz77Match(a,b){this.length=a;this.backwordDistance=b} Lz77Match.prototype.getLengthCode_=function(a){switch(!0){case a===3:a=[257,a-3,0];break;case a===4:a=[258,a-4,0];break;case a===5:a=[259,a-5,0];break;case a===6:a=[260,a-6,0];break;case a===7:a=[261,a-7,0];break;case a===8:a=[262,a-8,0];break;case a===9:a=[263,a-9,0];break;case a===10:a=[264,a-10,0];break;case a<=12:a=[265,a-11,1];break;case a<=14:a=[266,a-13,1];break;case a<=16:a=[267,a-15,1];break;case a<=18:a=[268,a-17,1];break;case a<=22:a=[269,a-19,2];break;case a<=26:a=[270,a-23,2];break;case a<= 30:a=[271,a-27,2];break;case a<=34:a=[272,a-31,2];break;case a<=42:a=[273,a-35,3];break;case a<=50:a=[274,a-43,3];break;case a<=58:a=[275,a-51,3];break;case a<=66:a=[276,a-59,3];break;case a<=82:a=[277,a-67,4];break;case a<=98:a=[278,a-83,4];break;case a<=114:a=[279,a-99,4];break;case a<=130:a=[280,a-115,4];break;case a<=162:a=[281,a-131,5];break;case a<=194:a=[282,a-163,5];break;case a<=226:a=[283,a-195,5];break;case a<=257:a=[284,a-227,5];break;case a===258:a=[285,a-258,0];break;default:throw"invalid length: "+ a;}return a}; Lz77Match.prototype.getDistanceCode_=function(a){switch(!0){case a===1:a=[0,a-1,0];break;case a===2:a=[1,a-2,0];break;case a===3:a=[2,a-3,0];break;case a===4:a=[3,a-4,0];break;case a<=6:a=[4,a-5,1];break;case a<=8:a=[5,a-7,1];break;case a<=12:a=[6,a-9,2];break;case a<=16:a=[7,a-13,2];break;case a<=24:a=[8,a-17,3];break;case a<=32:a=[9,a-25,3];break;case a<=48:a=[10,a-33,4];break;case a<=64:a=[11,a-49,4];break;case a<=96:a=[12,a-65,5];break;case a<=128:a=[13,a-97,5];break;case a<=192:a=[14,a-129,6]; break;case a<=256:a=[15,a-193,6];break;case a<=384:a=[16,a-257,7];break;case a<=512:a=[17,a-385,7];break;case a<=768:a=[18,a-513,8];break;case a<=1024:a=[19,a-769,8];break;case a<=1536:a=[20,a-1025,9];break;case a<=2048:a=[21,a-1537,9];break;case a<=3072:a=[22,a-2049,10];break;case a<=4096:a=[23,a-3073,10];break;case a<=6144:a=[24,a-4097,11];break;case a<=8192:a=[25,a-6145,11];break;case a<=12288:a=[26,a-8193,12];break;case a<=16384:a=[27,a-12289,12];break;case a<=24576:a=[28,a-16385,13];break;case a<= 32768:a=[29,a-24577,13];break;default:throw"invalid distance";}return a};Lz77Match.prototype.toLz77Array=function(){var a=this.backwordDistance,b=[];(0,Zlib.Util.concat)(b,this.getLengthCode_(this.length));(0,Zlib.Util.concat)(b,this.getDistanceCode_(a));return b}; Zlib.RawDeflate.prototype.lz77=function(a){var b,c,d,e,f,h,i=this.matchTable,g,j,k=[];g=0;var l,n=[],o=[];if(l=this.compressionType===Zlib.Deflate.CompressionType.DYNAMIC){for(d=0;d<=285;d++)n[d]=0;for(d=0;d<=29;d++)o[d]=0;n[256]=1}c=a.length;for(b=0;b<c;b++){h=(0,Zlib.Util.slice)(a,b,Zlib.RawDeflate.Lz77MinLength);if(h.length<Zlib.RawDeflate.Lz77MinLength&&g===0){(0,Zlib.Util.concat)(k,h);if(l)for(d=0,e=h.length;d<e;d++)n[h[d]]++;break}f=0;for(d=0,e=h.length;d<e;d++)f=f<<8|h[d]&255;i[f]===void 0&& (i[f]=[]);if(g>0)g--;else{d=i[f];h=d.length;for(e=0;e<h;e++)if(j=d[e],b-j>Zlib.RawDeflate.WindowSize)d.shift(),e--,h--;else break;d.length>0?(g=this.searchLongestMatch_(a,b,d),d=g.toLz77Array(),(0,Zlib.Util.concat)(k,d),l&&(n[d[0]]++,o[d[3]]++),g=g.length-1):(l&&n[a[b]]++,k.push(a[b]))}i[f].push(b)}if(l)n[256]++,this.freqsLitLen=n,this.freqsDist=o;k.push(256);return k}; Zlib.RawDeflate.prototype.searchLongestMatch_=function(a,b,c){var d,e,f,h,i,g,j=Zlib.RawDeflate.Lz77MinLength,k,l;f=Zlib.RawDeflate.Lz77MaxLength;d=c;c=[];for(e=j;e<f;e+=8){g=d.length;for(i=0;i<g;i++){h=d[i];l=!0;for(k=7;k>=0;k--)if(a[d[i]+e+k]!==a[b+e+k]){l=!1;break}l&&c.push(h)}if(c.length===0)break;d=c;c=[]}e>j&&e--;c=[];for(k=0;k<8&&e<f;k++){g=d.length;for(i=0;i<g;i++)a[d[i]+e]===a[b+e]&&c.push(d[i]);if(c.length===0)break;e++;d=c;c=[]}return new Lz77Match(e,b-Math.max.apply(this,d))}; Zlib.RawDeflate.prototype.getTreeSymbols_=function(a,b,c,d){var e=Array(a+c),f,h,i=Array(316),g=Array(19);for(f=h=0;f<a;f++)e[h++]=b[f];for(f=0;f<c;f++)e[h++]=d[f];for(f=0,b=g.length;f<b;f++)g[f]=0;c=0;for(f=0,b=e.length;f<b;f+=h){for(h=1;f+h<b&&e[f+h]===e[f];h++);a=h;if(e[f]===0)if(a<3)for(;a-- >0;)i[c++]=0,g[0]++;else for(;a>0;)d=a<138?a:138,d>a-3&&d<a&&(d=a-3),d<=10?(i[c++]=17,i[c++]=d-3,g[17]++):(i[c++]=18,i[c++]=d-11,g[18]++),a-=d;else if(i[c++]=e[f],g[e[f]]++,a--,a<3)for(;a-- >0;)i[c++]=e[f], g[e[f]]++;else for(;a>0;)d=a<6?a:6,d>a-3&&d<a&&(d=a-3),i[c++]=16,i[c++]=d-3,g[16]++,a-=d}return{codes:i.slice(0,c),freqs:g}}; Zlib.RawDeflate.prototype.getLengths_=function(a,b){var c=a.length,d,e=2*Zlib.RawDeflate.HUFMAX-1,f=new Zlib.Heap(2*Zlib.RawDeflate.HUFMAX),h=Array(e),i=Array(e),g,j;d=[];j=4294967295;var k;for(g=0;g<c;g++)a[g]===0?d.push(g):(j>a[g]&&(j=a[g]),k+=a[g]);for(g=0;c-d.length<2;g++)a[d.shift()]=1;if((b|0)>0){if(b!==7&&b!==15)throw"invalid limit number";g=b===15?2584:55;d=c-d.length;d=g-d;j=(0-j*g+d-1)/d|0;for(g=0;g<c;g++)a[g]!==0&&(a[g]+=j)}for(g=0;g<e;g++)h[g]=0,i[g]=0;for(g=0;g<c;g++)a[g]>0&&f.push(g, a[g]);for(g=Zlib.RawDeflate.HUFMAX;f.length>2;g++)e=f.pop(),j=f.pop(),h[e.index]=g,h[j.index]=g,f.push(g,e.value+j.value);for(;g>=0;g--)h[g]>0&&(i[g]=1+i[h[g]]);return i.slice(0,c)}; Zlib.RawDeflate.prototype.getCodesFromLengths_=function(a){var b=Array(a.length),c=[],d=[],e=0,f,h,i;for(f=0,h=a.length;f<h;f++)c[a[f]]=(c[a[f]]|0)+1;for(f=1,h=Zlib.RawDeflate.MaxCodeLength;f<=h;f++){d[f]=e;e+=c[f]|0;if(e>1<<f)throw"overcommitted";e<<=1}if(e<1<<Zlib.RawDeflate.MaxCodeLength)throw"undercommitted";for(f=0,h=a.length;f<h;f++){e=d[a[f]];d[a[f]]+=1;b[f]=0;for(c=0,i=a[f];c<i;c++)b[f]=b[f]<<1|e&1,e>>>=1}return b};Zlib.Deflate=function(a,b){this.buffer=a;this.compressionType=Zlib.Deflate.CompressionType.DYNAMIC;if(typeof b==="object"&&typeof b.compressionType==="number")this.compressionType=b.compressionType;this.rawDeflate=new Zlib.RawDeflate(this.compressionType)};Zlib.Deflate.CompressionType={NONE:0,FIXED:1,DYNAMIC:2,RESERVED:3};Zlib.Deflate.compress=function(a,b){return(new Zlib.Deflate(a,b)).compress()}; Zlib.Deflate.prototype.compress=function(){var a,b,c,d,e;b=Zlib.CompressionMethod.DEFLATE;switch(b){case Zlib.CompressionMethod.DEFLATE:a=Math.LOG2E*Math.log(Zlib.RawDeflate.WindowSize)-8;break;default:throw"invalid compression method";}a=a<<4|b;switch(b){case Zlib.CompressionMethod.DEFLATE:switch(this.compressionType){case Zlib.Deflate.CompressionType.NONE:b=0;break;case Zlib.Deflate.CompressionType.FIXED:b=1;break;case Zlib.Deflate.CompressionType.DYNAMIC:b=2;break;default:throw"unsupported compression type"; }break;default:throw"invalid compression method";}b=b<<6|0;b|=31-(a*256+b)%31;d=(0,Zlib.Util.convertNetworkByteOrder)(Zlib.Adler32(this.buffer),4);c=this.makeBlocks();e=[];e.push(a,b);(0,Zlib.Util.concat)(e,c);(0,Zlib.Util.concat)(e,d);return e}; Zlib.Deflate.prototype.makeBlocks=function(){var a=[],b,c,d;if(typeof this.buffer==="string")this.buffer=this.buffer.split("").map(function(a){return a.charCodeAt(0)});switch(this.compressionType){case Zlib.Deflate.CompressionType.NONE:for(c=0,d=this.buffer.length;c<d;)b=(0,Zlib.Util.slice)(this.buffer,c,65535),c+=b.length,(0,Zlib.Util.concat)(a,this.makeNocompressBlock(b,c===d));break;case Zlib.Deflate.CompressionType.FIXED:(0,Zlib.Util.concat)(a,this.makeFixedHuffmanBlock(this.buffer,!0));break; case Zlib.Deflate.CompressionType.DYNAMIC:(0,Zlib.Util.concat)(a,this.makeDynamicHuffmanBlock(this.buffer,!0));break;default:throw"invalid compression type";}return a};Zlib.Deflate.prototype.makeNocompressBlock=function(a,b){var c=[],d,e;c.push((b?1:0)|Zlib.Deflate.CompressionType.NONE<<1);d=a.length;e=~d+65536&65535;c.push(d&255,d>>>8&255,e&255,e>>>8&255);Array.prototype.unshift.apply(a,c);return a}; Zlib.Deflate.prototype.makeFixedHuffmanBlock=function(a,b){var c=new Zlib.BitStream,d,e;d=Zlib.Deflate.CompressionType.FIXED;c.writeBits(b?1:0,1,!0);c.writeBits(d,2,!0);e=this.rawDeflate;d=e.lz77(a);return d=e.fixedHuffman(d,c)}; Zlib.Deflate.prototype.makeDynamicHuffmanBlock=function(a,b){var c=new Zlib.BitStream,d,e,f,h,i,g=[16,17,18,0,8,7,9,6,10,5,11,4,12,3,13,2,14,1,15],j,k,l,n,o,q,p=Array(19),m;d=Zlib.Deflate.CompressionType.DYNAMIC;c.writeBits(b?1:0,1,!0);c.writeBits(d,2,!0);e=this.rawDeflate;d=e.lz77(a);j=e.getLengths_(e.freqsLitLen);k=e.getCodesFromLengths_(j);l=e.getLengths_(e.freqsDist);n=e.getCodesFromLengths_(l);for(f=286;f>257&&j[f-1]===0;f--);for(h=30;h>1&&l[h-1]===0;h--);o=e.getTreeSymbols_(f,j,h,l);q=e.getLengths_(o.freqs, 7);for(m=0;m<19;m++)p[m]=q[g[m]];for(i=19;i>4&&p[i-1]===0;i--);g=e.getLengths_(o.freqs);q=e.getCodesFromLengths_(g);c.writeBits(f-257,5,!0);c.writeBits(h-1,5,!0);c.writeBits(i-4,4,!0);for(m=0;m<i;m++)c.writeBits(p[m],3,!0);for(m=0,p=o.codes.length;m<p;m++)if(f=o.codes[m],c.writeBits(q[f],g[f],!0),f>=16){m++;switch(f){case 16:f=2;break;case 17:f=3;break;case 18:f=7;break;default:throw"invalid code: "+f;}c.writeBits(o.codes[m],f,!0)}e.dynamicHuffman(d,[k,j],[n,l],c);return c.finish()}; Zlib.Deflate.NO_EXPORT=!1;Zlib.Deflate.NO_EXPORT||(goog.exportSymbol("Zlib.Deflate",Zlib.Deflate),goog.exportSymbol("Zlib.Deflate.CompressionType",Zlib.Deflate.CompressionType),goog.exportSymbol("Zlib.Deflate.compress",Zlib.Deflate.compress));Zlib.CompressionMethod={DEFLATE:8,RESERVED:15};})(); Zlib and Deflate Encode Library Zlib(RFC1950), Deflate(RFC1951) のエンコード実装 Deflateは非圧縮、固定ハフマン符号、動的ハフマン符号(カスタムハフマンテーブル)に対応 ただし LZ77 符号化の lazy match は実装していないため、既存のエンコーダの高圧縮設定より圧縮率が下がる可能性がある。 ソースコードは https://github.com/imaya/canvas2png で公開しています。 /** * @license * zlib.deflate.js * JavaScript Zlib and Deflate Library * https://github.com/imaya/canvas2png/ * * The MIT License * * Copyright (c) 2011 imaya * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal * in the Software without restriction, including without limitation the rights * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell * copies of the Software, and to permit persons to whom the Software is * furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN * THE SOFTWARE. */ (function() {var COMPILED=!0,goog=goog||{};goog.global=this;goog.DEBUG=!1;goog.LOCALE="en";goog.provide=function(a){if(!COMPILED){if(goog.isProvided_(a))throw Error('Namespace "'+a+'" already declared.');delete goog.implicitNamespaces_[a];for(var b=a;b=b.substring(0,b.lastIndexOf("."));){if(goog.getObjectByName(b))break;goog.implicitNamespaces_[b]=!0}}goog.exportPath_(a)}; goog.setTestOnly=function(a){if(COMPILED&&!goog.DEBUG)throw a=a||"",Error("Importing test-only code into non-debug environment"+a?": "+a:".");};if(!COMPILED)goog.isProvided_=function(a){return!goog.implicitNamespaces_[a]&&!!goog.getObjectByName(a)},goog.implicitNamespaces_={};goog.exportPath_=function(a,b,c){a=a.split(".");c=c||goog.global;!(a[0]in c)&&c.execScript&&c.execScript("var "+a[0]);for(var d;a.length&&(d=a.shift());)!a.length&&goog.isDef(b)?c[d]=b:c=c[d]?c[d]:c[d]={}}; goog.getObjectByName=function(a,b){for(var c=a.split("."),d=b||goog.global,e;e=c.shift();)if(goog.isDefAndNotNull(d[e]))d=d[e];else return null;return d};goog.globalize=function(a,b){var c=b||goog.global,d;for(d in a)c[d]=a[d]}; goog.addDependency=function(a,b,c){if(!COMPILED){for(var d,a=a.replace(/\\/g,"/"),e=goog.dependencies_,f=0;d=b[f];f++)e.nameToPath[d]=a,a in e.pathToNames||(e.pathToNames[a]={}),e.pathToNames[a][d]=!0;for(d=0;b=c[d];d++)a in e.requires||(e.requires[a]={}),e.requires[a][b]=!0}};goog.ENABLE_DEBUG_LOADER=!0; goog.require=function(a){if(!COMPILED&&!goog.isProvided_(a)){if(goog.ENABLE_DEBUG_LOADER){var b=goog.getPathFromDeps_(a);if(b){goog.included_[b]=!0;goog.writeScripts_();return}}a="goog.require could not find: "+a;goog.global.console&&goog.global.console.error(a);throw Error(a);}};goog.basePath="";goog.nullFunction=function(){};goog.identityFunction=function(a){return a};goog.abstractMethod=function(){throw Error("unimplemented abstract method");}; goog.addSingletonGetter=function(a){a.getInstance=function(){return a.instance_||(a.instance_=new a)}}; if(!COMPILED&&goog.ENABLE_DEBUG_LOADER)goog.included_={},goog.dependencies_={pathToNames:{},nameToPath:{},requires:{},visited:{},written:{}},goog.inHtmlDocument_=function(){var a=goog.global.document;return typeof a!="undefined"&&"write"in a},goog.findBasePath_=function(){if(goog.global.CLOSURE_BASE_PATH)goog.basePath=goog.global.CLOSURE_BASE_PATH;else if(goog.inHtmlDocument_())for(var a=goog.global.document.getElementsByTagName("script"),b=a.length-1;b>=0;--b){var c=a[b].src,d=c.lastIndexOf("?"), d=d==-1?c.length:d;if(c.substr(d-7,7)=="base.js"){goog.basePath=c.substr(0,d-7);break}}},goog.importScript_=function(a){var b=goog.global.CLOSURE_IMPORT_SCRIPT||goog.writeScriptTag_;!goog.dependencies_.written[a]&&b(a)&&(goog.dependencies_.written[a]=!0)},goog.writeScriptTag_=function(a){return goog.inHtmlDocument_()?(goog.global.document.write('<script type="text/javascript" src="'+a+'"><\/script>'),!0):!1},goog.writeScripts_=function(){function a(e){if(!(e in d.written)){if(!(e in d.visited)&&(d.visited[e]= !0,e in d.requires))for(var h in d.requires[e])if(!goog.isProvided_(h))if(h in d.nameToPath)a(d.nameToPath[h]);else throw Error("Undefined nameToPath for "+h);e in c||(c[e]=!0,b.push(e))}}var b=[],c={},d=goog.dependencies_,e;for(e in goog.included_)d.written[e]||a(e);for(e=0;e<b.length;e++)if(b[e])goog.importScript_(goog.basePath+b[e]);else throw Error("Undefined script input");},goog.getPathFromDeps_=function(a){return a in goog.dependencies_.nameToPath?goog.dependencies_.nameToPath[a]:null},goog.findBasePath_(), goog.global.CLOSURE_NO_DEPS||goog.importScript_(goog.basePath+"deps.js"); goog.typeOf=function(a){var b=typeof a;if(b=="object")if(a){if(a instanceof Array)return"array";else if(a instanceof Object)return b;var c=Object.prototype.toString.call(a);if(c=="[object Window]")return"object";if(c=="[object Array]"||typeof a.length=="number"&&typeof a.splice!="undefined"&&typeof a.propertyIsEnumerable!="undefined"&&!a.propertyIsEnumerable("splice"))return"array";if(c=="[object Function]"||typeof a.call!="undefined"&&typeof a.propertyIsEnumerable!="undefined"&&!a.propertyIsEnumerable("call"))return"function"}else return"null"; else if(b=="function"&&typeof a.call=="undefined")return"object";return b};goog.propertyIsEnumerableCustom_=function(a,b){if(b in a)for(var c in a)if(c==b&&Object.prototype.hasOwnProperty.call(a,b))return!0;return!1};goog.propertyIsEnumerable_=function(a,b){return a instanceof Object?Object.prototype.propertyIsEnumerable.call(a,b):goog.propertyIsEnumerableCustom_(a,b)};goog.isDef=function(a){return a!==void 0};goog.isNull=function(a){return a===null};goog.isDefAndNotNull=function(a){return a!=null}; goog.isArray=function(a){return goog.typeOf(a)=="array"};goog.isArrayLike=function(a){var b=goog.typeOf(a);return b=="array"||b=="object"&&typeof a.length=="number"};goog.isDateLike=function(a){return goog.isObject(a)&&typeof a.getFullYear=="function"};goog.isString=function(a){return typeof a=="string"};goog.isBoolean=function(a){return typeof a=="boolean"};goog.isNumber=function(a){return typeof a=="number"};goog.isFunction=function(a){return goog.typeOf(a)=="function"}; goog.isObject=function(a){a=goog.typeOf(a);return a=="object"||a=="array"||a=="function"};goog.getUid=function(a){return a[goog.UID_PROPERTY_]||(a[goog.UID_PROPERTY_]=++goog.uidCounter_)};goog.removeUid=function(a){"removeAttribute"in a&&a.removeAttribute(goog.UID_PROPERTY_);try{delete a[goog.UID_PROPERTY_]}catch(b){}};goog.UID_PROPERTY_="closure_uid_"+Math.floor(Math.random()*2147483648).toString(36);goog.uidCounter_=0;goog.getHashCode=goog.getUid;goog.removeHashCode=goog.removeUid; goog.cloneObject=function(a){var b=goog.typeOf(a);if(b=="object"||b=="array"){if(a.clone)return a.clone();var b=b=="array"?[]:{},c;for(c in a)b[c]=goog.cloneObject(a[c]);return b}return a};goog.bindNative_=function(a,b,c){return a.call.apply(a.bind,arguments)}; goog.bindJs_=function(a,b,c){if(!a)throw Error();if(arguments.length>2){var d=Array.prototype.slice.call(arguments,2);return function(){var c=Array.prototype.slice.call(arguments);Array.prototype.unshift.apply(c,d);return a.apply(b,c)}}else return function(){return a.apply(b,arguments)}};goog.bind=function(a,b,c){goog.bind=Function.prototype.bind&&Function.prototype.bind.toString().indexOf("native code")!=-1?goog.bindNative_:goog.bindJs_;return goog.bind.apply(null,arguments)}; goog.partial=function(a,b){var c=Array.prototype.slice.call(arguments,1);return function(){var b=Array.prototype.slice.call(arguments);b.unshift.apply(b,c);return a.apply(this,b)}};goog.mixin=function(a,b){for(var c in b)a[c]=b[c]};goog.now=Date.now||function(){return+new Date}; goog.globalEval=function(a){if(goog.global.execScript)goog.global.execScript(a,"JavaScript");else if(goog.global.eval){if(goog.evalWorksForGlobals_==null)goog.global.eval("var _et_ = 1;"),typeof goog.global._et_!="undefined"?(delete goog.global._et_,goog.evalWorksForGlobals_=!0):goog.evalWorksForGlobals_=!1;if(goog.evalWorksForGlobals_)goog.global.eval(a);else{var b=goog.global.document,c=b.createElement("script");c.type="text/javascript";c.defer=!1;c.appendChild(b.createTextNode(a));b.body.appendChild(c); b.body.removeChild(c)}}else throw Error("goog.globalEval not available");};goog.evalWorksForGlobals_=null;goog.getCssName=function(a,b){var c=function(a){return goog.cssNameMapping_[a]||a},d;d=goog.cssNameMapping_?goog.cssNameMappingStyle_=="BY_WHOLE"?c:function(a){for(var a=a.split("-"),b=[],d=0;d<a.length;d++)b.push(c(a[d]));return b.join("-")}:function(a){return a};return b?a+"-"+d(b):d(a)};goog.setCssNameMapping=function(a,b){goog.cssNameMapping_=a;goog.cssNameMappingStyle_=b}; goog.getMsg=function(a,b){var c=b||{},d;for(d in c)var e=(""+c[d]).replace(/\$/g,"$$$$"),a=a.replace(RegExp("\\{\\$"+d+"\\}","gi"),e);return a};goog.exportSymbol=function(a,b,c){goog.exportPath_(a,b,c)};goog.exportProperty=function(a,b,c){a[b]=c};goog.inherits=function(a,b){function c(){}c.prototype=b.prototype;a.superClass_=b.prototype;a.prototype=new c;a.prototype.constructor=a}; goog.base=function(a,b,c){var d=arguments.callee.caller;if(d.superClass_)return d.superClass_.constructor.apply(a,Array.prototype.slice.call(arguments,1));for(var e=Array.prototype.slice.call(arguments,2),f=!1,h=a.constructor;h;h=h.superClass_&&h.superClass_.constructor)if(h.prototype[b]===d)f=!0;else if(f)return h.prototype[b].apply(a,e);if(a[b]===d)return a.constructor.prototype[b].apply(a,e);else throw Error("goog.base called from a method of one name to a method of a different name");}; goog.scope=function(a){a.call(goog.global)};var Zlib={};Zlib.Adler32=function(a){return Zlib.Adler32.update(1,a)};Zlib.Adler32.update=function(a,b){for(var c=a&65535,d=a>>>16&65535,e=0,f=b.length;e<f;e++)c=(c+b[e])%65521,d=(d+c)%65521;return d<<16|c};Zlib.BitStream=function(){this.bitindex=this.index=0;this.buffer=[]};Zlib.BitStream.prototype.writeBits=function(a,b,c){var d,e,f=this.buffer;for(d=0;d<b;d++)if(f[this.index]===void 0&&(f[this.index]=0),c?(e=a&1,a>>>=1):e=(a>>>b-d-1&1)===0?0:1,f[this.index]=f[this.index]<<1|e,this.bitindex++,this.bitindex===8)this.bitindex=0,this.reverseByte(this.index),this.index++}; Zlib.BitStream.prototype.finish=function(){this.bitindex>0&&(this.buffer[this.index]<<=8-this.bitindex);this.reverseByte(this.index);return this.buffer};Zlib.BitStream.prototype.reverseByte=function(a){var b=0,c=this.buffer[a],d;for(d=0;d<8;d++)b=b<<1|c&1,c>>>=1;this.buffer[a]=b;return this.buffer[a]};Zlib.Util={};Zlib.Util.convertNetworkByteOrder=function(a,b){var c=[],d;do d=a&255,c.unshift(d),a>>>=8;while(a>0);if(typeof b==="number")for(;c.length<b;)c.unshift(0);return c};Zlib.Util.slice=function(a,b,c){var d,e=a.length;if(a instanceof Array)return a.slice(b,b+c);d=[];for(var f=0;f<c;f++){if(b+f>=e)break;d.push(a[b+f])}return d}; Zlib.Util.concat=function(a,b){var c=a.length,d=b.length,e;if(a instanceof Array&&b instanceof Array){if(b.length>65535)for(e=0;e<d;e+=65535)Array.prototype.push.apply(a,b.slice(e,e+65535));else Array.prototype.push.apply(a,b);return a}for(e=0;e<d;e++)a[c+e]=b[e];return a};Zlib.Heap=function(a){this.buffer=Array(a*2);this.length=0};Zlib.Heap.prototype.getParent=function(a){return((a-2)/4|0)*2};Zlib.Heap.prototype.getChild=function(a){return 2*a+2};Zlib.Heap.prototype.push=function(a,b){var c,d,e=this.buffer,f;c=this.length;e[this.length++]=b;for(e[this.length++]=a;c>0;)if(d=this.getParent(c),e[c+1]<e[d+1])f=e[c],e[c]=e[d],e[d]=f,f=e[c+1],e[c+1]=e[d+1],e[d+1]=f,c=d;else break;return this.length}; Zlib.Heap.prototype.pop=function(){var a,b,c=this.buffer,d,e,f;b=c[0];a=c[1];this.length-=2;c[0]=c[this.length];c[1]=c[this.length+1];for(f=0;;){e=this.getChild(f);if(e>=this.length)break;e+2<this.length&&c[e+3]<c[e+1]&&(e+=2);if(c[f+1]>c[e+1])d=c[f],c[f]=c[e],c[e]=d,d=c[f+1],c[f+1]=c[e+1],c[e+1]=d;else break;f=e}return{index:a,value:b,length:this.length}};Zlib.RawDeflate=function(a){this.compressionType=a;this.matchTable={};this.freqsLitLen=[];this.freqsDist=[]};Zlib.RawDeflate.Lz77MinLength=3;Zlib.RawDeflate.Lz77MaxLength=258;Zlib.RawDeflate.WindowSize=32768;Zlib.RawDeflate.MaxCodeLength=16;Zlib.RawDeflate.HUFMAX=286; Zlib.RawDeflate.FixedHuffmanTable=function(){var a=[],b;for(b=0;b<288;b++)switch(!0){case b<=143:a.push([b-0+48,8]);break;case b<=255:a.push([b-144+400,9]);break;case b<=279:a.push([b-256+0,7]);break;case b<=287:a.push([b-280+192,8]);break;default:throw"invalid literal: "+b;}return a}(); Zlib.RawDeflate.prototype.dynamicHuffman=function(a,b,c,d){var e,f,h,i,g;d instanceof Zlib.BitStream||(d=new Zlib.BitStream);h=b[0];b=b[1];i=c[0];g=c[1];for(c=0,e=a.length;c<e;c++)if(f=a[c],d.writeBits(h[f],b[f],!0),f>256)d.writeBits(a[++c],a[++c],!0),d.writeBits(i[a[++c]],g[a[c]],!0),d.writeBits(a[++c],a[++c],!0);else if(f===256)break;return d}; Zlib.RawDeflate.prototype.fixedHuffman=function(a,b){var c,d,e;b instanceof Zlib.BitStream||(b=new Zlib.BitStream);for(c=0,d=a.length;c<d;c++)if(e=a[c],Zlib.BitStream.prototype.writeBits.apply(b,Zlib.RawDeflate.FixedHuffmanTable[e]),e>256)b.writeBits(a[++c],a[++c],!0),b.writeBits(a[++c],5),b.writeBits(a[++c],a[++c],!0);else if(e===256)break;return b.finish()};function Lz77Match(a,b){this.length=a;this.backwordDistance=b} Lz77Match.prototype.getLengthCode_=function(a){switch(!0){case a===3:a=[257,a-3,0];break;case a===4:a=[258,a-4,0];break;case a===5:a=[259,a-5,0];break;case a===6:a=[260,a-6,0];break;case a===7:a=[261,a-7,0];break;case a===8:a=[262,a-8,0];break;case a===9:a=[263,a-9,0];break;case a===10:a=[264,a-10,0];break;case a<=12:a=[265,a-11,1];break;case a<=14:a=[266,a-13,1];break;case a<=16:a=[267,a-15,1];break;case a<=18:a=[268,a-17,1];break;case a<=22:a=[269,a-19,2];break;case a<=26:a=[270,a-23,2];break;case a<= 30:a=[271,a-27,2];break;case a<=34:a=[272,a-31,2];break;case a<=42:a=[273,a-35,3];break;case a<=50:a=[274,a-43,3];break;case a<=58:a=[275,a-51,3];break;case a<=66:a=[276,a-59,3];break;case a<=82:a=[277,a-67,4];break;case a<=98:a=[278,a-83,4];break;case a<=114:a=[279,a-99,4];break;case a<=130:a=[280,a-115,4];break;case a<=162:a=[281,a-131,5];break;case a<=194:a=[282,a-163,5];break;case a<=226:a=[283,a-195,5];break;case a<=257:a=[284,a-227,5];break;case a===258:a=[285,a-258,0];break;default:throw"invalid length: "+ a;}return a}; Lz77Match.prototype.getDistanceCode_=function(a){switch(!0){case a===1:a=[0,a-1,0];break;case a===2:a=[1,a-2,0];break;case a===3:a=[2,a-3,0];break;case a===4:a=[3,a-4,0];break;case a<=6:a=[4,a-5,1];break;case a<=8:a=[5,a-7,1];break;case a<=12:a=[6,a-9,2];break;case a<=16:a=[7,a-13,2];break;case a<=24:a=[8,a-17,3];break;case a<=32:a=[9,a-25,3];break;case a<=48:a=[10,a-33,4];break;case a<=64:a=[11,a-49,4];break;case a<=96:a=[12,a-65,5];break;case a<=128:a=[13,a-97,5];break;case a<=192:a=[14,a-129,6]; break;case a<=256:a=[15,a-193,6];break;case a<=384:a=[16,a-257,7];break;case a<=512:a=[17,a-385,7];break;case a<=768:a=[18,a-513,8];break;case a<=1024:a=[19,a-769,8];break;case a<=1536:a=[20,a-1025,9];break;case a<=2048:a=[21,a-1537,9];break;case a<=3072:a=[22,a-2049,10];break;case a<=4096:a=[23,a-3073,10];break;case a<=6144:a=[24,a-4097,11];break;case a<=8192:a=[25,a-6145,11];break;case a<=12288:a=[26,a-8193,12];break;case a<=16384:a=[27,a-12289,12];break;case a<=24576:a=[28,a-16385,13];break;case a<= 32768:a=[29,a-24577,13];break;default:throw"invalid distance";}return a};Lz77Match.prototype.toLz77Array=function(){var a=this.backwordDistance,b=[];(0,Zlib.Util.concat)(b,this.getLengthCode_(this.length));(0,Zlib.Util.concat)(b,this.getDistanceCode_(a));return b}; Zlib.RawDeflate.prototype.lz77=function(a){var b,c,d,e,f,h,i=this.matchTable,g,j,k=[];g=0;var l,n=[],o=[];if(l=this.compressionType===Zlib.Deflate.CompressionType.DYNAMIC){for(d=0;d<=285;d++)n[d]=0;for(d=0;d<=29;d++)o[d]=0;n[256]=1}c=a.length;for(b=0;b<c;b++){h=(0,Zlib.Util.slice)(a,b,Zlib.RawDeflate.Lz77MinLength);if(h.length<Zlib.RawDeflate.Lz77MinLength&&g===0){(0,Zlib.Util.concat)(k,h);if(l)for(d=0,e=h.length;d<e;d++)n[h[d]]++;break}f=0;for(d=0,e=h.length;d<e;d++)f=f<<8|h[d]&255;i[f]===void 0&& (i[f]=[]);if(g>0)g--;else{d=i[f];h=d.length;for(e=0;e<h;e++)if(j=d[e],b-j>Zlib.RawDeflate.WindowSize)d.shift(),e--,h--;else break;d.length>0?(g=this.searchLongestMatch_(a,b,d),d=g.toLz77Array(),(0,Zlib.Util.concat)(k,d),l&&(n[d[0]]++,o[d[3]]++),g=g.length-1):(l&&n[a[b]]++,k.push(a[b]))}i[f].push(b)}if(l)n[256]++,this.freqsLitLen=n,this.freqsDist=o;k.push(256);return k}; Zlib.RawDeflate.prototype.searchLongestMatch_=function(a,b,c){var d,e,f,h,i,g,j=Zlib.RawDeflate.Lz77MinLength,k,l;f=Zlib.RawDeflate.Lz77MaxLength;d=c;c=[];for(e=j;e<f;e+=8){g=d.length;for(i=0;i<g;i++){h=d[i];l=!0;for(k=7;k>=0;k--)if(a[d[i]+e+k]!==a[b+e+k]){l=!1;break}l&&c.push(h)}if(c.length===0)break;d=c;c=[]}e>j&&e--;c=[];for(k=0;k<8&&e<f;k++){g=d.length;for(i=0;i<g;i++)a[d[i]+e]===a[b+e]&&c.push(d[i]);if(c.length===0)break;e++;d=c;c=[]}return new Lz77Match(e,b-Math.max.apply(this,d))}; Zlib.RawDeflate.prototype.getTreeSymbols_=function(a,b,c,d){var e=Array(a+c),f,h,i=Array(316),g=Array(19);for(f=h=0;f<a;f++)e[h++]=b[f];for(f=0;f<c;f++)e[h++]=d[f];for(f=0,b=g.length;f<b;f++)g[f]=0;c=0;for(f=0,b=e.length;f<b;f+=h){for(h=1;f+h<b&&e[f+h]===e[f];h++);a=h;if(e[f]===0)if(a<3)for(;a-- >0;)i[c++]=0,g[0]++;else for(;a>0;)d=a<138?a:138,d>a-3&&d<a&&(d=a-3),d<=10?(i[c++]=17,i[c++]=d-3,g[17]++):(i[c++]=18,i[c++]=d-11,g[18]++),a-=d;else if(i[c++]=e[f],g[e[f]]++,a--,a<3)for(;a-- >0;)i[c++]=e[f], g[e[f]]++;else for(;a>0;)d=a<6?a:6,d>a-3&&d<a&&(d=a-3),i[c++]=16,i[c++]=d-3,g[16]++,a-=d}return{codes:i.slice(0,c),freqs:g}}; Zlib.RawDeflate.prototype.getLengths_=function(a,b){var c=a.length,d,e=2*Zlib.RawDeflate.HUFMAX-1,f=new Zlib.Heap(2*Zlib.RawDeflate.HUFMAX),h=Array(e),i=Array(e),g,j;d=[];j=4294967295;var k;for(g=0;g<c;g++)a[g]===0?d.push(g):(j>a[g]&&(j=a[g]),k+=a[g]);for(g=0;c-d.length<2;g++)a[d.shift()]=1;if((b|0)>0){if(b!==7&&b!==15)throw"invalid limit number";g=b===15?2584:55;d=c-d.length;d=g-d;j=(0-j*g+d-1)/d|0;for(g=0;g<c;g++)a[g]!==0&&(a[g]+=j)}for(g=0;g<e;g++)h[g]=0,i[g]=0;for(g=0;g<c;g++)a[g]>0&&f.push(g, a[g]);for(g=Zlib.RawDeflate.HUFMAX;f.length>2;g++)e=f.pop(),j=f.pop(),h[e.index]=g,h[j.index]=g,f.push(g,e.value+j.value);for(;g>=0;g--)h[g]>0&&(i[g]=1+i[h[g]]);return i.slice(0,c)}; Zlib.RawDeflate.prototype.getCodesFromLengths_=function(a){var b=Array(a.length),c=[],d=[],e=0,f,h,i;for(f=0,h=a.length;f<h;f++)c[a[f]]=(c[a[f]]|0)+1;for(f=1,h=Zlib.RawDeflate.MaxCodeLength;f<=h;f++){d[f]=e;e+=c[f]|0;if(e>1<<f)throw"overcommitted";e<<=1}if(e<1<<Zlib.RawDeflate.MaxCodeLength)throw"undercommitted";for(f=0,h=a.length;f<h;f++){e=d[a[f]];d[a[f]]+=1;b[f]=0;for(c=0,i=a[f];c<i;c++)b[f]=b[f]<<1|e&1,e>>>=1}return b};Zlib.Deflate=function(a,b){this.buffer=a;this.compressionType=Zlib.Deflate.CompressionType.DYNAMIC;if(typeof b==="object"&&typeof b.compressionType==="number")this.compressionType=b.compressionType;this.rawDeflate=new Zlib.RawDeflate(this.compressionType)};Zlib.Deflate.CompressionType={NONE:0,FIXED:1,DYNAMIC:2,RESERVED:3};Zlib.Deflate.compress=function(a,b){return(new Zlib.Deflate(a,b)).compress()}; Zlib.Deflate.prototype.compress=function(){var a,b,c,d,e;b=Zlib.CompressionMethod.DEFLATE;switch(b){case Zlib.CompressionMethod.DEFLATE:a=Math.LOG2E*Math.log(Zlib.RawDeflate.WindowSize)-8;break;default:throw"invalid compression method";}a=a<<4|b;switch(b){case Zlib.CompressionMethod.DEFLATE:switch(this.compressionType){case Zlib.Deflate.CompressionType.NONE:b=0;break;case Zlib.Deflate.CompressionType.FIXED:b=1;break;case Zlib.Deflate.CompressionType.DYNAMIC:b=2;break;default:throw"unsupported compression type"; }break;default:throw"invalid compression method";}b=b<<6|0;b|=31-(a*256+b)%31;d=(0,Zlib.Util.convertNetworkByteOrder)(Zlib.Adler32(this.buffer),4);c=this.makeBlocks();e=[];e.push(a,b);(0,Zlib.Util.concat)(e,c);(0,Zlib.Util.concat)(e,d);return e}; Zlib.Deflate.prototype.makeBlocks=function(){var a=[],b,c,d;if(typeof this.buffer==="string")this.buffer=this.buffer.split("").map(function(a){return a.charCodeAt(0)});switch(this.compressionType){case Zlib.Deflate.CompressionType.NONE:for(c=0,d=this.buffer.length;c<d;)b=(0,Zlib.Util.slice)(this.buffer,c,65535),c+=b.length,(0,Zlib.Util.concat)(a,this.makeNocompressBlock(b,c===d));break;case Zlib.Deflate.CompressionType.FIXED:(0,Zlib.Util.concat)(a,this.makeFixedHuffmanBlock(this.buffer,!0));break; case Zlib.Deflate.CompressionType.DYNAMIC:(0,Zlib.Util.concat)(a,this.makeDynamicHuffmanBlock(this.buffer,!0));break;default:throw"invalid compression type";}return a};Zlib.Deflate.prototype.makeNocompressBlock=function(a,b){var c=[],d,e;c.push((b?1:0)|Zlib.Deflate.CompressionType.NONE<<1);d=a.length;e=~d+65536&65535;c.push(d&255,d>>>8&255,e&255,e>>>8&255);Array.prototype.unshift.apply(a,c);return a}; Zlib.Deflate.prototype.makeFixedHuffmanBlock=function(a,b){var c=new Zlib.BitStream,d,e;d=Zlib.Deflate.CompressionType.FIXED;c.writeBits(b?1:0,1,!0);c.writeBits(d,2,!0);e=this.rawDeflate;d=e.lz77(a);return d=e.fixedHuffman(d,c)}; Zlib.Deflate.prototype.makeDynamicHuffmanBlock=function(a,b){var c=new Zlib.BitStream,d,e,f,h,i,g=[16,17,18,0,8,7,9,6,10,5,11,4,12,3,13,2,14,1,15],j,k,l,n,o,q,p=Array(19),m;d=Zlib.Deflate.CompressionType.DYNAMIC;c.writeBits(b?1:0,1,!0);c.writeBits(d,2,!0);e=this.rawDeflate;d=e.lz77(a);j=e.getLengths_(e.freqsLitLen);k=e.getCodesFromLengths_(j);l=e.getLengths_(e.freqsDist);n=e.getCodesFromLengths_(l);for(f=286;f>257&&j[f-1]===0;f--);for(h=30;h>1&&l[h-1]===0;h--);o=e.getTreeSymbols_(f,j,h,l);q=e.getLengths_(o.freqs, 7);for(m=0;m<19;m++)p[m]=q[g[m]];for(i=19;i>4&&p[i-1]===0;i--);g=e.getLengths_(o.freqs);q=e.getCodesFromLengths_(g);c.writeBits(f-257,5,!0);c.writeBits(h-1,5,!0);c.writeBits(i-4,4,!0);for(m=0;m<i;m++)c.writeBits(p[m],3,!0);for(m=0,p=o.codes.length;m<p;m++)if(f=o.codes[m],c.writeBits(q[f],g[f],!0),f>=16){m++;switch(f){case 16:f=2;break;case 17:f=3;break;case 18:f=7;break;default:throw"invalid code: "+f;}c.writeBits(o.codes[m],f,!0)}e.dynamicHuffman(d,[k,j],[n,l],c);return c.finish()}; Zlib.Deflate.NO_EXPORT=!1;Zlib.Deflate.NO_EXPORT||(goog.exportSymbol("Zlib.Deflate",Zlib.Deflate),goog.exportSymbol("Zlib.Deflate.CompressionType",Zlib.Deflate.CompressionType),goog.exportSymbol("Zlib.Deflate.compress",Zlib.Deflate.compress));Zlib.CompressionMethod={DEFLATE:8,RESERVED:15};})(); use an iframe compat browser, deer Play on jsdo.it games Author Share ブログに埋め込む QR Tag Download Complete! Description どんなゲームですか? Zlib(RFC1950), Deflate(RFC1951) のエンコード実装 Deflateは非圧縮、固定ハフマン符号、動的ハフマン符号(カスタムハフマンテーブル)に対応 ただし LZ77 符号化の lazy match は実装していないため、既存のエンコーダの高圧縮設定より圧縮率が下がる可能性がある。 ソースコードは https://github.com/imaya/canvas2png で公開しています。 Control Device スマートフォンコントローラー jsdo.it WebSocket Controller» マウス キーボード タッチデバイス Fullscreen 有効 無効 jsdo.it games から削除する Submit Author imaya URLhttp://twitter.com/y_imaya Tweet Default Panel Auto play Screenshot Readme JavaScript HTML CSS Size Width: px Height: px code <script type="text/javascript" src="http://jsdo.it/blogparts/idO5/js"></script> 実行画面をスマートフォンで確認できます。お父さん QR - App Store deflate zlib Discussion このコードについて質問してみる! Tags deflate zlib