1*f4ee7fbaSAndroid Build Coastguard Worker /* Copyright 2013 Google Inc. All Rights Reserved.
2*f4ee7fbaSAndroid Build Coastguard Worker
3*f4ee7fbaSAndroid Build Coastguard Worker Distributed under MIT license.
4*f4ee7fbaSAndroid Build Coastguard Worker See file LICENSE for detail or copy at https://opensource.org/licenses/MIT
5*f4ee7fbaSAndroid Build Coastguard Worker */
6*f4ee7fbaSAndroid Build Coastguard Worker
7*f4ee7fbaSAndroid Build Coastguard Worker /* Function to find backward reference copies. */
8*f4ee7fbaSAndroid Build Coastguard Worker
9*f4ee7fbaSAndroid Build Coastguard Worker #include "./backward_references.h"
10*f4ee7fbaSAndroid Build Coastguard Worker
11*f4ee7fbaSAndroid Build Coastguard Worker #include "../common/constants.h"
12*f4ee7fbaSAndroid Build Coastguard Worker #include "../common/context.h"
13*f4ee7fbaSAndroid Build Coastguard Worker #include "../common/dictionary.h"
14*f4ee7fbaSAndroid Build Coastguard Worker #include "../common/platform.h"
15*f4ee7fbaSAndroid Build Coastguard Worker #include <brotli/types.h>
16*f4ee7fbaSAndroid Build Coastguard Worker #include "./command.h"
17*f4ee7fbaSAndroid Build Coastguard Worker #include "./dictionary_hash.h"
18*f4ee7fbaSAndroid Build Coastguard Worker #include "./memory.h"
19*f4ee7fbaSAndroid Build Coastguard Worker #include "./quality.h"
20*f4ee7fbaSAndroid Build Coastguard Worker
21*f4ee7fbaSAndroid Build Coastguard Worker #if defined(__cplusplus) || defined(c_plusplus)
22*f4ee7fbaSAndroid Build Coastguard Worker extern "C" {
23*f4ee7fbaSAndroid Build Coastguard Worker #endif
24*f4ee7fbaSAndroid Build Coastguard Worker
ComputeDistanceCode(size_t distance,size_t max_distance,const int * dist_cache)25*f4ee7fbaSAndroid Build Coastguard Worker static BROTLI_INLINE size_t ComputeDistanceCode(size_t distance,
26*f4ee7fbaSAndroid Build Coastguard Worker size_t max_distance,
27*f4ee7fbaSAndroid Build Coastguard Worker const int* dist_cache) {
28*f4ee7fbaSAndroid Build Coastguard Worker if (distance <= max_distance) {
29*f4ee7fbaSAndroid Build Coastguard Worker size_t distance_plus_3 = distance + 3;
30*f4ee7fbaSAndroid Build Coastguard Worker size_t offset0 = distance_plus_3 - (size_t)dist_cache[0];
31*f4ee7fbaSAndroid Build Coastguard Worker size_t offset1 = distance_plus_3 - (size_t)dist_cache[1];
32*f4ee7fbaSAndroid Build Coastguard Worker if (distance == (size_t)dist_cache[0]) {
33*f4ee7fbaSAndroid Build Coastguard Worker return 0;
34*f4ee7fbaSAndroid Build Coastguard Worker } else if (distance == (size_t)dist_cache[1]) {
35*f4ee7fbaSAndroid Build Coastguard Worker return 1;
36*f4ee7fbaSAndroid Build Coastguard Worker } else if (offset0 < 7) {
37*f4ee7fbaSAndroid Build Coastguard Worker return (0x9750468 >> (4 * offset0)) & 0xF;
38*f4ee7fbaSAndroid Build Coastguard Worker } else if (offset1 < 7) {
39*f4ee7fbaSAndroid Build Coastguard Worker return (0xFDB1ACE >> (4 * offset1)) & 0xF;
40*f4ee7fbaSAndroid Build Coastguard Worker } else if (distance == (size_t)dist_cache[2]) {
41*f4ee7fbaSAndroid Build Coastguard Worker return 2;
42*f4ee7fbaSAndroid Build Coastguard Worker } else if (distance == (size_t)dist_cache[3]) {
43*f4ee7fbaSAndroid Build Coastguard Worker return 3;
44*f4ee7fbaSAndroid Build Coastguard Worker }
45*f4ee7fbaSAndroid Build Coastguard Worker }
46*f4ee7fbaSAndroid Build Coastguard Worker return distance + BROTLI_NUM_DISTANCE_SHORT_CODES - 1;
47*f4ee7fbaSAndroid Build Coastguard Worker }
48*f4ee7fbaSAndroid Build Coastguard Worker
49*f4ee7fbaSAndroid Build Coastguard Worker #define EXPAND_CAT(a, b) CAT(a, b)
50*f4ee7fbaSAndroid Build Coastguard Worker #define CAT(a, b) a ## b
51*f4ee7fbaSAndroid Build Coastguard Worker #define FN(X) EXPAND_CAT(X, HASHER())
52*f4ee7fbaSAndroid Build Coastguard Worker #define EXPORT_FN(X) EXPAND_CAT(X, EXPAND_CAT(PREFIX(), HASHER()))
53*f4ee7fbaSAndroid Build Coastguard Worker
54*f4ee7fbaSAndroid Build Coastguard Worker #define PREFIX() N
55*f4ee7fbaSAndroid Build Coastguard Worker
56*f4ee7fbaSAndroid Build Coastguard Worker #define HASHER() H2
57*f4ee7fbaSAndroid Build Coastguard Worker /* NOLINTNEXTLINE(build/include) */
58*f4ee7fbaSAndroid Build Coastguard Worker #include "./backward_references_inc.h"
59*f4ee7fbaSAndroid Build Coastguard Worker #undef HASHER
60*f4ee7fbaSAndroid Build Coastguard Worker
61*f4ee7fbaSAndroid Build Coastguard Worker #define HASHER() H3
62*f4ee7fbaSAndroid Build Coastguard Worker /* NOLINTNEXTLINE(build/include) */
63*f4ee7fbaSAndroid Build Coastguard Worker #include "./backward_references_inc.h"
64*f4ee7fbaSAndroid Build Coastguard Worker #undef HASHER
65*f4ee7fbaSAndroid Build Coastguard Worker
66*f4ee7fbaSAndroid Build Coastguard Worker #define HASHER() H4
67*f4ee7fbaSAndroid Build Coastguard Worker /* NOLINTNEXTLINE(build/include) */
68*f4ee7fbaSAndroid Build Coastguard Worker #include "./backward_references_inc.h"
69*f4ee7fbaSAndroid Build Coastguard Worker #undef HASHER
70*f4ee7fbaSAndroid Build Coastguard Worker
71*f4ee7fbaSAndroid Build Coastguard Worker #define HASHER() H5
72*f4ee7fbaSAndroid Build Coastguard Worker /* NOLINTNEXTLINE(build/include) */
73*f4ee7fbaSAndroid Build Coastguard Worker #include "./backward_references_inc.h"
74*f4ee7fbaSAndroid Build Coastguard Worker #undef HASHER
75*f4ee7fbaSAndroid Build Coastguard Worker
76*f4ee7fbaSAndroid Build Coastguard Worker #define HASHER() H6
77*f4ee7fbaSAndroid Build Coastguard Worker /* NOLINTNEXTLINE(build/include) */
78*f4ee7fbaSAndroid Build Coastguard Worker #include "./backward_references_inc.h"
79*f4ee7fbaSAndroid Build Coastguard Worker #undef HASHER
80*f4ee7fbaSAndroid Build Coastguard Worker
81*f4ee7fbaSAndroid Build Coastguard Worker #define HASHER() H40
82*f4ee7fbaSAndroid Build Coastguard Worker /* NOLINTNEXTLINE(build/include) */
83*f4ee7fbaSAndroid Build Coastguard Worker #include "./backward_references_inc.h"
84*f4ee7fbaSAndroid Build Coastguard Worker #undef HASHER
85*f4ee7fbaSAndroid Build Coastguard Worker
86*f4ee7fbaSAndroid Build Coastguard Worker #define HASHER() H41
87*f4ee7fbaSAndroid Build Coastguard Worker /* NOLINTNEXTLINE(build/include) */
88*f4ee7fbaSAndroid Build Coastguard Worker #include "./backward_references_inc.h"
89*f4ee7fbaSAndroid Build Coastguard Worker #undef HASHER
90*f4ee7fbaSAndroid Build Coastguard Worker
91*f4ee7fbaSAndroid Build Coastguard Worker #define HASHER() H42
92*f4ee7fbaSAndroid Build Coastguard Worker /* NOLINTNEXTLINE(build/include) */
93*f4ee7fbaSAndroid Build Coastguard Worker #include "./backward_references_inc.h"
94*f4ee7fbaSAndroid Build Coastguard Worker #undef HASHER
95*f4ee7fbaSAndroid Build Coastguard Worker
96*f4ee7fbaSAndroid Build Coastguard Worker #define HASHER() H54
97*f4ee7fbaSAndroid Build Coastguard Worker /* NOLINTNEXTLINE(build/include) */
98*f4ee7fbaSAndroid Build Coastguard Worker #include "./backward_references_inc.h"
99*f4ee7fbaSAndroid Build Coastguard Worker #undef HASHER
100*f4ee7fbaSAndroid Build Coastguard Worker
101*f4ee7fbaSAndroid Build Coastguard Worker #define HASHER() H35
102*f4ee7fbaSAndroid Build Coastguard Worker /* NOLINTNEXTLINE(build/include) */
103*f4ee7fbaSAndroid Build Coastguard Worker #include "./backward_references_inc.h"
104*f4ee7fbaSAndroid Build Coastguard Worker #undef HASHER
105*f4ee7fbaSAndroid Build Coastguard Worker
106*f4ee7fbaSAndroid Build Coastguard Worker #define HASHER() H55
107*f4ee7fbaSAndroid Build Coastguard Worker /* NOLINTNEXTLINE(build/include) */
108*f4ee7fbaSAndroid Build Coastguard Worker #include "./backward_references_inc.h"
109*f4ee7fbaSAndroid Build Coastguard Worker #undef HASHER
110*f4ee7fbaSAndroid Build Coastguard Worker
111*f4ee7fbaSAndroid Build Coastguard Worker #define HASHER() H65
112*f4ee7fbaSAndroid Build Coastguard Worker /* NOLINTNEXTLINE(build/include) */
113*f4ee7fbaSAndroid Build Coastguard Worker #include "./backward_references_inc.h"
114*f4ee7fbaSAndroid Build Coastguard Worker #undef HASHER
115*f4ee7fbaSAndroid Build Coastguard Worker
116*f4ee7fbaSAndroid Build Coastguard Worker #undef PREFIX
117*f4ee7fbaSAndroid Build Coastguard Worker
118*f4ee7fbaSAndroid Build Coastguard Worker #undef EXPORT_FN
119*f4ee7fbaSAndroid Build Coastguard Worker #undef FN
120*f4ee7fbaSAndroid Build Coastguard Worker #undef CAT
121*f4ee7fbaSAndroid Build Coastguard Worker #undef EXPAND_CAT
122*f4ee7fbaSAndroid Build Coastguard Worker
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)123*f4ee7fbaSAndroid Build Coastguard Worker void BrotliCreateBackwardReferences(size_t num_bytes,
124*f4ee7fbaSAndroid Build Coastguard Worker size_t position, const uint8_t* ringbuffer, size_t ringbuffer_mask,
125*f4ee7fbaSAndroid Build Coastguard Worker ContextLut literal_context_lut, const BrotliEncoderParams* params,
126*f4ee7fbaSAndroid Build Coastguard Worker Hasher* hasher, int* dist_cache, size_t* last_insert_len,
127*f4ee7fbaSAndroid Build Coastguard Worker Command* commands, size_t* num_commands, size_t* num_literals) {
128*f4ee7fbaSAndroid Build Coastguard Worker switch (params->hasher.type) {
129*f4ee7fbaSAndroid Build Coastguard Worker #define CASE_(N) \
130*f4ee7fbaSAndroid Build Coastguard Worker case N: \
131*f4ee7fbaSAndroid Build Coastguard Worker CreateBackwardReferencesNH ## N(num_bytes, \
132*f4ee7fbaSAndroid Build Coastguard Worker position, ringbuffer, ringbuffer_mask, \
133*f4ee7fbaSAndroid Build Coastguard Worker literal_context_lut, params, hasher, dist_cache, \
134*f4ee7fbaSAndroid Build Coastguard Worker last_insert_len, commands, num_commands, num_literals); \
135*f4ee7fbaSAndroid Build Coastguard Worker return;
136*f4ee7fbaSAndroid Build Coastguard Worker FOR_GENERIC_HASHERS(CASE_)
137*f4ee7fbaSAndroid Build Coastguard Worker #undef CASE_
138*f4ee7fbaSAndroid Build Coastguard Worker default:
139*f4ee7fbaSAndroid Build Coastguard Worker break;
140*f4ee7fbaSAndroid Build Coastguard Worker }
141*f4ee7fbaSAndroid Build Coastguard Worker }
142*f4ee7fbaSAndroid Build Coastguard Worker
143*f4ee7fbaSAndroid Build Coastguard Worker #if defined(__cplusplus) || defined(c_plusplus)
144*f4ee7fbaSAndroid Build Coastguard Worker } /* extern "C" */
145*f4ee7fbaSAndroid Build Coastguard Worker #endif
146