예제 #1
0
        internal void decodeBinSymbol(ModelPPM model)
        {
            SharpCompress.Compressor.PPMd.H.State rs = this.tempState1.Initialize(model.Heap);
            rs.Address       = this.oneState.Address;
            model.HiBitsFlag = model.getHB2Flag()[model.FoundState.Symbol];
            int index = rs.Freq - 1;
            int num2  = this.getArrayIndex(model, rs);
            int summ  = model.BinSumm[index][num2];

            if (model.Coder.GetCurrentShiftCount(ModelPPM.TOT_BITS) < summ)
            {
                model.FoundState.Address = rs.Address;
                rs.IncrementFreq((rs.Freq < 0x80) ? 1 : 0);
                model.Coder.SubRange.LowCount  = 0L;
                model.Coder.SubRange.HighCount = summ;
                summ = ((summ + ModelPPM.INTERVAL) - this.getMean(summ, 7, 2)) & 0xffff;
                model.BinSumm[index][num2] = summ;
                model.PrevSuccess          = 1;
                model.incRunLength(1);
            }
            else
            {
                model.Coder.SubRange.LowCount = summ;
                summ = (summ - this.getMean(summ, 7, 2)) & 0xffff;
                model.BinSumm[index][num2]     = summ;
                model.Coder.SubRange.HighCount = ModelPPM.BIN_SCALE;
                model.InitEsc             = ExpEscape[Utility.URShift(summ, 10)];
                model.NumMasked           = 1;
                model.CharMask[rs.Symbol] = model.EscCount;
                model.PrevSuccess         = 0;
                model.FoundState.Address  = 0;
            }
        }
예제 #2
0
 internal bool decodeInit(Stream stream, int maxOrder, int maxMemory)
 {
     if (stream != null)
     {
         this.coder = new RangeCoder(stream);
     }
     if (maxOrder == 1)
     {
         this.subAlloc.stopSubAllocator();
         return(false);
     }
     this.subAlloc.startSubAllocator(maxMemory);
     this.minContext    = new PPMContext(this.Heap);
     this.maxContext    = new PPMContext(this.Heap);
     this.foundState    = new SharpCompress.Compressor.PPMd.H.State(this.Heap);
     this.dummySEE2Cont = new SEE2Context();
     for (int i = 0; i < 0x19; i++)
     {
         for (int j = 0; j < 0x10; j++)
         {
             this.SEE2Cont[i][j] = new SEE2Context();
         }
     }
     this.startModelRare(maxOrder);
     return(this.minContext.Address != 0);
 }
예제 #3
0
        internal bool decodeSymbol2(ModelPPM model)
        {
            int         diff    = this.NumStats - model.NumMasked;
            SEE2Context context = this.makeEscFreq2(model, diff);
            RangeCoder  coder   = model.Coder;

            SharpCompress.Compressor.PPMd.H.State state  = this.tempState1.Initialize(model.Heap);
            SharpCompress.Compressor.PPMd.H.State state2 = this.tempState2.Initialize(model.Heap);
            state.Address = this.freqData.GetStats() - 6;
            int index  = 0;
            int dScale = 0;

            do
            {
                do
                {
                    state.IncrementAddress();
                }while (model.CharMask[state.Symbol] == model.EscCount);
                dScale          += state.Freq;
                this.ps[index++] = state.Address;
            }while (--diff != 0);
            coder.SubRange.incScale(dScale);
            long currentCount = coder.CurrentCount;

            if (currentCount >= coder.SubRange.Scale)
            {
                return(false);
            }
            index         = 0;
            state.Address = this.ps[index];
            if (currentCount < dScale)
            {
                dScale = 0;
                while ((dScale += state.Freq) <= currentCount)
                {
                    state.Address = this.ps[++index];
                }
                coder.SubRange.HighCount = dScale;
                coder.SubRange.LowCount  = dScale - state.Freq;
                context.update();
                this.update2(model, state.Address);
            }
            else
            {
                coder.SubRange.LowCount  = dScale;
                coder.SubRange.HighCount = coder.SubRange.Scale;
                diff = this.NumStats - model.NumMasked;
                index--;
                do
                {
                    state2.Address = this.ps[++index];
                    model.CharMask[state2.Symbol] = model.EscCount;
                }while (--diff != 0);
                context.incSumm((int)coder.SubRange.Scale);
                model.NumMasked = this.NumStats;
            }
            return(true);
        }
예제 #4
0
        internal int getArrayIndex(ModelPPM Model, SharpCompress.Compressor.PPMd.H.State rs)
        {
            PPMContext context = this.getTempPPMContext(Model.SubAlloc.Heap);

            context.Address = this.getSuffix();
            int num = 0;

            num += Model.PrevSuccess;
            num += Model.getNS2BSIndx()[context.NumStats - 1];
            num += Model.HiBitsFlag + (2 * Model.getHB2Flag()[rs.Symbol]);
            return(num + (Utility.URShift(Model.RunLength, 0x1a) & 0x20));
        }
