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(); }
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()); }