Example #1
0
        public void Save(Stream output, ImageInfo imageInfo)
        {
            using var ms = new MemoryStream();
            using var bw = new BinaryWriterX(ms);

            // Calculate offsets
            var nodeOffset = _header.nodeOffset;
            var dataOffset = nodeOffset + _nodeRegion.Length;
            var postOffset = dataOffset + imageInfo.ImageData.Length;

            // Write data regions
            ms.Position = nodeOffset;
            bw.Write(_nodeRegion);

            ms.Position = dataOffset;
            bw.Write(imageInfo.ImageData);

            ms.Position = postOffset;
            bw.Write(_postData);

            // Update header
            _header.nodeOffset = nodeOffset;

            _header.dataOffset = dataOffset;
            _header.dataSize   = imageInfo.ImageData.Length;

            _header.postOffset = postOffset;
            _header.postSize   = _postData.Length;

            _header.format = imageInfo.ImageFormat;
            _header.width  = imageInfo.ImageSize.Width;
            _header.height = imageInfo.ImageSize.Height;

            // Write header
            ms.Position = 0;
            bw.WriteType(_header);

            // Compress with ZLib
            output          = new IntiCreatesCipherStream(output, "obj90210");
            using var outBw = new BinaryWriterX(output);

            ms.Position          = 0;
            using var compStream = new MemoryStream();

            Compressions.ZLib.Build().Compress(ms, compStream);

            // Write compressed data
            output.Position = 0;
            outBw.Write((int)ms.Length);

            compStream.Position = 0;
            compStream.CopyTo(output);
        }
Example #2
0
        public ImageInfo Load(Stream input, Platform platform)
        {
            input = new IntiCreatesCipherStream(input, "obj90210");

            // Decompress ZLib data
            var ms = new MemoryStream();

            Compressions.ZLib.Build().Decompress(new SubStream(input, 4, input.Length - 4), ms);

            using var br = new BinaryReaderX(ms);

            // Read header
            br.BaseStream.Position = 0;
            _header = br.ReadType <OsbHeader>();

            // Read node region
            br.BaseStream.Position = _header.nodeOffset;
            _nodeRegion            = br.ReadBytes(_header.dataOffset - _header.nodeOffset);

            // Read image data
            br.BaseStream.Position = _header.dataOffset;
            var imgData = br.ReadBytes(_header.dataSize);

            // Read post data
            br.BaseStream.Position = _header.postOffset;
            _postData = br.ReadBytes(_header.postSize);

            // Create image info
            var imageInfo = new ImageInfo(imgData, _header.format, new Size(_header.width, _header.height));

            if (platform == Platform.N3DS)
            {
                imageInfo.RemapPixels.With(context => new CtrSwizzle(context, CtrTransformation.YFlip));
            }

            return(imageInfo);
        }