예제 #5
0
 public PPMContext(byte[] Memory) : base(Memory)
 {
     this.tempState1     = new SharpCompress.Compressor.PPMd.H.State(null);
     this.tempState2     = new SharpCompress.Compressor.PPMd.H.State(null);
     this.tempState3     = new SharpCompress.Compressor.PPMd.H.State(null);
     this.tempState4     = new SharpCompress.Compressor.PPMd.H.State(null);
     this.tempState5     = new SharpCompress.Compressor.PPMd.H.State(null);
     this.tempPPMContext = null;
     this.ps             = new int[0x100];
     this.oneState       = new SharpCompress.Compressor.PPMd.H.State(Memory);
     this.freqData       = new SharpCompress.Compressor.PPMd.H.FreqData(Memory);
 }
예제 #6
0
 public PPMContext(byte[] Memory)
     : base(Memory)
 {
     this.tempState1 = new SharpCompress.Compressor.PPMd.H.State(null);
     this.tempState2 = new SharpCompress.Compressor.PPMd.H.State(null);
     this.tempState3 = new SharpCompress.Compressor.PPMd.H.State(null);
     this.tempState4 = new SharpCompress.Compressor.PPMd.H.State(null);
     this.tempState5 = new SharpCompress.Compressor.PPMd.H.State(null);
     this.tempPPMContext = null;
     this.ps = new int[0x100];
     this.oneState = new SharpCompress.Compressor.PPMd.H.State(Memory);
     this.freqData = new SharpCompress.Compressor.PPMd.H.FreqData(Memory);
 }
예제 #7
0
 internal void update2(ModelPPM model, int p)
 {
     SharpCompress.Compressor.PPMd.H.State state = this.tempState5.Initialize(model.Heap);
     state.Address            = p;
     model.FoundState.Address = p;
     model.FoundState.IncrementFreq(4);
     this.freqData.IncrementSummFreq(4);
     if (state.Freq > 0x7c)
     {
         this.rescale(model);
     }
     model.incEscCount(1);
     model.RunLength = model.InitRL;
 }
예제 #8
0
        internal int createChild(ModelPPM model, SharpCompress.Compressor.PPMd.H.State pStats, StateRef firstState)
        {
            PPMContext successor = this.getTempPPMContext(model.SubAlloc.Heap);

            successor.Address = model.SubAlloc.allocContext();
            if (successor != null)
            {
                successor.NumStats = 1;
                successor.setOneState(firstState);
                successor.setSuffix(this);
                pStats.SetSuccessor(successor);
            }
            return(successor.Address);
        }
예제 #9
0
        private void restartModelRare()
        {
            int num2;
            int num3;

            Utility.Fill <int>(this.charMask, 0);
            this.subAlloc.initSubAllocator();
            this.initRL = -((this.maxOrder < 12) ? this.maxOrder : 12) - 1;
            int stats = this.subAlloc.allocContext();

            this.minContext.Address = stats;
            this.maxContext.Address = stats;
            this.minContext.setSuffix(0);
            this.orderFall                    = this.maxOrder;
            this.minContext.NumStats          = 0x100;
            this.minContext.FreqData.SummFreq = this.minContext.NumStats + 1;
            stats = this.subAlloc.allocUnits(0x80);
            this.foundState.Address = stats;
            this.minContext.FreqData.SetStats(stats);
            SharpCompress.Compressor.PPMd.H.State state = new SharpCompress.Compressor.PPMd.H.State(this.subAlloc.Heap);
            stats            = this.minContext.FreqData.GetStats();
            this.runLength   = this.initRL;
            this.prevSuccess = 0;
            for (num2 = 0; num2 < 0x100; num2++)
            {
                state.Address = stats + (num2 * 6);
                state.Symbol  = num2;
                state.Freq    = 1;
                state.SetSuccessor(0);
            }
            for (num2 = 0; num2 < 0x80; num2++)
            {
                num3 = 0;
                while (num3 < 8)
                {
                    for (int i = 0; i < 0x40; i += 8)
                    {
                        this.binSumm[num2][num3 + i] = BIN_SCALE - (InitBinEsc[num3] / (num2 + 2));
                    }
                    num3++;
                }
            }
            for (num2 = 0; num2 < 0x19; num2++)
            {
                for (num3 = 0; num3 < 0x10; num3++)
                {
                    this.SEE2Cont[num2][num3].Initialize((5 * num2) + 10);
                }
            }
        }
예제 #10
0
        internal bool decodeInit(Unpack unpackRead, int escChar)
        {
            int  maxOrder = unpackRead.Char & 0xff;
            bool flag     = (maxOrder & 0x20) != 0;
            int  num2     = 0;

            if (flag)
            {
                num2 = unpackRead.Char;
            }
            else if (this.subAlloc.GetAllocatedMemory() == 0)
            {
                return(false);
            }
            if ((maxOrder & 0x40) != 0)
            {
                escChar = unpackRead.Char;
                unpackRead.PpmEscChar = escChar;
            }
            this.coder = new RangeCoder(unpackRead);
            if (flag)
            {
                maxOrder = (maxOrder & 0x1f) + 1;
                if (maxOrder > 0x10)
                {
                    maxOrder = 0x10 + ((maxOrder - 0x10) * 3);
                }
                if (maxOrder == 1)
                {
                    this.subAlloc.stopSubAllocator();
                    return(false);
                }
                this.subAlloc.startSubAllocator((num2 + 1) << 20);
                this.minContext    = new PPMContext(this.Heap);
                this.maxContext    = new PPMContext(this.Heap);
                this.foundState    = new SharpCompress.Compressor.PPMd.H.State(this.Heap);
                this.dummySEE2Cont = new SEE2Context();
                for (int i = 0; i < 0x19; i++)
                {
                    for (int j = 0; j < 0x10; j++)
                    {
                        this.SEE2Cont[i][j] = new SEE2Context();
                    }
                }
                this.startModelRare(maxOrder);
            }
            return(this.minContext.Address != 0);
        }
