/// <summary>
 /// Writes a colour to a managed memory stream.
 /// </summary>
 /// <param name="writer">Writer used for writing the stream.</param>
 /// <param name="color">Colour to write.</param>
 public static void Write(this EndianMemoryStream writer, ColorABGR color)
 {
     writer.Write(color.Alpha);
     writer.Write(color.Blue);
     writer.Write(color.Green);
     writer.Write(color.Red);
 }
Beispiel #2
0
 public void Write(EndianMemoryStream stream)
 {
     stream.Write(Unknown);
     stream.Write(XvrsTextureId);
     stream.Write(NormalizedPosX);
     stream.Write(NormalizedPosY);
     stream.Write(NormalizedWidth);
     stream.Write(NormalizedHeight);
 }
Beispiel #3
0
        public int Write(EndianMemoryStream stream)
        {
            var pos = stream.Stream.Position;

            Extensions.Write(stream, TopLeft);
            Extensions.Write(stream, BottomLeft);
            Extensions.Write(stream, BottomRight);
            Extensions.Write(stream, TopRight);
            return((int)(stream.Stream.Position - pos));
        }
        /// <summary>
        /// Writes the contents of the archive to be generated to the stream.
        /// </summary>
        public void Write(Stream writeStream, bool bigEndian)
        {
            using var stream = new ExtendedMemoryStream();
            using EndianMemoryStream endianStream = bigEndian ? (EndianMemoryStream) new BigEndianMemoryStream(stream) : new LittleEndianMemoryStream(stream);

            // Number of items.
            endianStream.Write <int>(Groups.Keys.Count);

            // Number of items for each id.
            foreach (var group in Groups)
            {
                endianStream.Write <byte>((byte)group.Value.Files.Count);
            }

            endianStream.AddPadding(0x00, 4);

            // Write first item index for each group.
            ushort totalItems = 0;

            foreach (var group in Groups)
            {
                endianStream.Write <ushort>(totalItems);
                totalItems += (ushort)group.Value.Files.Count;
            }

            // Write ID for each group.
            foreach (var group in Groups)
            {
                endianStream.Write <ushort>(group.Value.Id);
            }

            // Write offsets for each file and pad.
            int firstWriteOffset = Utilities.Utilities.RoundUp((int)endianStream.Stream.Position + (sizeof(int) * totalItems), 16);
            int fileWriteOffset  = firstWriteOffset;

            foreach (var group in Groups)
            {
                foreach (var file in group.Value.Files)
                {
                    endianStream.Write <int>(file.Data.Length <= 0 ? 0 : fileWriteOffset);
                    fileWriteOffset += file.Data.Length;
                }
            }

            // Write files.
            endianStream.Write(new byte[(int)(firstWriteOffset - endianStream.Stream.Position)]); // Alignment
            foreach (var file in Groups.SelectMany(x => x.Value.Files))
            {
                endianStream.Write(file.Data);
            }

            writeStream.Write(endianStream.ToArray());
        }
Beispiel #5
0
        /// <summary>
        /// Writes the contents of the archive to be generated to the stream.
        /// </summary>
        public void Write(Stream writeStream, bool bigEndian)
        {
            using var stream = new ExtendedMemoryStream();
            using EndianMemoryStream endianStream = bigEndian ? (EndianMemoryStream) new BigEndianMemoryStream(stream) : new LittleEndianMemoryStream(stream);

            // Precompute Offsets
            var        fileNameSize = Files.Sum(x => x.Name.Length) + (Files.Count);
            Span <int> offsets      = stackalloc int[Files.Count];

            PrecomputeFileOffsets(offsets, fileNameSize);

            // Texture Count
            endianStream.Write <short>((short)Files.Count);
            endianStream.Write((short)1);

            // Texture Offsets
            for (int x = 0; x < offsets.Length; x++)
            {
                endianStream.Write(offsets[x]);
            }

            // Texture Flags
            for (int x = 0; x < Files.Count; x++)
            {
                endianStream.Write((byte)0x11);
            }

            // Texture Names
            Span <byte> currentString = stackalloc byte[1024];

            foreach (var file in Files)
            {
                int numEncoded = Encoding.ASCII.GetBytes(file.Name, currentString);
                currentString[numEncoded] = 0x00;
                stream.Write(currentString.Slice(0, numEncoded + 1));
            }

            // Texture Data
            stream.AddPadding(FileDataAlignment);
            for (int x = 0; x < Files.Count; x++)
            {
                stream.Write(Files[x].Data);
                stream.AddPadding(FileDataAlignment);
            }

            writeStream.Write(stream.ToArray());
        }
Beispiel #6
0
        /// <summary>
        /// Writes the action layer to a given stream.
        /// </summary>
        /// <param name="stream">The stream to write the action layer to.</param>
        /// <param name="parent">The object owning this action layer.</param>
        /// <returns>Number of bytes written.</returns>
        public int Write(EndianMemoryStream stream, Object parent)
        {
            var originalPos = stream.Stream.Position;

            stream.Write(IsEnabled);
            stream.Write(Unk_1);

            if (IsEnabled <= 0)
            {
                return((int)(stream.Stream.Position - originalPos));
            }

            stream.Write(LongestAnimationDuration);
            stream.Write(UnknownFlag);
            stream.Write(Unk_4);
            stream.Write(Unk_5);
            stream.Write(Unknown_6);

            return((int)(stream.Stream.Position - originalPos));
        }
Beispiel #7
0
 public int Write(EndianMemoryStream stream)
 {
     stream.Write(Data);
     return(Data.Length);
 }