static void Test(byte[] bytes, Method method) { var bytes2 = new byte[bytes.Length]; switch (method) { case Method.Ninty: bytes2 = Nintendo.Decompress(new MemoryStream(Nintendo.Compress(new MemoryStream(bytes), Nintendo.Method.LZ10))); Assert.IsTrue(bytes.SequenceEqual(bytes2)); bytes2 = Nintendo.Decompress(new MemoryStream(Nintendo.Compress(new MemoryStream(bytes), Nintendo.Method.LZ11))); Assert.IsTrue(bytes.SequenceEqual(bytes2)); bytes2 = Nintendo.Decompress(new MemoryStream(Nintendo.Compress(new MemoryStream(bytes), Nintendo.Method.Huff4))); Assert.IsTrue(bytes.SequenceEqual(bytes2)); bytes2 = Nintendo.Decompress(new MemoryStream(Nintendo.Compress(new MemoryStream(bytes), Nintendo.Method.Huff8))); Assert.IsTrue(bytes.SequenceEqual(bytes2)); bytes2 = Nintendo.Decompress(new MemoryStream(Nintendo.Compress(new MemoryStream(bytes), Nintendo.Method.RLE))); Assert.IsTrue(bytes.SequenceEqual(bytes2)); break; case Method.L5: bytes2 = Level5.Decompress(new MemoryStream(Level5.Compress(new MemoryStream(bytes), Level5.Method.NoCompression))); Assert.IsTrue(bytes.SequenceEqual(bytes2)); bytes2 = Level5.Decompress(new MemoryStream(Level5.Compress(new MemoryStream(bytes), Level5.Method.LZ10))); Assert.IsTrue(bytes.SequenceEqual(bytes2)); bytes2 = Level5.Decompress(new MemoryStream(Level5.Compress(new MemoryStream(bytes), Level5.Method.Huffman4Bit))); Assert.IsTrue(bytes.SequenceEqual(bytes2)); bytes2 = Level5.Decompress(new MemoryStream(Level5.Compress(new MemoryStream(bytes), Level5.Method.Huffman8Bit))); Assert.IsTrue(bytes.SequenceEqual(bytes2)); bytes2 = Level5.Decompress(new MemoryStream(Level5.Compress(new MemoryStream(bytes), Level5.Method.RLE))); Assert.IsTrue(bytes.SequenceEqual(bytes2)); break; } }
public XPCK(Stream input) { _stream = input; using (var br = new BinaryReaderX(input, true)) { //Header header = br.ReadStruct <Header>(); //Entries br.BaseStream.Position = header.fileInfoOffset; entries.AddRange(br.ReadMultiple <FileInfoEntry>(header.fileCount)); //Filenames br.BaseStream.Position = header.filenameTableOffset; compNameTable = br.ReadBytes(header.filenameTableSize); var decNames = new MemoryStream(Level5.Decompress(new MemoryStream(compNameTable))); //Files using (var nameList = new BinaryReaderX(decNames)) for (int i = 0; i < entries.Count; i++) { nameList.BaseStream.Position = entries[i].nameOffset; Files.Add(new XPCKFileInfo { State = ArchiveFileState.Archived, FileName = nameList.ReadCStringA(), FileData = new SubStream(br.BaseStream, header.dataOffset + entries[i].fileOffset, entries[i].fileSize), Entry = entries[i] }); } } }
public static Bitmap Load(Stream input) { using (var br = new BinaryReaderX(input)) { //check header header = br.ReadStruct <Header>(); header.checkConst(); //decompress table br.BaseStream.Position = header.tableDataOffset; tableComp = (Compression)(br.ReadUInt32() % 8); br.BaseStream.Position = header.tableDataOffset; byte[] table = Level5.Decompress(new MemoryStream(br.ReadBytes(header.tableSize1))); //get decompressed picture data br.BaseStream.Position = header.tableDataOffset + header.tableSize2; picComp = (Compression)(br.ReadUInt32() % 8); br.BaseStream.Position = header.tableDataOffset + header.tableSize2; byte[] tex = Level5.Decompress(new MemoryStream(br.ReadBytes(header.imgDataSize))); //order pic blocks by table byte[] pic = Order(new BinaryReaderX(new MemoryStream(table)), table.Length, new BinaryReaderX(new MemoryStream(tex)), header.width, header.height, header.bitDepth); //return decompressed picture data var settings = new ImageSettings { Width = header.width, Height = header.height, Orientation = Orientation.TransposeTile, Format = ImageSettings.ConvertFormat(header.imageFormat), PadToPowerOf2 = false }; return(Common.Load(pic, settings)); } }
public void extractXpck(BinaryReaderX br) { var header = br.ReadStruct <XpckHeader>(); header.correctHeader(); long bk = br.BaseStream.Position; br.BaseStream.Position = header.filenameTableOffset; byte[] filenameTable = Level5.Decompress(new MemoryStream(br.ReadBytes((int)br.BaseStream.Length))); br.BaseStream.Position = bk; int count = 0; using (BinaryReaderX br2 = new BinaryReaderX(new MemoryStream(filenameTable))) { List <XpckEntry> xpckEntries = new List <XpckEntry>(); for (int i = 0; i < header.fileCount; i++) { xpckEntries.Add(br.ReadStruct <XpckEntry>()); bk = br.BaseStream.Position; string name = getFileName(br2); if (name.Contains("cfg.bin")) { br.BaseStream.Position = xpckEntries[i].offset + header.dataOffset; byte[] cont = br.ReadBytes(xpckEntries[i].fileSize); //extractCfgBin(new BinaryReaderX(new MemoryStream(cont)), "XPCK" + count.ToString()); count += xpckEntries[i].fileSize; br.BaseStream.Position = bk; } } } }
public XI(Stream input) { using (var br = new BinaryReaderX(input)) { var header = br.ReadStruct <Header>(); Settings = new ImageSettings { Width = header.width, Height = header.height, Format = ImageSettings.ConvertFormat(header.imageFormat), Orientation = header.orientation, PadToPowerOf2 = false }; CombineFormat = header.combineFormat; if (CombineFormat != 1) { throw new Exception($"Unknown combine format {header.combineFormat}"); } var buf1 = Level5.Decompress(input); while (input.Position % 4 != 0) { input.ReadByte(); } var buf2 = Level5.Decompress(input); var ms = new MemoryStream(); for (int i = 0; i < buf1.Length / 2; i++) { int index = BitConverter.ToInt16(buf1, 2 * i); ms.Write(buf2, index * header.bytesPerTile, header.bytesPerTile); } Image = Common.Load(ms.ToArray(), Settings); } }
public static Bitmap Load(Stream input) { using (var br = new BinaryReaderX(input)) { //Header header = br.ReadStruct <Header>(); header.checkFormat(); //get tile table br.BaseStream.Position = header.tableDataOffset; byte[] table = Level5.Decompress(new MemoryStream(br.ReadBytes(header.tableSize1))); //get image data br.BaseStream.Position = header.tableDataOffset + header.tableSize2; byte[] tex = Level5.Decompress(new MemoryStream(br.ReadBytes(header.imgDataSize))); //order pic blocks by table byte[] pic = Order(new MemoryStream(table), new MemoryStream(tex)); //return finished image var settings = new ImageSettings { Width = header.width, Height = header.height, Format = ImageSettings.ConvertFormat(header.imageFormat), PadToPowerOf2 = false, ZOrder = false }; return(Common.Load(pic, settings)); } }
private void ReadStream(Stream stream) { using (var reader = new ImprovedBinaryReader(stream)) { // header header = reader.ReadStruct <Header>(); // table 0 reader.BaseStream.Position = header.T0 << 2; using (var table0 = new ImprovedBinaryReader(new MemoryStream(Level5.Decompress(reader.BaseStream)))) { while (table0.BaseStream.Position < table0.BaseStream.Length) { t0_list.Add(table0.ReadStruct <T0Entry>()); } } // table 1 reader.BaseStream.Position = header.T1 << 2; using (var table1 = new ImprovedBinaryReader(new MemoryStream(Level5.Decompress(reader.BaseStream)))) { while (table1.BaseStream.Position < table1.BaseStream.Length) { t1_list.Add(table1.ReadStruct <T1Entry>()); } } // table 2 reader.BaseStream.Position = header.T2 << 2; using (var table2 = new ImprovedBinaryReader(new MemoryStream(Level5.Decompress(reader.BaseStream)))) { while (table2.BaseStream.Position < table2.BaseStream.Length) { t2_list.Add(table2.ReadStruct <T2Entry>()); } } // table 3 reader.BaseStream.Position = header.T3 << 2; using (var table3 = new ImprovedBinaryReader(new MemoryStream(Level5.Decompress(reader.BaseStream)))) { while (table3.BaseStream.Position < table3.BaseStream.Length) { t3_list.Add(table3.ReadStruct <T3Entry>()); } } // table 4 reader.BaseStream.Position = header.T4 << 2; using (var table4 = new ImprovedBinaryReader(new MemoryStream(Level5.Decompress(reader.BaseStream)))) { while (table4.BaseStream.Position < table4.BaseStream.Length) { t4_data.Add(table4.ReadByte()); } } } }
public XFSA(Stream input) { _stream = input; using (var br = new BinaryReaderX(input, true)) { //Header header = br.ReadStruct <Header>(); //Table 0 br.BaseStream.Position = header.table0Offset; table0Comp = GetCompressionMethod(br.BaseStream); table0 = new BinaryReaderX(new MemoryStream(Level5.Decompress(br.BaseStream))).ReadMultiple <Table0Entry>(header.table0EntryCount); //Table 1 br.BaseStream.Position = header.table1Offset; table1Comp = GetCompressionMethod(br.BaseStream); table1 = new BinaryReaderX(new MemoryStream(Level5.Decompress(br.BaseStream))).ReadMultiple <Table1Entry>(header.table1EntryCount); //File Entry Table br.BaseStream.Position = header.fileEntryTableOffset; entriesComp = GetCompressionMethod(br.BaseStream); entries = new BinaryReaderX(new MemoryStream(Level5.Decompress(br.BaseStream))).ReadMultiple <FileEntry>(header.fileEntryCount); //String Table br.BaseStream.Position = header.nameTableOffset; stringComp = GetCompressionMethod(br.BaseStream); stringTable = Level5.Decompress(br.BaseStream); //Add Files using (var stringReader = new BinaryReaderX(new MemoryStream(stringTable))) { foreach (var dir in table0) { stringReader.BaseStream.Position = dir.dirNameOffset; var dirName = stringReader.ReadCStringSJIS(); var fileCountInDir = 0; foreach (var file in entries.Where((e, i) => i >= dir.fileEntryOffset && i < dir.fileEntryOffset + dir.fileCountInDir)) { stringReader.BaseStream.Position = dir.firstFileNameInDir + file.nameOffset; var fileName = stringReader.ReadCStringSJIS(); Files.Add(new XFSAFileInfo { State = ArchiveFileState.Archived, FileName = Path.Combine(dirName, fileName), FileData = new SubStream(br.BaseStream, header.dataOffset + (file.offset << 4), file.size), fileEntry = file, fileCountInDir = fileCountInDir++, dirEntry = dir }); } } } } }
public XFSA(Stream input) { _stream = input; using (var br = new BinaryReaderX(input, true)) { //Header header = br.ReadStruct <Header>(); //1st table br.BaseStream.Position = header.offset1; table1Comp = (byte)(br.ReadByte() & 7); br.BaseStream.Position--; var tmpT1 = br.ReadBytes((int)(header.offset2 - header.offset1)); table1 = new BinaryReaderX(Support.DecompressToStream(tmpT1)).ReadMultiple <Table1Entry>(header.table1EntryCount); //2nd table br.BaseStream.Position = header.offset2; table2Comp = (byte)(br.ReadByte() & 7); br.BaseStream.Position--; var tmpT2 = br.ReadBytes((int)(header.fileEntryTableOffset - header.offset2)); table2 = new BinaryReaderX(Support.DecompressToStream(tmpT2)).ReadMultiple <Table2Entry>(header.table2EntryCount); //File Entry Table br.BaseStream.Position = header.fileEntryTableOffset; entriesComp = (byte)(br.ReadByte() & 7); br.BaseStream.Position--; entries = new BinaryReaderX(Support.DecompressToStream(br.ReadBytes((int)(header.nameTableOffset - header.fileEntryTableOffset)))) .ReadMultipleEntriesInc((int)header.fileEntryCount).ToList(); //Name Table br.BaseStream.Position = header.nameTableOffset; nameC = br.ReadBytes((int)(header.dataOffset - header.nameTableOffset)); fileNames = GetFileNames(Level5.Decompress(new MemoryStream(nameC))); //Add Files List <uint> combs = new List <uint>(); foreach (var name in fileNames) { var crc32 = Crc32.Create(name.Split('/').Last(), Encoding.GetEncoding("SJIS")); var entry = entries.Find(c => c.entry.crc32 == crc32 && !combs.Contains(c.entry.comb1)); combs.Add(entry.entry.comb1); Files.Add(new XFSAFileInfo { State = ArchiveFileState.Archived, FileName = name, FileData = new SubStream(br.BaseStream, header.dataOffset + ((entry.entry.comb1 & 0x01ffffff) << 4), entry.entry.comb2 & 0x000fffff), entry = entry }); } } }
public bool Identify(string filename) { using (var br = new BinaryReaderX(File.OpenRead(filename))) { try { //possible identifications: PCK, cfg.bin, XPCK-Archive //if cfg.bin br.BaseStream.Position = 0x18; uint t1 = br.ReadUInt32(); br.BaseStream.Position = 0x24; uint t2 = br.ReadUInt32(); if (t1 == 0x0 && t2 == 0x14) { return(true); } br.BaseStream.Position = 0; //if PCK int entryCount = br.ReadInt32(); br.BaseStream.Position = 0x8; if (entryCount * 3 * 4 + 4 == br.ReadInt32()) { return(true); } br.BaseStream.Position = 0; //if XPCK if (br.ReadString(4) == "XPCK") { return(true); } else { br.BaseStream.Position = 0; byte[] result = Level5.Decompress(new MemoryStream(br.ReadBytes((int)br.BaseStream.Length))); using (BinaryReaderX br2 = new BinaryReaderX(new MemoryStream(result))) { if (br2.ReadString(4) == "XPCK") { br2.BaseStream.Position = 0; return(true); } } } } catch (Exception) { } return(false); } }
public byte[] Identify(BinaryReaderX br) { //possible identifications: PCK, cfg.bin, XPCK-Archive //if cfg.bin br.BaseStream.Position = 0x18; uint t1 = br.ReadUInt32(); br.BaseStream.Position = 0x24; uint t2 = br.ReadUInt32(); br.BaseStream.Position = 0; if (t1 == 0x0 && t2 == 0x14) { type = 1; return(null); } //if PCK int entryCount = br.ReadInt32(); br.BaseStream.Position = 0x8; if (entryCount * 3 * 4 + 4 == br.ReadInt32()) { type = 2; return(null); } br.BaseStream.Position = 0; //if XPCK if (br.ReadString(4) == "XPCK") { type = 3; return(null); } else { br.BaseStream.Position = 0; byte[] result = Level5.Decompress(new MemoryStream(br.ReadBytes((int)br.BaseStream.Length))); using (BinaryReaderX br2 = new BinaryReaderX(new MemoryStream(result))) { if (br2.ReadString(4) == "XPCK") { type = 3; return(result); } } } return(null); }
public XPCK(string filename) { using (BinaryReaderX xpckBr = new BinaryReaderX(File.OpenRead(filename))) { if (xpckBr.ReadString(4) == "XPCK") { xpckBr.BaseStream.Position = 0; _stream = new MemoryStream(xpckBr.ReadBytes((int)xpckBr.BaseStream.Length)); } else { xpckBr.BaseStream.Position = 0; byte[] decomp = Level5.Decompress(xpckBr.BaseStream); _stream = new MemoryStream(decomp); } } using (BinaryReaderX xpckBr = new BinaryReaderX(_stream)) { //Header var header = xpckBr.ReadStruct <Header>(); int fileCount = header.fileInfoSize / 0xc; //fileInfo var entries = new List <Entry>(); entries.AddRange(xpckBr.ReadMultiple <Entry>(fileCount).OrderBy(e => e.fileOffset)); //nameList var nameList = new List <string>(); byte[] uncompressedNameList = Level5.Decompress(new MemoryStream(xpckBr.ReadBytes(header.filenameTableSize))); using (BinaryReaderX nlBr = new BinaryReaderX(new MemoryStream(uncompressedNameList))) for (int i = 0; i < fileCount; i++) { nameList.Add(nlBr.ReadCStringA()); } for (int i = 0; i < fileCount; i++) { xpckBr.BaseStream.Position = header.dataOffset + entries[i].fileOffset; Files.Add(new XPCKFileInfo() { Entry = entries[i], FileName = nameList[i], FileData = new MemoryStream(xpckBr.ReadBytes(entries[i].fileSize)), State = ArchiveFileState.Archived }); } } }
public XF(Stream input) { using (var br = new BinaryReaderX(input)) { //parse Header var header = br.ReadStruct <XpckHeader>(); header.CorrectHeader(); //parse FileEntries fileEntries = new List <FileEntry>(); for (int i = 0; i < header.fileEntries; i++) { fileEntries.Add(br.ReadStruct <FileEntry>()); } //get xi image BinaryWriterX xi = new BinaryWriterX(new MemoryStream()); br.BaseStream.Position = header.dataOffset + fileEntries[0].offset; xi.Write(br.ReadBytes(fileEntries[0].fileSize)); xi.BaseStream.Position = 0; //convert xi image to bmp bmp = new IMGC(xi.BaseStream).Image; //get fnt.bin BinaryWriterX fnt = new BinaryWriterX(new MemoryStream()); br.BaseStream.Position = header.dataOffset + fileEntries[0].fileSize + 4; fnt.Write(br.ReadBytes(fileEntries[1].fileSize)); fnt.BaseStream.Position = 0; //decompress fnt.bin BinaryReaderX fntR = new BinaryReaderX(fnt.BaseStream); fntR.BaseStream.Position = 0x28; byte[] buf1 = Level5.Decompress(fntR.BaseStream); fntR.BaseStream.Position = (fntR.BaseStream.Position + 3) & ~3; byte[] buf2 = Level5.Decompress(fntR.BaseStream); fntR.BaseStream.Position = (fntR.BaseStream.Position + 3) & ~3; byte[] buf3 = Level5.Decompress(fntR.BaseStream); using (BinaryReaderX br2 = new BinaryReaderX(new MemoryStream(buf1))) lstCharSizeInfo = Enumerable.Range(0, buf1.Length / 4).Select(_ => br2.ReadStruct <CharSizeInfo>()).ToList(); using (BinaryReaderX br2 = new BinaryReaderX(new MemoryStream(buf2))) dicGlyphLarge = Enumerable.Range(0, buf2.Length / 8).Select(i => br2.ReadStruct <CharacterMap>()).ToDictionary(x => x.code_point); using (BinaryReaderX br2 = new BinaryReaderX(new MemoryStream(buf3))) dicGlyphSmall = Enumerable.Range(0, buf3.Length / 8).Select(i => br2.ReadStruct <CharacterMap>()).ToDictionary(x => x.code_point); } }
public XS(string filename) { using (BinaryReaderX br = new BinaryReaderX(File.OpenRead(filename))) { //Header header = br.ReadStruct <Header>(); //Table0 br.BaseStream.Position = header.table0Offset << 2; table0Comp = (Level5.Method)(br.ReadInt32() & 0x7); br.BaseStream.Position -= 4; entries = new BinaryReaderX(new MemoryStream(Level5.Decompress(br.BaseStream))).ReadMultiple <Entry>(header.table0EntryCount); //Table2 br.BaseStream.Position = header.table1Offset << 2; table1Comp = (Level5.Method)(br.ReadInt32() & 0x7); br.BaseStream.Position -= 4; subEntries = new BinaryReaderX(new MemoryStream(Level5.Decompress(br.BaseStream))).ReadMultiple <SubEntry>(header.table1EntryCount); //Text br.BaseStream.Position = header.stringTableOffset << 2; stringComp = (Level5.Method)(br.ReadInt32() & 0x7); br.BaseStream.Position -= 4; using (var text = new BinaryReaderX(new MemoryStream(Level5.Decompress(br.BaseStream)))) { var entryCount = 0; foreach (var entry in entries) { for (int i = entry.subEntryOffset; i < entry.subEntryOffset + entry.subEntryCount; i++) { var subEntry = subEntries[i]; if (subEntry.ident == 0x18 && !offsets.Contains(subEntry.value)) { text.BaseStream.Position = subEntry.value; offsets.Add(subEntry.value); Labels.Add(new Label { Name = $"{entryCount}:{i-entry.subEntryOffset}", TextID = i, Text = text.ReadCStringSJIS() }); } } entryCount++; } } } }
public XS(string filename) { using (BinaryReaderX br = new BinaryReaderX(File.OpenRead(filename))) { //Header header = br.ReadStruct <Header>(); //Table1 table1 = br.ReadBytes((header.table2Offset << 2) - (header.table1Offset << 2)); //Table2 br.BaseStream.Position = header.table2Offset << 2; using (var table2 = new BinaryReaderX(new MemoryStream(Level5.Decompress(br.BaseStream)))) { while (table2.BaseStream.Position < table2.BaseStream.Length) { entries.Add(table2.ReadStruct <T2Entry>()); } } br.BaseStream.Position = (br.BaseStream.Position + 3) & ~3; //Text if (br.BaseStream.Position < br.BaseStream.Length) { using (var text = new BinaryReaderX(new MemoryStream(Level5.Decompress(br.BaseStream)))) { var count = 0; foreach (var entry in entries) { if (entry.ident == 0x18 && !offsets.Contains(entry.textOffset)) { offsets.Add(entry.textOffset); text.BaseStream.Position = entry.textOffset; Labels.Add(new Label { Name = $"text{count:000000}", TextID = count++, Text = text.ReadCStringSJIS() }); } } } } } }
public IMGC(Stream input) { using (var br = new BinaryReaderX(input)) { //Header header = br.ReadStruct <Header>(); if (header.imageFormat == 28 && header.bitDepth == 8) { editMode = true; header.imageFormat = 29; } if (header.imageFormat == 0xb && header.bitDepth == 8) { editMode2 = true; header.imageFormat = 12; } //get tile table br.BaseStream.Position = header.tableDataOffset; var tableC = br.ReadBytes(header.tableSize1); tableComp = (Level5.Method)(tableC[0] & 0x7); byte[] table = Level5.Decompress(new MemoryStream(tableC)); //get image data br.BaseStream.Position = header.tableDataOffset + header.tableSize2; var texC = br.ReadBytes(header.imgDataSize); picComp = (Level5.Method)(texC[0] & 0x7); byte[] tex = Level5.Decompress(new MemoryStream(texC)); //order pic blocks by table byte[] pic = Order(new MemoryStream(table), new MemoryStream(tex)); //return finished image settings = new ImageSettings { Width = header.width, Height = header.height, Format = Support.Format[header.imageFormat], Swizzle = new ImgcSwizzle(header.width, header.height) }; Image = Kontract.Image.Common.Load(pic, settings); } }
public bool Identify(string filename) { using (var br = new BinaryReaderX(File.OpenRead(filename))) { if (br.BaseStream.Length < 4) { return(false); } if (br.ReadString(4) == "XPCK") { return(true); } br.BaseStream.Position = 0; byte[] decomp; try { decomp = Level5.Decompress(br.BaseStream); } catch { return(false); } return(new BinaryReaderX(new MemoryStream(decomp)).ReadString(4) == "XPCK"); } }
public XS(string filename) { using (BinaryReaderX br = new BinaryReaderX(File.OpenRead(filename))) { //Header header = br.ReadStruct <Header>(); //Table0 br.BaseStream.Position = header.table0Offset << 2; table0Comp = (Level5.Method)(br.ReadInt32() & 0x7); br.BaseStream.Position -= 4; table0 = new BinaryReaderX(new MemoryStream(Level5.Decompress(br.BaseStream))).ReadMultiple <T0Entry>(header.table0EntryCount); //Table2 br.BaseStream.Position = header.table1Offset << 2; table1Comp = (Level5.Method)(br.ReadInt32() & 0x7); br.BaseStream.Position -= 4; entries = new BinaryReaderX(new MemoryStream(Level5.Decompress(br.BaseStream))).ReadMultiple <VarStruct>(header.table1EntryCount); //Text br.BaseStream.Position = header.stringTableOffset << 2; stringComp = (Level5.Method)(br.ReadInt32() & 0x7); br.BaseStream.Position -= 4; using (var text = new BinaryReaderX(new MemoryStream(Level5.Decompress(br.BaseStream)))) { var count = 0; foreach (var entry in entries) { if (entry.ident == 0x18 && !offsets.Contains(entry.value)) { offsets.Add(entry.value); text.BaseStream.Position = entry.value; Labels.Add(new Label { Name = $"text{count:000000}", TextID = count++, Text = text.ReadCStringSJIS() }); } } } } }
public ARC0(Stream input) { _stream = input; using (BinaryReaderX br = new BinaryReaderX(input, true)) { //Header header = br.ReadStruct <Header>(); //Table 1 br.BaseStream.Position = header.offset1; table1 = br.ReadBytes((int)(header.offset2 - header.offset1)); //Table 2 br.BaseStream.Position = header.offset2; table2 = br.ReadBytes((int)(header.fileEntriesOffset - header.offset2)); //File Entry Table br.BaseStream.Position = header.fileEntriesOffset; entries = new BinaryReaderX(new MemoryStream(Level5.Decompress(new MemoryStream(br.ReadBytes((int)(header.nameOffset - header.fileEntriesOffset)))))) .ReadMultiple <FileEntry>(header.fileEntriesCount); //NameTable br.BaseStream.Position = header.nameOffset; nameC = br.ReadBytes((int)(header.dataOffset - header.nameOffset)); fileNames = GetFileNames(Level5.Decompress(new MemoryStream(nameC))); //Add Files List <uint> offsets = new List <uint>(); foreach (var name in fileNames) { var crc32 = Crc32.Create(name.Split('/').Last(), Encoding.GetEncoding("SJIS")); var entry = entries.Find(c => c.crc32 == crc32 && !offsets.Contains(c.fileOffset)); offsets.Add(entry.fileOffset); Files.Add(new ARC0FileInfo { State = ArchiveFileState.Archived, FileName = name, FileData = new SubStream(br.BaseStream, header.dataOffset + entry.fileOffset, entry.fileSize), entry = entry }); } } }
public XFSA(string filename) { using (var br = new BinaryReaderX(File.OpenRead(filename), true)) { //Header header = br.ReadStruct <Header>(); //1st table br.BaseStream.Position = header.offset1; table1 = br.ReadBytes((int)(header.offset2 - header.offset1)); //2nd table br.BaseStream.Position = header.offset2; table2 = br.ReadBytes((int)(header.fileEntryTableOffset - header.offset2)); //File Entry Table br.BaseStream.Position = header.fileEntryTableOffset; entries = new BinaryReaderX(new MemoryStream(Level5.Decompress(new MemoryStream(br.ReadBytes((int)(header.nameTableOffset - header.fileEntryTableOffset)))))) .ReadMultiple <FileEntry>((int)header.fileEntryCount); //Name Table br.BaseStream.Position = header.nameTableOffset; nameC = br.ReadBytes((int)(header.dataOffset - header.nameTableOffset)); fileNames = GetFileNames(Level5.Decompress(new MemoryStream(nameC))); //Add Files List <uint> combs = new List <uint>(); foreach (var name in fileNames) { var crc32 = Crc32.Create(name.Split('/').Last(), Encoding.GetEncoding("SJIS")); var entry = entries.Find(c => c.crc32 == crc32 && !combs.Contains(c.comb1)); combs.Add(entry.comb1); Files.Add(new XFSAFileInfo { State = ArchiveFileState.Archived, FileName = name, FileData = new SubStream(br.BaseStream, header.dataOffset + ((entry.comb1 & 0x01ffffff) << 4), entry.comb2 & 0x000fffff), entry = entry }); } } }
public static Bitmap Load(Stream input) { using (var br = new BinaryReaderX(input)) { //Header header = br.ReadStruct <Header>(); if (header.imageFormat == Format.ETC1 && header.bitDepth == 8) { editMode = true; header.imageFormat = Format.ETC1A4; } //get tile table br.BaseStream.Position = header.tableDataOffset; var tableC = br.ReadBytes(header.tableSize1); tableComp = (Level5.Method)(tableC[0] & 0x7); byte[] table = Level5.Decompress(new MemoryStream(tableC)); //get image data br.BaseStream.Position = header.tableDataOffset + header.tableSize2; var texC = br.ReadBytes(header.imgDataSize); picComp = (Level5.Method)(texC[0] & 0x7); byte[] tex = Level5.Decompress(new MemoryStream(texC)); //order pic blocks by table byte[] pic = Order(new MemoryStream(table), new MemoryStream(tex)); //return finished image var settings = new ImageSettings { Width = header.width, Height = header.height, Orientation = Orientation.TransposeTile, Format = ImageSettings.ConvertFormat(header.imageFormat), PadToPowerOf2 = false }; return(Common.Load(pic, settings)); } }
public IMGV(Stream input) { using (var br = new BinaryReaderX(input)) { //Header header = br.ReadStruct <Header>(); //get tile table br.BaseStream.Position = header.tableDataOffset; var tableC = br.ReadBytes(header.tableSize1); tableComp = (Level5.Method)(tableC[0] & 0x7); byte[] table = Level5.Decompress(new MemoryStream(tableC)); //get image data br.BaseStream.Position = header.tableDataOffset + header.tableSize2; var texC = br.ReadBytes(header.imgDataSize); picComp = (Level5.Method)(texC[0] & 0x7); byte[] tex = Level5.Decompress(new MemoryStream(texC)); //order pic blocks by table byte[] pic = Order(new MemoryStream(table), new MemoryStream(tex), header.bitDepth); //File.WriteAllBytes(@"D:\Users\Kirito\Desktop\xi_data.bin", pic); //return finished image var isBlockCompression = Support.Format[header.imageFormat].FormatName.Contains("DXT"); settings = new ImageSettings { Width = header.width, Height = header.height, Format = Support.Format[header.imageFormat], Swizzle = isBlockCompression ? new Support.BlockSwizzle(header.width, header.height) : null }; Image = Kontract.Image.Common.Load(pic, settings); } }
public XF(Stream input) { using (var br = new BinaryReaderX(input)) { //load files xpck = new XPCK(input); //get xi image to bmp xi = new IMGC(xpck.Files[0].FileData); bmp = xi.Image; //decompress fnt.bin var tempCharSizeInfo = new List <CharSizeInfo>(); var largeChars = new List <CharacterMap>(); var smallChars = new List <CharacterMap>(); using (var fntR = new BinaryReaderX(xpck.Files[1].FileData, true)) { Header = fntR.ReadType <XFHeader>(); fntR.BaseStream.Position = Header.table0Offset << 2; t0Comp = (Level5.Method)(fntR.ReadInt32() & 0x7); fntR.BaseStream.Position -= 4; tempCharSizeInfo = new BinaryReaderX(new MemoryStream(Level5.Decompress(fntR.BaseStream))).ReadMultiple <CharSizeInfo>(Header.table0EntryCount); fntR.BaseStream.Position = Header.table1Offset << 2; t1Comp = (Level5.Method)(fntR.ReadInt32() & 0x7); fntR.BaseStream.Position -= 4; largeChars = new BinaryReaderX(new MemoryStream(Level5.Decompress(fntR.BaseStream))).ReadMultiple <CharacterMap>(Header.table1EntryCount); fntR.BaseStream.Position = Header.table2Offset << 2; t2Comp = (Level5.Method)(fntR.ReadInt32() & 0x7); fntR.BaseStream.Position -= 4; smallChars = new BinaryReaderX(new MemoryStream(Level5.Decompress(fntR.BaseStream))).ReadMultiple <CharacterMap>(Header.table2EntryCount); } Textures = new List <Bitmap>(); var bmpInfo = new BitmapInfo(bmp); Textures.Add(bmpInfo.CreateChannelBitmap(BitmapInfo.Channel.Red)); Textures.Add(bmpInfo.CreateChannelBitmap(BitmapInfo.Channel.Green)); Textures.Add(bmpInfo.CreateChannelBitmap(BitmapInfo.Channel.Blue)); //Add Characters Characters = new List <XFCharacter>(); foreach (var glyph in largeChars) { var newChar = new XFCharacter { Character = glyph.code_point, TextureID = (int)glyph.ColorChannel, GlyphX = (int)glyph.ImageOffsetX, GlyphY = (int)glyph.ImageOffsetY, GlyphWidth = tempCharSizeInfo[(int)glyph.CharSizeInfoIndex].glyph_width, GlyphHeight = tempCharSizeInfo[(int)glyph.CharSizeInfoIndex].glyph_height, CharacterWidth = (int)glyph.CharWidth, OffsetX = tempCharSizeInfo[(int)glyph.CharSizeInfoIndex].offset_x, OffsetY = tempCharSizeInfo[(int)glyph.CharSizeInfoIndex].offset_y, }; Characters.Add(newChar); } /*foreach (var glyph in smallChars) * Characters.Add(new XFCharacter * { * Character = glyph.code_point, * TextureID = (int)glyph.ColorChannel, * GlyphX = (int)glyph.ImageOffsetX, * GlyphY = (int)glyph.ImageOffsetY, * GlyphWidth = tempCharSizeInfo[(int)glyph.CharSizeInfoIndex].glyph_width, * GlyphHeight = tempCharSizeInfo[(int)glyph.CharSizeInfoIndex].glyph_height, * CharacterWidth = (int)glyph.CharWidth, * OffsetX = tempCharSizeInfo[(int)glyph.CharSizeInfoIndex].offset_x, * OffsetY = tempCharSizeInfo[(int)glyph.CharSizeInfoIndex].offset_y, * });*/ //Add Textures } }
public static void Decompress(object sender, EventArgs e) { var tsi = sender as ToolStripMenuItem; if (!Shared.PrepareFiles("Open a " + tsi?.Tag + " compressed file...", "Save your decompressed file...", ".decomp", out var openFile, out var saveFile)) { return; } try { using (openFile) using (var outFs = new BinaryWriterX(saveFile)) switch (tsi?.Tag) { case Compression.Level5: outFs.Write(Level5.Decompress(openFile)); break; case Compression.Nintendo: outFs.Write(Nintendo.Decompress(openFile)); break; case Compression.LZ77: outFs.Write(LZ77.Decompress(openFile)); break; case Compression.RevLZ77: outFs.Write(RevLZ77.Decompress(openFile)); break; case Compression.LZOvl: outFs.Write(LZOvl.Decompress(openFile)); break; case Compression.LZ4: outFs.Write(Kontract.Compression.LZ4.Decompress(openFile)); break; case Compression.MIO0LE: outFs.Write(MIO0.Decompress(openFile, ByteOrder.LittleEndian)); break; case Compression.MIO0BE: outFs.Write(MIO0.Decompress(openFile, ByteOrder.BigEndian)); break; case Compression.Yay0LE: outFs.Write(Yay0.Decompress(openFile, ByteOrder.LittleEndian)); break; case Compression.Yay0BE: outFs.Write(Yay0.Decompress(openFile, ByteOrder.BigEndian)); break; case Compression.Yaz0LE: outFs.Write(Yaz0.Decompress(openFile, ByteOrder.LittleEndian)); break; case Compression.Yaz0BE: outFs.Write(Yaz0.Decompress(openFile, ByteOrder.BigEndian)); break; case Compression.LZECD: outFs.Write(LZECD.Decompress(openFile)); break; case Compression.LZ10VLE: outFs.Write(LZSSVLE.Decompress(openFile)); break; case Compression.GZip: outFs.Write(GZip.Decompress(openFile)); break; case Compression.ZLib: outFs.Write(ZLib.Decompress(openFile)); break; case Compression.PSVSpikeChun: outFs.Write(PSVSpikeChun.Decompress(openFile)); break; } } catch (Exception ex) { MessageBox.Show(ex.ToString(), tsi?.Text, MessageBoxButtons.OK, MessageBoxIcon.Error); return; } MessageBox.Show($"Successfully decompressed {Path.GetFileName(openFile.Name)}.", tsi.Text, MessageBoxButtons.OK, MessageBoxIcon.Information); }
public static byte[] Decomp(BinaryReaderX br) { // above to be restored eventually with some changes to Cetera return(Level5.Decompress(br.BaseStream)); }
public static void Decompress(object sender, EventArgs e) { var tsi = sender as ToolStripMenuItem; if (!PrepareFiles("Open a " + tsi.Tag.ToString() + " compressed file...", "Save your decompressed file...", ".decomp", out FileStream openFile, out FileStream saveFile)) { return; } try { using (openFile) using (var outFs = new BinaryWriterX(saveFile)) switch (tsi.Tag) { case Compression.Level5: outFs.Write(Level5.Decompress(openFile)); break; case Compression.GZip: outFs.Write(GZip.Decompress(openFile)); break; case Compression.Huff4: outFs.Write(Huffman.Decompress(openFile, 4)); break; case Compression.Huff8: outFs.Write(Huffman.Decompress(openFile, 8)); break; case Compression.LZ10: outFs.Write(LZ10.Decompress(openFile)); break; case Compression.LZ11: outFs.Write(LZ11.Decompress(openFile)); break; case Compression.LZ77: outFs.Write(LZ77.Decompress(openFile)); break; /*case Compression.LZSS: * outFs.Write(LZSS.Decompress(openFile, LZSS.GetDecompressedSize(openFile))); * break;*/ case Compression.RevLZ77: outFs.Write(RevLZ77.Decompress(openFile)); break; case Compression.RLE: outFs.Write(RLE.Decompress(openFile)); break; case Compression.ZLib: outFs.Write(ZLib.Decompress(openFile)); break; } } catch (Exception ex) { MessageBox.Show(ex.ToString(), tsi?.Text, MessageBoxButtons.OK, MessageBoxIcon.Error); } MessageBox.Show($"Successfully decompressed {Path.GetFileName(openFile.Name)}.", tsi?.Text, MessageBoxButtons.OK, MessageBoxIcon.Information); }
public XF(Stream input) { using (var br = new BinaryReaderX(input)) { xpck = new XPCK(input); //get xi image to bmp xi = new IMGC(xpck.Files[0].FileData); bmp = xi.Image; //decompress fnt.bin var tempCharSizeInfo = new List <CharSizeInfo>(); using (var fntR = new BinaryReaderX(xpck.Files[1].FileData, true)) { xfheader = fntR.ReadStruct <XFHeader>(); fntR.BaseStream.Position = xfheader.table0Offset << 2; t0Comp = (Level5.Method)(fntR.ReadInt32() & 0x7); fntR.BaseStream.Position -= 4; tempCharSizeInfo = new BinaryReaderX(new MemoryStream(Level5.Decompress(fntR.BaseStream))).ReadMultiple <CharSizeInfo>(xfheader.table0EntryCount); fntR.BaseStream.Position = xfheader.table1Offset << 2; t1Comp = (Level5.Method)(fntR.ReadInt32() & 0x7); fntR.BaseStream.Position -= 4; dicGlyphLarge = new BinaryReaderX(new MemoryStream(Level5.Decompress(fntR.BaseStream))).ReadMultiple <CharacterMap>(xfheader.table1EntryCount).ToDictionary(x => x.code_point); fntR.BaseStream.Position = xfheader.table2Offset << 2; t2Comp = (Level5.Method)(fntR.ReadInt32() & 0x7); fntR.BaseStream.Position -= 4; dicGlyphSmall = new BinaryReaderX(new MemoryStream(Level5.Decompress(fntR.BaseStream))).ReadMultiple <CharacterMap>(xfheader.table2EntryCount).ToDictionary(x => x.code_point); } #region Expand charsizeinfo lstCharSizeInfoLarge = new Dictionary <char, CharSizeInfo>(); lstCharSizeInfoSmall = new Dictionary <char, CharSizeInfo>(); foreach (var dic in dicGlyphLarge) { lstCharSizeInfoLarge.Add(dic.Value.code_point, new CharSizeInfo { offset_x = tempCharSizeInfo[dic.Value.CharSizeInfoIndex].offset_x, offset_y = tempCharSizeInfo[dic.Value.CharSizeInfoIndex].offset_y, char_width = tempCharSizeInfo[dic.Value.CharSizeInfoIndex].char_width, char_height = tempCharSizeInfo[dic.Value.CharSizeInfoIndex].char_height }); } foreach (var dic in dicGlyphSmall) { lstCharSizeInfoSmall.Add(dic.Value.code_point, new CharSizeInfo { offset_x = tempCharSizeInfo[dic.Value.CharSizeInfoIndex].offset_x, offset_y = tempCharSizeInfo[dic.Value.CharSizeInfoIndex].offset_y, char_width = tempCharSizeInfo[dic.Value.CharSizeInfoIndex].char_width, char_height = tempCharSizeInfo[dic.Value.CharSizeInfoIndex].char_height }); } #endregion var bmpInfo = new BitmapInfo(bmp); image_0 = bmpInfo.CreateChannelBitmap(BitmapInfo.Channel.Red); image_1 = bmpInfo.CreateChannelBitmap(BitmapInfo.Channel.Green); image_2 = bmpInfo.CreateChannelBitmap(BitmapInfo.Channel.Blue); } }
public ARC0(Stream input) { _stream = input; using (BinaryReaderX br = new BinaryReaderX(input, true)) { //Header header = br.ReadStruct <ARC0Header>(); unk1 = br.ReadBytes(header.offset1 - header.offset0); unk2 = br.ReadBytes(header.offset2 - header.offset1); //Entries entries = new BinaryReaderX(new MemoryStream(Level5.Decompress(new MemoryStream(br.ReadBytes(header.nameOffset - header.offset2))))).ReadMultiple <ARC0Entry>(header.fileCount); //Names using (var nl = new BinaryReaderX(new MemoryStream(Level5.Decompress(new MemoryStream(br.ReadBytes(header.dataOffset - header.nameOffset)))))) { string currentFolder = ""; nl.BaseStream.Position++; string tmp = nl.ReadCStringSJIS(); nl.BaseStream.Position--; fileNames = new List <string>(); folderCounts.Add(0); while (tmp != "" && nl.BaseStream.Position < nl.BaseStream.Length) { if (tmp.Last() == '/') { folderCounts.Add(0); dirStruct.Add(tmp); currentFolder = tmp; } else { dirStruct.Add(currentFolder + tmp); fileNames.Add(currentFolder + tmp); folderCounts[folderCounts.Count - 1] += 1; } nl.BaseStream.Position++; if (nl.BaseStream.Position < nl.BaseStream.Length) { tmp = nl.ReadCStringSJIS(); nl.BaseStream.Position--; } } } //FileData int pos = 0; foreach (var folderCount in folderCounts) { var tmpFiles = new List <ARC0NameEntry>(); for (int i = 0; i < folderCount; i++) { tmpFiles.Add(new ARC0NameEntry { name = fileNames[pos + i], crc32 = Crc32.Create(Encoding.GetEncoding("SJIS").GetBytes(fileNames[pos + i].Split('/').Last().ToLower())) }); } tmpFiles = tmpFiles.OrderBy(x => x.crc32).ToList(); foreach (var nameEntry in tmpFiles) { if (nameEntry.crc32 == entries[pos].crc32) { Files.Add(new ARC0FileInfo { State = ArchiveFileState.Archived, FileName = nameEntry.name, FileData = new SubStream(br.BaseStream, entries[pos].fileOffset + header.dataOffset, entries[pos].fileSize), crc32 = entries[pos++].crc32 }); } } } } }
public static Stream DecompressToStream(byte[] input) => new MemoryStream(Level5.Decompress(new MemoryStream(input)));