예제 #11
0
        internal static void PPMDSwap(SharpCompress.Compressor.PPMd.H.State ptr1, SharpCompress.Compressor.PPMd.H.State ptr2)
        {
            byte[] memory  = ptr1.Memory;
            byte[] buffer2 = ptr2.Memory;
            int    num     = 0;
            int    address = ptr1.Address;

            for (int i = ptr2.Address; num < 6; i++)
            {
                byte num4 = memory[address];
                memory[address] = buffer2[i];
                buffer2[i]      = num4;
                num++;
                address++;
            }
        }
예제 #12
0
 internal void update1(ModelPPM model, int p)
 {
     model.FoundState.Address = p;
     model.FoundState.IncrementFreq(4);
     this.freqData.IncrementSummFreq(4);
     SharpCompress.Compressor.PPMd.H.State state  = this.tempState3.Initialize(model.Heap);
     SharpCompress.Compressor.PPMd.H.State state2 = this.tempState4.Initialize(model.Heap);
     state.Address  = p;
     state2.Address = p - 6;
     if (state.Freq > state2.Freq)
     {
         SharpCompress.Compressor.PPMd.H.State.PPMDSwap(state, state2);
         model.FoundState.Address = state2.Address;
         if (state2.Freq > 0x7c)
         {
             this.rescale(model);
         }
     }
 }
예제 #13
0
 internal void rescale(ModelPPM model)
 {
     StateRef ref2;
     int numStats = this.NumStats;
     int num2 = this.NumStats - 1;
     SharpCompress.Compressor.PPMd.H.State state = new SharpCompress.Compressor.PPMd.H.State(model.Heap);
     SharpCompress.Compressor.PPMd.H.State state2 = new SharpCompress.Compressor.PPMd.H.State(model.Heap);
     SharpCompress.Compressor.PPMd.H.State state3 = new SharpCompress.Compressor.PPMd.H.State(model.Heap);
     state2.Address = model.FoundState.Address;
     while (state2.Address != this.freqData.GetStats())
     {
         state3.Address = state2.Address - 6;
         SharpCompress.Compressor.PPMd.H.State.PPMDSwap(state2, state3);
         state2.DecrementAddress();
     }
     state3.Address = this.freqData.GetStats();
     state3.IncrementFreq(4);
     this.freqData.IncrementSummFreq(4);
     int number = this.freqData.SummFreq - state2.Freq;
     int num3 = (model.OrderFall != 0) ? 1 : 0;
     state2.Freq = Utility.URShift((int) (state2.Freq + num3), 1);
     this.freqData.SummFreq = state2.Freq;
     do
     {
         state2.IncrementAddress();
         number -= state2.Freq;
         state2.Freq = Utility.URShift((int) (state2.Freq + num3), 1);
         this.freqData.IncrementSummFreq(state2.Freq);
         state3.Address = state2.Address - 6;
         if (state2.Freq > state3.Freq)
         {
             state.Address = state2.Address;
             ref2 = new StateRef();
             ref2.Values = state;
             SharpCompress.Compressor.PPMd.H.State ptr = new SharpCompress.Compressor.PPMd.H.State(model.Heap);
             SharpCompress.Compressor.PPMd.H.State state5 = new SharpCompress.Compressor.PPMd.H.State(model.Heap);
             do
             {
                 ptr.Address = state.Address - 6;
                 state.SetValues(ptr);
                 state.DecrementAddress();
                 state5.Address = state.Address - 6;
             }
             while ((state.Address != this.freqData.GetStats()) && (ref2.Freq > state5.Freq));
             state.SetValues(ref2);
         }
     }
     while (--num2 != 0);
     if (state2.Freq == 0)
     {
         do
         {
             num2++;
             state2.DecrementAddress();
         }
         while (state2.Freq == 0);
         number += num2;
         this.NumStats -= num2;
         if (this.NumStats == 1)
         {
             ref2 = new StateRef();
             state3.Address = this.freqData.GetStats();
             ref2.Values = state3;
             do
             {
                 ref2.DecrementFreq(Utility.URShift(ref2.Freq, 1));
                 number = Utility.URShift(number, 1);
             }
             while (number > 1);
             model.SubAlloc.freeUnits(this.freqData.GetStats(), Utility.URShift((int) (numStats + 1), 1));
             this.oneState.SetValues(ref2);
             model.FoundState.Address = this.oneState.Address;
             return;
         }
     }
     number -= Utility.URShift(number, 1);
     this.freqData.IncrementSummFreq(number);
     int oldNU = Utility.URShift((int) (numStats + 1), 1);
     int newNU = Utility.URShift((int) (this.NumStats + 1), 1);
     if (oldNU != newNU)
     {
         this.freqData.SetStats(model.SubAlloc.shrinkUnits(this.freqData.GetStats(), oldNU, newNU));
     }
     model.FoundState.Address = this.freqData.GetStats();
 }
