Mercurial > hgrepos > Python2 > PyMuPDF
comparison mupdf-source/thirdparty/brotli/c/dec/huffman.h @ 2:b50eed0cc0ef upstream
ADD: MuPDF v1.26.7: the MuPDF source as downloaded by a default build of PyMuPDF 1.26.4.
The directory name has changed: no version number in the expanded directory now.
| author | Franz Glasner <fzglas.hg@dom66.de> |
|---|---|
| date | Mon, 15 Sep 2025 11:43:07 +0200 |
| parents | |
| children |
comparison
equal
deleted
inserted
replaced
| 1:1d09e1dec1d9 | 2:b50eed0cc0ef |
|---|---|
| 1 /* Copyright 2013 Google Inc. All Rights Reserved. | |
| 2 | |
| 3 Distributed under MIT license. | |
| 4 See file LICENSE for detail or copy at https://opensource.org/licenses/MIT | |
| 5 */ | |
| 6 | |
| 7 /* Utilities for building Huffman decoding tables. */ | |
| 8 | |
| 9 #ifndef BROTLI_DEC_HUFFMAN_H_ | |
| 10 #define BROTLI_DEC_HUFFMAN_H_ | |
| 11 | |
| 12 #include <brotli/types.h> | |
| 13 | |
| 14 #include "../common/platform.h" | |
| 15 | |
| 16 #if defined(__cplusplus) || defined(c_plusplus) | |
| 17 extern "C" { | |
| 18 #endif | |
| 19 | |
| 20 #define BROTLI_HUFFMAN_MAX_CODE_LENGTH 15 | |
| 21 | |
| 22 /* BROTLI_NUM_BLOCK_LEN_SYMBOLS == 26 */ | |
| 23 #define BROTLI_HUFFMAN_MAX_SIZE_26 396 | |
| 24 /* BROTLI_MAX_BLOCK_TYPE_SYMBOLS == 258 */ | |
| 25 #define BROTLI_HUFFMAN_MAX_SIZE_258 632 | |
| 26 /* BROTLI_MAX_CONTEXT_MAP_SYMBOLS == 272 */ | |
| 27 #define BROTLI_HUFFMAN_MAX_SIZE_272 646 | |
| 28 | |
| 29 #define BROTLI_HUFFMAN_MAX_CODE_LENGTH_CODE_LENGTH 5 | |
| 30 | |
| 31 #if ((defined(BROTLI_TARGET_ARMV7) || defined(BROTLI_TARGET_ARMV8_32)) && \ | |
| 32 BROTLI_GNUC_HAS_ATTRIBUTE(aligned, 2, 7, 0)) | |
| 33 #define BROTLI_HUFFMAN_CODE_FAST_LOAD | |
| 34 #endif | |
| 35 | |
| 36 #if !defined(BROTLI_HUFFMAN_CODE_FAST_LOAD) | |
| 37 /* Do not create this struct directly - use the ConstructHuffmanCode | |
| 38 * constructor below! */ | |
| 39 typedef struct { | |
| 40 uint8_t bits; /* number of bits used for this symbol */ | |
| 41 uint16_t value; /* symbol value or table offset */ | |
| 42 } HuffmanCode; | |
| 43 | |
| 44 static BROTLI_INLINE HuffmanCode ConstructHuffmanCode(const uint8_t bits, | |
| 45 const uint16_t value) { | |
| 46 HuffmanCode h; | |
| 47 h.bits = bits; | |
| 48 h.value = value; | |
| 49 return h; | |
| 50 } | |
| 51 | |
| 52 /* Please use the following macros to optimize HuffmanCode accesses in hot | |
| 53 * paths. | |
| 54 * | |
| 55 * For example, assuming |table| contains a HuffmanCode pointer: | |
| 56 * | |
| 57 * BROTLI_HC_MARK_TABLE_FOR_FAST_LOAD(table); | |
| 58 * BROTLI_HC_ADJUST_TABLE_INDEX(table, index_into_table); | |
| 59 * *bits = BROTLI_HC_GET_BITS(table); | |
| 60 * *value = BROTLI_HC_GET_VALUE(table); | |
| 61 * BROTLI_HC_ADJUST_TABLE_INDEX(table, offset); | |
| 62 * *bits2 = BROTLI_HC_GET_BITS(table); | |
| 63 * *value2 = BROTLI_HC_GET_VALUE(table); | |
| 64 * | |
| 65 */ | |
| 66 | |
| 67 #define BROTLI_HC_MARK_TABLE_FOR_FAST_LOAD(H) | |
| 68 #define BROTLI_HC_ADJUST_TABLE_INDEX(H, V) H += (V) | |
| 69 | |
| 70 /* These must be given a HuffmanCode pointer! */ | |
| 71 #define BROTLI_HC_FAST_LOAD_BITS(H) (H->bits) | |
| 72 #define BROTLI_HC_FAST_LOAD_VALUE(H) (H->value) | |
| 73 | |
| 74 #else /* BROTLI_HUFFMAN_CODE_FAST_LOAD */ | |
| 75 | |
| 76 typedef BROTLI_ALIGNED(4) uint32_t HuffmanCode; | |
| 77 | |
| 78 static BROTLI_INLINE HuffmanCode ConstructHuffmanCode(const uint8_t bits, | |
| 79 const uint16_t value) { | |
| 80 return (HuffmanCode) ((value & 0xFFFF) << 16) | (bits & 0xFF); | |
| 81 } | |
| 82 | |
| 83 #define BROTLI_HC_MARK_TABLE_FOR_FAST_LOAD(H) uint32_t __fastload_##H = (*H) | |
| 84 #define BROTLI_HC_ADJUST_TABLE_INDEX(H, V) H += (V); __fastload_##H = (*H) | |
| 85 | |
| 86 /* These must be given a HuffmanCode pointer! */ | |
| 87 #define BROTLI_HC_FAST_LOAD_BITS(H) ((__fastload_##H) & 0xFF) | |
| 88 #define BROTLI_HC_FAST_LOAD_VALUE(H) ((__fastload_##H) >> 16) | |
| 89 #endif /* BROTLI_HUFFMAN_CODE_FAST_LOAD */ | |
| 90 | |
| 91 /* Builds Huffman lookup table assuming code lengths are in symbol order. */ | |
| 92 BROTLI_INTERNAL void BrotliBuildCodeLengthsHuffmanTable(HuffmanCode* root_table, | |
| 93 const uint8_t* const code_lengths, uint16_t* count); | |
| 94 | |
| 95 /* Builds Huffman lookup table assuming code lengths are in symbol order. | |
| 96 Returns size of resulting table. */ | |
| 97 BROTLI_INTERNAL uint32_t BrotliBuildHuffmanTable(HuffmanCode* root_table, | |
| 98 int root_bits, const uint16_t* const symbol_lists, uint16_t* count); | |
| 99 | |
| 100 /* Builds a simple Huffman table. The |num_symbols| parameter is to be | |
| 101 interpreted as follows: 0 means 1 symbol, 1 means 2 symbols, | |
| 102 2 means 3 symbols, 3 means 4 symbols with lengths [2, 2, 2, 2], | |
| 103 4 means 4 symbols with lengths [1, 2, 3, 3]. */ | |
| 104 BROTLI_INTERNAL uint32_t BrotliBuildSimpleHuffmanTable(HuffmanCode* table, | |
| 105 int root_bits, uint16_t* symbols, uint32_t num_symbols); | |
| 106 | |
| 107 /* Contains a collection of Huffman trees with the same alphabet size. */ | |
| 108 /* alphabet_size_limit is needed due to simple codes, since | |
| 109 log2(alphabet_size_max) could be greater than log2(alphabet_size_limit). */ | |
| 110 typedef struct { | |
| 111 HuffmanCode** htrees; | |
| 112 HuffmanCode* codes; | |
| 113 uint16_t alphabet_size_max; | |
| 114 uint16_t alphabet_size_limit; | |
| 115 uint16_t num_htrees; | |
| 116 } HuffmanTreeGroup; | |
| 117 | |
| 118 #if defined(__cplusplus) || defined(c_plusplus) | |
| 119 } /* extern "C" */ | |
| 120 #endif | |
| 121 | |
| 122 #endif /* BROTLI_DEC_HUFFMAN_H_ */ |
