internal void EncodeBlock(Stream target, Stream source, bool final) { while (true) { minimumContext = maximumContext; numberStatistics = minimumContext.NumberStatistics; int c = source.ReadByte(); if (c < 0 && !final) { return; } if (numberStatistics != 0) { EncodeSymbol1(c, minimumContext); Coder.RangeEncodeSymbol(); } else { EncodeBinarySymbol(c, minimumContext); Coder.RangeShiftEncodeSymbol(TotalBitCount); } while (foundState == PpmState.Zero) { Coder.RangeEncoderNormalize(target); do { orderFall++; minimumContext = minimumContext.Suffix; if (minimumContext == PpmContext.Zero) { goto StopEncoding; } } while (minimumContext.NumberStatistics == numberMasked); EncodeSymbol2(c, minimumContext); Coder.RangeEncodeSymbol(); } if (orderFall == 0 && (Pointer)foundState.Successor >= Allocator.BaseUnit) { maximumContext = foundState.Successor; } else { UpdateModel(minimumContext); if (escapeCount == 0) { ClearMask(); } } Coder.RangeEncoderNormalize(target); } StopEncoding: Coder.RangeEncoderFlush(target); }