예제 #14
0
        internal void rescale(ModelPPM model)
        {
            StateRef ref2;
            int      numStats = this.NumStats;
            int      num2     = this.NumStats - 1;

            SharpCompress.Compressor.PPMd.H.State state  = new SharpCompress.Compressor.PPMd.H.State(model.Heap);
            SharpCompress.Compressor.PPMd.H.State state2 = new SharpCompress.Compressor.PPMd.H.State(model.Heap);
            SharpCompress.Compressor.PPMd.H.State state3 = new SharpCompress.Compressor.PPMd.H.State(model.Heap);
            state2.Address = model.FoundState.Address;
            while (state2.Address != this.freqData.GetStats())
            {
                state3.Address = state2.Address - 6;
                SharpCompress.Compressor.PPMd.H.State.PPMDSwap(state2, state3);
                state2.DecrementAddress();
            }
            state3.Address = this.freqData.GetStats();
            state3.IncrementFreq(4);
            this.freqData.IncrementSummFreq(4);
            int number = this.freqData.SummFreq - state2.Freq;
            int num3   = (model.OrderFall != 0) ? 1 : 0;

            state2.Freq            = Utility.URShift((int)(state2.Freq + num3), 1);
            this.freqData.SummFreq = state2.Freq;
            do
            {
                state2.IncrementAddress();
                number     -= state2.Freq;
                state2.Freq = Utility.URShift((int)(state2.Freq + num3), 1);
                this.freqData.IncrementSummFreq(state2.Freq);
                state3.Address = state2.Address - 6;
                if (state2.Freq > state3.Freq)
                {
                    state.Address = state2.Address;
                    ref2          = new StateRef();
                    ref2.Values   = state;
                    SharpCompress.Compressor.PPMd.H.State ptr    = new SharpCompress.Compressor.PPMd.H.State(model.Heap);
                    SharpCompress.Compressor.PPMd.H.State state5 = new SharpCompress.Compressor.PPMd.H.State(model.Heap);
                    do
                    {
                        ptr.Address = state.Address - 6;
                        state.SetValues(ptr);
                        state.DecrementAddress();
                        state5.Address = state.Address - 6;
                    }while ((state.Address != this.freqData.GetStats()) && (ref2.Freq > state5.Freq));
                    state.SetValues(ref2);
                }
            }while (--num2 != 0);
            if (state2.Freq == 0)
            {
                do
                {
                    num2++;
                    state2.DecrementAddress();
                }while (state2.Freq == 0);
                number        += num2;
                this.NumStats -= num2;
                if (this.NumStats == 1)
                {
                    ref2           = new StateRef();
                    state3.Address = this.freqData.GetStats();
                    ref2.Values    = state3;
                    do
                    {
                        ref2.DecrementFreq(Utility.URShift(ref2.Freq, 1));
                        number = Utility.URShift(number, 1);
                    }while (number > 1);
                    model.SubAlloc.freeUnits(this.freqData.GetStats(), Utility.URShift((int)(numStats + 1), 1));
                    this.oneState.SetValues(ref2);
                    model.FoundState.Address = this.oneState.Address;
                    return;
                }
            }
            number -= Utility.URShift(number, 1);
            this.freqData.IncrementSummFreq(number);
            int oldNU = Utility.URShift((int)(numStats + 1), 1);
            int newNU = Utility.URShift((int)(this.NumStats + 1), 1);

            if (oldNU != newNU)
            {
                this.freqData.SetStats(model.SubAlloc.shrinkUnits(this.freqData.GetStats(), oldNU, newNU));
            }
            model.FoundState.Address = this.freqData.GetStats();
        }
