mirror of
https://github.com/CloverHackyColor/CloverBootloader.git
synced 2024-12-05 13:33:33 +01:00
145 lines
4.0 KiB
C
145 lines
4.0 KiB
C
|
/* 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 "../common/constants.h"
|
||
|
#include "../common/dictionary.h"
|
||
|
#include "../common/platform.h"
|
||
|
#include <brotli/types.h>
|
||
|
#include "./command.h"
|
||
|
#include "./dictionary_hash.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 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
|
||
|
|
||
|
#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, const BrotliEncoderParams* params,
|
||
|
HasherHandle hasher, int* dist_cache, size_t* last_insert_len,
|
||
|
Command* commands, size_t* num_commands, size_t* num_literals) {
|
||
|
switch (params->hasher.type) {
|
||
|
#define CASE_(N) \
|
||
|
case N: \
|
||
|
CreateBackwardReferencesNH ## N( \
|
||
|
num_bytes, position, ringbuffer, \
|
||
|
ringbuffer_mask, params, hasher, dist_cache, \
|
||
|
last_insert_len, commands, num_commands, num_literals); \
|
||
|
return;
|
||
|
FOR_GENERIC_HASHERS(CASE_)
|
||
|
#undef CASE_
|
||
|
default:
|
||
|
break;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
#if defined(__cplusplus) || defined(c_plusplus)
|
||
|
} /* extern "C" */
|
||
|
#endif
|