コード例 #1
0
ファイル: DDSImage.cs プロジェクト: haiboge/bitmap-compressor
 public void Save(string fileName)
 {
     using (var writer = new DDSFileWriter(fileName))
     {
         writer.Write(this);
     }
 }
コード例 #2
0
        public void CreateFileHeaderForBC1()
        {
            var expectedFlags = DDSFileHeaderFlags.DDSD_CAPS | DDSFileHeaderFlags.DDSD_HEIGHT |
                                DDSFileHeaderFlags.DDSD_WIDTH | DDSFileHeaderFlags.DDSD_PIXELFORMAT;
            var expectedPixelFormat = new DDSPixelFormat
            {
                Size   = 32,
                Flags  = DDSPixelFormatFlags.DDPF_FOURCC,
                FourCC = FourCC.BC1Unorm.Value
            };

            var header = DDSFileWriter.CreateHeader(1024, 512, FourCC.BC1Unorm.Value);

            Assert.AreEqual(124, header.Size);
            Assert.AreEqual(expectedFlags, header.Flags);
            Assert.AreEqual(512, header.Height);
            Assert.AreEqual(1024, header.Width);
            Assert.AreEqual(0, header.PitchOrLinearSize);
            Assert.AreEqual(0, header.Depth);
            Assert.AreEqual(0, header.MipMapCount);
            unsafe
            {
                Assert.AreEqual(0, header.Reserved1[0]);
                Assert.AreEqual(0, header.Reserved1[1]);
                Assert.AreEqual(0, header.Reserved1[2]);
                Assert.AreEqual(0, header.Reserved1[3]);
                Assert.AreEqual(0, header.Reserved1[4]);
                Assert.AreEqual(0, header.Reserved1[5]);
                Assert.AreEqual(0, header.Reserved1[6]);
                Assert.AreEqual(0, header.Reserved1[7]);
                Assert.AreEqual(0, header.Reserved1[8]);
                Assert.AreEqual(0, header.Reserved1[9]);
                Assert.AreEqual(0, header.Reserved1[10]);
            }
            Assert.AreEqual(DDSCapsFlags.DDSCAPS_TEXTURE, header.Caps);
            Assert.AreEqual(0, header.Caps2);
            Assert.AreEqual(0, header.Caps3);
            Assert.AreEqual(0, header.Caps4);
            Assert.AreEqual(0, header.Reserved2);

            Assert.AreEqual(expectedPixelFormat.Size, header.PixelFormat.Size);
            Assert.AreEqual(expectedPixelFormat.Flags, header.PixelFormat.Flags);
            Assert.AreEqual(expectedPixelFormat.FourCC, header.PixelFormat.FourCC);
            Assert.AreEqual(0, header.PixelFormat.RGBBitCount);
            Assert.AreEqual(0, header.PixelFormat.RBitMask);
            Assert.AreEqual(0, header.PixelFormat.GBitMask);
            Assert.AreEqual(0, header.PixelFormat.BBitMask);
            Assert.AreEqual(0, header.PixelFormat.ABitMask);
        }
コード例 #3
0
        public void WriteImageToMemory()
        {
            var format = new Mock <IBlockCompressionFormat>();

            format.Setup(f => f.FourCC).Returns(FourCC.BC1Unorm);

            var imageData = new byte[8] {
                1, 2, 3, 4, 5, 6, 7, 8
            };
            int imageWidth  = 4;
            int imageHeight = 4;

            var ddsImage = DDSImage.CreateFromData(imageWidth, imageHeight, imageData, format.Object);
            var stream   = new MemoryStream();
            var writer   = new DDSFileWriter(stream);

            writer.Write(ddsImage);

            // Reset stream position for read
            stream.Position = 0;

            var reader = new BinaryReader(stream);

            {
                int size        = Marshal.SizeOf(DDSFile.MagicNumber);
                var data        = reader.ReadBytes(size);
                var magicNumber = BitConverter.ToUInt32(data, 0);

                Assert.AreEqual(DDSFile.MagicNumber, magicNumber);
            }
            {
                int size   = Marshal.SizeOf(typeof(DDSFileHeader));
                var data   = reader.ReadBytes(size);
                var handle = GCHandle.Alloc(data, GCHandleType.Pinned);
                var header = (DDSFileHeader)Marshal.PtrToStructure(handle.AddrOfPinnedObject(), typeof(DDSFileHeader));
                handle.Free();

                Assert.AreEqual(imageWidth, header.Width);
                Assert.AreEqual(imageHeight, header.Height);
            }
            {
                var data = reader.ReadBytes(imageData.Length);

                CollectionAssert.AreEqual(imageData, imageData);
            }

            writer.Dispose();
            reader.Dispose();
        }
コード例 #4
0
        public void ReadImageFromMemory()
        {
            int imageWidth  = 4;
            int imageHeight = 4;
            var mainImage   = new byte[8] {
                1, 2, 3, 4, 5, 6, 7, 8
            };

            var stream = new MemoryStream();
            var writer = new BinaryWriter(stream);

            // Write the DDS "magic number"
            writer.Write(DDSFile.MagicNumber);

            // Write the header data structure directly to the buffer
            var header     = DDSFileWriter.CreateHeader(imageWidth, imageHeight, FourCC.BC1Unorm.Value);
            var headerData = new byte[Marshal.SizeOf(typeof(DDSFileHeader))];
            var handle     = GCHandle.Alloc(headerData, GCHandleType.Pinned);

            Marshal.StructureToPtr(header, handle.AddrOfPinnedObject(), true);

            writer.Write(headerData);

            // Write main image data
            writer.Write(mainImage);

            // Flush data and reset stream position for reader
            writer.Flush();
            stream.Position = 0;

            // Act against test stream
            var reader   = new DDSFileReader(stream);
            var ddsImage = reader.Read();

            Assert.AreEqual(imageWidth, ddsImage.Width);
            Assert.AreEqual(imageHeight, ddsImage.Height);
            CollectionAssert.AreEqual(mainImage, ddsImage.GetBuffer());

            reader.Dispose();
            writer.Dispose();
        }