예제 #15
0
        public int decodeChar(SharpCompress.Compressor.LZMA.RangeCoder.Decoder decoder)
        {
            SharpCompress.Compressor.PPMd.H.State state;
            int  num;
            int  threshold;
            int  num3;
            byte symbol;

            if (this.minContext.NumStats != 1)
            {
                state         = this.tempState1.Initialize(this.Heap);
                state.Address = this.minContext.FreqData.GetStats();
                if ((threshold = (int)decoder.GetThreshold((uint)this.minContext.FreqData.SummFreq)) < (num3 = state.Freq))
                {
                    decoder.Decode(0, (uint)state.Freq);
                    symbol = (byte)state.Symbol;
                    this.minContext.update1_0(this, state.Address);
                    this.nextContext();
                    return(symbol);
                }
                this.prevSuccess = 0;
                num = this.minContext.NumStats - 1;
                do
                {
                    state.IncrementAddress();
                    if ((num3 += state.Freq) > threshold)
                    {
                        decoder.Decode((uint)(num3 - state.Freq), (uint)state.Freq);
                        symbol = (byte)state.Symbol;
                        this.minContext.update1(this, state.Address);
                        this.nextContext();
                        return(symbol);
                    }
                }while (--num > 0);
                if (threshold >= this.minContext.FreqData.SummFreq)
                {
                    return(-2);
                }
                this.hiBitsFlag = this.HB2Flag[this.foundState.Symbol];
                decoder.Decode((uint)num3, (uint)(this.minContext.FreqData.SummFreq - num3));
                for (num = 0; num < 0x100; num++)
                {
                    this.charMask[num] = -1;
                }
                this.charMask[state.Symbol] = 0;
                num = this.minContext.NumStats - 1;
                do
                {
                    state.DecrementAddress();
                    this.charMask[state.Symbol] = 0;
                }while (--num > 0);
            }
            else
            {
                SharpCompress.Compressor.PPMd.H.State rs = this.tempState1.Initialize(this.Heap);
                rs.Address      = this.minContext.getOneState().Address;
                this.hiBitsFlag = this.getHB2Flag()[this.foundState.Symbol];
                int index = rs.Freq - 1;
                int num6  = this.minContext.getArrayIndex(this, rs);
                int summ  = this.binSumm[index][num6];
                if (decoder.DecodeBit((uint)summ, 14) == 0)
                {
                    this.binSumm[index][num6] = ((summ + INTERVAL) - this.minContext.getMean(summ, 7, 2)) & 0xffff;
                    this.foundState.Address   = rs.Address;
                    symbol = (byte)rs.Symbol;
                    rs.IncrementFreq((rs.Freq < 0x80) ? 1 : 0);
                    this.prevSuccess = 1;
                    this.incRunLength(1);
                    this.nextContext();
                    return(symbol);
                }
                summ = (summ - this.minContext.getMean(summ, 7, 2)) & 0xffff;
                this.binSumm[index][num6] = summ;
                this.initEsc = PPMContext.ExpEscape[Utility.URShift(summ, 10)];
                for (num = 0; num < 0x100; num++)
                {
                    this.charMask[num] = -1;
                }
                this.charMask[rs.Symbol] = 0;
                this.prevSuccess         = 0;
            }
            while (true)
            {
                int num8;
                state = this.tempState1.Initialize(this.Heap);
                int numStats = this.minContext.NumStats;
                do
                {
                    this.orderFall++;
                    this.minContext.Address = this.minContext.getSuffix();
                    if ((this.minContext.Address <= this.subAlloc.PText) || (this.minContext.Address > this.subAlloc.HeapEnd))
                    {
                        return(-1);
                    }
                }while (this.minContext.NumStats == numStats);
                num3          = 0;
                state.Address = this.minContext.FreqData.GetStats();
                num           = 0;
                int num9 = this.minContext.NumStats - numStats;
                do
                {
                    int num11 = this.charMask[state.Symbol];
                    num3 += state.Freq & num11;
                    this.minContext.ps[num] = state.Address;
                    state.IncrementAddress();
                    num -= num11;
                }while (num != num9);
                SEE2Context context = this.minContext.makeEscFreq(this, numStats, out num8);
                num8     += num3;
                threshold = (int)decoder.GetThreshold((uint)num8);
                if (threshold < num3)
                {
                    SharpCompress.Compressor.PPMd.H.State state3 = this.tempState2.Initialize(this.Heap);
                    num3           = 0;
                    num            = 0;
                    state3.Address = this.minContext.ps[num];
                    while ((num3 += state3.Freq) <= threshold)
                    {
                        num++;
                        state3.Address = this.minContext.ps[num];
                    }
                    state.Address = state3.Address;
                    decoder.Decode((uint)(num3 - state.Freq), (uint)state.Freq);
                    context.update();
                    symbol = (byte)state.Symbol;
                    this.minContext.update2(this, state.Address);
                    this.updateModel();
                    return(symbol);
                }
                if (threshold >= num8)
                {
                    return(-2);
                }
                decoder.Decode((uint)num3, (uint)(num8 - num3));
                context.Summ += num8;
                do
                {
                    state.Address = this.minContext.ps[--num];
                    this.charMask[state.Symbol] = 0;
                }while (num != 0);
            }
        }
예제 #16
0
 internal void SetValues(SharpCompress.Compressor.PPMd.H.State ptr)
 {
     Array.Copy(ptr.Memory, ptr.Address, base.Memory, this.Address, 6);
 }
예제 #17
0
 internal virtual void SetStats(SharpCompress.Compressor.PPMd.H.State state)
 {
     this.SetStats(state.Address);
 }
예제 #18
0
 private void restartModelRare()
 {
     int num2;
     int num3;
     Utility.Fill<int>(this.charMask, 0);
     this.subAlloc.initSubAllocator();
     this.initRL = -((this.maxOrder < 12) ? this.maxOrder : 12) - 1;
     int stats = this.subAlloc.allocContext();
     this.minContext.Address = stats;
     this.maxContext.Address = stats;
     this.minContext.setSuffix(0);
     this.orderFall = this.maxOrder;
     this.minContext.NumStats = 0x100;
     this.minContext.FreqData.SummFreq = this.minContext.NumStats + 1;
     stats = this.subAlloc.allocUnits(0x80);
     this.foundState.Address = stats;
     this.minContext.FreqData.SetStats(stats);
     SharpCompress.Compressor.PPMd.H.State state = new SharpCompress.Compressor.PPMd.H.State(this.subAlloc.Heap);
     stats = this.minContext.FreqData.GetStats();
     this.runLength = this.initRL;
     this.prevSuccess = 0;
     for (num2 = 0; num2 < 0x100; num2++)
     {
         state.Address = stats + (num2 * 6);
         state.Symbol = num2;
         state.Freq = 1;
         state.SetSuccessor(0);
     }
     for (num2 = 0; num2 < 0x80; num2++)
     {
         num3 = 0;
         while (num3 < 8)
         {
             for (int i = 0; i < 0x40; i += 8)
             {
                 this.binSumm[num2][num3 + i] = BIN_SCALE - (InitBinEsc[num3] / (num2 + 2));
             }
             num3++;
         }
     }
     for (num2 = 0; num2 < 0x19; num2++)
     {
         for (num3 = 0; num3 < 0x10; num3++)
         {
             this.SEE2Cont[num2][num3].Initialize((5 * num2) + 10);
         }
     }
 }
