示例#1
0
        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));
        }
示例#2
0
        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
                            });
                        }
                    }
                }
            }
        }
示例#3
0
        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++;
                    }
                }
            }
        }
示例#4
0
        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()
                            });
                        }
                    }
                }
            }
        }
示例#5
0
        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);
            }
        }
示例#6
0
文件: XI.cs 项目: Moonstriker/Kuriimu
        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));
            }
        }
示例#7
0
        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);
            }
        }
示例#8
0
        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);
            }
        }
示例#9
0
        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));
        }
示例#10
0
        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));
        }
示例#11
0
        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
            }
        }