MCPcopy Create free account
hub / github.com/OpenXcom/OpenXcom / HuffmanTree_makeFromLengths2

Function HuffmanTree_makeFromLengths2

src/lodepng.cpp:587–624  ·  view source on GitHub ↗

Second step for the ...makeFromLengths and ...makeFromFrequencies functions. numcodes, lengths and maxbitlen must already be filled in correctly. return value is error. */

Source from the content-addressed store, hash-verified

585value is error.
586*/
587static 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/*
627given the code lengths (as stored in the PNG file), generate the tree as defined

Callers 2

Calls 5

uivector_initFunction · 0.85
lodepng_mallocFunction · 0.85
uivector_resizevFunction · 0.85
uivector_cleanupFunction · 0.85
HuffmanTree_make2DTreeFunction · 0.85

Tested by

no test coverage detected