(tableGroup: Int32Array, tableIdx: number, rootBits: number, codeLengths: Int32Array, codeLengthsSize: number)
| 1497 | return bits - rootBits; |
| 1498 | } |
| 1499 | function buildHuffmanTable(tableGroup: Int32Array, tableIdx: number, rootBits: number, codeLengths: Int32Array, codeLengthsSize: number): number { |
| 1500 | const tableOffset: number = tableGroup[tableIdx]; |
| 1501 | const sorted = new Int32Array(codeLengthsSize); |
| 1502 | const count = new Int32Array(16); |
| 1503 | const offset = new Int32Array(16); |
| 1504 | for (let sym = 0; sym < codeLengthsSize; ++sym) { |
| 1505 | count[codeLengths[sym]]++; |
| 1506 | } |
| 1507 | offset[1] = 0; |
| 1508 | for (let len = 1; len < 15; ++len) { |
| 1509 | offset[len + 1] = offset[len] + count[len]; |
| 1510 | } |
| 1511 | for (let sym = 0; sym < codeLengthsSize; ++sym) { |
| 1512 | if (codeLengths[sym] !== 0) { |
| 1513 | sorted[offset[codeLengths[sym]]++] = sym; |
| 1514 | } |
| 1515 | } |
| 1516 | let tableBits: number = rootBits; |
| 1517 | let tableSize: number = 1 << tableBits; |
| 1518 | let totalSize: number = tableSize; |
| 1519 | if (offset[15] === 1) { |
| 1520 | for (let k = 0; k < totalSize; ++k) { |
| 1521 | tableGroup[tableOffset + k] = sorted[0]; |
| 1522 | } |
| 1523 | return totalSize; |
| 1524 | } |
| 1525 | let key = 0; |
| 1526 | let symbol = 0; |
| 1527 | let step = 1; |
| 1528 | for (let len = 1; len <= rootBits; ++len) { |
| 1529 | step = step << 1; |
| 1530 | while (count[len] > 0) { |
| 1531 | replicateValue(tableGroup, tableOffset + key, step, tableSize, len << 16 | sorted[symbol++]); |
| 1532 | key = getNextKey(key, len); |
| 1533 | count[len]--; |
| 1534 | } |
| 1535 | } |
| 1536 | const mask: number = totalSize - 1; |
| 1537 | let low: number = -1; |
| 1538 | let currentOffset: number = tableOffset; |
| 1539 | step = 1; |
| 1540 | for (let len: number = rootBits + 1; len <= 15; ++len) { |
| 1541 | step = step << 1; |
| 1542 | while (count[len] > 0) { |
| 1543 | if ((key & mask) !== low) { |
| 1544 | currentOffset += tableSize; |
| 1545 | tableBits = nextTableBitSize(count, len, rootBits); |
| 1546 | tableSize = 1 << tableBits; |
| 1547 | totalSize += tableSize; |
| 1548 | low = key & mask; |
| 1549 | tableGroup[tableOffset + low] = (tableBits + rootBits) << 16 | (currentOffset - tableOffset - low); |
| 1550 | } |
| 1551 | replicateValue(tableGroup, currentOffset + (key >> rootBits), step, tableSize, (len - rootBits) << 16 | sorted[symbol++]); |
| 1552 | key = getNextKey(key, len); |
| 1553 | count[len]--; |
| 1554 | } |
| 1555 | } |
| 1556 | return totalSize; |
no test coverage detected
searching dependent graphs…