コード例 #1
0
        /// <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);
        }
コード例 #2
0
ファイル: ZPCodec.cs プロジェクト: dronab/DjvuNet
        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>();
            }
        }
コード例 #3
0
ファイル: ZPCodec.cs プロジェクト: dronab/DjvuNet
        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));
            }
        }
コード例 #4
0
ファイル: ZPCodec.cs プロジェクト: dronab/DjvuNet
        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);
        }