index.js 9.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375
  1. var TINF_OK = 0;
  2. var TINF_DATA_ERROR = -3;
  3. function Tree() {
  4. this.table = new Uint16Array(16); /* table of code length counts */
  5. this.trans = new Uint16Array(288); /* code -> symbol translation table */
  6. }
  7. function Data(source, dest) {
  8. this.source = source;
  9. this.sourceIndex = 0;
  10. this.tag = 0;
  11. this.bitcount = 0;
  12. this.dest = dest;
  13. this.destLen = 0;
  14. this.ltree = new Tree(); /* dynamic length/symbol tree */
  15. this.dtree = new Tree(); /* dynamic distance tree */
  16. }
  17. /* --------------------------------------------------- *
  18. * -- uninitialized global data (static structures) -- *
  19. * --------------------------------------------------- */
  20. var sltree = new Tree();
  21. var sdtree = new Tree();
  22. /* extra bits and base tables for length codes */
  23. var length_bits = new Uint8Array(30);
  24. var length_base = new Uint16Array(30);
  25. /* extra bits and base tables for distance codes */
  26. var dist_bits = new Uint8Array(30);
  27. var dist_base = new Uint16Array(30);
  28. /* special ordering of code length codes */
  29. var clcidx = new Uint8Array([
  30. 16, 17, 18, 0, 8, 7, 9, 6,
  31. 10, 5, 11, 4, 12, 3, 13, 2,
  32. 14, 1, 15
  33. ]);
  34. /* used by tinf_decode_trees, avoids allocations every call */
  35. var code_tree = new Tree();
  36. var lengths = new Uint8Array(288 + 32);
  37. /* ----------------------- *
  38. * -- utility functions -- *
  39. * ----------------------- */
  40. /* build extra bits and base tables */
  41. function tinf_build_bits_base(bits, base, delta, first) {
  42. var i, sum;
  43. /* build bits table */
  44. for (i = 0; i < delta; ++i) bits[i] = 0;
  45. for (i = 0; i < 30 - delta; ++i) bits[i + delta] = i / delta | 0;
  46. /* build base table */
  47. for (sum = first, i = 0; i < 30; ++i) {
  48. base[i] = sum;
  49. sum += 1 << bits[i];
  50. }
  51. }
  52. /* build the fixed huffman trees */
  53. function tinf_build_fixed_trees(lt, dt) {
  54. var i;
  55. /* build fixed length tree */
  56. for (i = 0; i < 7; ++i) lt.table[i] = 0;
  57. lt.table[7] = 24;
  58. lt.table[8] = 152;
  59. lt.table[9] = 112;
  60. for (i = 0; i < 24; ++i) lt.trans[i] = 256 + i;
  61. for (i = 0; i < 144; ++i) lt.trans[24 + i] = i;
  62. for (i = 0; i < 8; ++i) lt.trans[24 + 144 + i] = 280 + i;
  63. for (i = 0; i < 112; ++i) lt.trans[24 + 144 + 8 + i] = 144 + i;
  64. /* build fixed distance tree */
  65. for (i = 0; i < 5; ++i) dt.table[i] = 0;
  66. dt.table[5] = 32;
  67. for (i = 0; i < 32; ++i) dt.trans[i] = i;
  68. }
  69. /* given an array of code lengths, build a tree */
  70. var offs = new Uint16Array(16);
  71. function tinf_build_tree(t, lengths, off, num) {
  72. var i, sum;
  73. /* clear code length count table */
  74. for (i = 0; i < 16; ++i) t.table[i] = 0;
  75. /* scan symbol lengths, and sum code length counts */
  76. for (i = 0; i < num; ++i) t.table[lengths[off + i]]++;
  77. t.table[0] = 0;
  78. /* compute offset table for distribution sort */
  79. for (sum = 0, i = 0; i < 16; ++i) {
  80. offs[i] = sum;
  81. sum += t.table[i];
  82. }
  83. /* create code->symbol translation table (symbols sorted by code) */
  84. for (i = 0; i < num; ++i) {
  85. if (lengths[off + i]) t.trans[offs[lengths[off + i]]++] = i;
  86. }
  87. }
  88. /* ---------------------- *
  89. * -- decode functions -- *
  90. * ---------------------- */
  91. /* get one bit from source stream */
  92. function tinf_getbit(d) {
  93. /* check if tag is empty */
  94. if (!d.bitcount--) {
  95. /* load next tag */
  96. d.tag = d.source[d.sourceIndex++];
  97. d.bitcount = 7;
  98. }
  99. /* shift bit out of tag */
  100. var bit = d.tag & 1;
  101. d.tag >>>= 1;
  102. return bit;
  103. }
  104. /* read a num bit value from a stream and add base */
  105. function tinf_read_bits(d, num, base) {
  106. if (!num)
  107. return base;
  108. while (d.bitcount < 24) {
  109. d.tag |= d.source[d.sourceIndex++] << d.bitcount;
  110. d.bitcount += 8;
  111. }
  112. var val = d.tag & (0xffff >>> (16 - num));
  113. d.tag >>>= num;
  114. d.bitcount -= num;
  115. return val + base;
  116. }
  117. /* given a data stream and a tree, decode a symbol */
  118. function tinf_decode_symbol(d, t) {
  119. while (d.bitcount < 24) {
  120. d.tag |= d.source[d.sourceIndex++] << d.bitcount;
  121. d.bitcount += 8;
  122. }
  123. var sum = 0, cur = 0, len = 0;
  124. var tag = d.tag;
  125. /* get more bits while code value is above sum */
  126. do {
  127. cur = 2 * cur + (tag & 1);
  128. tag >>>= 1;
  129. ++len;
  130. sum += t.table[len];
  131. cur -= t.table[len];
  132. } while (cur >= 0);
  133. d.tag = tag;
  134. d.bitcount -= len;
  135. return t.trans[sum + cur];
  136. }
  137. /* given a data stream, decode dynamic trees from it */
  138. function tinf_decode_trees(d, lt, dt) {
  139. var hlit, hdist, hclen;
  140. var i, num, length;
  141. /* get 5 bits HLIT (257-286) */
  142. hlit = tinf_read_bits(d, 5, 257);
  143. /* get 5 bits HDIST (1-32) */
  144. hdist = tinf_read_bits(d, 5, 1);
  145. /* get 4 bits HCLEN (4-19) */
  146. hclen = tinf_read_bits(d, 4, 4);
  147. for (i = 0; i < 19; ++i) lengths[i] = 0;
  148. /* read code lengths for code length alphabet */
  149. for (i = 0; i < hclen; ++i) {
  150. /* get 3 bits code length (0-7) */
  151. var clen = tinf_read_bits(d, 3, 0);
  152. lengths[clcidx[i]] = clen;
  153. }
  154. /* build code length tree */
  155. tinf_build_tree(code_tree, lengths, 0, 19);
  156. /* decode code lengths for the dynamic trees */
  157. for (num = 0; num < hlit + hdist;) {
  158. var sym = tinf_decode_symbol(d, code_tree);
  159. switch (sym) {
  160. case 16:
  161. /* copy previous code length 3-6 times (read 2 bits) */
  162. var prev = lengths[num - 1];
  163. for (length = tinf_read_bits(d, 2, 3); length; --length) {
  164. lengths[num++] = prev;
  165. }
  166. break;
  167. case 17:
  168. /* repeat code length 0 for 3-10 times (read 3 bits) */
  169. for (length = tinf_read_bits(d, 3, 3); length; --length) {
  170. lengths[num++] = 0;
  171. }
  172. break;
  173. case 18:
  174. /* repeat code length 0 for 11-138 times (read 7 bits) */
  175. for (length = tinf_read_bits(d, 7, 11); length; --length) {
  176. lengths[num++] = 0;
  177. }
  178. break;
  179. default:
  180. /* values 0-15 represent the actual code lengths */
  181. lengths[num++] = sym;
  182. break;
  183. }
  184. }
  185. /* build dynamic trees */
  186. tinf_build_tree(lt, lengths, 0, hlit);
  187. tinf_build_tree(dt, lengths, hlit, hdist);
  188. }
  189. /* ----------------------------- *
  190. * -- block inflate functions -- *
  191. * ----------------------------- */
  192. /* given a stream and two trees, inflate a block of data */
  193. function tinf_inflate_block_data(d, lt, dt) {
  194. while (1) {
  195. var sym = tinf_decode_symbol(d, lt);
  196. /* check for end of block */
  197. if (sym === 256) {
  198. return TINF_OK;
  199. }
  200. if (sym < 256) {
  201. d.dest[d.destLen++] = sym;
  202. } else {
  203. var length, dist, offs;
  204. var i;
  205. sym -= 257;
  206. /* possibly get more bits from length code */
  207. length = tinf_read_bits(d, length_bits[sym], length_base[sym]);
  208. dist = tinf_decode_symbol(d, dt);
  209. /* possibly get more bits from distance code */
  210. offs = d.destLen - tinf_read_bits(d, dist_bits[dist], dist_base[dist]);
  211. /* copy match */
  212. for (i = offs; i < offs + length; ++i) {
  213. d.dest[d.destLen++] = d.dest[i];
  214. }
  215. }
  216. }
  217. }
  218. /* inflate an uncompressed block of data */
  219. function tinf_inflate_uncompressed_block(d) {
  220. var length, invlength;
  221. var i;
  222. /* unread from bitbuffer */
  223. while (d.bitcount > 8) {
  224. d.sourceIndex--;
  225. d.bitcount -= 8;
  226. }
  227. /* get length */
  228. length = d.source[d.sourceIndex + 1];
  229. length = 256 * length + d.source[d.sourceIndex];
  230. /* get one's complement of length */
  231. invlength = d.source[d.sourceIndex + 3];
  232. invlength = 256 * invlength + d.source[d.sourceIndex + 2];
  233. /* check length */
  234. if (length !== (~invlength & 0x0000ffff))
  235. return TINF_DATA_ERROR;
  236. d.sourceIndex += 4;
  237. /* copy block */
  238. for (i = length; i; --i)
  239. d.dest[d.destLen++] = d.source[d.sourceIndex++];
  240. /* make sure we start next block on a byte boundary */
  241. d.bitcount = 0;
  242. return TINF_OK;
  243. }
  244. /* inflate stream from source to dest */
  245. function tinf_uncompress(source, dest) {
  246. var d = new Data(source, dest);
  247. var bfinal, btype, res;
  248. do {
  249. /* read final block flag */
  250. bfinal = tinf_getbit(d);
  251. /* read block type (2 bits) */
  252. btype = tinf_read_bits(d, 2, 0);
  253. /* decompress block */
  254. switch (btype) {
  255. case 0:
  256. /* decompress uncompressed block */
  257. res = tinf_inflate_uncompressed_block(d);
  258. break;
  259. case 1:
  260. /* decompress block with fixed huffman trees */
  261. res = tinf_inflate_block_data(d, sltree, sdtree);
  262. break;
  263. case 2:
  264. /* decompress block with dynamic huffman trees */
  265. tinf_decode_trees(d, d.ltree, d.dtree);
  266. res = tinf_inflate_block_data(d, d.ltree, d.dtree);
  267. break;
  268. default:
  269. res = TINF_DATA_ERROR;
  270. }
  271. if (res !== TINF_OK)
  272. throw new Error('Data error');
  273. } while (!bfinal);
  274. if (d.destLen < d.dest.length) {
  275. if (typeof d.dest.slice === 'function')
  276. return d.dest.slice(0, d.destLen);
  277. else
  278. return d.dest.subarray(0, d.destLen);
  279. }
  280. return d.dest;
  281. }
  282. /* -------------------- *
  283. * -- initialization -- *
  284. * -------------------- */
  285. /* build fixed huffman trees */
  286. tinf_build_fixed_trees(sltree, sdtree);
  287. /* build extra bits and base tables */
  288. tinf_build_bits_base(length_bits, length_base, 4, 3);
  289. tinf_build_bits_base(dist_bits, dist_base, 2, 1);
  290. /* fix a special case */
  291. length_bits[28] = 0;
  292. length_base[28] = 258;
  293. module.exports = tinf_uncompress;