Beispiel #1
0
        public override ArcFile TryOpen(ArcView file)
        {
            uint height = file.View.ReadUInt32(4);
            uint width  = file.View.ReadUInt32(8);
            int  count  = file.View.ReadInt32(12);

            if (!IsSaneCount(count))
            {
                return(null);
            }
            uint dir_size    = file.View.ReadUInt32(20);
            uint cur_offset  = 24;
            uint data_offset = cur_offset + dir_size;
            uint data_size   = file.View.ReadUInt32(data_offset);

            data_offset += 4;

            var dir = new List <Entry> (count);

            for (int i = 0; i < count; ++i)
            {
                var entry = new LwgImageEntry();
                entry.PosX   = file.View.ReadInt32(cur_offset);
                entry.PosY   = file.View.ReadInt32(cur_offset + 4);
                entry.BPP    = file.View.ReadByte(cur_offset + 8);
                entry.Offset = data_offset + file.View.ReadUInt32(cur_offset + 9);
                entry.Size   = file.View.ReadUInt32(cur_offset + 13);

                uint   name_length = file.View.ReadByte(cur_offset + 17);
                string name        = file.View.ReadString(cur_offset + 18, name_length);
                entry.Name  = name + ".wcg";
                cur_offset += 18 + name_length;
                if (cur_offset > dir_size + 24)
                {
                    return(null);
                }
                if (entry.Size > 0 && entry.CheckPlacement(data_offset + data_size))
                {
                    dir.Add(entry);
                }
            }
            if (0 == dir.Count)
            {
                return(null);
            }
            return(new ArcFile(file, this, dir));
        }
Beispiel #2
0
        public override ArcFile TryOpen(ArcView file)
        {
            uint height = file.View.ReadUInt32 (4);
            uint width  = file.View.ReadUInt32 (8);
            int count   = file.View.ReadInt32 (12);
            if (!IsSaneCount (count))
                return null;
            uint dir_size = file.View.ReadUInt32 (20);
            uint cur_offset = 24;
            uint data_offset = cur_offset + dir_size;
            uint data_size = file.View.ReadUInt32 (data_offset);
            data_offset += 4;

            var dir = new List<Entry> (count);
            for (int i = 0; i < count; ++i)
            {
                var entry = new LwgImageEntry();
                entry.PosX = file.View.ReadInt32 (cur_offset);
                entry.PosY = file.View.ReadInt32 (cur_offset+4);
                entry.BPP = file.View.ReadByte (cur_offset+8);
                entry.Offset = data_offset + file.View.ReadUInt32 (cur_offset+9);
                entry.Size = file.View.ReadUInt32 (cur_offset+13);

                uint name_length = file.View.ReadByte (cur_offset+17);
                string name = file.View.ReadString (cur_offset+18, name_length);
                entry.Name = name + ".wcg";
                cur_offset += 18+name_length;
                if (cur_offset > dir_size+24)
                    return null;
                if (entry.CheckPlacement (data_offset + data_size))
                    dir.Add (entry);
            }
            return new ArcFile (file, this, dir);
        }