Beispiel #1
0
        public ITexImageContainer ReadFrom(BinaryReader reader, TexFormat texFormat)
        {
            if (reader == null)
            {
                throw new ArgumentNullException(nameof(reader));
            }

            if (!texFormat.IsValid())
            {
                throw new EnumNotValidException <TexFormat>(texFormat);
            }

            var container = new TexImageContainer
            {
                Magic = reader.ReadNString(maxLength: 16)
            };

            var imageCount = reader.ReadInt32();

            if (imageCount > Constants.MaximumImageCount)
            {
                throw new UnsafeTexException(
                          $"Image count exceeds limit: {imageCount}/{Constants.MaximumImageCount}");
            }

            switch (container.Magic)
            {
            case "TEXB0001":
            case "TEXB0002":
                break;

            case "TEXB0003":
                container.ImageFormat = (FreeImageFormat)reader.ReadInt32();
                break;

            default:
                throw new UnknownMagicException(nameof(TexImageContainerReader), container.Magic);
            }

            container.ImageContainerVersion = (TexImageContainerVersion)Convert.ToInt32(container.Magic.Substring(4));

            if (!container.ImageFormat.IsValid())
            {
                throw new EnumNotValidException <FreeImageFormat>(container.ImageFormat);
            }

            for (var i = 0; i < imageCount; i++)
            {
                container.Images.Add(_texImageReader.ReadFrom(reader, container, texFormat));
            }

            return(container);
        }
Beispiel #2
0
        public ITexImage ReadFrom(
            BinaryReader reader,
            ITexImageContainer container,
            TexFormat texFormat)
        {
            if (reader == null)
            {
                throw new ArgumentNullException(nameof(reader));
            }
            if (container == null)
            {
                throw new ArgumentNullException(nameof(container));
            }

            if (!texFormat.IsValid())
            {
                throw new EnumNotValidException <TexFormat>(texFormat);
            }

            var mipmapCount = reader.ReadInt32();

            if (mipmapCount > Constants.MaximumMipmapCount)
            {
                throw new UnsafeTexException(
                          $"Mipmap count exceeds limit: {mipmapCount}/{Constants.MaximumMipmapCount}");
            }

            var readFunction = PickMipmapReader(container.ImageContainerVersion);
            var format       = TexMipmapFormatGetter.GetFormatForTex(container.ImageFormat, texFormat);
            var image        = new TexImage();

            for (var i = 0; i < mipmapCount; i++)
            {
                var mipmap = readFunction(reader);
                mipmap.Format = format;

                if (DecompressMipmapBytes)
                {
                    _texMipmapDecompressor.DecompressMipmap(mipmap);
                }

                image.Mipmaps.Add(mipmap);
            }

            return(image);
        }