Пример #1
0
        public void SaveObject(string filename, object configuration)
        {
            if (maps == null || !maps.Any())
            {
                return;
            }

            DdsSaveConfig config = configuration as DdsSaveConfig ?? new DdsSaveConfig(FileFormat.Unknown, 0, 0, false, false);
            FileFormat    format;

            MipMap mipMap = maps.Where(mm => mm.uncompressedData != null && mm.uncompressedData.Length > 0).OrderByDescending(mm => mm.sizeX > mm.sizeY ? mm.sizeX : mm.sizeY).FirstOrDefault();

            if (mipMap == null)
            {
                return;
            }

            Stream memory = buildDdsImage(maps.IndexOf(mipMap), out format);

            if (memory == null)
            {
                return;
            }

            DdsFile    ddsImage  = new DdsFile(GetObjectStream());
            FileStream ddsStream = new FileStream(filename, FileMode.Create);

            config.FileFormat = format;
            ddsImage.Save(ddsStream, config);
            ddsStream.Close();

            memory.Close();
        }
Пример #2
0
        public Stream GetObjectStream()
        {
            if (maps == null || !maps.Any())
            {
                return(null);
            }

            FileFormat format;

            MipMap mipMap = maps.Where(mm => mm.uncompressedData != null && mm.uncompressedData.Length > 0).OrderByDescending(mm => mm.sizeX > mm.sizeY ? mm.sizeX : mm.sizeY).FirstOrDefault();

            return(mipMap == null ? null : buildDdsImage(maps.IndexOf(mipMap), out format));
        }
Пример #3
0
        private Stream buildDdsImage(int mipMapIndex, out FileFormat imageFormat)
        {
            MipMap mipMap = maps[mipMapIndex];

            imageFormat = GetFormat();
            DdsHeader ddsHeader = new DdsHeader(new DdsSaveConfig(imageFormat, 0, 0, false, false), mipMap.sizeX, mipMap.sizeY);

            MemoryStream stream = new MemoryStream();
            BinaryWriter writer = new BinaryWriter(stream);

            ddsHeader.Write(writer);
            stream.Write(mipMap.uncompressedData, 0, mipMap.uncompressedData.Length);
            stream.Flush();
            stream.Position = 0;

            return(stream);
        }
Пример #4
0
        public void ReadData(GpkPackage package, GpkExport export)
        {
            objectExport = export;
            BinaryReader reader     = new BinaryReader(new MemoryStream(export.Data));
            IProperty    formatProp = export.Properties.Find(t => ((GpkBaseProperty)t).name == "Format");
            String       format     = ((GpkByteProperty)formatProp).nameValue;

            startUnk = reader.ReadBytes(16);
            int length = reader.ReadInt32();

            if (length > 0)
            {
                tgaPath = Reader.ReadString(reader, length);
            }
            else
            {
                inUnicode = true;
                tgaPath   = Reader.ReadUnicodeString(reader, (length * -1) * 2);
            }


            int count = reader.ReadInt32();

            for (int i = 0; i < count; i++)
            {
                MipMap map = new MipMap();

                //chunk
                //info
                map.compFlag = reader.ReadInt32();

                map.uncompressedSize = reader.ReadInt32();
                map.compChunkSize    = reader.ReadInt32();
                map.compChunkOffset  = reader.ReadInt32();
                var temp = ((CompressionTypes)map.compFlag & NothingToDo);

                if (((CompressionTypes)map.compFlag & NothingToDo) == 0)
                {
                    //header
                    map.signature = reader.ReadUInt32(); //0x9e2a83c1
                    Debug.Assert(map.signature == MipMap.DEFAULT_SIGNATURE);

                    map.blocksize = reader.ReadInt32();

                    map.compressedSize = reader.ReadInt32();
                    map.uncompressedSize_chunkheader = reader.ReadInt32();
                    map.uncompressedData             = new byte[map.uncompressedSize];

                    int blockCount  = (map.uncompressedSize + map.blocksize - 1) / map.blocksize;
                    int blockOffset = 0;


                    for (int j = 0; j < blockCount; ++j)
                    {
                        var block = new ChunkBlock();
                        block.compressedSize       = reader.ReadInt32();
                        block.uncompressedDataSize = reader.ReadInt32();

                        map.blocks.Add(block);
                    }


                    foreach (ChunkBlock block in map.blocks)
                    {
                        block.compressedData = reader.ReadBytes(block.compressedSize);
                        block.decompress(map.compFlag);

                        Array.ConstrainedCopy(block.uncompressedData, 0, map.uncompressedData, blockOffset, block.uncompressedDataSize);
                        blockOffset += block.uncompressedDataSize;

                        //save memory
                        block.uncompressedData = null;
                    }
                }
                else
                {
                    logger.Trace("{0}, MipMap {0}, no data!!", export.ObjectName, i);
                }

                map.sizeX = reader.ReadInt32();
                map.sizeY = reader.ReadInt32();


                maps.Add(map);
            }

            guid = reader.ReadBytes(16);
        }