예제 #1
0
        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());
        }
예제 #2
0
        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();
        }