Exemplo n.º 1
0
        public static Span <byte> Create(TextureFormat format,
                                         Caps capabilities,
                                         Caps2 capabilities2,
                                         int width, int height,
                                         int?depth, int?mipMapCount,
                                         int?pitch, int?linearSize)
        {
            Span <byte> data = new byte[128];

            data.WriteInt32At(0, Magic);
            data.WriteInt32At(4, Length - 4); // Remove 4 from length for magic size
            var flags = DefaultFlags;

            if (depth.HasValue)
            {
                flags |= DdsFlags.Depth;
            }
            if (mipMapCount.HasValue)
            {
                flags |= DdsFlags.MipMapCount;
            }
            if (pitch.HasValue)
            {
                flags |= DdsFlags.Pitch;
            }
            if (linearSize.HasValue)
            {
                flags |= DdsFlags.LinearSize;
            }

            data.WriteInt32At(8, (int)flags);
            data.WriteInt32At(12, height);
            data.WriteInt32At(16, width);
            data.WriteInt32At(20, (pitch ?? linearSize).GetValueOrDefault());
            data.WriteInt32At(24, depth.GetValueOrDefault());
            data.WriteInt32At(28, mipMapCount.GetValueOrDefault() == 0 ? 1 : mipMapCount.GetValueOrDefault());

            // 44 bytes of reserved space

            DdsPixelFormat.Write(format, data.Slice(76));

            if (flags.HasFlag(DdsFlags.MipMapCount))
            {
                capabilities |= Caps.MipMap;
            }
            data.WriteInt32At(108, (int)capabilities);
            data.WriteInt32At(112, (int)capabilities2);
            data.WriteInt32At(116, 0); // Caps3 (unused)
            data.WriteInt32At(120, 0); // Caps4 (unused)
            data.WriteInt32At(124, 0); // Reserved

            return(data);
        }