예제 #1
0
        public override ArcFile TryOpen(ArcView file)
        {
            int count = file.View.ReadInt32(0);

            if (count <= 0 || count > 100)
            {
                return(null);
            }
            int first_offset = file.View.ReadInt32(4);

            if (0 != first_offset)
            {
                return(null);
            }
            string base_name = Path.GetFileNameWithoutExtension(file.Name);

            int base_offset  = 4 + count * 0x1C;
            int index_offset = 4;
            var dir          = new List <Entry> (count);

            for (int i = 0; i < count; ++i)
            {
                var entry = new BdfFrame {
                    Number      = i,
                    Name        = string.Format("{0}#{1:D2}", base_name, i),
                    Type        = "image",
                    Offset      = base_offset + file.View.ReadUInt32(index_offset),
                    Size        = file.View.ReadUInt32(index_offset + 4),
                    Incremental = 0 != file.View.ReadInt32(index_offset + 8),
                    Width       = file.View.ReadInt32(index_offset + 0x14),
                    Height      = file.View.ReadInt32(index_offset + 0x18),
                };
                if (entry.Size > 0)
                {
                    if (entry.Size < 4 || entry.Width <= 0 || entry.Height <= 0 ||
                        !entry.CheckPlacement(file.MaxOffset))
                    {
                        return(null);
                    }
                    dir.Add(entry);
                }
                index_offset += 0x1C;
            }
            return(new BdfArchive(file, this, dir));
        }
예제 #2
0
파일: ArcBDF.cs 프로젝트: y111303tut/GARbro
 public byte[] ReadFrame(BdfFrame frame)
 {
     byte[] pixels;
     if (!frame.Incremental)
     {
         if (null != FirstFrame && 0 == frame.Number)
         {
             return(FirstFrame);
         }
         pixels = new byte[frame.Width * frame.Height * 3];
         using (var input = File.CreateStream(frame.Offset, frame.Size))
             DecodeFrame(input, pixels);
         if (null == FirstFrame && 0 == frame.Number)
         {
             FirstFrame = pixels;
         }
     }
     else
     {
         if (null == FirstFrame)
         {
             var base_frame = Dir.First() as BdfFrame;
             FirstFrame = new byte[base_frame.Width * base_frame.Height * 3];
             using (var input = File.CreateStream(base_frame.Offset, base_frame.Size))
                 DecodeFrame(input, FirstFrame);
         }
         pixels = FirstFrame.Clone() as byte[];
         int i = 1;
         foreach (BdfFrame entry in Dir.Skip(1))
         {
             if (i++ > frame.Number)
             {
                 break;
             }
             using (var input = File.CreateStream(entry.Offset, entry.Size))
                 DecodeFrame(input, pixels, entry.Incremental);
         }
     }
     return(pixels);
 }
예제 #3
0
파일: ArcBDF.cs 프로젝트: Casidi/GARbro
        public override ArcFile TryOpen(ArcView file)
        {
            int count = file.View.ReadInt32 (0);
            if (count <= 0 || count > 100)
                return null;
            int first_offset = file.View.ReadInt32 (4);
            if (0 != first_offset)
                return null;
            string base_name = Path.GetFileNameWithoutExtension (file.Name);

            int base_offset = 4 + count * 0x1C;
            int index_offset = 4;
            var dir = new List<Entry> (count);
            for (int i = 0; i < count; ++i)
            {
                var entry = new BdfFrame {
                    Number = i,
                    Name = string.Format ("{0}#{1:D2}.tga", base_name, i),
                    Type = "image",
                    Offset = base_offset + file.View.ReadUInt32 (index_offset),
                    Size = file.View.ReadUInt32 (index_offset+4),
                    Incremental = 0 != file.View.ReadInt32 (index_offset+8),
                    Width = file.View.ReadInt32 (index_offset+0x14),
                    Height = file.View.ReadInt32 (index_offset+0x18),
                };
                if (entry.Size < 4 || entry.Width <= 0 || entry.Height <= 0
                    || !entry.CheckPlacement (file.MaxOffset))
                    return null;
                dir.Add (entry);
                index_offset += 0x1C;
            }
            return new BdfArchive (file, this, dir);
        }
예제 #4
0
파일: ArcBDF.cs 프로젝트: Casidi/GARbro
 public byte[] ReadFrame(BdfFrame frame)
 {
     byte[] pixels;
     if (!frame.Incremental)
     {
         if (null != FirstFrame && 0 == frame.Number)
             return FirstFrame;
         pixels = new byte[frame.Width * frame.Height * 3];
         using (var input = File.CreateStream (frame.Offset, frame.Size))
             DecodeFrame (input, pixels);
         if (null == FirstFrame && 0 == frame.Number)
             FirstFrame = pixels;
     }
     else
     {
         if (null == FirstFrame)
         {
             var base_frame = Dir.First() as BdfFrame;
             FirstFrame = new byte[base_frame.Width * base_frame.Height * 3];
             using (var input = File.CreateStream (base_frame.Offset, base_frame.Size))
                 DecodeFrame (input, FirstFrame);
         }
         pixels = FirstFrame.Clone() as byte[];
         int i = 1;
         foreach (BdfFrame entry in Dir.Skip(1))
         {
             if (i++ > frame.Number)
                 break;
             using (var input = File.CreateStream (entry.Offset, entry.Size))
                 DecodeFrame (input, pixels, entry.Incremental);
         }
     }
     return pixels;
 }
예제 #5
0
 public BdfImageDecoder(BdfArchive arc, BdfFrame entry)
     : base(arc.File.CreateStream(entry.Offset, entry.Size), arc.Info)
 {
     m_bdf   = arc;
     m_frame = entry;
 }