public byte[] Save(IEnumerable <Color> colors) { byte nibbleBuffer = 0; bool writeNibble = false; var ms = new MemoryStream(); using (var bw = new BinaryWriter(ms, System.Text.Encoding.ASCII, true)) { foreach (var color in colors) { var r = (RedDepth == 0) ? 0 : Convert.ChangeBitDepth(color.R, 8, RedDepth); var g = (GreenDepth == 0) ? 0 : Convert.ChangeBitDepth(color.G, 8, GreenDepth); var rShift = GreenDepth; long value = g; value |= (uint)(r << rShift); switch (BitDepth) { case 4: if (writeNibble) { nibbleBuffer |= (byte)(value & 0xF); bw.Write(nibbleBuffer); } else { nibbleBuffer = (byte)((value & 0xF) << 4); } writeNibble = !writeNibble; break; case 8: bw.Write((byte)value); break; case 16: bw.Write(Convert.ToByteArray((ushort)value, 2, ByteOrder)); break; default: throw new InvalidOperationException($"BitDepth {BitDepth} not supported!"); } } if (writeNibble) { bw.Write(nibbleBuffer); } } return(ms.ToArray()); }
private void CreateTempASTCFile(string astcFile, byte[] texData) { var astc = File.Create(astcFile); using (var bw = new BinaryWriter(astc, System.Text.Encoding.ASCII, true)) { bw.Write(0x5CA1AB13); // magic val bw.Write((byte)_xDim); bw.Write((byte)_yDim); bw.Write((byte)_zDim); bw.Write(Convert.ToByteArray(Width, 3, ByteOrder)); bw.Write(Convert.ToByteArray(Height, 3, ByteOrder)); bw.Write(Convert.ToByteArray(1, 3, ByteOrder)); bw.Write(texData); } astc.Dispose(); astc.Close(); }