Пример #1
0
 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);
 }
Пример #2
0
        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);
        }