Create the Huffman tree given the symbol frequencies*/
| 832 | |
| 833 | /*Create the Huffman tree given the symbol frequencies*/ |
| 834 | static unsigned HuffmanTree_makeFromFrequencies(HuffmanTree* tree, const unsigned* frequencies, |
| 835 | size_t mincodes, size_t numcodes, unsigned maxbitlen) |
| 836 | { |
| 837 | unsigned error = 0; |
| 838 | while(!frequencies[numcodes - 1] && numcodes > mincodes) numcodes--; /*trim zeroes*/ |
| 839 | tree->maxbitlen = maxbitlen; |
| 840 | tree->numcodes = (unsigned)numcodes; /*number of symbols*/ |
| 841 | tree->lengths = (unsigned*)lodepng_realloc(tree->lengths, numcodes * sizeof(unsigned)); |
| 842 | if(!tree->lengths) return 83; /*alloc fail*/ |
| 843 | /*initialize all lengths to 0*/ |
| 844 | memset(tree->lengths, 0, numcodes * sizeof(unsigned)); |
| 845 | |
| 846 | error = lodepng_huffman_code_lengths(tree->lengths, frequencies, numcodes, maxbitlen); |
| 847 | if(!error) error = HuffmanTree_makeFromLengths2(tree); |
| 848 | return error; |
| 849 | } |
| 850 | |
| 851 | static unsigned HuffmanTree_getCode(const HuffmanTree* tree, unsigned index) |
| 852 | { |
no test coverage detected