| 23104 | * in the bit length tree. |
| 23105 | */ |
| 23106 | function scan_tree(s, tree, max_code) |
| 23107 | // deflate_state *s; |
| 23108 | // ct_data *tree; /* the tree to be scanned */ |
| 23109 | // int max_code; /* and its largest code of non zero frequency */ |
| 23110 | { |
| 23111 | var n; /* iterates over all tree elements */ |
| 23112 | var prevlen = -1; /* last emitted length */ |
| 23113 | var curlen; /* length of current code */ |
| 23114 | |
| 23115 | var nextlen = tree[0 * 2 + 1]/*.Len*/; /* length of next code */ |
| 23116 | |
| 23117 | var count = 0; /* repeat count of the current code */ |
| 23118 | var max_count = 7; /* max repeat count */ |
| 23119 | var min_count = 4; /* min repeat count */ |
| 23120 | |
| 23121 | if (nextlen === 0) { |
| 23122 | max_count = 138; |
| 23123 | min_count = 3; |
| 23124 | } |
| 23125 | tree[(max_code + 1) * 2 + 1]/*.Len*/ = 0xffff; /* guard */ |
| 23126 | |
| 23127 | for (n = 0; n <= max_code; n++) { |
| 23128 | curlen = nextlen; |
| 23129 | nextlen = tree[(n + 1) * 2 + 1]/*.Len*/; |
| 23130 | |
| 23131 | if (++count < max_count && curlen === nextlen) { |
| 23132 | continue; |
| 23133 | |
| 23134 | } else if (count < min_count) { |
| 23135 | s.bl_tree[curlen * 2]/*.Freq*/ += count; |
| 23136 | |
| 23137 | } else if (curlen !== 0) { |
| 23138 | |
| 23139 | if (curlen !== prevlen) { s.bl_tree[curlen * 2]/*.Freq*/++; } |
| 23140 | s.bl_tree[REP_3_6 * 2]/*.Freq*/++; |
| 23141 | |
| 23142 | } else if (count <= 10) { |
| 23143 | s.bl_tree[REPZ_3_10 * 2]/*.Freq*/++; |
| 23144 | |
| 23145 | } else { |
| 23146 | s.bl_tree[REPZ_11_138 * 2]/*.Freq*/++; |
| 23147 | } |
| 23148 | |
| 23149 | count = 0; |
| 23150 | prevlen = curlen; |
| 23151 | |
| 23152 | if (nextlen === 0) { |
| 23153 | max_count = 138; |
| 23154 | min_count = 3; |
| 23155 | |
| 23156 | } else if (curlen === nextlen) { |
| 23157 | max_count = 6; |
| 23158 | min_count = 3; |
| 23159 | |
| 23160 | } else { |
| 23161 | max_count = 7; |
| 23162 | min_count = 4; |
| 23163 | } |