コード例 #1
0
 /// <summary>
 /// buffstate的状态重置
 /// </summary>
 /// <param name="state"></param>
 internal void RestoreState(OutputBuffer.BufferState state)
 {
     this.pos      = state.pos;
     this.bitBuf   = state.bitBuf;
     this.bitCount = state.bitCount;
 }
コード例 #2
0
ファイル: DeflaterManaged.cs プロジェクト: edc127/TryServer
        int IDeflater.GetDeflateOutput(byte[] outputBuffer)
        {
            Debug.Assert(outputBuffer != null, "Can't pass in a null output buffer!");
            Debug.Assert(!this.NeedsInput(), "GetDeflateOutput should only be called after providing input");
            this.output.UpdateBuffer(outputBuffer);
            switch (this.processingState)
            {
            case DeflaterManaged.DeflaterState.NotStarted:
                Debug.Assert(this.deflateEncoder.BytesInHistory == 0, "have leftover bytes in window");
                DeflateInput.InputState  state1 = this.input.DumpState();
                OutputBuffer.BufferState state2 = this.output.DumpState();
                this.deflateEncoder.GetBlockHeader(this.output);
                this.deflateEncoder.GetCompressedData(this.input, this.output);
                if (!this.UseCompressed(this.deflateEncoder.LastCompressionRatio))
                {
                    this.input.RestoreState(state1);
                    this.output.RestoreState(state2);
                    this.copyEncoder.GetBlock(this.input, this.output, false);
                    this.FlushInputWindows();
                    this.processingState = DeflaterManaged.DeflaterState.CheckingForIncompressible;
                    break;
                }
                this.processingState = DeflaterManaged.DeflaterState.CompressThenCheck;
                break;

            case DeflaterManaged.DeflaterState.SlowDownForIncompressible1:
                this.deflateEncoder.GetBlockFooter(this.output);
                this.processingState = DeflaterManaged.DeflaterState.SlowDownForIncompressible2;
                goto case DeflaterManaged.DeflaterState.SlowDownForIncompressible2;

            case DeflaterManaged.DeflaterState.SlowDownForIncompressible2:
                if (this.inputFromHistory.Count > 0)
                {
                    this.copyEncoder.GetBlock(this.inputFromHistory, this.output, false);
                }
                if (this.inputFromHistory.Count == 0)
                {
                    this.deflateEncoder.FlushInput();
                    this.processingState = DeflaterManaged.DeflaterState.CheckingForIncompressible;
                    break;
                }
                break;

            case DeflaterManaged.DeflaterState.StartingSmallData:
                this.deflateEncoder.GetBlockHeader(this.output);
                this.processingState = DeflaterManaged.DeflaterState.HandlingSmallData;
                goto case DeflaterManaged.DeflaterState.HandlingSmallData;

            case DeflaterManaged.DeflaterState.CompressThenCheck:
                this.deflateEncoder.GetCompressedData(this.input, this.output);
                if (!this.UseCompressed(this.deflateEncoder.LastCompressionRatio))
                {
                    this.processingState  = DeflaterManaged.DeflaterState.SlowDownForIncompressible1;
                    this.inputFromHistory = this.deflateEncoder.UnprocessedInput;
                    break;
                }
                break;

            case DeflaterManaged.DeflaterState.CheckingForIncompressible:
                Debug.Assert(this.deflateEncoder.BytesInHistory == 0, "have leftover bytes in window");
                DeflateInput.InputState  state3 = this.input.DumpState();
                OutputBuffer.BufferState state4 = this.output.DumpState();
                this.deflateEncoder.GetBlock(this.input, this.output, 8072);
                if (!this.UseCompressed(this.deflateEncoder.LastCompressionRatio))
                {
                    this.input.RestoreState(state3);
                    this.output.RestoreState(state4);
                    this.copyEncoder.GetBlock(this.input, this.output, false);
                    this.FlushInputWindows();
                    break;
                }
                break;

            case DeflaterManaged.DeflaterState.HandlingSmallData:
                this.deflateEncoder.GetCompressedData(this.input, this.output);
                break;
            }
            return(this.output.BytesWritten);
        }