/// <summary> /// /// </summary> /// <param name="Stream"></param> /// <param name="Spaces"></param> /// <returns></returns> public static MapStream ConvertSpacesToMapStream(this Stream Stream, SpaceAssigner1D.Space[] Spaces) { var MapStream = new MapStream(); foreach (var Space in Spaces) { MapStream.Map(Space.Min, Stream.SliceWithBounds(Space.Min, Space.Max)); } return MapStream; }
override public void SaveTo(Stream Stream, bool DoAlign = true) { var SpaceAssigner1D = new SpaceAssigner1D().AddAllPositiveAvailable(); var SpaceAssigner1DUniqueAllocator = new SpaceAssigner1DUniqueAllocatorStream(SpaceAssigner1D, new MemoryStream()); SpaceAssigner1DUniqueAllocator.Encoding = Encoding.UTF8; SpaceAssigner1DUniqueAllocator.AllocateUnique(SpaceAssigner1DUniqueAllocator.Encoding.GetBytes("dummy")); SpaceAssigner1DUniqueAllocator.AllocateUnique(new byte[] { 0 }); var EntryStructs = new List <EntryStruct>(); foreach (var Entry in Entries) { EntryStructs.Add(new EntryStruct() { OffsetTitle = (uint)SpaceAssigner1DUniqueAllocator.AllocateUnique(Entry.Title).Min, OffsetTextOriginal = (uint)SpaceAssigner1DUniqueAllocator.AllocateUnique(Entry.TextOriginal).Min, OffsetTextTranslated = (uint)SpaceAssigner1DUniqueAllocator.AllocateUnique(Entry.TextTranslated).Min, Talker = (uint)Entry.Talker, }); } var OffsetEntries = Marshal.SizeOf(typeof(HeaderStruct)); var OffsetTexts = OffsetEntries + Entries.Count * Marshal.SizeOf(typeof(EntryStruct)); var OffsetEnd = OffsetTexts + SpaceAssigner1DUniqueAllocator.Stream.Length; Stream.WriteStruct(new HeaderStruct() { Magic = "TO8CHTX", OffsetEntries = (uint)OffsetEntries, OffsetTexts = (uint)OffsetTexts, TextCount = (uint)Entries.Count, FileSize = (uint)OffsetEnd, Padding = 0, }); foreach (var EntryStruct in EntryStructs) { Stream.WriteStruct(EntryStruct); } SpaceAssigner1DUniqueAllocator.Stream.CopyToFast(Stream); }
void SpaceAssigner1DUniqueAllocatorStream_OnAllocate(byte[] Bytes, SpaceAssigner1D.Space Space) { SliceStream.CreateWithBounds(this.Stream, Space.Min, Space.Max).WriteBytes(Bytes); }
public SpaceAssigner1DUniqueAllocatorStream(SpaceAssigner1D SpaceAssigner, Stream Stream) : base(SpaceAssigner) { this.Stream = Stream; OnAllocate += SpaceAssigner1DUniqueAllocatorStream_OnAllocate; }
public void TestInitialize() { this.SpaceAssigner1D = new SpaceAssigner1D(); }
public SpaceAssigner1DUniqueAllocator(SpaceAssigner1D SpaceAssigner) { this.SpaceAssigner = SpaceAssigner; this.AllocatedSpaces = new Dictionary<byte[], SpaceAssigner1D.Space>(new ArrayEqualityComparer<byte>()); }
public void TranslateTexts(Action <TextEntry> TranslateTextEntry, Func <string, string> TranslateNormalText, bool HandleType1 = true, bool AddAdditionalSpace = true) { var SpaceAssigner1D = new SpaceAssigner1D(); var SpaceAssigner1DUniqueAllocator = new SpaceAssigner1DUniqueAllocatorStream(SpaceAssigner1D, TextStream); var Entries = new List <TextEntry>(); var StringInfoList2 = new List <StringInfo>(); HandleTexts((Entry) => { if (Entry == null) { return; } Entries.Add(Entry); foreach (var StringInfo in Entry.OriginalTranslated) { //var StringLength = CountStringz((uint)StringOffset); //Console.WriteLine("{0}, {1}", StringInfo.StringzOffset, StringInfo.StringzLength); SpaceAssigner1D.AddAvailableWithLength(StringInfo.StringzOffset, StringInfo.StringzLength); } bool HasText = false; foreach (var StringInfo in Entry.OriginalTranslated) { if (StringInfo.Text.Length > 0) { HasText = true; } } if (HasText) { TranslateTextEntry(Entry); } }, (StringInfo) => { var Translated = TranslateNormalText(StringInfo.Text); if (Translated != null) { StringInfo.Text = Translated; StringInfoList2.Add(StringInfo); SpaceAssigner1D.AddAvailableWithLength(StringInfo.StringzOffset, StringInfo.StringzLength); } }, HandleType1); SpaceAssigner1DUniqueAllocator.FillSpacesWithZeroes(); Console.WriteLine("SpaceAssigner1D: {0}", SpaceAssigner1D.GetAvailableSpaces().Sum(Item => Item.Length)); if (AddAdditionalSpace) { SpaceAssigner1D.AddAvailableWithLength(TextStream.Length, 0x10000); Console.WriteLine("SpaceAssigner1D: {0}", SpaceAssigner1D.GetAvailableSpaces().Sum(Item => Item.Length)); } #if true var StringInfoList = Entries .SelectMany(Item => Item.OriginalTranslated) .OrderByDescending(Item => Item.Text.Length) .Concat(StringInfoList2) .ToArray() ; #else var StringInfoList = new List <StringInfo>(); foreach (var Entry in Entries) { foreach (var StringInfo in Entry.OriginalTranslated) { StringInfoList.Add(StringInfo); } } StringInfoList = StringInfoList.OrderByDescending(Item => Item.Text.Length).ToList(); #endif /* * foreach (var StringInfo in StringInfoList) * { * Console.WriteLine("{0}", StringInfo.Text); * } */ //throw (new Exception("Stop")); foreach (var StringInfo in StringInfoList) { var TextSpace = SpaceAssigner1DUniqueAllocator.AllocateUnique(StringInfo.Text, Encoding.UTF8); StringInfo.WritePointerValue((uint)TextSpace.Min); } }
public void TestInitialize() { this.SpaceAssigner1D = new SpaceAssigner1D(); }
public SpaceAssigner1DTest() { this.SpaceAssigner1D = new SpaceAssigner1D(); }