Пример #1
0
 private RNCCommon.Huff[] makeHuffTable(ushort[] freq)
 {
     huffNode[] nodeArray = new huffNode[0x20];
     List<RNCCommon.Huff> list = new List<RNCCommon.Huff>();
     int index = 0;
     for (int i = 0; i < 0x10; i++)
     {
         if (freq[i] > 0)
         {
             nodeArray[index].freq = freq[i];
             nodeArray[index].parent = nodeArray[index].lchild = -1;
             nodeArray[index].rchild = i;
             index++;
         }
     }
     int num3 = index;
     if (num3 == 1)
     {
         num3 = 2;
     }
     while (num3 > 1)
     {
         int num4 = 0x7ffffffe;
         int num5 = 0x7fffffff;
         int num6 = 0;
         int num7 = 0;
         for (int num8 = 0; num8 < index; num8++)
         {
             if (nodeArray[num8].parent == -1)
             {
                 if (num4 > nodeArray[num8].freq)
                 {
                     num5 = num4;
                     num7 = num6;
                     num4 = nodeArray[num8].freq;
                     num6 = num8;
                 }
                 else if (num5 > nodeArray[num8].freq)
                 {
                     num5 = nodeArray[num8].freq;
                     num7 = num8;
                 }
             }
         }
         nodeArray[index].freq = num4 + num5;
         nodeArray[index].parent = -1;
         nodeArray[index].lchild = num6;
         nodeArray[index].rchild = num7;
         nodeArray[num6].parent = nodeArray[num7].parent = index;
         index++;
         num3--;
     }
     int num9 = 0;
     for (int j = 0; j < 0x10; j++)
     {
         list.Add(new RNCCommon.Huff(0, 0, 0));
     }
     for (int k = 0; k < index; k++)
     {
         if (nodeArray[k].lchild == -1)
         {
             int num12 = 0;
             for (num3 = k; nodeArray[num3].parent != -1; num3 = nodeArray[num3].parent)
             {
                 num12++;
             }
             RNCCommon.Huff huff = list[nodeArray[k].rchild];
             huff.value = (ushort)nodeArray[k].rchild;
             huff.len = (byte)num12;
             list[nodeArray[k].rchild] = huff;
             if (num9 < num12)
             {
                 num9 = num12;
             }
         }
     }
     ushort num13 = 0;
     for (int m = 1; m <= num9; m++)
     {
         for (index = 0; index < 0x10; index++)
         {
             if (list[index].len == m)
             {
                 ushort num15 = (ushort)(num13 >> (0x10 - m));
                 ushort num16 = 0;
                 for (int num17 = 0; num17 < m; num17++)
                 {
                     num16 = (ushort)(num16 | ((ushort)(((num15 >> (num17 & 0x1f)) & 1) << ((m - num17) - 1))));
                 }
                 RNCCommon.Huff huff2 = list[index];
                 huff2.code = num16;
                 list[index] = huff2;
                 num13 = (ushort)(num13 + ((ushort)(((int)1) << (0x10 - m))));
             }
         }
     }
     for (int n = list.Count - 1; (list[n].len == 0) && (list.Count > 1); n--)
     {
         list.RemoveAt(n);
     }
     return list.ToArray();
 }
Пример #2
0
        private RNCCommon.Huff[] makeHuffTable(ushort[] freq)
        {
            huffNode[]            nodeArray = new huffNode[0x20];
            List <RNCCommon.Huff> list      = new List <RNCCommon.Huff>();
            int index = 0;

            for (int i = 0; i < 0x10; i++)
            {
                if (freq[i] > 0)
                {
                    nodeArray[index].freq   = freq[i];
                    nodeArray[index].parent = nodeArray[index].lchild = -1;
                    nodeArray[index].rchild = i;
                    index++;
                }
            }
            int num3 = index;

            if (num3 == 1)
            {
                num3 = 2;
            }
            while (num3 > 1)
            {
                int num4 = 0x7ffffffe;
                int num5 = 0x7fffffff;
                int num6 = 0;
                int num7 = 0;
                for (int num8 = 0; num8 < index; num8++)
                {
                    if (nodeArray[num8].parent == -1)
                    {
                        if (num4 > nodeArray[num8].freq)
                        {
                            num5 = num4;
                            num7 = num6;
                            num4 = nodeArray[num8].freq;
                            num6 = num8;
                        }
                        else if (num5 > nodeArray[num8].freq)
                        {
                            num5 = nodeArray[num8].freq;
                            num7 = num8;
                        }
                    }
                }
                nodeArray[index].freq   = num4 + num5;
                nodeArray[index].parent = -1;
                nodeArray[index].lchild = num6;
                nodeArray[index].rchild = num7;
                nodeArray[num6].parent  = nodeArray[num7].parent = index;
                index++;
                num3--;
            }
            int num9 = 0;

            for (int j = 0; j < 0x10; j++)
            {
                list.Add(new RNCCommon.Huff(0, 0, 0));
            }
            for (int k = 0; k < index; k++)
            {
                if (nodeArray[k].lchild == -1)
                {
                    int num12 = 0;
                    for (num3 = k; nodeArray[num3].parent != -1; num3 = nodeArray[num3].parent)
                    {
                        num12++;
                    }
                    RNCCommon.Huff huff = list[nodeArray[k].rchild];
                    huff.value = (ushort)nodeArray[k].rchild;
                    huff.len   = (byte)num12;
                    list[nodeArray[k].rchild] = huff;
                    if (num9 < num12)
                    {
                        num9 = num12;
                    }
                }
            }
            ushort num13 = 0;

            for (int m = 1; m <= num9; m++)
            {
                for (index = 0; index < 0x10; index++)
                {
                    if (list[index].len == m)
                    {
                        ushort num15 = (ushort)(num13 >> (0x10 - m));
                        ushort num16 = 0;
                        for (int num17 = 0; num17 < m; num17++)
                        {
                            num16 = (ushort)(num16 | ((ushort)(((num15 >> (num17 & 0x1f)) & 1) << ((m - num17) - 1))));
                        }
                        RNCCommon.Huff huff2 = list[index];
                        huff2.code  = num16;
                        list[index] = huff2;
                        num13       = (ushort)(num13 + ((ushort)(((int)1) << (0x10 - m))));
                    }
                }
            }
            for (int n = list.Count - 1; (list[n].len == 0) && (list.Count > 1); n--)
            {
                list.RemoveAt(n);
            }
            return(list.ToArray());
        }