예제 #1
0
	/// <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;
	}
예제 #2
0
파일: TO8CHTX.cs 프로젝트: talestra/tov
        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>());
 }
예제 #7
0
파일: TSS.cs 프로젝트: talestra/tov
        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);
            }
        }
예제 #8
0
		public void TestInitialize()
		{
            this.SpaceAssigner1D = new SpaceAssigner1D();
		}
 public SpaceAssigner1DTest()
 {
     this.SpaceAssigner1D = new SpaceAssigner1D();
 }