util.ts 4.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136
  1. /**
  2. * Copyright (c) 2020 mol* contributors, licensed under MIT, See LICENSE file for more info.
  3. *
  4. * @author Alexander Rose <alexander.rose@weirdbyte.de>
  5. *
  6. * ported from https://github.com/photopea/UZIP.js/blob/master/UZIP.js
  7. * MIT License, Copyright (c) 2018 Photopea
  8. */
  9. export const U = (function (){
  10. const u16 = Uint16Array, u32 = Uint32Array;
  11. return {
  12. next_code: new u16(16),
  13. bl_count: new u16(16),
  14. ordr: [16, 17, 18, 0, 8, 7, 9, 6, 10, 5, 11, 4, 12, 3, 13, 2, 14, 1, 15],
  15. of0: [3, 4, 5, 6, 7, 8, 9, 10, 11, 13, 15, 17, 19, 23, 27, 31, 35, 43, 51, 59, 67, 83, 99, 115, 131, 163, 195, 227, 258, 999, 999, 999],
  16. exb: [0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3, 4, 4, 4, 4, 5, 5, 5, 5, 0, 0, 0, 0],
  17. ldef: new u16(32),
  18. df0: [1, 2, 3, 4, 5, 7, 9, 13, 17, 25, 33, 49, 65, 97, 129, 193, 257, 385, 513, 769, 1025, 1537, 2049, 3073, 4097, 6145, 8193, 12289, 16385, 24577, 65535, 65535],
  19. dxb: [0, 0, 0, 0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 7, 7, 8, 8, 9, 9, 10, 10, 11, 11, 12, 12, 13, 13, 0, 0],
  20. ddef: new u32(32),
  21. flmap: new u16(512), fltree: [] as number[],
  22. fdmap: new u16(32), fdtree: [] as number[],
  23. lmap: new u16(32768), ltree: [] as number[], ttree: [] as number[],
  24. dmap: new u16(32768), dtree: [] as number[],
  25. imap: new u16(512), itree: [] as number[],
  26. // rev9 : new u16( 512)
  27. rev15: new u16(1 << 15),
  28. lhst: new u32(286), dhst: new u32(30), ihst: new u32(19),
  29. lits: new u32(15000),
  30. strt: new u16(1 << 16),
  31. prev: new u16(1 << 15)
  32. };
  33. })();
  34. (function (){
  35. const len = 1 << 15;
  36. for(let i = 0; i < len; i++) {
  37. let x = i;
  38. x = (((x & 0xaaaaaaaa) >>> 1) | ((x & 0x55555555) << 1));
  39. x = (((x & 0xcccccccc) >>> 2) | ((x & 0x33333333) << 2));
  40. x = (((x & 0xf0f0f0f0) >>> 4) | ((x & 0x0f0f0f0f) << 4));
  41. x = (((x & 0xff00ff00) >>> 8) | ((x & 0x00ff00ff) << 8));
  42. U.rev15[i] = (((x >>> 16) | (x << 16))) >>> 17;
  43. }
  44. function pushV(tgt: number[], n: number, sv: number) {
  45. while(n-- !== 0) tgt.push(0, sv);
  46. }
  47. for(let i = 0; i < 32; i++) {
  48. U.ldef[i] = (U.of0[i] << 3) | U.exb[i];
  49. U.ddef[i] = (U.df0[i] << 4) | U.dxb[i];
  50. }
  51. pushV(U.fltree, 144, 8);
  52. pushV(U.fltree, 255 - 143, 9);
  53. pushV(U.fltree, 279 - 255, 7);
  54. pushV(U.fltree, 287 - 279, 8);
  55. /*
  56. var i = 0;
  57. for(; i<=143; i++) U.fltree.push(0,8);
  58. for(; i<=255; i++) U.fltree.push(0,9);
  59. for(; i<=279; i++) U.fltree.push(0,7);
  60. for(; i<=287; i++) U.fltree.push(0,8);
  61. */
  62. makeCodes(U.fltree, 9);
  63. codes2map(U.fltree, 9, U.flmap);
  64. revCodes (U.fltree, 9);
  65. pushV(U.fdtree, 32, 5);
  66. // for(i=0;i<32; i++) U.fdtree.push(0,5);
  67. makeCodes(U.fdtree, 5);
  68. codes2map(U.fdtree, 5, U.fdmap);
  69. revCodes (U.fdtree, 5);
  70. pushV(U.itree, 19, 0); pushV(U.ltree, 286, 0); pushV(U.dtree, 30, 0); pushV(U.ttree, 320, 0);
  71. /*
  72. for(var i=0; i< 19; i++) U.itree.push(0,0);
  73. for(var i=0; i<286; i++) U.ltree.push(0,0);
  74. for(var i=0; i< 30; i++) U.dtree.push(0,0);
  75. for(var i=0; i<320; i++) U.ttree.push(0,0);
  76. */
  77. })();
  78. export function codes2map(tree: number[], MAX_BITS: number, map: Uint16Array) {
  79. const max_code = tree.length;
  80. const r15 = U.rev15;
  81. for(let i = 0; i < max_code; i += 2) {
  82. if(tree[i + 1] !== 0) {
  83. const lit = i >> 1;
  84. const cl = tree[i + 1], val = (lit << 4) | cl; // : (0x8000 | (U.of0[lit-257]<<7) | (U.exb[lit-257]<<4) | cl);
  85. const rest = (MAX_BITS - cl);
  86. let i0 = tree[i] << rest;
  87. const i1 = i0 + (1 << rest);
  88. // tree[i]=r15[i0]>>>(15-MAX_BITS);
  89. while(i0 !== i1) {
  90. const p0 = r15[i0] >>> (15 - MAX_BITS);
  91. map[p0] = val; i0++;
  92. }
  93. }
  94. }
  95. }
  96. export function makeCodes(tree: number[], MAX_BITS: number) { // code, length
  97. const max_code = tree.length;
  98. const bl_count = U.bl_count;
  99. for(let i = 0; i <= MAX_BITS; i++) bl_count[i] = 0;
  100. for(let i = 1; i < max_code; i += 2) bl_count[tree[i]]++;
  101. const next_code = U.next_code; // smallest code for each length
  102. let code = 0;
  103. bl_count[0] = 0;
  104. for (let bits = 1; bits <= MAX_BITS; bits++) {
  105. code = (code + bl_count[bits - 1]) << 1;
  106. next_code[bits] = code;
  107. }
  108. for (let n = 0; n < max_code; n += 2) {
  109. const len = tree[n + 1];
  110. if (len !== 0) {
  111. tree[n] = next_code[len];
  112. next_code[len]++;
  113. }
  114. }
  115. }
  116. export function revCodes(tree: number[], MAX_BITS: number) {
  117. const r15 = U.rev15, imb = 15 - MAX_BITS;
  118. for(let i = 0; i < tree.length; i += 2) {
  119. const i0 = (tree[i] << (MAX_BITS - tree[i + 1]));
  120. tree[i] = r15[i0] >>> imb;
  121. }
  122. }