| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233 |
- /* Copyright 2013 Google Inc. All Rights Reserved.
- Distributed under MIT license.
- See file LICENSE for detail or copy at https://opensource.org/licenses/MIT
- */
- /* Function to find backward reference copies. */
- #include "backward_references.h"
- #include <brotli/types.h>
- #include "../common/constants.h"
- #include "../common/dictionary.h"
- #include "../common/platform.h"
- #include "command.h"
- #include "compound_dictionary.h"
- #include "dictionary_hash.h"
- #include "encoder_dict.h"
- #include "memory.h"
- #include "quality.h"
- #if defined(__cplusplus) || defined(c_plusplus)
- extern "C" {
- #endif
- static BROTLI_INLINE size_t ComputeDistanceCode(size_t distance,
- size_t max_distance,
- const int* dist_cache) {
- if (distance <= max_distance) {
- size_t distance_plus_3 = distance + 3;
- size_t offset0 = distance_plus_3 - (size_t)dist_cache[0];
- size_t offset1 = distance_plus_3 - (size_t)dist_cache[1];
- if (distance == (size_t)dist_cache[0]) {
- return 0;
- } else if (distance == (size_t)dist_cache[1]) {
- return 1;
- } else if (offset0 < 7) {
- return (0x9750468 >> (4 * offset0)) & 0xF;
- } else if (offset1 < 7) {
- return (0xFDB1ACE >> (4 * offset1)) & 0xF;
- } else if (distance == (size_t)dist_cache[2]) {
- return 2;
- } else if (distance == (size_t)dist_cache[3]) {
- return 3;
- }
- }
- return distance + BROTLI_NUM_DISTANCE_SHORT_CODES - 1;
- }
- #define EXPAND_CAT(a, b) CAT(a, b)
- #define CAT(a, b) a ## b
- #define FN(X) EXPAND_CAT(X, HASHER())
- #define EXPORT_FN(X) EXPAND_CAT(X, EXPAND_CAT(PREFIX(), HASHER()))
- #define PREFIX() N
- #define ENABLE_COMPOUND_DICTIONARY 0
- #define HASHER() H2
- /* NOLINTNEXTLINE(build/include) */
- #include "backward_references_inc.h"
- #undef HASHER
- #define HASHER() H3
- /* NOLINTNEXTLINE(build/include) */
- #include "backward_references_inc.h"
- #undef HASHER
- #define HASHER() H4
- /* NOLINTNEXTLINE(build/include) */
- #include "backward_references_inc.h"
- #undef HASHER
- #define HASHER() H5
- /* NOLINTNEXTLINE(build/include) */
- #include "backward_references_inc.h"
- #undef HASHER
- #define HASHER() H6
- /* NOLINTNEXTLINE(build/include) */
- #include "backward_references_inc.h"
- #undef HASHER
- #define HASHER() H40
- /* NOLINTNEXTLINE(build/include) */
- #include "backward_references_inc.h"
- #undef HASHER
- #define HASHER() H41
- /* NOLINTNEXTLINE(build/include) */
- #include "backward_references_inc.h"
- #undef HASHER
- #define HASHER() H42
- /* NOLINTNEXTLINE(build/include) */
- #include "backward_references_inc.h"
- #undef HASHER
- #define HASHER() H54
- /* NOLINTNEXTLINE(build/include) */
- #include "backward_references_inc.h"
- #undef HASHER
- #define HASHER() H35
- /* NOLINTNEXTLINE(build/include) */
- #include "backward_references_inc.h"
- #undef HASHER
- #define HASHER() H55
- /* NOLINTNEXTLINE(build/include) */
- #include "backward_references_inc.h"
- #undef HASHER
- #define HASHER() H65
- /* NOLINTNEXTLINE(build/include) */
- #include "backward_references_inc.h"
- #undef HASHER
- #if defined(BROTLI_MAX_SIMD_QUALITY)
- #define HASHER() H58
- /* NOLINTNEXTLINE(build/include) */
- #include "backward_references_inc.h"
- #undef HASHER
- #define HASHER() H68
- /* NOLINTNEXTLINE(build/include) */
- #include "backward_references_inc.h"
- #undef HASHER
- #endif
- #undef ENABLE_COMPOUND_DICTIONARY
- #undef PREFIX
- #define PREFIX() D
- #define ENABLE_COMPOUND_DICTIONARY 1
- #define HASHER() H5
- /* NOLINTNEXTLINE(build/include) */
- #include "backward_references_inc.h"
- #undef HASHER
- #define HASHER() H6
- /* NOLINTNEXTLINE(build/include) */
- #include "backward_references_inc.h"
- #undef HASHER
- #define HASHER() H40
- /* NOLINTNEXTLINE(build/include) */
- #include "backward_references_inc.h"
- #undef HASHER
- #define HASHER() H41
- /* NOLINTNEXTLINE(build/include) */
- #include "backward_references_inc.h"
- #undef HASHER
- #define HASHER() H42
- /* NOLINTNEXTLINE(build/include) */
- #include "backward_references_inc.h"
- #undef HASHER
- #define HASHER() H55
- /* NOLINTNEXTLINE(build/include) */
- #include "backward_references_inc.h"
- #undef HASHER
- #define HASHER() H65
- /* NOLINTNEXTLINE(build/include) */
- #include "backward_references_inc.h"
- #undef HASHER
- #if defined(BROTLI_MAX_SIMD_QUALITY)
- #define HASHER() H58
- /* NOLINTNEXTLINE(build/include) */
- #include "backward_references_inc.h"
- #undef HASHER
- #define HASHER() H68
- /* NOLINTNEXTLINE(build/include) */
- #include "backward_references_inc.h"
- #undef HASHER
- #endif
- #undef ENABLE_COMPOUND_DICTIONARY
- #undef PREFIX
- #undef EXPORT_FN
- #undef FN
- #undef CAT
- #undef EXPAND_CAT
- void BrotliCreateBackwardReferences(size_t num_bytes,
- size_t position, const uint8_t* ringbuffer, size_t ringbuffer_mask,
- ContextLut literal_context_lut, const BrotliEncoderParams* params,
- Hasher* hasher, int* dist_cache, size_t* last_insert_len,
- Command* commands, size_t* num_commands, size_t* num_literals) {
- if (params->dictionary.compound.num_chunks != 0) {
- switch (params->hasher.type) {
- #define CASE_(N) \
- case N: \
- CreateBackwardReferencesDH ## N(num_bytes, \
- position, ringbuffer, ringbuffer_mask, \
- literal_context_lut, params, hasher, dist_cache, \
- last_insert_len, commands, num_commands, num_literals); \
- return;
- CASE_(5)
- CASE_(6)
- #if defined(BROTLI_MAX_SIMD_QUALITY)
- CASE_(58)
- CASE_(68)
- #endif
- CASE_(40)
- CASE_(41)
- CASE_(42)
- CASE_(55)
- CASE_(65)
- #undef CASE_
- default:
- BROTLI_DCHECK(false);
- break;
- }
- }
- switch (params->hasher.type) {
- #define CASE_(N) \
- case N: \
- CreateBackwardReferencesNH ## N(num_bytes, \
- position, ringbuffer, ringbuffer_mask, \
- literal_context_lut, params, hasher, dist_cache, \
- last_insert_len, commands, num_commands, num_literals); \
- return;
- FOR_GENERIC_HASHERS(CASE_)
- #undef CASE_
- default:
- BROTLI_DCHECK(false);
- break;
- }
- }
- #if defined(__cplusplus) || defined(c_plusplus)
- } /* extern "C" */
- #endif
|