/// <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); }
/// <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()); }
/// <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()); }
public void Write(EndianMemoryStream stream) { stream.Write(Unknown); stream.Write(XvrsTextureId); stream.Write(NormalizedPosX); stream.Write(NormalizedPosY); stream.Write(NormalizedWidth); stream.Write(NormalizedHeight); }
/// <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)); }
public int Write(EndianMemoryStream stream) { stream.Write(Data); return(Data.Length); }