=========================================================================== * Send the header for a block using dynamic Huffman trees: the counts, the * lengths of the bit length codes, the literal tree and the distance tree. * IN assertion: lcodes >= 257, dcodes >= 1, blcodes >= 4. */
| 829 | * IN assertion: lcodes >= 257, dcodes >= 1, blcodes >= 4. |
| 830 | */ |
| 831 | local void send_all_trees(deflate_state *s, int lcodes, int dcodes, |
| 832 | int blcodes) { |
| 833 | int rank; /* index in bl_order */ |
| 834 | |
| 835 | Assert (lcodes >= 257 && dcodes >= 1 && blcodes >= 4, "not enough codes"); |
| 836 | Assert (lcodes <= L_CODES && dcodes <= D_CODES && blcodes <= BL_CODES, |
| 837 | "too many codes"); |
| 838 | Tracev((stderr, "\nbl counts: ")); |
| 839 | send_bits(s, lcodes - 257, 5); /* not +255 as stated in appnote.txt */ |
| 840 | send_bits(s, dcodes - 1, 5); |
| 841 | send_bits(s, blcodes - 4, 4); /* not -3 as stated in appnote.txt */ |
| 842 | for (rank = 0; rank < blcodes; rank++) { |
| 843 | Tracev((stderr, "\nbl code %2d ", bl_order[rank])); |
| 844 | send_bits(s, s->bl_tree[bl_order[rank]].Len, 3); |
| 845 | } |
| 846 | Tracev((stderr, "\nbl tree: sent %ld", s->bits_sent)); |
| 847 | |
| 848 | send_tree(s, (ct_data *)s->dyn_ltree, lcodes - 1); /* literal tree */ |
| 849 | Tracev((stderr, "\nlit tree: sent %ld", s->bits_sent)); |
| 850 | |
| 851 | send_tree(s, (ct_data *)s->dyn_dtree, dcodes - 1); /* distance tree */ |
| 852 | Tracev((stderr, "\ndist tree: sent %ld", s->bits_sent)); |
| 853 | } |
| 854 | |
| 855 | /* =========================================================================== |
| 856 | * Send a stored block |