Second step for the ...makeFromLengths and ...makeFromFrequencies functions. numcodes, lengths and maxbitlen must already be filled in correctly. return value is error. */
| 585 | value is error. |
| 586 | */ |
| 587 | static unsigned HuffmanTree_makeFromLengths2(HuffmanTree* tree) |
| 588 | { |
| 589 | uivector blcount; |
| 590 | uivector nextcode; |
| 591 | unsigned bits, n, error = 0; |
| 592 | |
| 593 | uivector_init(&blcount); |
| 594 | uivector_init(&nextcode); |
| 595 | |
| 596 | tree->tree1d = (unsigned*)lodepng_malloc(tree->numcodes * sizeof(unsigned)); |
| 597 | if(!tree->tree1d) error = 83; /*alloc fail*/ |
| 598 | |
| 599 | if(!uivector_resizev(&blcount, tree->maxbitlen + 1, 0) |
| 600 | || !uivector_resizev(&nextcode, tree->maxbitlen + 1, 0)) |
| 601 | error = 83; /*alloc fail*/ |
| 602 | |
| 603 | if(!error) |
| 604 | { |
| 605 | /*step 1: count number of instances of each code length*/ |
| 606 | for(bits = 0; bits < tree->numcodes; bits++) blcount.data[tree->lengths[bits]]++; |
| 607 | /*step 2: generate the nextcode values*/ |
| 608 | for(bits = 1; bits <= tree->maxbitlen; bits++) |
| 609 | { |
| 610 | nextcode.data[bits] = (nextcode.data[bits - 1] + blcount.data[bits - 1]) << 1; |
| 611 | } |
| 612 | /*step 3: generate all the codes*/ |
| 613 | for(n = 0; n < tree->numcodes; n++) |
| 614 | { |
| 615 | if(tree->lengths[n] != 0) tree->tree1d[n] = nextcode.data[tree->lengths[n]]++; |
| 616 | } |
| 617 | } |
| 618 | |
| 619 | uivector_cleanup(&blcount); |
| 620 | uivector_cleanup(&nextcode); |
| 621 | |
| 622 | if(!error) return HuffmanTree_make2DTree(tree); |
| 623 | else return error; |
| 624 | } |
| 625 | |
| 626 | /* |
| 627 | given the code lengths (as stored in the PNG file), generate the tree as defined |
no test coverage detected