private byte[] CompressTable <T>(List <T> table, Level5.Method method) { var ms = new MemoryStream(); using (var bw = new BinaryWriterX(ms, true)) bw.WriteMultiple(table); ms.Position = 0; return(Level5.Compress(ms, method)); }
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 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>(); //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 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 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)) { 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 static void WriteMultipleCompressed <T>(this BinaryWriterX bw, IEnumerable <T> list, Level5.Method comp) { var ms = new MemoryStream(); using (var bwIntern = new BinaryWriterX(ms, true)) foreach (var t in list) { bwIntern.WriteStruct(t); } bw.Write(Level5.Compress(ms, comp)); }
public static void WriteStringsCompressed(this BinaryWriterX bw, IEnumerable <string> list, Level5.Method comp, Encoding enc) { var ms = new MemoryStream(); using (var bwIntern = new BinaryWriterX(ms, true)) foreach (var t in list) { bwIntern.Write(enc.GetBytes(t)); bwIntern.Write((byte)0); } bw.Write(Level5.Compress(ms, comp)); }
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 } }