void SendAllTrees(int blTreeCodes) { blTree.BuildCodes(); literalTree.BuildCodes(); distTree.BuildCodes(); pending.WriteBits(literalTree.numCodes - 257, 5); pending.WriteBits(distTree.numCodes - 1, 5); pending.WriteBits(blTreeCodes - 4, 4); for (int rank = 0; rank < blTreeCodes; rank++) { pending.WriteBits(blTree.length[BlOrder[rank]], 3); } literalTree.WriteTree(blTree); distTree.WriteTree(blTree); }
public unsafe int Deflate(byte[] output, int offset, int length) { int origLength = length; if (state == ClosedState) { throw new InvalidOperationException("Deflater closed"); } if (state < BusyState) { int header = (Deflated + ((DeflaterConstants.MaxWbits - 8) << 4)) << 8; int levelFlags = (level - 1) >> 1; if (levelFlags < 0 || levelFlags > 3) { levelFlags = 3; } header |= levelFlags << 6; header += 31 - (header % 31); pending.WriteShortMsb(header); state = BusyState | (state & (IsFlushing | IsFinishing)); } fixed(byte *mem = engine.memFix) { for (; ;) { int count = pending.Flush(output, offset, length); offset += count; length -= count; if (length == 0 || state == FinishedState) { break; } if (engine.Deflate((state & IsFlushing) != 0, (state & IsFinishing) != 0, mem)) { continue; } switch (state) { case BusyState: return(origLength - length); case FlushingState: { if (level != NoCompression) { int neededbits = 8 + ((-pending.BitCount) & 7); while (neededbits > 0) { pending.WriteBits(2, 10); neededbits -= 10; } } state = BusyState; } break; case FinishingState: { pending.AlignToByte(); state = FinishedState; } break; } } } return(origLength - length); }