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