Example #1
0
        public void WriteTo(BinaryWriter writer, ITexImageContainer imageContainer)
        {
            if (writer == null)
            {
                throw new ArgumentNullException(nameof(writer));
            }
            if (imageContainer == null)
            {
                throw new ArgumentNullException(nameof(imageContainer));
            }

            writer.WriteNString(imageContainer.Magic);
            writer.Write(imageContainer.Images.Count);

            switch (imageContainer.ImageContainerVersion)
            {
            case TexImageContainerVersion.Version1:
            case TexImageContainerVersion.Version2:
                break;

            case TexImageContainerVersion.Version3:
                writer.Write((int)imageContainer.ImageFormat);
                break;

            default:
                throw new UnknownMagicException(nameof(TexImageContainerWriter), imageContainer.Magic);
            }

            foreach (var image in imageContainer.Images)
            {
                _texImageWriter.WriteTo(writer, imageContainer.ImageContainerVersion, image);
            }
        }
Example #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);
        }