/// <summary> /// /// </summary> /// <param name="input"></param> /// <returns></returns> public BSInputStream Init(Stream input) { zp = new ZPCodec().Init(input); for (int i = 0; i < ctx.Length;) { ctx[i++] = new MutableValue <sbyte>(); } return(this); }
public ZPCodec() { Ffzt = new sbyte[FFZT.Length]; Array.Copy(FFZT, 0, Ffzt, 0, Ffzt.Length); for (int i = 0; i < _arraySize; i++) { Up[i] = new MutableValue <sbyte>(); Down[i] = new MutableValue <sbyte>(); } }
public int Decoder(MutableValue <sbyte> ctx) { int ictx = 0xff & ctx.Value; int z = AValue + PArray[ictx]; if (z <= _fence) { AValue = z; return(ictx & 1); } else { return(DecodeSub(ctx, z)); } }
public int DecodeSub(MutableValue <sbyte> ctx, int z) { int bit = ctx.Value & 1; int d = 24576 + ((z + AValue) >> 2); if (z > d) { z = d; } if (z > _code) { z = 0x10000 - z; AValue += z; _code += z; ctx.Value = Down[0xff & ctx.Value].Value; int shift = FFZ(AValue); _scount = (short)(_scount - shift); AValue = 0xffff & (AValue << shift); _code = 0xffff & ((_code << shift) | ((_buffer >> _scount) & ((1 << shift) - 1))); if (_scount < 16) { Preload(); } _fence = _code; if (_code >= 32768L) { _fence = 32767L; } return(bit ^ 1); } if ((unchecked ((int)0xffffffffL) & AValue) >= (unchecked ((int)0xffffffffL) & MArray[0xff & ctx.Value])) { ctx.Value = Up[0xff & ctx.Value].Value; } _scount--; AValue = 0xffff & (z << 1); _code = 0xffff & ((_code << 1) | ((_buffer >> _scount) & 1)); if (_scount < 16) { Preload(); } _fence = _code; if (_code >= 32768L) { _fence = 32767L; } return(bit); }