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