| 59 | // mb (max bits) must be at most 15 |
| 60 | // TODO: optimize/split up? |
| 61 | var hMap = function (cd, mb, r) { |
| 62 | var s = cd.length; |
| 63 | // index |
| 64 | var i = 0; |
| 65 | // u16 "map": index -> # of codes with bit length = index |
| 66 | var l = new u16(mb); |
| 67 | // length of cd must be 288 (total # of codes) |
| 68 | for (; i < s; ++i) { |
| 69 | if (cd[i]) ++l[cd[i] - 1]; |
| 70 | } |
| 71 | // u16 "map": index -> minimum code for bit length = index |
| 72 | var le = new u16(mb); |
| 73 | for (i = 1; i < mb; ++i) { |
| 74 | le[i] = (le[i - 1] + l[i - 1]) << 1; |
| 75 | } |
| 76 | var co; |
| 77 | if (r) { |
| 78 | // u16 "map": index -> number of actual bits, symbol for code |
| 79 | co = new u16(1 << mb); |
| 80 | // bits to remove for reverser |
| 81 | var rvb = 15 - mb; |
| 82 | for (i = 0; i < s; ++i) { |
| 83 | // ignore 0 lengths |
| 84 | if (cd[i]) { |
| 85 | // num encoding both symbol and bits read |
| 86 | var sv = (i << 4) | cd[i]; |
| 87 | // free bits |
| 88 | var r_1 = mb - cd[i]; |
| 89 | // start value |
| 90 | var v = le[cd[i] - 1]++ << r_1; |
| 91 | // m is end value |
| 92 | for (var m = v | ((1 << r_1) - 1); v <= m; ++v) { |
| 93 | // every 16 bit value starting with the code yields the same result |
| 94 | co[rev[v] >> rvb] = sv; |
| 95 | } |
| 96 | } |
| 97 | } |
| 98 | } else { |
| 99 | co = new u16(s); |
| 100 | for (i = 0; i < s; ++i) { |
| 101 | if (cd[i]) { |
| 102 | co[i] = rev[le[cd[i] - 1]++] >> (15 - cd[i]); |
| 103 | } |
| 104 | } |
| 105 | } |
| 106 | return co; |
| 107 | }; |
| 108 | // fixed length tree |
| 109 | var flt = new u8(288); |
| 110 | for (var i = 0; i < 144; ++i) flt[i] = 8; |