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(); }
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)); }
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); }
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); }