コード例 #1
0
        /// <summary>
        /// Decode TGA Header.
        /// </summary>
        /// <param name="reader">Image stream.</param>
        /// <param name="description">Image description.</param>
        public unsafe void DecodeHeader(BinaryReader reader, out ImageDescription description)
        {
            KTXHeader header = ImageHelpers.ReadStruct <KTXHeader>(reader);

            description = new ImageDescription()
            {
                imageFormat = ImageFormat.KTX,
                Width       = Math.Max(1, header.pixelWidth),
                Height      = Math.Max(1, header.pixelHeight),
                Depth       = Math.Max(1, header.pixelDepth),
                MipLevels   = Math.Max(1, header.numberOfMipmapLevels),
                ArraySize   = Math.Max(1, header.numberOfArrayElements),
                Faces       = Math.Max(1, header.numberOfFaces),
                pixelFormat = SupportedFormats.FromOpenGLFormat(ref header),
            };
        }
コード例 #2
0
        /// <summary>
        /// Decode TGA data.
        /// </summary>
        /// <param name="reader">Binary reader.</param>
        /// <param name="databoxes">Databoxes array.</param>
        /// <param name="description">Image Description.</param>
        public void DecodeData(BinaryReader reader, out DataBox[] databoxes, out ImageDescription description)
        {
            KTXTexture texture = KTXTexture.Load(reader, true);
            var        header  = texture.Header;

            description = new ImageDescription()
            {
                imageFormat = ImageFormat.KTX,
                Width       = Math.Max(1, texture.Header.pixelWidth),
                Height      = Math.Max(1, texture.Header.pixelHeight),
                Depth       = Math.Max(1, texture.Header.pixelDepth),
                MipLevels   = Math.Max(1, texture.Header.numberOfMipmapLevels),
                ArraySize   = Math.Max(1, texture.Header.numberOfArrayElements),
                Faces       = Math.Max(1, header.numberOfFaces),
                pixelFormat = SupportedFormats.FromOpenGLFormat(ref header),
            };

            databoxes = new DataBox[description.ArraySize * description.Faces * description.MipLevels];

            for (int mipmapIndex = 0; mipmapIndex < texture.Mipmaps.Length; mipmapIndex++)
            {
                var level = texture.Mipmaps[mipmapIndex];
                for (int sliceIndex = 0; sliceIndex < level.ArrayElements.Length; sliceIndex++)
                {
                    var slice = level.ArrayElements[sliceIndex];

                    for (int faceIndex = 0; faceIndex < slice.Faces.Length; faceIndex++)
                    {
                        var face = slice.Faces[faceIndex];

                        uint formatSize           = description.pixelFormat.GetSizeInBits() / 8;
                        uint rowPitch             = (uint)level.Width * formatSize;
                        uint slicePitch           = (uint)face.Data.Length;
                        int  sliceIndexCalculated = (sliceIndex * slice.Faces.Length) + faceIndex;
                        int  index = (sliceIndexCalculated * (int)description.MipLevels) + mipmapIndex;


                        databoxes[index] = new DataBox(face.Data, rowPitch, slicePitch);
                    }
                }
            }
        }