예제 #19
0
 internal bool decodeInit(Stream stream, int maxOrder, int maxMemory)
 {
     if (stream != null)
     {
         this.coder = new RangeCoder(stream);
     }
     if (maxOrder == 1)
     {
         this.subAlloc.stopSubAllocator();
         return false;
     }
     this.subAlloc.startSubAllocator(maxMemory);
     this.minContext = new PPMContext(this.Heap);
     this.maxContext = new PPMContext(this.Heap);
     this.foundState = new SharpCompress.Compressor.PPMd.H.State(this.Heap);
     this.dummySEE2Cont = new SEE2Context();
     for (int i = 0; i < 0x19; i++)
     {
         for (int j = 0; j < 0x10; j++)
         {
             this.SEE2Cont[i][j] = new SEE2Context();
         }
     }
     this.startModelRare(maxOrder);
     return (this.minContext.Address != 0);
 }
예제 #20
0
        private void updateModel()
        {
            StateRef ref2 = this.tempStateRef1;

            ref2.Values = this.foundState;
            SharpCompress.Compressor.PPMd.H.State state  = this.tempState3.Initialize(this.Heap);
            SharpCompress.Compressor.PPMd.H.State state2 = this.tempState4.Initialize(this.Heap);
            PPMContext context   = this.tempPPMContext3.Initialize(this.Heap);
            PPMContext successor = this.tempPPMContext4.Initialize(this.Heap);

            context.Address = this.minContext.getSuffix();
            if ((ref2.Freq < 0x1f) && (context.Address != 0))
            {
                if (context.NumStats != 1)
                {
                    state.Address = context.FreqData.GetStats();
                    if (state.Symbol != ref2.Symbol)
                    {
                        do
                        {
                            state.IncrementAddress();
                        }while (state.Symbol != ref2.Symbol);
                        state2.Address = state.Address - 6;
                        if (state.Freq >= state2.Freq)
                        {
                            SharpCompress.Compressor.PPMd.H.State.PPMDSwap(state, state2);
                            state.DecrementAddress();
                        }
                    }
                    if (state.Freq < 0x73)
                    {
                        state.IncrementFreq(2);
                        context.FreqData.IncrementSummFreq(2);
                    }
                }
                else
                {
                    state.Address = context.getOneState().Address;
                    if (state.Freq < 0x20)
                    {
                        state.IncrementFreq(1);
                    }
                }
            }
            if (this.orderFall == 0)
            {
                this.foundState.SetSuccessor(this.createSuccessors(true, state));
                this.minContext.Address = this.foundState.GetSuccessor();
                this.maxContext.Address = this.foundState.GetSuccessor();
                if (this.minContext.Address == 0)
                {
                    this.updateModelRestart();
                }
            }
            else
            {
                this.subAlloc.Heap[this.subAlloc.PText] = (byte)ref2.Symbol;
                this.subAlloc.incPText();
                successor.Address = this.subAlloc.PText;
                if (this.subAlloc.PText >= this.subAlloc.FakeUnitsStart)
                {
                    this.updateModelRestart();
                }
                else
                {
                    if (ref2.GetSuccessor() != 0)
                    {
                        if (ref2.GetSuccessor() <= this.subAlloc.PText)
                        {
                            ref2.SetSuccessor(this.createSuccessors(false, state));
                            if (ref2.GetSuccessor() == 0)
                            {
                                this.updateModelRestart();
                                return;
                            }
                        }
                        if (--this.orderFall == 0)
                        {
                            successor.Address = ref2.GetSuccessor();
                            if (this.maxContext.Address != this.minContext.Address)
                            {
                                this.subAlloc.decPText(1);
                            }
                        }
                    }
                    else
                    {
                        this.foundState.SetSuccessor(successor.Address);
                        ref2.SetSuccessor(this.minContext);
                    }
                    int numStats = this.minContext.NumStats;
                    int num5     = (this.minContext.FreqData.SummFreq - numStats) - (ref2.Freq - 1);
                    context.Address = this.maxContext.Address;
                    while (context.Address != this.minContext.Address)
                    {
                        int number = context.NumStats;
                        if (number != 1)
                        {
                            if ((number & 1) == 0)
                            {
                                context.FreqData.SetStats(this.subAlloc.expandUnits(context.FreqData.GetStats(), Utility.URShift(number, 1)));
                                if (context.FreqData.GetStats() == 0)
                                {
                                    this.updateModelRestart();
                                    return;
                                }
                            }
                            int num6 = (((2 * number) < numStats) ? 1 : 0) + (2 * ((((4 * number) <= numStats) ? 1 : 0) & ((context.FreqData.SummFreq <= (8 * number)) ? 1 : 0)));
                            context.FreqData.IncrementSummFreq(num6);
                        }
                        else
                        {
                            state.Address = this.subAlloc.allocUnits(1);
                            if (state.Address == 0)
                            {
                                this.updateModelRestart();
                                return;
                            }
                            state.SetValues(context.getOneState());
                            context.FreqData.SetStats(state);
                            if (state.Freq < 30)
                            {
                                state.IncrementFreq(state.Freq);
                            }
                            else
                            {
                                state.Freq = 120;
                            }
                            context.FreqData.SummFreq = (state.Freq + this.initEsc) + ((numStats > 3) ? 1 : 0);
                        }
                        int dSummFreq = (2 * ref2.Freq) * (context.FreqData.SummFreq + 6);
                        int num4      = num5 + context.FreqData.SummFreq;
                        if (dSummFreq < (6 * num4))
                        {
                            dSummFreq = (1 + ((dSummFreq > num4) ? 1 : 0)) + ((dSummFreq >= (4 * num4)) ? 1 : 0);
                            context.FreqData.IncrementSummFreq(3);
                        }
                        else
                        {
                            dSummFreq = ((4 + ((dSummFreq >= (9 * num4)) ? 1 : 0)) + ((dSummFreq >= (12 * num4)) ? 1 : 0)) + ((dSummFreq >= (15 * num4)) ? 1 : 0);
                            context.FreqData.IncrementSummFreq(dSummFreq);
                        }
                        state.Address = context.FreqData.GetStats() + (number * 6);
                        state.SetSuccessor(successor);
                        state.Symbol     = ref2.Symbol;
                        state.Freq       = dSummFreq;
                        context.NumStats = ++number;
                        context.Address  = context.getSuffix();
                    }
                    int num7 = ref2.GetSuccessor();
                    this.maxContext.Address = num7;
                    this.minContext.Address = num7;
                }
            }
        }
