| 11122 | * in the bit length tree. |
| 11123 | */ |
| 11124 | function scan_tree(s, tree, max_code) |
| 11125 | // deflate_state *s; |
| 11126 | // ct_data *tree; /* the tree to be scanned */ |
| 11127 | // int max_code; /* and its largest code of non zero frequency */ |
| 11128 | { |
| 11129 | var n; /* iterates over all tree elements */ |
| 11130 | var prevlen = -1; /* last emitted length */ |
| 11131 | var curlen; /* length of current code */ |
| 11132 | |
| 11133 | var nextlen = tree[0 * 2 + 1]/*.Len*/; /* length of next code */ |
| 11134 | |
| 11135 | var count = 0; /* repeat count of the current code */ |
| 11136 | var max_count = 7; /* max repeat count */ |
| 11137 | var min_count = 4; /* min repeat count */ |
| 11138 | |
| 11139 | if (nextlen === 0) { |
| 11140 | max_count = 138; |
| 11141 | min_count = 3; |
| 11142 | } |
| 11143 | tree[(max_code + 1) * 2 + 1]/*.Len*/ = 0xffff; /* guard */ |
| 11144 | |
| 11145 | for (n = 0; n <= max_code; n++) { |
| 11146 | curlen = nextlen; |
| 11147 | nextlen = tree[(n + 1) * 2 + 1]/*.Len*/; |
| 11148 | |
| 11149 | if (++count < max_count && curlen === nextlen) { |
| 11150 | continue; |
| 11151 | |
| 11152 | } else if (count < min_count) { |
| 11153 | s.bl_tree[curlen * 2]/*.Freq*/ += count; |
| 11154 | |
| 11155 | } else if (curlen !== 0) { |
| 11156 | |
| 11157 | if (curlen !== prevlen) { s.bl_tree[curlen * 2]/*.Freq*/++; } |
| 11158 | s.bl_tree[REP_3_6 * 2]/*.Freq*/++; |
| 11159 | |
| 11160 | } else if (count <= 10) { |
| 11161 | s.bl_tree[REPZ_3_10 * 2]/*.Freq*/++; |
| 11162 | |
| 11163 | } else { |
| 11164 | s.bl_tree[REPZ_11_138 * 2]/*.Freq*/++; |
| 11165 | } |
| 11166 | |
| 11167 | count = 0; |
| 11168 | prevlen = curlen; |
| 11169 | |
| 11170 | if (nextlen === 0) { |
| 11171 | max_count = 138; |
| 11172 | min_count = 3; |
| 11173 | |
| 11174 | } else if (curlen === nextlen) { |
| 11175 | max_count = 6; |
| 11176 | min_count = 3; |
| 11177 | |
| 11178 | } else { |
| 11179 | max_count = 7; |
| 11180 | min_count = 4; |
| 11181 | } |