示例#1
0
            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));
                    }
                }
            }
示例#2
0
            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));
                    }
                }
            }
示例#3
0
            public static void ConvertTable(
                Stream inStream,
                Stream outStream,
                ReadMTableItem readItem,
                WriteMTableItem writeItem,
                GetMTableItemSize getItemSize)
            {
                var list = ReadTable(inStream, readItem);

                WriteTable(outStream, list, writeItem, getItemSize);
            }
示例#4
0
            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);
                }
            }