예제 #21
0
        internal bool decodeSymbol1(ModelPPM model)
        {
            int        num2;
            RangeCoder coder = model.Coder;

            coder.SubRange.Scale = this.freqData.SummFreq;
            SharpCompress.Compressor.PPMd.H.State state = new SharpCompress.Compressor.PPMd.H.State(model.Heap);
            state.Address = this.freqData.GetStats();
            long currentCount = coder.CurrentCount;

            if (currentCount >= coder.SubRange.Scale)
            {
                return(false);
            }
            if (currentCount < (num2 = state.Freq))
            {
                coder.SubRange.HighCount = num2;
                model.PrevSuccess        = ((2 * num2) > coder.SubRange.Scale) ? 1 : 0;
                model.incRunLength(model.PrevSuccess);
                num2 += 4;
                model.FoundState.Address = state.Address;
                model.FoundState.Freq    = num2;
                this.freqData.IncrementSummFreq(4);
                if (num2 > 0x7c)
                {
                    this.rescale(model);
                }
                coder.SubRange.LowCount = 0L;
                return(true);
            }
            if (model.FoundState.Address == 0)
            {
                return(false);
            }
            model.PrevSuccess = 0;
            int numStats = this.NumStats;
            int num      = numStats - 1;

            while ((num2 += state.IncrementAddress().Freq) <= currentCount)
            {
                if (--num == 0)
                {
                    model.HiBitsFlag             = model.getHB2Flag()[model.FoundState.Symbol];
                    coder.SubRange.LowCount      = num2;
                    model.CharMask[state.Symbol] = model.EscCount;
                    model.NumMasked          = numStats;
                    num                      = numStats - 1;
                    model.FoundState.Address = 0;
                    do
                    {
                        model.CharMask[state.DecrementAddress().Symbol] = model.EscCount;
                    }while (--num != 0);
                    coder.SubRange.HighCount = coder.SubRange.Scale;
                    return(true);
                }
            }
            coder.SubRange.LowCount  = num2 - state.Freq;
            coder.SubRange.HighCount = num2;
            this.update1(model, state.Address);
            return(true);
        }
예제 #22
0
 internal bool decodeSymbol1(ModelPPM model)
 {
     int num2;
     RangeCoder coder = model.Coder;
     coder.SubRange.Scale = this.freqData.SummFreq;
     SharpCompress.Compressor.PPMd.H.State state = new SharpCompress.Compressor.PPMd.H.State(model.Heap);
     state.Address = this.freqData.GetStats();
     long currentCount = coder.CurrentCount;
     if (currentCount >= coder.SubRange.Scale)
     {
         return false;
     }
     if (currentCount < (num2 = state.Freq))
     {
         coder.SubRange.HighCount = num2;
         model.PrevSuccess = ((2 * num2) > coder.SubRange.Scale) ? 1 : 0;
         model.incRunLength(model.PrevSuccess);
         num2 += 4;
         model.FoundState.Address = state.Address;
         model.FoundState.Freq = num2;
         this.freqData.IncrementSummFreq(4);
         if (num2 > 0x7c)
         {
             this.rescale(model);
         }
         coder.SubRange.LowCount = 0L;
         return true;
     }
     if (model.FoundState.Address == 0)
     {
         return false;
     }
     model.PrevSuccess = 0;
     int numStats = this.NumStats;
     int num = numStats - 1;
     while ((num2 += state.IncrementAddress().Freq) <= currentCount)
     {
         if (--num == 0)
         {
             model.HiBitsFlag = model.getHB2Flag()[model.FoundState.Symbol];
             coder.SubRange.LowCount = num2;
             model.CharMask[state.Symbol] = model.EscCount;
             model.NumMasked = numStats;
             num = numStats - 1;
             model.FoundState.Address = 0;
             do
             {
                 model.CharMask[state.DecrementAddress().Symbol] = model.EscCount;
             }
             while (--num != 0);
             coder.SubRange.HighCount = coder.SubRange.Scale;
             return true;
         }
     }
     coder.SubRange.LowCount = num2 - state.Freq;
     coder.SubRange.HighCount = num2;
     this.update1(model, state.Address);
     return true;
 }
