private static void WriteTable( Stream stream, List <Node> itemList, WriteMTableItem writeItem, GetMTableItemSize getItemSize) { const int Alignment = 2; using (var writer = new BinaryWriter(stream)) { int basePtr = (1 + itemList.Count) * 2; var ptrs = new ushort[itemList.Count]; writer.BaseStream.Position = basePtr; for (int i = 0; i < itemList.Count; i++) { var node = itemList[i]; ptrs[i] = (ushort)Utility.AlignStream(writer.BaseStream, Alignment); writeItem(writer, node.Child); } Utility.PadStream(writer.BaseStream); writer.BaseStream.Position = 0; writer.Write((ushort)itemList.Count); foreach (var ptr in ptrs) { writer.Write((ushort)(ptr - basePtr)); } } }
private static void WriteMTable( Stream stream, Node root, WriteMTableItem writeItem, GetMTableItemSize getItemSize) { using (var writer = new BinaryWriter(stream)) { var itemList = (List <Node>)root.Children; int basePtr = (1 + itemList.Count) * 2; var ptrs = new ushort[itemList.Count]; writer.BaseStream.Position = basePtr; for (int i = 0; i < itemList.Count; i++) { var node = itemList[i]; var dimSizes = new List <int>(); while (true) { var list = node.Children as List <Node>; if (list != null) { dimSizes.Add(list.Count); Debug.Assert(list.Count > 0); node = list[0]; } else { int size = getItemSize(node.Children); dimSizes.Add(size); break; } } for (int j = dimSizes.Count - 2; j >= 0; j--) { dimSizes[j] *= dimSizes[j + 1]; } ptrs[i] = (ushort)writer.BaseStream.Position; writer.Write((byte)(dimSizes.Count - 1)); for (int j = 1; j < dimSizes.Count; j++) { writer.Write((byte)dimSizes[j]); } WriteArrayDim(writer, itemList[i], writeItem); } Utility.PadStream(writer.BaseStream); writer.BaseStream.Position = 0; writer.Write((ushort)itemList.Count); foreach (var ptr in ptrs) { writer.Write((ushort)(ptr - basePtr)); } } }
public static void ConvertTable( Stream inStream, Stream outStream, ReadMTableItem readItem, WriteMTableItem writeItem, GetMTableItemSize getItemSize) { var list = ReadTable(inStream, readItem); WriteTable(outStream, list, writeItem, getItemSize); }
private static void WriteArrayDim( BinaryWriter writer, Node node, WriteMTableItem writeItem) { var list = node.Children as List <Node>; if (list != null) { foreach (var child in list) { WriteArrayDim(writer, child, writeItem); } } else { writeItem(writer, node.Children); } }