xref: /aosp_15_r20/external/lzma/CPP/7zip/Compress/DeflateConst.h (revision f6dc9357d832569d4d1f5d24eacdb3935a1ae8e6)
1*f6dc9357SAndroid Build Coastguard Worker // DeflateConst.h
2*f6dc9357SAndroid Build Coastguard Worker 
3*f6dc9357SAndroid Build Coastguard Worker #ifndef ZIP7_INC_DEFLATE_CONST_H
4*f6dc9357SAndroid Build Coastguard Worker #define ZIP7_INC_DEFLATE_CONST_H
5*f6dc9357SAndroid Build Coastguard Worker 
6*f6dc9357SAndroid Build Coastguard Worker namespace NCompress {
7*f6dc9357SAndroid Build Coastguard Worker namespace NDeflate {
8*f6dc9357SAndroid Build Coastguard Worker 
9*f6dc9357SAndroid Build Coastguard Worker const unsigned kNumHuffmanBits = 15;
10*f6dc9357SAndroid Build Coastguard Worker 
11*f6dc9357SAndroid Build Coastguard Worker const UInt32 kHistorySize32 = (1 << 15);
12*f6dc9357SAndroid Build Coastguard Worker const UInt32 kHistorySize64 = (1 << 16);
13*f6dc9357SAndroid Build Coastguard Worker 
14*f6dc9357SAndroid Build Coastguard Worker const unsigned kDistTableSize32 = 30;
15*f6dc9357SAndroid Build Coastguard Worker const unsigned kDistTableSize64 = 32;
16*f6dc9357SAndroid Build Coastguard Worker 
17*f6dc9357SAndroid Build Coastguard Worker const unsigned kNumLenSymbols32 = 256;
18*f6dc9357SAndroid Build Coastguard Worker const unsigned kNumLenSymbols64 = 255; // don't change it. It must be <= 255.
19*f6dc9357SAndroid Build Coastguard Worker const unsigned kNumLenSymbolsMax = kNumLenSymbols32;
20*f6dc9357SAndroid Build Coastguard Worker 
21*f6dc9357SAndroid Build Coastguard Worker const unsigned kNumLenSlots = 29;
22*f6dc9357SAndroid Build Coastguard Worker 
23*f6dc9357SAndroid Build Coastguard Worker const unsigned kFixedDistTableSize = 32;
24*f6dc9357SAndroid Build Coastguard Worker const unsigned kFixedLenTableSize = 31;
25*f6dc9357SAndroid Build Coastguard Worker 
26*f6dc9357SAndroid Build Coastguard Worker const unsigned kSymbolEndOfBlock = 0x100;
27*f6dc9357SAndroid Build Coastguard Worker const unsigned kSymbolMatch = kSymbolEndOfBlock + 1;
28*f6dc9357SAndroid Build Coastguard Worker 
29*f6dc9357SAndroid Build Coastguard Worker const unsigned kMainTableSize = kSymbolMatch + kNumLenSlots;
30*f6dc9357SAndroid Build Coastguard Worker const unsigned kFixedMainTableSize = kSymbolMatch + kFixedLenTableSize;
31*f6dc9357SAndroid Build Coastguard Worker 
32*f6dc9357SAndroid Build Coastguard Worker const unsigned kLevelTableSize = 19;
33*f6dc9357SAndroid Build Coastguard Worker 
34*f6dc9357SAndroid Build Coastguard Worker const unsigned kTableDirectLevels = 16;
35*f6dc9357SAndroid Build Coastguard Worker const unsigned kTableLevelRepNumber = kTableDirectLevels;
36*f6dc9357SAndroid Build Coastguard Worker const unsigned kTableLevel0Number = kTableLevelRepNumber + 1;
37*f6dc9357SAndroid Build Coastguard Worker const unsigned kTableLevel0Number2 = kTableLevel0Number + 1;
38*f6dc9357SAndroid Build Coastguard Worker 
39*f6dc9357SAndroid Build Coastguard Worker const unsigned kLevelMask = 0xF;
40*f6dc9357SAndroid Build Coastguard Worker 
41*f6dc9357SAndroid Build Coastguard Worker const Byte kLenStart32[kFixedLenTableSize] =
42*f6dc9357SAndroid Build Coastguard Worker   {0,1,2,3,4,5,6,7,8,10,12,14,16,20,24,28,32,40,48,56,64,80,96,112,128,160,192,224, 255, 0, 0};
43*f6dc9357SAndroid Build Coastguard Worker const Byte kLenStart64[kFixedLenTableSize] =
44*f6dc9357SAndroid Build Coastguard Worker   {0,1,2,3,4,5,6,7,8,10,12,14,16,20,24,28,32,40,48,56,64,80,96,112,128,160,192,224, 0, 0, 0};
45*f6dc9357SAndroid Build Coastguard Worker 
46*f6dc9357SAndroid Build Coastguard Worker const Byte kLenDirectBits32[kFixedLenTableSize] =
47*f6dc9357SAndroid Build Coastguard Worker   {0,0,0,0,0,0,0,0,1, 1, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3, 4, 4, 4,  4,  5,  5,  5,  5, 0, 0, 0};
48*f6dc9357SAndroid Build Coastguard Worker const Byte kLenDirectBits64[kFixedLenTableSize] =
49*f6dc9357SAndroid Build Coastguard Worker   {0,0,0,0,0,0,0,0,1, 1, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3, 4, 4, 4,  4,  5,  5,  5,  5, 16, 0, 0};
50*f6dc9357SAndroid Build Coastguard Worker 
51*f6dc9357SAndroid Build Coastguard Worker const UInt32 kDistStart[kDistTableSize64] =
52*f6dc9357SAndroid Build Coastguard Worker   {0,1,2,3,4,6,8,12,16,24,32,48,64,96,128,192,256,384,512,768,
53*f6dc9357SAndroid Build Coastguard Worker   1024,1536,2048,3072,4096,6144,8192,12288,16384,24576,32768,49152};
54*f6dc9357SAndroid Build Coastguard Worker const Byte kDistDirectBits[kDistTableSize64] =
55*f6dc9357SAndroid Build Coastguard Worker   {0,0,0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7,8,8,9,9,10,10,11,11,12,12,13,13,14,14};
56*f6dc9357SAndroid Build Coastguard Worker 
57*f6dc9357SAndroid Build Coastguard Worker const Byte kLevelDirectBits[3] = {2, 3, 7};
58*f6dc9357SAndroid Build Coastguard Worker 
59*f6dc9357SAndroid Build Coastguard Worker const Byte kCodeLengthAlphabetOrder[kLevelTableSize] = {16, 17, 18, 0, 8, 7, 9, 6, 10, 5, 11, 4, 12, 3, 13, 2, 14, 1, 15};
60*f6dc9357SAndroid Build Coastguard Worker 
61*f6dc9357SAndroid Build Coastguard Worker const unsigned kMatchMinLen = 3;
62*f6dc9357SAndroid Build Coastguard Worker const unsigned kMatchMaxLen32 = kNumLenSymbols32 + kMatchMinLen - 1; // 256 + 2
63*f6dc9357SAndroid Build Coastguard Worker const unsigned kMatchMaxLen64 = kNumLenSymbols64 + kMatchMinLen - 1; // 255 + 2
64*f6dc9357SAndroid Build Coastguard Worker const unsigned kMatchMaxLen = kMatchMaxLen32;
65*f6dc9357SAndroid Build Coastguard Worker 
66*f6dc9357SAndroid Build Coastguard Worker const unsigned kFinalBlockFieldSize = 1;
67*f6dc9357SAndroid Build Coastguard Worker 
68*f6dc9357SAndroid Build Coastguard Worker namespace NFinalBlockField
69*f6dc9357SAndroid Build Coastguard Worker {
70*f6dc9357SAndroid Build Coastguard Worker   enum
71*f6dc9357SAndroid Build Coastguard Worker   {
72*f6dc9357SAndroid Build Coastguard Worker     kNotFinalBlock = 0,
73*f6dc9357SAndroid Build Coastguard Worker     kFinalBlock = 1
74*f6dc9357SAndroid Build Coastguard Worker   };
75*f6dc9357SAndroid Build Coastguard Worker }
76*f6dc9357SAndroid Build Coastguard Worker 
77*f6dc9357SAndroid Build Coastguard Worker const unsigned kBlockTypeFieldSize = 2;
78*f6dc9357SAndroid Build Coastguard Worker 
79*f6dc9357SAndroid Build Coastguard Worker namespace NBlockType
80*f6dc9357SAndroid Build Coastguard Worker {
81*f6dc9357SAndroid Build Coastguard Worker   enum
82*f6dc9357SAndroid Build Coastguard Worker   {
83*f6dc9357SAndroid Build Coastguard Worker     kStored = 0,
84*f6dc9357SAndroid Build Coastguard Worker     kFixedHuffman = 1,
85*f6dc9357SAndroid Build Coastguard Worker     kDynamicHuffman = 2
86*f6dc9357SAndroid Build Coastguard Worker   };
87*f6dc9357SAndroid Build Coastguard Worker }
88*f6dc9357SAndroid Build Coastguard Worker 
89*f6dc9357SAndroid Build Coastguard Worker const unsigned kNumLenCodesFieldSize = 5;
90*f6dc9357SAndroid Build Coastguard Worker const unsigned kNumDistCodesFieldSize = 5;
91*f6dc9357SAndroid Build Coastguard Worker const unsigned kNumLevelCodesFieldSize = 4;
92*f6dc9357SAndroid Build Coastguard Worker 
93*f6dc9357SAndroid Build Coastguard Worker const unsigned kNumLitLenCodesMin = 257;
94*f6dc9357SAndroid Build Coastguard Worker const unsigned kNumDistCodesMin = 1;
95*f6dc9357SAndroid Build Coastguard Worker const unsigned kNumLevelCodesMin = 4;
96*f6dc9357SAndroid Build Coastguard Worker 
97*f6dc9357SAndroid Build Coastguard Worker const unsigned kLevelFieldSize = 3;
98*f6dc9357SAndroid Build Coastguard Worker 
99*f6dc9357SAndroid Build Coastguard Worker const unsigned kStoredBlockLengthFieldSize = 16;
100*f6dc9357SAndroid Build Coastguard Worker 
101*f6dc9357SAndroid Build Coastguard Worker struct CLevels
102*f6dc9357SAndroid Build Coastguard Worker {
103*f6dc9357SAndroid Build Coastguard Worker   Byte litLenLevels[kFixedMainTableSize];
104*f6dc9357SAndroid Build Coastguard Worker   Byte distLevels[kFixedDistTableSize];
105*f6dc9357SAndroid Build Coastguard Worker 
SubClearCLevels106*f6dc9357SAndroid Build Coastguard Worker   void SubClear()
107*f6dc9357SAndroid Build Coastguard Worker   {
108*f6dc9357SAndroid Build Coastguard Worker     unsigned i;
109*f6dc9357SAndroid Build Coastguard Worker     for (i = kNumLitLenCodesMin; i < kFixedMainTableSize; i++)
110*f6dc9357SAndroid Build Coastguard Worker       litLenLevels[i] = 0;
111*f6dc9357SAndroid Build Coastguard Worker     for (i = 0; i < kFixedDistTableSize; i++)
112*f6dc9357SAndroid Build Coastguard Worker       distLevels[i] = 0;
113*f6dc9357SAndroid Build Coastguard Worker   }
114*f6dc9357SAndroid Build Coastguard Worker 
SetFixedLevelsCLevels115*f6dc9357SAndroid Build Coastguard Worker   void SetFixedLevels()
116*f6dc9357SAndroid Build Coastguard Worker   {
117*f6dc9357SAndroid Build Coastguard Worker     unsigned i = 0;
118*f6dc9357SAndroid Build Coastguard Worker 
119*f6dc9357SAndroid Build Coastguard Worker     for (; i < 144; i++) litLenLevels[i] = 8;
120*f6dc9357SAndroid Build Coastguard Worker     for (; i < 256; i++) litLenLevels[i] = 9;
121*f6dc9357SAndroid Build Coastguard Worker     for (; i < 280; i++) litLenLevels[i] = 7;
122*f6dc9357SAndroid Build Coastguard Worker     for (; i < 288; i++) litLenLevels[i] = 8;
123*f6dc9357SAndroid Build Coastguard Worker 
124*f6dc9357SAndroid Build Coastguard Worker     for (i = 0; i < kFixedDistTableSize; i++)  // test it: InfoZip only uses kDistTableSize
125*f6dc9357SAndroid Build Coastguard Worker       distLevels[i] = 5;
126*f6dc9357SAndroid Build Coastguard Worker   }
127*f6dc9357SAndroid Build Coastguard Worker };
128*f6dc9357SAndroid Build Coastguard Worker 
129*f6dc9357SAndroid Build Coastguard Worker }}
130*f6dc9357SAndroid Build Coastguard Worker 
131*f6dc9357SAndroid Build Coastguard Worker #endif
132