예제 #23
0
        private int createSuccessors(bool Skip, SharpCompress.Compressor.PPMd.H.State p1)
        {
            StateRef firstState = this.tempStateRef2;

            SharpCompress.Compressor.PPMd.H.State pStats = this.tempState1.Initialize(this.Heap);
            PPMContext context = this.tempPPMContext1.Initialize(this.Heap);

            context.Address = this.minContext.Address;
            PPMContext context2 = this.tempPPMContext2.Initialize(this.Heap);

            context2.Address = this.foundState.GetSuccessor();
            SharpCompress.Compressor.PPMd.H.State state2 = this.tempState2.Initialize(this.Heap);
            int  num  = 0;
            bool flag = false;

            if (!Skip)
            {
                this.ps[num++] = this.foundState.Address;
                if (context.getSuffix() == 0)
                {
                    flag = true;
                }
            }
            if (flag)
            {
                goto Label_01E0;
            }
            bool flag2 = false;

            if (p1.Address != 0)
            {
                state2.Address  = p1.Address;
                context.Address = context.getSuffix();
                flag2           = true;
            }
Label_00F2:
            if (!flag2)
            {
                context.Address = context.getSuffix();
                if (context.NumStats != 1)
                {
                    state2.Address = context.FreqData.GetStats();
                    if (state2.Symbol != this.foundState.Symbol)
                    {
                        do
                        {
                            state2.IncrementAddress();
                        }while (state2.Symbol != this.foundState.Symbol);
                    }
                }
                else
                {
                    state2.Address = context.getOneState().Address;
                }
            }
            flag2 = false;
            if (state2.GetSuccessor() != context2.Address)
            {
                context.Address = state2.GetSuccessor();
            }
            else
            {
                this.ps[num++] = state2.Address;
                if (context.getSuffix() != 0)
                {
                    goto Label_00F2;
                }
            }
Label_01E0:
            if (num != 0)
            {
                firstState.Symbol = this.Heap[context2.Address];
                firstState.SetSuccessor((int)(context2.Address + 1));
                if (context.NumStats != 1)
                {
                    if (context.Address <= this.subAlloc.PText)
                    {
                        return(0);
                    }
                    state2.Address = context.FreqData.GetStats();
                    if (state2.Symbol != firstState.Symbol)
                    {
                        do
                        {
                            state2.IncrementAddress();
                        }while (state2.Symbol != firstState.Symbol);
                    }
                    int num2 = state2.Freq - 1;
                    int num3 = (context.FreqData.SummFreq - context.NumStats) - num2;
                    firstState.Freq = 1 + (((2 * num2) <= num3) ? (((5 * num2) > num3) ? 1 : 0) : ((((2 * num2) + (3 * num3)) - 1) / (2 * num3)));
                }
                else
                {
                    firstState.Freq = context.getOneState().Freq;
                }
                do
                {
                    pStats.Address  = this.ps[--num];
                    context.Address = context.createChild(this, pStats, firstState);
                    if (context.Address == 0)
                    {
                        return(0);
                    }
                }while (num != 0);
            }
            return(context.Address);
        }
예제 #24
0
 internal bool decodeInit(Unpack unpackRead, int escChar)
 {
     int maxOrder = unpackRead.Char & 0xff;
     bool flag = (maxOrder & 0x20) != 0;
     int num2 = 0;
     if (flag)
     {
         num2 = unpackRead.Char;
     }
     else if (this.subAlloc.GetAllocatedMemory() == 0)
     {
         return false;
     }
     if ((maxOrder & 0x40) != 0)
     {
         escChar = unpackRead.Char;
         unpackRead.PpmEscChar = escChar;
     }
     this.coder = new RangeCoder(unpackRead);
     if (flag)
     {
         maxOrder = (maxOrder & 0x1f) + 1;
         if (maxOrder > 0x10)
         {
             maxOrder = 0x10 + ((maxOrder - 0x10) * 3);
         }
         if (maxOrder == 1)
         {
             this.subAlloc.stopSubAllocator();
             return false;
         }
         this.subAlloc.startSubAllocator((num2 + 1) << 20);
         this.minContext = new PPMContext(this.Heap);
         this.maxContext = new PPMContext(this.Heap);
         this.foundState = new SharpCompress.Compressor.PPMd.H.State(this.Heap);
         this.dummySEE2Cont = new SEE2Context();
         for (int i = 0; i < 0x19; i++)
         {
             for (int j = 0; j < 0x10; j++)
             {
                 this.SEE2Cont[i][j] = new SEE2Context();
             }
         }
         this.startModelRare(maxOrder);
     }
     return (this.minContext.Address != 0);
 }