Second step for the ...makeFromLengths and ...makeFromFrequencies functions. numcodes, lengths and maxbitlen must already be filled in correctly. return value is error. */
| 602 | value is error. |
| 603 | */ |
| 604 | static unsigned HuffmanTree_makeFromLengths2(HuffmanTree* tree) |
| 605 | { |
| 606 | uivector blcount; |
| 607 | uivector nextcode; |
| 608 | unsigned bits, n, error = 0; |
| 609 | |
| 610 | uivector_init(&blcount); |
| 611 | uivector_init(&nextcode); |
| 612 | |
| 613 | tree->tree1d = (unsigned*)lodepng_malloc(tree->numcodes * sizeof(unsigned)); |
| 614 | if(!tree->tree1d) error = 83; /*alloc fail*/ |
| 615 | |
| 616 | if(!uivector_resizev(&blcount, tree->maxbitlen + 1, 0) |
| 617 | || !uivector_resizev(&nextcode, tree->maxbitlen + 1, 0)) |
| 618 | error = 83; /*alloc fail*/ |
| 619 | |
| 620 | if(!error) |
| 621 | { |
| 622 | /*step 1: count number of instances of each code length*/ |
| 623 | for(bits = 0; bits < tree->numcodes; bits++) blcount.data[tree->lengths[bits]]++; |
| 624 | /*step 2: generate the nextcode values*/ |
| 625 | for(bits = 1; bits <= tree->maxbitlen; bits++) |
| 626 | { |
| 627 | nextcode.data[bits] = (nextcode.data[bits - 1] + blcount.data[bits - 1]) << 1; |
| 628 | } |
| 629 | /*step 3: generate all the codes*/ |
| 630 | for(n = 0; n < tree->numcodes; n++) |
| 631 | { |
| 632 | if(tree->lengths[n] != 0) tree->tree1d[n] = nextcode.data[tree->lengths[n]]++; |
| 633 | } |
| 634 | } |
| 635 | |
| 636 | uivector_cleanup(&blcount); |
| 637 | uivector_cleanup(&nextcode); |
| 638 | |
| 639 | if(!error) return HuffmanTree_make2DTree(tree); |
| 640 | else return error; |
| 641 | } |
| 642 | |
| 643 | /* |
| 644 | given the code lengths (as stored in the PNG file), generate the tree as defined |
no test coverage detected